【C++】笔试强训 第二天
如果你已经对C/C++略知一二,现在正在复习C/C++的一些重点知识
这些看似简单的题目能拿满分吗?
-------------------------------------------------------------------------------------------------------------------------
点赞+收藏🌈,每天更新总结文章(多以图文形式,方便记忆,均为网上搜集资料以及AI)⭐
-------------------------------------------------------------------------------------------------------------------------
时间:2025/5/23/ 20: 41分
-----------------------------------
种一棵树最好的机会是十年前,其次是现在
快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社
一、选择题
1.使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30
答案:C
解析:-30 左对齐,.4 小数点后位数 选项 A 的
%e
是科学计数法格式
2.请找出下面程序中有哪些错误()
int main()
{
int i = 10;
int j = 1;
const int *p1;//(1)int *const p3 = &i;//(4) int const *p2 = &i; //(2) p2 = &j;//(3)*p3 = 20;//(5)*p2 = 30;//(6)p3 = &j;//(7)return 0;
}
A 1,2,3,4,5,6,7
B 1,3,5,6
C 6,7
D 3,5
答案:C
解析:1.const int *p1 和 int const *p1是一致的
2.const在*号前面代表 指针指向的值不能修改,指针变量本身可以修改
3.const在*号后面代表 常量指针,指针变量本身不能修改,但指向的值可以修改
3.下面关于此代码叙述错误的是?
char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";
A acX与acY的内容可以修改
B szX与szY指向同一个地址
C acX占用的内存空间比acY占用的大
D szX的内容修改后,szY的内容也会被更改
答案:D
解析:1.acX和acY是字符数组,都存储在栈上,可以修改其内容
2.szX和szY是指向字符串常量的指针,字符串常量存储在只读数据段,多个相同的字 符串可能共享同一块内存地址,这里的修改本身就是错误,只读的
4.在头文件及上下文均正常的情况下,下列代码的运行结果是()
int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2;
*(b + 2) = 2;
b++;
printf("%d,%d\n", *b, *(b + 2));
A 1,3
B 1,2
C 2,4
D 3,2
答案:C
解析:这个就不用了把...
5.下列关于C/C++的宏定义,不正确的是()
A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率.
答案:B
解析:1.宏定义不进行类型检查,可能导致意外错误
2.宏定义常量没有类型信息,且在预处理阶段直接替换,调试和维护困难
现代C++推荐使用const定义常量
6.有以下定义:
int a[10]; char b[80];
函数声明为: void sss(char[],int[]);
则正确的函数调用形式是()
Asss(a,b);
B sss(char b[],int a[]);
C sss(b[],a[]);
D sss(b,a);
答案:D
解析:基础知识,注意形参实参顺序
7.用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()
A int *a[10];
B int (*a)[10];
C int (*a)(int);
D int (*a[10])(int);
答案:D
解析:1.优先级:
[]
高于*
,因此a[10]
表示数组,*a[10]
表示指针数组。
2.(*a[10])
表示这是一个指针数组,每个元素是指针。
3.(*a[10])(int)
表示这些指针指向函数,函数参数为int
。
4.int (*a[10])(int)
表示函数返回值为int
。
8.以下 C++ 函数的功能是统计给定输入中每个大写字母的出现次数(不需要检查输入合法性,所有字母都为大写),则应在横线处填入的代码为()
void AlphabetCounting(char a[], int n) {
int count[26] = {}, i, kind = 10;
for (i = 0; i < n; ++i) ________________;
for (i = 0; i < 26; ++i) { printf("%c=%d", _____, _____);
}
}
A ++count[a[i]-'Z'] 'Z'-i count['Z'-i]
B ++count['A'-a[i]] 'A'+i count[i]
C ++count[i] i count[i]
D ++count['Z'-a[i]] 'Z'-i count[i]
答案:D
解析:1.count数组中,count[0]存储‘A’的次数 依次类推
2.‘Z’-i对应每一个字母
9.在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{unsigned a : 19;unsigned b : 11;unsigned c : 4;unsigned d : 29;char index;};
则sizeof(struct A)的值为()
A 9
B 12
C 16
D 20
答案:C
解析:
10.下面代码会输出()
int main(){int a[4]={1,2,3,4};int *ptr=(int*)(&a+1);printf("%d",*(ptr-1));}
A 4
B 1
C 2
D 3
答案:A
解析:&a+1代表直接跳过整个数组的下一个位置,ptr-1往前走一步4字节 回到数组末尾
二、编程题
1.题目链接:排序子序列_牛客笔试题_牛客网
思路讲解:
- 题目我们先来看下,非递增和非递归的意思就是递增 递减 加上相等的条件
- 122就是非递减 221就是非递增 只是增加了一个如果相等的条件
- 这个题 我们直接循环就行了,不断判断,如果不满足则记录一个count变量++;count就是最后的个数
#include <iostream> #include <vector> using namespace std; int main() {int n;while(cin >> n){if (n == 1) // 单个直接处理{cout << 1 << endl;continue;}vector<int> nums(n, 0);for (int i = 0; i < n; i++) cin >> nums[i];int i = 0, res = 0;while(i + 1 < n) {if (nums[i] < nums[i + 1])// 非递减子序列{while(i + 1 < n && nums[i] <= nums[i + 1]) i++;res++, i++;// i++过掉当前子序列的最后一个。if (i == n - 1) res++, i++;// 恰好只剩一个数字}else if (nums[i] == nums[i + 1]) i++;else // 非递增子序列{while(i + 1 < n && nums[i] >= nums[i + 1]) i++;res++, i++;if (i == n - 1) res++, i++;// 恰好只剩一个数字}}cout<< res << endl;}return 0; } // 64 位输出请用 printf("%lld")
2.题目链接 倒置字符串_牛客题霸_牛客网
思路讲解:
- 题目比较简单,直接说明
- 先对整个字符串逆置,然后再对符合条件的子字符串逆置,空格不用动
#include <iostream> #include <string> #include <algorithm> using namespace std;int main() {string s;getline(cin,s);//1、进行整体的逆置 -》gnijieb ekil Ireverse(s.begin(),s.end());auto start = s.begin();while(start != s.end()) {auto end = start;while(end != s.end() && *end != ' ') {end++;}reverse(start,end);if(end != s.end()) {start = end+1;}else{start = end;}}cout<<s<<endl; }
⭐加油,为了更好的明天!
种一棵树最好的机会是十年前,其次是现在