文章目录
- 一. 单选
- 1.有以下程序,程序运行后的输出结果是()
- 2. 以下哪个选项一定可以将flag的第二个bit置0()
- 3. 请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。
- 4.以下C语言指令:运行结果是什么?
- 5. 二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
- 6.根据下面递归函数:调用函数Fun(2),返回值是多少()
- 7.以下程序的输出结果是:
- 8.求函数返回值,输入x=9999
- 9.下列程序执行后,输出的结果为()
- 10.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()
- 二. 编程
一. 单选
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
二进制:101010b
八进制:0123
十进制:123
十六进制:0x123 123h
%d表示以十进制方式输出
%o八进制输出
%x十六进制方式输出
之前的0不用打印出来
2. 以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
正确答案:A
考察位运算
按位或 | :遇到1就是1
按位与&:遇到两个1才是1,不同就是0
按位异或^:遇到1就是1,两个相同都是1或都是0,就是0
假设falg = 10
0000 1010
~:1111 0101 取反
flag&=~2 ——flag = falg&(~2):0000 0000
置0一定采用的按位与
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在前:const修饰的是解引用的结果不能修改,即指向空间中的内容不能修改
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
&a指整个数组,+1就是跳过整个数组
a是数组首元素的地址
5. 二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
正确答案:A
方法一
:
不知道二维数组总共有多少行,每行有多少列:
假设:数组X的起始地址为start,总共有m行,n列
&X[4][4] = start+4n+4 = Oxf8b82140
&X[9][9] = start+9n+9 = Oxf8b8221c
求得start = n =
带入:
&X[7][7] = start+7*n+7 =
以上方法算术量太大
方法二
:
&X[4][4] = Oxf8b82140
&X[4][9] = Oxf8b82145
&X[9][9] = Oxf8b8221c
xX[4][9]和X[9][9]之间刚好相隔5行
Oxf8b8221c - Oxf8b82145 = 5n
十六进制数:a10 b11 c12 d13 e14 f15
21c - 145 = d7
5行中总共有d7个元素,即:1316+7 = 215
n = 43
&X[7][7] = &X[7][9] -2 = &X[4][9] +3*43-2 = Oxf8b821c4
注意加减之前要先将十进制数转换为十六进制数
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
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
数组名表示数组首元素地址,只有在&或sizeof之后才表示数组本身
想要指向指针就必须使用二级指针
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 = 7 111
1.count = 1,x = 7&6 = 110,x = 6
2.count = 2,x = 6&5 = 100,x =4
3.count = 3,x = 5&4 = 100,x =0
最终返回3
功能:返回x中总共有多少个1
9999:0010011100001111
8个1
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
cnt实际在统计,斐波那契递归总的次数
f0递归1次
f1递归一次
f2 f0+f1 = 1+1+1递归3次
f3 f2 +f1 = 1+3+1 = 5
f4 f3+f2 = 1+5+3 = 9
f5 f4+f3 = 1+9+5 = 15
f6 1+15+9 = 25
f7 1+25+15 = 41
f8 1+14+25 = 67
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
A:
4
2~4
4
1~4
16
B:
4
2+1
4
12
二. 编程
1. 计算糖果
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道
以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所
有题设条件。
输入描述:
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭
区间)。
输出描述:
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在
这样的整数A,B,C,则输出No
示例1:
输入
1 -2 3 4
输出
2 1 3
正确答案:
#include <iostream>
using namespace std;
int main() {
int a,b,c,d;
cin>>a>>b>>c>>d;
int A = (a+c)/2;
int B1 =(b+d)/2;
int B2 = (c-a)/2;
int C = (d-b)/2;
if(B1 != B2)
{
cout<<"No"<<endl;
}
else{
cout<<A<<" "<<B1<<" "<<C;
}
return 0;
}
// 64 位输出请用 printf("%lld")
2.进制转换
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10
用A表示,等等)
示例1:
输入
7 2
输出
111
正确答案:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s,table = "0123456789ABCDEF";
int m,n;
cin>>m>>n;
bool flag = false;
if(m<0)
{
m = -m;
flag = true;
}
if(m == 0) {
cout<<"0";
return 0;
}
while(m)
{
s = s+table[m%n];
m=m/n;
}
if(flag == true)
{
s += "-";
}
reverse(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")