一、选择题

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、计算糖果

入口:题目链接

题目描述:
【C++】笔试训练(四)-LMLPHP

题目解析:
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、进制转换

入口:题目链接

题目描述:
【C++】笔试训练(四)-LMLPHP

题目解析:
将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;
}
10-09 15:23