一、选择题
1、有以下程序,程序运行后的输出结果是()
#include<iostream>
#include<cstdio>
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
2、以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
3、请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。
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;
4、以下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 运行时崩溃
5、二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
6、根据下面递归函数:调用函数Fun(2),返回值是多少()
int Fun(int n)
{
if (n == 5)
return 2;
else
return 2 * Fun(n + 1);
}
A 2
B 4
C 8
D 16
7、以下程序的输出结果是:
#include <iostream>
using namespace std;
void func(char** m){
++m;
cout << *m << endl;
}
int main()
{
static char* a[] = { "morning", "afternoon", "evening" };
char** p;
p = a;
func(p);
return 0;
}
A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址
8、求函数返回值,输入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
9、下列程序执行后,输出的结果为()
#include <stdio.h>
int cnt = 0;
int fib(int n) {
cnt++;
if (n == 0)
return 1;
else if (n == 1)
return 2;
else
return fib(n - 1) + fib(n - 2);
}
void main()
{
fib(8);
printf("%d", cnt);
}
A 41
B 67
C 109
D 177
10、在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
二、编程题
1、计算糖果
入口:题目链接
题目描述:
题目解析:
A,B,C是三个人手里的糖果数量,我们不知道A,B,C是多少?但是我们知道A - B, B - C, A + B, B + C的结果,这个结果题目是通过输入测试用例给我们的。所以本题本质是一个表达式求解问题。
解题思路:
1、A - B = a。2、B - C = b。 3、A + B = c。 4、B + C = d 这道题目的实质是:判断三元一次方程组是否有解及求解,1+3可以得到A=(a+c)/2;4-2可以得到C=(d-b)/2;2+4可以得到B2=(b+d)/2,3-1可以得到B1=(c-a)/2;
如果B1不等B2则表达式无解
代码展示:
#include <iostream>
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" << endl;
}
else
{
cout << A << " " << B1 << " " << C << endl;
}
return 0;
}
2、进制转换
入口:题目链接
题目描述:
题目解析:
将10进制的数转换成N进制。N(2 ≤ N ≤ 16)可以看出进制最多可以到16进制。
代码展示:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string str, table = "0123456789ABCDEF";
int m, n;
cin >> m >> n;
if (m == 0)
{
cout << 0 << endl;
}
bool flag = false;
if (m < 0)
{
m = -m;
flag = true;
}
while (m != 0)
{
str = str + table[m % n];
m /= n;
}
if (flag == true)
{
str += "-";
}
reverse(str.begin(), str.end());
cout << str << endl;
return 0;
}