一、选择题
🌈第1题
有以下程序
#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
答案:C
解析:这个就是考%d, %o,%x是啥意思 .
%d:十进制打印,%o八进制打印,%x十六进制打印
这里的进制也有一些格式:
- 二进制格式:101011110b,二进制中数是0,1加一个b代表是二进制。
- 八进制格式:0123,八进制必须以0开始作为8进制标志且数不能超过8。
- 十进制格式:12479。
- 16进制格式:0x123,123h都是16进制的表示方法。
所以这个题里面m就是8进制数字, %o打印还是0123,而123则是10进制表示,十进制转8进制就是一直除8,这个就不算了。
🌈第2题:
以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2 B flag|=2
C flag^=2 D flag>>=2
答案:A
这个就是考三个按位操作符:按位与(&),按位或(|),按位异或(^)
- 按位与&: 有0则0,全1为1
- 按位或|:有1为1,全0为0
- 按位异或^: 相同为0,相异为1
那这个按位或不可以,flag第二位如果是1就一定不可以,所以只会用到按位与和异或。
我们算一下A: 2: 0000 0010,~2: 1111 1101
flag&=~2----->flag=flag&~2
xxxx xxyx
& 1111 1101 所以无论y是1还是0,flag第二位一定是0(有0则0). A选项正确,B选项排除。
C选项:y是1的话就不能,所以C选项也是错的。 D选项就不看了。
🌈第3题:
请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。
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;
答案:B
这个不还是指针常量和常量指针吗,老生常谈,更新的前三次中就重复了两次。
- 常量指针(const*):指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但是指针的指向可以发生改变。
- 指针常量(*const):指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值可以发生改变,可以通过指针解引用改变指针所指空间的值。
不分析了。
🌈第4题:
以下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
这个题中有一个概念必须弄明白:出现数组名时什么时候代表数组本身什么时候代表首元素地址。
如果数组名在&,sizeof(&A, sizeof(a) )之后代表数组本身,其他情况代表首元素地址。
也就是说&a也算一个地址,这个地址的类型是int(*)[5]的数组指针。
那给这个类型+1是不是直接跨越了一个完整数组,直接到9的下一位,所以此时p指向9的下一位。
所以*(a+1)是3,*(p-1)是9。
所以答案是C
🌈第5题:
二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存
储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
答案:A
xdm,这个题属实没看懂,就不讲了。
🌈第6题:
根据下面递归函数:调用函数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
答案:D
这个题一点技术含量都没有
2*Func(30=)=2*2*Func(4)=2*2*2*Func(5)=4*4=16
🌈第7题:
以下程序的输出结果是:
#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
数组名代表首元素地址,*a就代表首元素morning的地址,而morning的类型是char*
p必须使用指针,因为此时a已经是一级指针了。
被调到func函数中,++m,此时指针就往后面偏移了一个元素,指向afternoon,注意啊不是单单指向一个字符。所以再对m解引用后是afternoon。
🌈第8题:
求函数返回值,输入x=9999
int func(int x){
int count=0;
while (x)
{
count++;
x=x&(x-1);//与运算
}
return count;
}
A 8 B 9
C 10 D 12
答案:A
高中做过找规律的题把,这个也是找规律。
- 先输入一个x=8试试水,进入循环count++,count=1;8:1000,7:0111--------->8&7=0000,所以count=1,此时x转换为二进制数中的1个数是1,count是1。
- 再令x=7,count=1,7&6=0110=6 ;count+1=2,,6&5=0100=4;count+1=3,4&3=0;跳出循环。
- 看这两个结果,如果说x转换为2进制数,这个数中有几个1那么count就是几。
- 所以把9999转换为二进制:10011100001111,8个1,所以count是8。
🌈第9题:
#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);
}
下列程序执行后,输出的结果为()
A 41 B 67
C 109 D 177
答案:B
单纯考递归的,上面有解析,这个就是直接带入套的。
🌈第10题:
在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
答案:C
这个考的是内存对齐
我们就简单说个sizeof(A)
二、编程题
🌈1.计算糖果
这个思路很是简单:
我家上二年级的大侄子都会,带入硬解呗。
#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; }
🌈2.进制转换
思路解析:
- 这个题的思路不难,也可以用到很是简单来描述。
- 十进制转化为N进制就用M模N并且得到一个数,把这个数存到一个新的字符串中,
- 然后用M/N,转入下一轮计算,然后继续M%N,一直进行循环,直到M/N=0结束。
- 再把存到新数组中的;每个数字进行逆序就是所求进制数了。
- 这个题中值得注意的是负数的情况。
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s = "",table = "0123456789ABCDEF"; int m, n; cin>>m>>n; //注意当m<0的时候 bool flag = false; if(m < 0) { m = -m; flag = true; } //注意当m=0的时候 if(m == 0) { s = "0"; } while(m) { s += table[m%n]; m /= n; } if(flag == true) { s += '-'; } //逆置字符串 :3 2 1 - reverse(s.begin(), s.end()); cout<<s<<endl; }
xdm,用函数reverse进行排序一定要加头文件#include<algorithm>