
6月Gesp三级真题解析
原题在:https://gesp.ccf.org.cn/101/1010/10092.html ,C++六月认证三级真题
不是专业人士,可能会有错误,欢迎指出 :)
选择题
1
高级语言是一种独立于机器,面向过程或对象的编程语言,相对于汇编语言和机器语言而言,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。常见的高级语言有C/C++,易语言,Java等。
高级语言需要通过编译成执行平台中可识别的执行文件才可以执行
所以选D
2
二进制转换十进制方法:
二进制1010 转十进制
转换公式:(1010)= (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰) = (10)
从右到左用二进制的每个数去乘以2的相应次方(次方从0开始),再将其每个数进行相加。
先看整数部分,二进制11的十进制是3
再看小数部分,跟整数部分差不多,但是乘的方变成了负数
如0.01二进制转十进制
然后整数部分和小数部分加起来,就是3+0.25=3.25
所以选D
3
Ascii编码只需要记住两个主要的就行,大写字母A编码为65,小写字母a为97,剩下的往后推就行,比如大写字母B就为66
大写F字母的Ascii值就为70
10进制转换其他进制就毕竟简单,十进制70转16进制方法:
70/16=4....6
4/16=0....4
反向读余数,就是46。
所以选A
4
C++的各种运算符
算术运算符:+,-,*,/,%(取模)。
关系运算符:==,!=,>,<,>=,<=。
逻辑运算符:&&(逻辑与),||(逻辑或),!(逻辑非)。
位运算符:&(按位与),|(按位或),^(按位异或),~(按位取反),<<(左移),>>(右移)。
赋值运算符:=,+=,-=,*=,/=,%=。
杂项运算符:sizeof(返回数据类型的大小),&(返回变量的地址),*(指针变量)。
所以选D
5
数组str的长度为6。因为字符串中还有一个空字符’\0’。
所以选C
6
在C++中,int类型的长度为4个字节,char类型的长度为1个字节,double类型的长度为8个字节。
3×8=24
所以选A
7
所以选B
8
所以选B
9
A. 数组必须先定义后使用。这是正确的。
B. 数组的所有元素在内存中是连续存放的。这也是正确的。
C. 除了字符数组,在定义数组时“[]”内必须有常数。这个选项不正确。在定义数组时,除了字符数组,数组的“[]”内必须有常数。
D. 不能对数组赋值,但可以对数组的每个基础类型的元素赋值。这也是正确的。
所以选C
10
...
11
首先排除B和D,主要看A和C
A选项如果a=4,b=3,会输出a=b,所以A不对,答案就是C
所以选C
12
直接上运行
所以选A
13
这道题每次都考,原理就是用按位异或交换两个变量的值,如
b = a ^ b;
a = a ^ b;
b = a ^ b;
所以选B
14
这道题选D,以上都不对
15
首先排除A,全部加上就等于31,然后就是上运行了,所以选B
选择题完
判断题
编程题
1.春游
【问题描述】
老师带领同学们春游。已知班上有N位同学,每位同学有从0 到N−1的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗?
【输入描述】 输入包含 2 行。第一行包含两个整数N和M,表示班级有N位同学,同学们共有M次报出编号。约定 2 ≤ N, M ≤ 1000。 第二行包含M个整数,分别为M次报出的编号。约定所有编号都在合理范围内。
【输出描述】 输出一行。如果所有同学都到达,则输出N;否则由小到大输出所有未到达的同学编号,空格分隔。
【样例输入 1】 3 3 0 2 1
【样例输出 1】 3
【样例输入 2】 3 5 0 0 0 0 0
【样例输出 2】 1 2
我的代码:
int main(){
bool arr[1000];
int n,m;
cin>>n>>m;
for(int i=0;i<1000;i++){
arr[i]= false;
}
int code;
for (int i=0;i<m;i++){
cin>>code;
arr[code]= true;
}
bool all= true;
for (int i=0;i<n;i++){
if(!arr[i]){
if (all){
cout<<i;
all= false;
}else{
cout<<" "<<i;
}
}
}
if (all){
cout<<n;
}
return 0;
}
2.密码合规检测
【问题描述】 网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求: 1、只能由 a-z 之间 26 个小写字母、A-Z 之间 26 个大写字母、0-9 之间10个数字以及!@#$四个特殊字符构成。 2、密码最短长度:6 个字符,密码最大长度:12 个字符。3、大写字母、小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
【输入描述】 输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
【输出描述】 输出若干行,每行输出一组合规的密码。 输出顺序以输入先后为序,即先输入则先输出。
【样例输入 1】 seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!
【样例输出 1】 seHJ12!@ sjdkffH$123
【样例解释 1】 输入被英文逗号分为了四组被检测密码:“seHJ12!@”、“sjdkffH$123”、“sdf!@&12HDHa!”、“123&^YUhg@!”。其中,“sdf!@&12HDHa!”长度超过12个字符,不合规;“123&^YUhg@!”包含四个特殊字符之外的字符“^”,不合规。
我的代码:
bool check(string a){
// string a="123&^YUhg@!";
bool ts= false,lit= false,lar= false,num= false,lenq= false,out= true;
if (a.length()>=6 and a.length()<=12){
lenq= true;
}
for (int i=65;i<65+26;i++){
if (a.find(char(i))<=a.length()){
lar= true;
break;
}
}
for (int i=97;i<97+26;i++){
if (a.find(char(i))<=a.length()){
lit= true;
break;
}
}
for (int i=48;i<=57;i++){
if (a.find(char(i))<=a.length()){
num= true;
break;
}
}
if ((a.find(char(33))<=a.length()) or (a.find(char(64))<=a.length()) or (a.find(char(35))<=a.length()) or (a.find(char(36))<=a.length())){
ts= true;
}
for(int i=1;i<=a.length();i++){
if(((int)a[i]>=97 and (int)a[i]<=122) or ((int)a[i]>=64 and (int)a[i]<=90) or ((int)a[i]>=48 and (int)a[i]<=57) or (int)a[i]==35 or (int)a[i]==36 or (int)a[i]==33 or (int)a[i]==64 or a[i]=='\0'){
}else{
out= false;
}
// cout<<(int)a[i]<<endl;
}
if ((out and lenq and ts) and ((lit and lar) or (lit and num) or (lar and num))){
return true;
}else{
return false;
}
}
int main(){
char line[101];
cin>>line;
string tmp="";
for (int i=0;line[i]!='\0';i++){
if (line[i]!=','){
tmp+=line[i];
}else{
if(check(tmp)){
cout<<tmp<<endl;
tmp="";
}
}
}
}
- 感谢你赐予我前进的力量