2023 年12 月 GESP C++ 四级试卷解析

1.  单选题(每题 2 分,共 30 分)
1 下面有关函数参数的说法,正确的是 ( )
A. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中 的参数值不变。
B. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中 的参数值将随子函数一样改变而改变。
C. 函数参数传递时,主函数如果将参数的地址传递给子函数,若子函数将参数值改变,主函数当中的参数值将 不改变。
D. 函数参数传递可以不满足子函数的参数个数要求。
答案:【A】
   
2 下面 C++ 代码执行后,输出的是( )。
A. chen
B. c
C. chen a dai
D. dai
答案:【B】
     
3 下面 C++ 代码最后执行后输出是( )。
A. 1
B. 2
C. 3
D. 4
答案:【D】
    
4 下面 C++ 代码执行后的结果是( )
答案:【C】
     
5 下面 C++ 代码执行后输出是( )。
A. 1,2,3
B. 1
C. 2
D. 3
答案:【C】
      
6 如果变量 x 的地址是 0x6ffe14, 下面 C++ 代码执行以后输出的是( )。
A. 0x6ffe11
B. 0x6ffe14
C. 0x6ffe18
D. 0x6ffe15
答案:【C】
    
7 C++ , 执行下面代码后,输出的是( )。
A. 400
B. 200
C. 20
D. 100
答案:【A】
     
8 下列 C++ 语句执行以后结果是 true 的是( )。
A. 3&&false
B. 5&&2
C. 101&&000
D. 4&true
答案:【B】
    
9 在如下的 C++ 代码中实现了对字符串中出现的 26 个字母的个数统计,横线处应填入是( )。
A. alpha[i]=alpha[i-1]+1;
B. alpha[i]=alpha[i]+1;
C. alpha[i+1]=alpha[i]+1;
D. alpha[i-1]=alpha[i]+1;
答案:【A】
    
10 下面 C++ 代码执行后生成的文件其字节数为( )。
A. 10
B. 16
C. 40
D. 24
答案:【A】
   
11 下列 C++ 代码输入 1,2,3,4 ,执行后,将输出的是( )。
A. 1#4#
B. 1#3#
C. 1#2#3#4#
D. 1#2#3#4
答案:【D】
  
  
12 以下 C++ 代码用于实现每个整数对应的因数,如输入 12 ,则输出 1 2 3 4 6 12 ;如输入 18 ,则输出 1 2 3 6 9 18 。横线处应填入代码是( )。
A. if(n%i==0) 题号 1 2 3 4 5 6 7 8 9 10
答案
B. if(n/i==0)
C. if(n%i!=0)
D. if(n/i!=0)
答案:【A】
    
13 某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动
选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。( )
A. 麦克风
B. 扬声器
C. 油量表
D. 传感器
答案:【C】
  
