一、选择题:
1.
以下for循环的执行次数是()
for(int x = 0, y = 0; (y = 123) && (x < 4); x++);
A 是无限循环
B 循环次数不定
C 4次
D 3次
C
y=123为真,所以就循环四次。
2.
以下程序的运行结果是()
#include <stdio.h>
int main(void) {
printf("%s , %5.3s\n", "computer", "computer");
return 0;
}
A computer , puter
B computer , com
C computer , computer
D computer , compu.ter
B
%s:遇到\0就停止打印,而且常量字符串末尾是\0。
%m.ns:
m:输出字符串的宽度; n:左起截取n个字符,并且是右对齐,补空格。
%5.3s:
输出字符串的长度是5,左起截取3个字符,并且右对齐,但是还差两个字符,所以要在左边补两个空格。
3.
下列main()函数执行后的结果为()
int func(){
int i, j, k = 0;
for(i = 0, j = -1;j = 0;i++, j++){
k++;
}
return k;
}
int main(){
cout << (func());
return 0;
}
A -1 B 0
C 1 D 2
B
初始化部分i=0,j=-1;条件判断部分j=0为假,不进入循环,所以k=0
4.
#include <stdio.h>
int main()
{
int a=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);
else
printf("%d,%d,%d\n" ,a,b,c);
else
printf("%d,%d,%d\n" ,a,b,c);
return 0;
}
下面程序输出是什么
A 1,2,3 B 1,3,2
C 3,2,1 D 1,3,3
D
这个题考查的就是else和离他最近的if对应。对于第一个If,a==1,b==2为真,b+1=3,
进入第二个if语句b=3!=2为真并且不再进行或运算右边的操作了,所以打印的是1,3,3。
5.
若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()
A char B int
C double D float
C
自动提升,小->大
char -128~127
int -21亿~21亿
double 2.3*10-308~1.7*10308
由此可见double最大,所以在运算中char与int会自动提升为double
6.
在int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};中,p[1][2]的值是()
A 1 B 0
C 6 D 2
B
0 1 0 0
3 2 0 0 //是第一个0
4 5 6 0
0 0 0 0
7.
选择表达式 11|10 的结果(本题数值均为十进制)()
A 11 B 10
C 8 D 2
A
按位或运算|(有1就是1,全0才是0)
11: 1 0 1 1
10: 1 0 1 0
所以是1 0 1 1=11
8.
int fun(int a){
a^=(1<<5)-1;
return a;
}
fun(21)运行结果是()
A 10 B 5
C 3 D 8
A
1<<5---->等价于0000 0001左移5位,0010 0000=32
a^=(1<<5)-1--------->a=a^((1<<5)-1)----------> a=a^31
^按位异或操作--->相同为0相异为1
21: 0001 0101
31:^ 0001 1111
10: 0000 1010
9.
若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()
A *p+=1; B (*p)++;
C ++(*p) D *p++
D
A选项先对p解引用,也就是得到year,将year+=1,就从1009变成1010
B选项先对p解引用,也就是得到year,将year+=1,就从1009变成1010
C前置++和后置++在这里相同,同B
D这里++的优先级高于*,也就是p指针会先++,但因为这里是后置++,所以会解引用得到year也就是1009,然后再将指针++,所以我们的year根本就没有++
10.
下面关于"指针"的描述不正确的是()
A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
A
free释放掉一个指针内容后,只是销毁了指针所指向的空间,变成野指针,并没有对指针置空
二、编程题:
1.组队竞赛
思路分析:
- 队伍的水平值等于该队伍队员中第二高水平值,为了所有队伍的水平值总和最大的解法,也就是说每个队伍 的第二个值是尽可能大的值。所以实际值把最大值放到最右边,最小是放到最左边。
- 我们每次尽量取最大,但是最大的数不可能是中位数,所以退而求其次,取每组中第二大的。
- 例如 现在排序后 有 1 2 5 5 8 9 ,那么分组为1 8 9 和 2 5 5(先升序排列),这里就满足一个关系:arr[arr.length-2*(i+1)],可以带入5,8试一试。
源码:
#include<iostream> #include<algorithm> //这个头文件必须加,要不std的排序就报错 #include<vector> using namespace std; int main() { int n=0, m=0; cin>>n; vector<int> a; a.resize(n*3); //给容器开辟合适的空间 for (int i = 0; i < (3 * n); i++) { cin >> a[i]; } long long int sum = 0; std::sort(a.begin(), a.end()); for (int i = 0; i < n; i++) { sum+=a[a.size()-(2*(i+1))]; } cout << sum << endl; }
2. 删除公共字符
思路分析:
- 我们申请一个字符数组,用来代表256个字符,然后把数组2映射到字符数组中,只要是数组2中出现的字符就把对应位置标记为1,没有出现的字符标记为0.
- 然后我们可以通过查询数组1中的字符在数组中对应的位置是否为1,如果为1,则删除。
- 把所有位置上的数是0的全部相加到一个新数组上就行了。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1;
string str2;
getline(cin, str1); //cin如果遇到空格就会自动停止,所以用getline
getline(cin, str2);
char hashtable[256]={0};
for(size_t i=0;i<str2.size();i++) //先映射str2
{
hashtable[str2[i]]++; //str映射到hashtable上的位置数值
//只要不为0就可以
}
string ret; //新字符串来存储删除后的字符串
for(size_t i=0;i<str1.size();i++)
{
if( hashtable[str1[i]]==0)
{
ret += str1[i]; //把位置上不为0的字符全部想加
}
}
cout<<ret<<endl;
}