一、选择题
💦第1题:
以下程序的输出结果是()
#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
B
先定义一个长度为10的字符数组a[]和一个字符指针*p
p=a+8代表指针p向后偏移8个字节此时指针p指向'9', p-3后此时指针p指向6,
%s打印时遇到\0结束,所以会打印 6 ,7,8,9
💦第2题 :
以下程序的输出结果是()
#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";
}
}
A second third
B hello
C first second
D hellothird
D
x%2==1,所以会进入case1中,然后又是switch(y=3),所以会进入default打印hello.
但是这个switch(y)分支结束没有break,他会继续执行语句case2,所以再打印third.
所以会打印hellotyhird。
💦第3题 :
以下能对二维数组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}};
B
对于二维数组来说ta[][]第一个括号中的数表示行数,第二个[]表示列数。行数可以省略,列数不可以省略。在对数组中的数进行初始化时必须连续初始化,中间不能有间隔。
💦第4题 :
能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()
A return这二个数
B 形参用数组
C 形参用二个指针
D 用二个全局变量
A
A选项: return每次只能一个数据类型,只能放在一个数组或者容器里面返回出来,所以A错误
B选项 形参在使用数组的时候会传递数组的地址,然后将函数处理的结果放在数组当中,当函数调用完以后可以访问数组获取处理结果,B正确
C选项 形参用两个指针,然后两个指针在调用的时候需要传递两个地址变量,将对应的处理的结果放在对应的地址空间,然后可以根据指针访问处理结果,C正确
D选项 全局变量的作用域在整个文件中都是有效的,所以在处理完以后主调函数可以在全局域中访问到处理结果,所以D正确
💦第5题 :
int *p[4] 与选择项中的() 等价
A int p[4]
B int *p
C int *(p[4])
D int (*p)[4]
A
这题最重要的就是*和[]谁的优先级高,[]的优先级高,所以更规范的写法是int* (p[4])
C选项:这是一个指针数组,数组中存放的是int*类型的数据,数组的大小是4,正确。
D选项:是一个数组指针,指向包含4个元素的数组p[]的指针。
💦第6题 :
设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
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++);
D
键输一串字符abcdaidnacadc\n,统计一共输入多少字符。
A选项:输入的字符被ch接收然后和\n比较,不是n++,所以A正确。
B选项:这个就是青春版的A,B选项也可以。
C选项:如果A是P40的话,C就是mate40,两者型号不同,但是都可以。
D选项:初始化部分只会执行一次,所以此次循环只会获取一个字符,所以D错误。
💦第7题 :
以下代码
char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;
代码执行之后ptr指向的内容是?
A Compiler error B fg
C efg D defg
B
先解读一下代码,定义一个字符指针ptr,指针指向数组myString首元素a ,ptr+5代表ptr偏移5个字节指向f,所以是fg。
💦第8题 :
下面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 都不一样
C
const* :常量指针,指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
*const:指针常量,指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。
所以(1)(2)是常量指针,(3)是指针常量。选项C正确。
💦第9题 :
32位系统中,定义**a[3][4],则变量占用内存空间为()。
A 4
B 48
C 192
D 12
B
这个我们可以理解为是一个三行四列的数组,数组中存放的是指针类型。
1个指针类型是4个字节,3*4*4=48 。
💦第10题 :
假设在一个 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
B
此题是在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。
二、编程题
🌈第一题:字符串中找出连续最长的数字串
思路详解:
这个的大致思路是用判断字符是不是数字函数进行判定,如果是就++计数器count,同时将数字拼接到字符串Num上面,当循环到非数字字符上面时,更新最大数字长度计数器Max,一直保持Max记录的是最长数字字符串的长度,然后count在重新从0开始计数,知道一直循环到字符串遍历结束为止。
#include <iostream>
#include <string>
using namespace std;
string My_LongNum(const string& str)
{
int Max = 0; //记录最大数字串长度
int i = 0;
string tmp;
while (i<str.size())
{
int count = 0; // 记录当前数字串长度
string Num; //用来拼接数字串
while (isdigit(str[i]))
{
count++;
Num += str[i];
i++;
}
if (Max < count)
{
Max = count;
tmp = Num;
}
i++;
}
return tmp;
}
int main()
{
string str;
getline(cin, str);
cout << My_LongNum(str) << endl;
return 0;
}
🌈第二题:数组中出现次数超过一半的数字
思路详解:
其实这题的思路挺简单的,先整体进行排序,假设存在一个超过整体一半的数,我们把这个数命名为众数,那最中间的数一定是众数,所以我们取数组最中间的那个数,如果我们拿这个众数去一个一个抵消非众数,那最后剩下的一定是众数(因为众数超过一半)。所以我们就看消完后的那个数是不是中位数即可。
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;
}
else
return 0;
}
};