🎇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;elsereturn 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;elsereturn 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";elsecout << 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;
}