目录
一、选择题
1、
以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 、是无限循环
B 、循环次数不定
C、 4次
D 、3次
答案:C
解释:
先复习一下 for循环的用法:
for(初始化部分;条件判断部分;调整部分)
{ // 循环体}
执行次数为 x = 0、1、2、3, x = 4 跳出循环,所以选择C
2、
以下程序的运行结果是()
intmain(void) { printf("%s , %5.3s\n", "computer", "computer"); return0; }
A 、computer , puter
B、 computer , com
C、 computer , computer
D 、computer , compu.ter
答案:B
解释:
每个字符串结尾都有一个默认的 ‘/0’,%s 打印遇到 ‘/0’ 就停止打印,所以第一 个 “computer” 会完整打印
先来解释一下通用的:%m.ns
m:输出字符串的宽度
n:左起截止目标字符串的 n个字符,并且是右对齐左边不够补空格
- 当 字符串长度 > n ,此时 m的作用失效了,直接截取 n个字符,并且是右对齐,左边不够补空格,格式输出宽度依旧为 m
- 当 字符串长度 < n ,作用和 %s 一样,遇到 ‘\0’ 就停止,会完整打印整个字符串
题目中的 %5.3s ,字符串长度8 > 3,5 的作用失效了,直接截取前 3个字符 ‘com’,格式输出宽度依旧为 5,右对齐,左边不够补空格,所以输出结果为:' com'
所以选择B
3、
下列main()函数执行后的结果为()
intfunc(){ inti, j, k=0; for(i=0, j=-1;j=0;i++, j++){ k++; } returnk; } intmain(){ cout<< (func()); return0; }
A 、-1
B、 0
C 、1
D、 2
答案:B
解释:
进入循环的条件是 j = 0,而 j 开始的值就为 -1,不满足循环条件,所以 k 依旧为 0,所以选择B
4、
下面程序输出是什么?
intmain() { inta=1,b=2,c=3,d=0; if(a==1&&b++==2) if(b!=2||c--!=3) printf("%d,%d,%d\n" ,a,b,c); elseprintf("%d,%d,%d\n" ,a,b,c); elseprintf("%d,%d,%d\n" ,a,b,c); return0; }
A 、1,2,3
B 、1,3,2
C、 3,2,1
D 、1,3,3
答案:D
解释:
上面的代码很乱,而且 if 语句还省略了缩进 {},我们看代码就容易出错
else 有最近匹配原则,所以 else会与它最近的 if 进行匹配
还有要注意一点:|| 逻辑或:任意一方为真就执行。左边表达式为真,右边的表达式就不会执行
如题 if(a == 1 && b++==2),表达式左边为真,右边的表达式就不会执行,-- 也就不会执行,所以选择D
5、
若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A、 char
B、 int
C 、double
D、 float
答案:C
解释:
'A’是char类型,占一个字节,范围是-128 ~ 127
a是int 类型, 占4个字节,范围是 -21亿 ~ 21亿
c是double类型,占8个字节,范围是2.310的308次方 ~ 1.710的308次方
不同类型运算会自动提升(向高位提升),即小范围 -> 大范围,最后转换为double类型,所以答案选C
6、
在
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
中,p[1][2]的值是()
A 、1
B、 0
C 、6
D 、2
答案:B
解释:
p 数组的每个大括号是一行,都没有进行完全初始化,没初始化的默认为0, p[][4] 第一个参数没给,这是可以的,有几行第一个参数就为几,数组下标从 0 开始
数组补充完如下
1 0 0 0
3 2 0 0
4 5 6 0
0 0 0 0
所以 p[1][2] = 0,标红色的,所以选择B
7、
选择表达式 11|10 的结果(本题数值均为十进制)()
A 、11
B 、10
C、 8
D、 2
答案:A
解释:
写出两个数的补码(正数的原码、反码、补码相同)
假设用8个 bit 表示:
11: 0000 1011
10 :0000 1010
| 按位或的规则:只有有一个为 1,结果 位 就为 1,其余情况为
转换为十进制就是 11,所以选择A
8、
fun(21)运行结果是()
1. int fun(int a){ 2. a^=(1<<5)-1; 3. return a; 4. }
A 、10
B、 5
C、 3
D 、8
答案:A
解释:
^ 运算符的规则为:相同为0,相异为1
a ^= b ---> a = a^b;
则 a ^= (1<<5)-1 ---> a = a ^ ((1<<5)-1)
1 << 5 就是 1 向左移动 5 个bit,0000 0001 ---> 0010 0000,十进制为32
最后 a = a ^ 31 ---> a = 21 ^ 31
最后转成十进制就是10,所以答案选A
9、
若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A、 *p+=1
B 、(*p)++
C、 ++(*p)
D、 *p++
答案:D
解释: 这里考察的是运算符的优先级
由图得知 * 的优先级大与 +=,
()
的优先级比 ++ 高++ 的优先级比 * 要高,没有对1009进行++,而是对指针++,所以选择D
10、
下面关于"指针"的描述不正确的是()
A、 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 、32位系统下任何类型指针的长度都是4个字节
C 、指针的数据类型声明的是指针实际指向内容的数据类型
D、 野指针是指向未分配或者已经释放的内存地址
答案:A
解释:
free指针只是把指向的空间销毁了 ,指针的值置空是要我们手动置空
32位指针的长度都是4个字节,64位下是8字节
再说一下造成野指针的三大原因
- 定义时,没有初始化
- free掉后,没有置空
- 越界访问使用指针
所以选择A
二、编程题
1、组队竞赛
题目链接:组队竞赛
思路分析:
- 首先对数据进行排序
- 然后进行分组,前面取一个后面取两个
- 然后对中间下标进行观察,可以发现规律
解题关键:如何进行分组(主要思路是贪心算法)
代码如下(C++):
usingnamespacestd; intmain() { intn=0; cin>>n; vector<int>arr; arr.resize(n*3); for(inti=0; i<arr.size(); ++i) { cin>>arr[i]; } sort(arr.begin(), arr.end()); longlongsum=0; for(inti=0; i<n; ++i) { sum+=arr[arr.size() -2*(i+1)]; } cout<<sum; return0; }
2、删除公共字符
题目链接:删除公共字符
思路分析:
- 使用哈希思想,定义一个数组,遍历 s2,把 s2 里面有的字符映射到数组上
- 再遍历 s1,比较为0就插入 ret 中,即不重复的字符
代码如下(C++):
usingnamespacestd; intmain() { strings1, s2; getline(cin, s1); getline(cin, s2); inthash[256] = {0}; for(inti=0; i<s2.size(); ++i) { hash[s2[i]]++; } stringret; for(inti=0; i<s1.size(); ++i) { if(hash[s1[i]] ==0) { ret+=s1[i]; } } cout<<ret; return0; }
----------------我是分割线---------------
Day_01完结,下篇即将更新