🎇C++笔试强训
- 博客主页:一起去看日落吗
- 分享博主的C++刷题日常,大家一起学习
博主的能力有限,出现错误希望大家不吝赐教- 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。
💦🔥
选择题
💦第一题
有以下程序
#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
这道题主要是对进制位的考验

m原本就是八进制,所以%o打印还是123,0是不需要打印的,n是十进制,转换八进制即123不断除8,直到商为0;

所以这道题的答案选C
💦第二题
以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
这道题主要是考验按位运算,并且是在比特位上计算的

我们假设给falg一个值,看看如何可以将第二个比特位置0,且题目的意识是只变第二个比特位,其他位不变

这道题的答案是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,我们来了解两个概念:
- 常量指针:指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
- 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。
区分:const *的相对位置
- const 在 * 的左边,常量指针
- const 在 * 的右边,指针常量

这道题的答案是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 运行时崩溃
这道题主要是对指针以及数组的考验,在前两天的笔试强训中也有类似的题目

这道题的答案选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;
else
return 2*Fun(n+1);
}
A 2
B 4
C 8
D 16
这道题是对于函数递归的理解的考验,这道题需要我们一次一次递归进行算

这道题最终的答案是16,选D
💦第七题
以下程序的输出结果是:
#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的起始地址
这道题主要是对二级指针和指针数组的考验,仔细分析

这道题的答案是A
💦第八题
求函数返回值,输入x=9999
int func(int x){
int count=0;
while (x)
{
count++;
x=x&(x-1);//与运算
}
return count;
}
8
B 9
C 10
D 12
这道题主要是看循环的次数,我们可以先假设一个输入值

所以只需要看9999的二进制中有多少个1即可
所以这道题的答案选A
💦第九题
#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);
}
这道题第一眼看着就是个斐波那契数列,也是对于递归理解的考验,我们只需要依次进行推导那就可以得出最终结果了

💦第十题
在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
这道题主要是考验结构体的内存对齐,我们到时可以去了解三个问题
- 结构体为什么要对齐
- 结构体是如何进行对齐的
- 如果想要让结构体任意字节对齐该如何处理

这样我们可以进行计算第一个结构体的值为16

第二个结构体的值12

所以这道题的答案是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 C = (d - b) / 2;
int B1 = (c - a) / 2;
int B2 = (b + d) / 2;
if (B1 != B2)
cout << "No";
else
cout << A << " " << B1 << " " << C;
return 0;
}
🔥第二题
链接:进制转换

- 解题思路:
本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0N0,X1*N1, X2N^2…,X0,X1,X2就是这些进制位的值,就是就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。
- 代码演示:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s, table = "0123456789ABCDEF";
int m,n;
cin >> m >>n;
if( m == 0)
{
cout << 0;
return 0;
}
bool flag = false;
if(m < 0)
{
m = -m;
flag = true;
}
while(m != 0)
{
s = s+ table[m%n];
m /= n;
}
if(flag == true)
{
s += "-";
}
reverse(s.begin(),s.end());
cout << s << endl;
}
