【C++笔试强训】第三天
🎇C++笔试强训
- 博客主页:一起去看日落吗
- 分享博主的C++刷题日常,大家一起学习
博主的能力有限,出现错误希望大家不吝赐教
- 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。
💦🔥
目录
- 选择题
- 💦第一题
- 💦第二题
- 💦第三题
- 💦第四题
- 💦第五题
- 💦第六题
- 💦第七题
- 💦第八题
- 💦第九题
- 💦第十题
- 编程题
- 🔥第一题
- 🔥第二题
选择题
💦第一题
以下程序的输出结果是()
#include <stdio.h>
main() {
char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
int i;
i = 8;
p = a + i;
printf("%s\n", p - 3);
}
A 6
B 6789
C ‘6’
D 789
这道题的话先定义了一个长度为10的数组a和一个指针p,然后初始化i的值为8
p = a + i 即从数组首元素偏移8个字节,指针变量p是指向字符9,p-3是从6开始打印,%s打印是遇到\0才会停止,所以会打印6789
所以这道题的答案是B
💦第二题
以下程序的输出结果是()
#include <iostream.h>
int main()
{
int x=3,y=3;
switch(x%2)
{
case 1:
switch (y)
{
case 0:
cout<<"first";
case 1:
cout<<"second";
break;
default:
cout<<"hello";
}
case 2:
cout<<"third";
}
return 0;
}
A second third
B hello
C first second
D hellothird
这道题主要是对分支语句的考验,定义x,y的值为3,x%2的值为1,所以是进入case1,之后进入switch(y),因为y为3,所以会进入default语句,然后会打印hello,因为case1没有break,所以不会跳出去,会继续执行下去
所以这道题会继续打印case2的third
所以答案是hellothird 选D
💦第三题
以下能对二维数组a进行正确初始化的语句是()
A int ta[2][]={{0,1,2},{3,4,5}};
B int ta[][3]={{0,1,2},{3,4,5}};
C int ta[2][4]={{0,1,2},{3,4},{5}};
D int ta[][3]={{0,,2},{},{3,4,5}};
A选项在对二维数组初始化的时候,行可以省略但是列不可以省略,所以A错误
B省略行,没有问题
C选项声明数组是两行四列,但是初始化了三行,所以C错误
D选项初始化的时候必须连续初始化,中间不能有间隔,所以D错误
这道题的答案选B
💦第四题
能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()
A return这二个数
B 形参用数组
C 形参用二个指针
D 用二个全局变量
A选项 return每次只能一个数据类型,只能放在一个数组或者容器里面返回出来,所以A错误
B选项 形参在使用数组的时候会传递数组的地址,然后将函数处理的结果放在数组当中,当函数调用完以后可以访问数组获取处理结果,B正确
C选项 形参用两个指针,然后两个指针在调用的时候需要传递两个地址变量,将对应的处理的结果放在对应的地址空间,然后可以根据指针访问处理结果,C正确
D选项 全局变量的作用域在整个文件中都是有效的,所以在处理完以后主调函数可以在全局域中访问到处理结果,所以D正确
·所以这道题的答案是A`
💦第五题
int *p[4] 与选择项中的() 等价
A int p[4]
B int *p
C int *(p[4])
D int (*p)[4]
这道题 []的优先级是高于*号的 ,所以int *p[4] 代表 int类型的指针数组,数组大小为4
A是个整型数组,大小为4
B是个int类型的指针
C选项int类型的指针数组
D是个数组指针,数组大小为4,存放int数据类型
这道题的答案是C
💦第六题
设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
A n=0;while(ch=getchar()!='\n')n++;
B n=0;while(getchar()!='\n')n++;
C for(n=0;getchar()!='\n';n++);
D n=0;for(ch=getchar();ch!='\n';n++);
这道题的意思是输入asdasda一串字符然后按下回车\n ,统计你一共输入了多少个字符
A选项 用ch每次接受一个字符,和\n比较,不是就++,A可以统计
B选项 和A的区别是没用ch接受,直接比较,也是可以的
C选项 用的是for循环,一样是用getchar获取字符和\n进行比较,然后进行循环操作,操作完之后n++,所以C也是正确的
D选项 for循环的初始化部分只会执行一次,所以只会获取一个字符,所以D错误
这道题的答案是D
💦第七题
以下代码
char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;
A Compiler error
B f
C efg
D defg
这道题声明了一个char类型的指针变量ptr 还有一个指字符数组
ptr = myString 代表ptr初始化指向字符数组的首地址
ptr += 5 代表偏移五个字节,所以这时ptr指向f
所以这道题的答案是B
💦第八题
下面3段程序代码的效果一样吗()
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A (2)=(3)
B (1)=(3)
C (1)=(2)
D 都不一样
这里有const,我们来了解两个概念:
- 常量指针:指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
- 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。
- 区分:const *的相对位置
const 在 * 的左边,常量指针
const 在 * 的右边,指针常量
12 是常量指针,3 是指针常量
这道题的答案是C
💦第九题
32位系统中,定义**a[3][4],则变量占用内存空间为()。
A 4
B 48
C 192
D 12
是在32位系统中,[]的优先级是高于*的,所以这是一个三行四列数组,存放指针类型
- 占用4个字节,一共有12个 所以12 * 4 = 48
这道题的答案是48
💦第十题
假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}
A 1,2,3
B 1,0,2
C 1,3,2
D 3,2,1
这道题是在32位小端的机器上运行,先讲一下什么是大小端
大端:低位存高地址
小端:低位存低地址
左低右高
longlong类型占8个字节,用小端存储
a:01 00 00 00 00 00 00 00
b:02 00 00 00 00 00 00 00
c:03 00 00 00 00 00 00 00
printf在打印的时候会创建函数栈帧,是从高地址向低地址增长的,从高地址开辟空间往低地址延伸,并且函数在调用的时候是从右往左入栈的,依次是c b a,三个变量入栈以后再进行打印,%d每次获取四个字节,栈是后进先出,所以先打印a
所以
这道题的答案是1 0 2 ,所以选B
编程题
🔥第一题
链接:最长的数字串
- 解题思路:
- 两重循环遍历字符串,记录全部为数字的字符串长度,将所有为数字的字符串添加进入列表对象中
- 遍历第一步生成的列表对象,将所有与最大数字字符串长度相等的字符串取出来用新的字符串保存
- 代码演示:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str ,cur ,ret;
cin >> str;
for(int i = 0; i <= str.length();i++)//注意一定要加=,不然极端情况如果最后是最长的字符串无法进入循环中
{
if(str[i] >= '0' && str[i] <= '9')
{
cur += str[i];
}
else
{
if(ret.size() < cur.size())
{
ret = cur;
}
else
{
cur.clear();
}
}
}
cout << ret << endl;
}
🔥第二题
链接:超过长度一半的数字
- 解题思路
思路一:
数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优;
思路二:
众数:就是出现次数超过数组长度一半的那个数字如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。
- 代码演示:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty())
return 0;
sort(numbers.begin(),numbers.end());
int midNum = numbers[numbers.size()/2];
int count = 0;
for(int i = 0; i < numbers.size();i++)
{
if(midNum == numbers[i])
{
count++;
}
}
if(count > numbers.size()/2)
{
return midNum;
}
return 0;
}
// int retsult = numbers[0];
// int times = 1;
// for(int i = 1; i < numbers.size();i++)
// {
// if(times != 0)
// {
// if(numbers[i] == retsult)
// {
// ++times;
// }
// else
// --times;
// }
// else
// {
// retsult = numbers[i];
// times = 1;
// }
// }
// //二次遍历数组看retsult是不是众数
// for(int i = 0; i < numbers.size();i++)
// {
// if(numbers[i] == retsult)
// {
// times++;
// }
// }
// if(times > numbers.size()/2)
// return retsult;
// else
// return 0;
};