14 现代计算机是指电子计算机,它所基于的是( )体系结构。
A. 艾伦 · 图灵
B. · 诺依曼
C. 阿塔纳索夫
D. 埃克特 - 莫克利
答案:【B】
  
  
15 输入一个正整数 N ,想找出它所有相邻的因数对,比如,输入 12 ,因数对有 (1,2) (2,3) (3,4) 。下面哪段代
码找不到所有的因数对?( )
A. for(i=1;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
B. for(i=2;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
C. for(i=2;i<N/2;i++) if(!(N%(i-1)) && !(N%i)) printf("(%d,%d)\n", i-1, i);
D. for(i=1;i<N/2;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
答案:【B】
  
2 判断题(每题 2 分,共 20 分)
   
  
1 C++ 的内置函数 sort() 支持数组的局部排序。例如 int a={10,9,8,7,6,5,4,3,2,1} ,可以用
sort(a,a+5) , 排序成 {6,7,8,9,10,5,4,3,2,1} 。( )
答案:【T】
      
  
2 用递归法求n的阶乘,时间复杂度是O(n)。
答案:【T】
     
3 [(1,2)*2]*3 C++ 中是合法的表达式。( )
答案:【F】
     
4 在下面的 C++ 代码中,将对 1.txt 文件写入 hello 。( )
答案:【F】
      
5 文本文件 1.txt 1 行由 01234 5 个字符组成其间没有空格,当用 C++代码正常打开文件成功并执行如下 代码以后,第 1 行长度为 5 ( )
答案:【F】
   
6 执行 C++ 代码 cout<<(5||2); 后将输出 1 。( )
答案:【T】
    
7 C++ 中,两个字符串相加的运算符为 + 相当于字符串的合并运算。下面 C++代码执行后,将输出 chenadai 。( )
答案:【T】
    
8 C++ 内置函数 sort() 可以对整数、浮点数、字符数组进行从大到小,从小到大,局部排序。( )
答案:【T】
     
9 小杨最近在准备考 GESP ,他用的 Dev C++ 来练习和运行程序,所以 Dev C++ 也是一个小型操作系统。( )
答案:【F】
  
10 任何一个 while 循环都可以转化为等价的 for 循环( )。
答案:【T】
     
3 编程题(每题 25 分,共 50 分)
3.1
编程题 1
试题名称 :小杨的字典
时间限制 1.0 s
内存限制 128.0 MB
3.1.1
问题描述
在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言: A 语言和 B 语言。小杨是 B 国的翻译官,他的工 作是将 A 语言的文章翻译成 B 语言的文章。
为了顺利完成工作,小杨制作了一本字典,里面记录了 个 A 语言单词对应的 B 语言单词,巧合的是,这些单词都 由地球上的 26 个小写英文字母组成。
小杨希望你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-[]{}\|;:'",./? <> 和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割,你的程序需要把这段话中的所有 A 语言 单词替换成它的 B 语言翻译。特别地,如果遇到不在字典中的单词,请使用大写 UNK 来替换它。
例如,小杨的字典中包含 2 A 语言单词 abc d ,它们的 B 语言翻译分别为 a def ,那么我们可以把 A 语言文章 abc.d.d.abc.abcd. 翻译成 B 语言文章 a.def.def.a.UNK. ,其中,单词 abcd 不在词典内,因此我 们需要使用 UNK 来替换它。
3.1.2
输入描述
第一行一个整数 ,表示词典中的条目数。保证N<=100。
接下来 行,每行两个用单个空格隔开的字符串A, B,分别表示字典中的一个 A 语言单词以及它对应的 B 语言翻 译。保证所有 不重复;保证A 和B 的长度不超过10 。
最后一行一个字符串 ,表示需要翻译的 A 语言文章。保证字符串S 的长度不超过1000,保证字符串 S只包含小写 字母以及标点符号 !()-[]{}\|;:'",./?<>
3.1.3
输出描述
输出一行,表示翻译后的结果。
3.1.4
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。
3.1.5
样例输入 1
2
abc a
d def
abc.d.d.abc.abcd.
样例输出 1
a.def.def.a.UNK.
样例输入 2
3
abc a
d def
abcd xxxx
abc,(d)d!-abc?abcd
样例输出 2
a,(def)def!-a?xxxx
样例输入 3
1
abcdefghij klmnopqrst
!()-[]{}\|;:'",./?<>abcdefghijklmnopqrstuvwxyz
样例输出 3
!()-[]{}\|;:'",./?<>UNK
   
直接模拟即可
参考程序
#include<iostream>
using namespace std;
string a[110],b[110]; 
int main(){
	int n,flag=0; //判断当前字符前是否存在单词 
	string s,s1="";
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
	}
	cin>>s;	  
	for(int i=0;i<s.size();i++){
		if(s[i]>='a'&&s[i]<='z'){
			s1+=s[i];  //拼接 
		}else{ //不是字母 
			if(s1!=""){ //当前字符前有单词 
				string w="UNK";
				//查找单词并替换 
				for(int j=1;j<=n;j++){
					if(a[j]==s1){
						w=b[j];
						break;
					}
				}
				cout<<w;				
				s1=""; //清空
			}
			cout<<s[i]; //输出当前非字母字符 
		}
	}
	//字符串s可能是以单词结尾,做一下特判,输出最后一个单词 
	if(s1!=""){
		string w="UNK";
		//查找 
		for(int j=1;j<=n;j++){
			if(a[j]==s1){
				w=b[j];
				break;
			}
		}
		cout<<w;				
		s1="";
	}
	return 0;
}

      

3.2
编程题 2
试题名称 :田忌赛马
时间限制 1.0 s
内存限制 128.0 MB
3.2.1
问题描述
你要和田忌赛马。你们各自有N 匹马,并且要进行 N轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。 你的马匹的速度分别为u1,u2,...,un,,田忌的马匹的速度分别为v1,v2,.....vn。田忌会按顺序派出他的马匹,请问 你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
3.2.2
输入描述
第一行一个整数 。保证1<=N<=5*10^4。
接下来一行 个用空格隔开的整数,依次为u1,u2,...,un,表示你的马匹们的速度。保证1<ui<=2N。
接下来一行 个用空格隔开的整数,依次为v1,v2,.....vn,表示田忌的马匹们的速度。保证1<=vi<=2N。
3.2.3
输出描述
输出一行,表示你最多能获胜几轮。
3.2.4
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。
3.2.5
样例输入 1
3
1 3 5
2 4 6
3.2.6
样例输出 1
2
3.2.7
样例解释 1
1 轮,田忌派出速度为2 的马匹,你可以派出速度为3 的马匹迎战,本轮你获胜。
2 轮,田忌派出速度为4 的马匹,你可以派出速度为5 的马匹迎战,本轮你获胜。
3 轮,田忌派出速度为6 的马匹,你可以派出速度为 1的马匹迎战,本轮田忌获胜。
如此,你可以赢得 2 轮比赛。
3.2.8
样例输入 2
5
10 3 5 8 7
4 6 1 2 9
3.2.9
样例输出 2
5
贪心:
贪心策略
对两组马按照速度从小到大排序,排序后,分以下三种情况:
1.如果你最快的马快与田忌最快的马,直接比较,赢一局,既然最快的能赢,那肯定要消耗掉田忌最快的马。
2.如果你最慢的马比田忌最慢的马快,这就意味着所有的马都可以赢下田忌最慢的马,那就让最慢的马和田忌最慢的马去比,赢一局。
3.除以上两种情况外,就用最慢的马去消耗田忌最快的马,因为如果条件1不成立,那么你的任何一匹马都赢不了田忌最快的马,同时条件2也不成立,那么你最慢的马也不可能赢田忌的任何一匹马,此时用你最慢的马消耗田忌最快的马最优。
参考程序
#include <bits/stdc++.h>

using namespace std;
int a[50010],b[50010];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)  cin>>a[i];
	for(int i=1;i<=n;i++)  cin>>b[i]; 
	
	sort(a+1,a+1+n); //从小到大排序 
	sort(b+1,b+1+n);
	int ans=0;
	int l1=1,r1=n;
	int l2=1,r2=n;
	while(l1<=r1){
		if(a[r1]>b[r2]){ //本方最大的能赢对方最大的 
			ans++;
			r1--;
			r2--;
		}
		else if(a[l1]>b[l2]){ //本方最小的能赢对方最小的 
			ans++;
			l1++;
			l2++;
		}
		else { //注意又有可能a[l1]==b[r2] ,本题没有
			if(a[l1]<b[r2]){ //本方最小的消耗对方最大的 
			//	ans--;	 
			}
			l1++;
			r2--;
		}
	}
	cout<<ans;
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值