【C++笔试强训】第四天
创始人
2024-04-19 16:40:21

文章目录

    • 选择题
    • 编程题

选择题

#include
#include
using namespace std;
int main(){int m=0123, n=123;printf("%o %o\n", m, n);return 0;
}

程序运行后的输出结果是()
A 0123 0173
B 0123 173
C 123 173
D 173 173

这道题考查输出的格式,要区分各种进制的表达格式

二进制:1010b

八进制:0123456

十进制:123

十六进制:0x123

%d是十进制,%o是八进制,%x是十六进制输出。%o代表的是八进制整型输出整数,数字前0代表八进制、0x代表16进制,因此m输出为123,十进制123转换为8进制为173,所以n输出为173,因此答案选C

以下哪个选项一定可以将flag的第二个bit置0()

A flag&=~2
B flag|=2
C flag^=2
D flag>>=2

按位或(有1就是1) 按位与(同1才为1) 按位异或(相同为0,不同为1)

一个一个看即可,选A

请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变()

A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;

本题还是对const修饰的考查,要求所指向的内存地址不能改变,内存中的值可以被改变:即x本身不能变,而*x解引用的值可以改变故选B

以下C语言指令:运行结果是什么?

int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1),*(p-1));

A 2,1
B 3,1
C 3,9
D 运行时崩溃

数组名只有在& 和 sizeof之后表示数组本身,其余都表示数组首元素的地址
&a是一个地址,类型为int(*)[5],&a + 1 是跨越了一个数组大小,p被强转为(int*),p-1指向9,*(a+1)是3 选C

二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()

A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
在这里插入图片描述

答案选A

根据下面递归函数:调用函数Fun(2),返回值是多少()

int Fun(int n)
{if(n==5)return 2;elsereturn 2*Fun(n+1);
}

A 2
B 4
C 8
D 16

这个自己展开一下就知道结果了选D

以下程序的输出结果是:

#include 
using namespace std;
void func(char **m)
{++m;cout<<*m<

A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址

数组名表示数组首元素的地址,数组除了放在&和sizeof之后才表示数组本身,所以这里的*a指的是首元素的地址也就是morning的地址
++m也就是偏移一个元素的大小,也就是指向了afternoon故选A

求函数返回值,输入x=9999

int func(int x){int count=0;while (x){count++;x=x&(x-1);//与运算}return count;
}

A 8
B 9
C 10
D 12

image-20221204160431254

所以9999的二进制有8个1,故选A

#include 
int cnt = 0;
int fib(int n) 
{cnt++;if (n == 0)return 1;else if (n == 1)return 2;elsereturn fib(n - 1) + fib(n - 2);
}
void main() {fib(8);printf("%d", cnt);
}

下列程序执行后,输出的结果为()
A 41
B 67
C 109
D 177

cnt实际统计的是:斐波那契递归的总次数

在这里插入图片描述

答案选B

在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()

struct A
{int a;short b;int c;char d;
};
struct B
{int a;short b;char c;int d;
};

A 16,16
B 13,12
C 16,12
D 11,16

结构体内存对齐:

第一个成员在与结构体变量偏移量为0的地址处。

其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的值为8

结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

image-20221204141102042

选C


编程题

计算糖果

在这里插入图片描述

这题一开始我的做法就是直接for循环进行嵌套,无脑强行求出结果:

#include 
#include 
using namespace std;
int main()
{int sum1, sum2, sum3, sum4;cin >> sum1 >> sum2 >> sum3 >> sum4;int a=0, b=0, c=0;int flag = 0;for (a = -30; a <=30; a++){for (b = -30; b <= 30; b++){for (c = -30; c <= 30; c++){if ((a - b) == sum1 && (b - c) == sum2 && (a + b) == sum3 && (b + c) == sum4){cout << a << " " << b << " " << c << endl;flag = 1;break;}}}}if(flag == 0){cout<<"No"<

但是现在我们来看一看题目所给出的条件:

image-20221204124209422

#include 
#include 
using namespace std;
int main()
{int a,b,c,d;cin>>a>>b>>c>>d;int A = (a+c)/2;int B1 = (b+d)/2;int B2 = (c-a)/2;int C = (d-b)/2;if(B1!=B2){cout<<"No"<

进制转换

在这里插入图片描述

先考虑M是正负数问题,可以利用flag来标记一下.当M==0的时候也要处理一下。

然后创建两个字符串ret和table,ret用来存放结果,由于是利用拼接+=,所以最后的结果我们需要倒置一下,而table用来存储进制所代表的数字字母。最后再去一一求出M的每一位数字即可。

image-20221204130419375

#include 
#include 
using namespace std;
int main() {int M,N;cin>>M>>N;bool flag = true;string ret;string table = "0123456789ABCDEF";if(M<0){M = -M;flag = false;}if(M == 0){ret="0";}while(M){ret+=table[M%N];M/=N;}if(flag == false){ret+='-';}reverse(ret.begin(),ret.end());cout<

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...