25-26-1-计算导论与程序设计-期末(信息与通信工程学院)
目录
注:本试题为机考试题,无法供笔试参考。
一、电商优惠
某电商推出优惠活动。规定,如果某订单商品总价大于等于300元,则免100元;如果订单商品总价大于等于200元但小于300元,则免75元;如果订单商品总价大于等于100元但小于200元,则免30元。现某订单共4件商品,请你算一下该订单实付多少(不含邮费)。
输入格式:
只有一行,为四个用空格分隔的正整数,代表4件商品的价格。
输出格式:
也只有一行,为一个整数,代表客户实际需要支付的钱数(不含邮费)。测试用例保证输入合法,且所有整数可以用int型存储。
输入样例:
11 22 33 44
输出样例:
80
答案 / 解析
参考代码:
#include <iostream>
int main() {
int total=0;
for (int i=0; i<4; i++) {
int price;
std::cin >> price;
total += price;
}
if (total>=300) total-=100;
else if (total>=200) total-=75;
else if (total>=100) total-=30;
std::cout << total << std::endl;
return 0;
} 二、大小写转换
现有一个长度不超过100的字符串,该字符串只包含ascii可视字符。请写一段程序将其中的大写字母全部转换为对应的小写字母,小写字母全部转换为对应的大写字母。
输入格式:
只有一行以回车换行符’\n’结尾的字符串,为待处理字符串。测试用例保证输入合法。
输出格式:
也只有一行,为转换后的对应字符串。
输入样例:
HelloWorld!
输出样例:
hELLOwORLD!
答案 / 解析
可能检测点:空字符串、长度为100的字符串、包含空格’ ‘的字符串等。
参考代码:
#include <iostream>
#include <string>
int main() {
std::string str="";
getline(std::cin, str);
for (int i=0; i<str.size(); i++) {
if (str[i] >= 'a' && str[i] <= 'z') str.at(i)-=32;
else if (str[i] >= 'A' && str[i] <= 'Z') str.at(i)+=32;
}
std::cout << str << std::endl;
return 0;
} 三、女排世界杯
女排世界杯(Women’s World Cup)是世界杯排球赛(FIVB World Cup)的女子组比赛,是由国际排联(FIVB)举办的三大赛之一,前身是“日本杯”,1965年国际排联举办世界杯排球赛,1973年举办首届女排世界杯。每四年一届,1991年时提前两年在奥运会前一年举办并作为奥运会的预选赛,世界杯前三名直接进入次年奥运会。1977年开始由日本永久买断世界杯男女排球赛的举办权。
2015年女排世界杯是由国际排联(FIVB)举办的第12届世界杯赛事,比赛于8月22日至9月6日在日本举行,共有12支参赛队伍,前两名直接获得2016年里约奥运会的入场券。2015年9月6日,在女排世界杯最后一轮比赛中,中国女排以3-1力克东道主日本女排,时隔12年获得第4个世界杯冠军,这是中国女排的第8个世界冠军(包括奥运会),也是自2004年雅典奥运会之后获得的第一个世界冠军。
2019年,中国女排再次出征日本。初战横滨,中国队横扫俄罗斯和日本,前五场一局未失。转战札幌,中国队3比2从容击退巴西队的有力挑战,3比0战胜美国队,扫清了夺冠路上最大的两个障碍。决战大阪,中国队连克两大欧洲劲敌荷兰和塞尔维亚,提前一轮锁定了队史上第五座世界杯奖杯,也是中国女排三大赛的第十冠!
赛制说明:
2019年仍然采用单循环赛制,每支球队将进行11场比赛,最后根据胜场积分等排出最终名次。本届世界杯的积分规则与上届相同:在比赛中以3-0或者3-1取胜的球队积3分,负队积0分;在比赛中以3-2取胜的球队积2分,负队积1分。最终大循环结束后,根据胜场排定最终名次。
倘若两支或两支以上的球队胜场相同,那将通过比较积分、局分、小分以及直接的胜负关系这样的先后顺序排定名次。具体情况为:倘若胜场相同,则首先比较积分,积分多的球队排名靠前;倘若胜场和积分均相同,则需要比较局分,胜局与负局比值高的球队排名靠前;
倘若胜场、积分和局分比值均相同,则需要比较小分,总得分与总失分比值高的球队排名靠前;倘若胜场、积分、局分和小分比值均相同,则最终通过直接比较球队之间的胜负关系,胜队排名靠前。 现在就请你写一段程序,用来计算某轮比赛过后某队的积分情况。
输入格式:
第一行为一个整数T(0<T<12),代表该队已参加了T轮比赛。后边是T行数据,每行数据为两个用空格分隔的整数,代表该队每轮的比赛情况。如3 0代表该队3比0获胜,0 3代表该队0比3失利等等(测试用例保证所有输入数据合法)。
输出格式:
只有一行,为一个整数,即该队T轮过后的积分。
输入样例:
11
3 1
3 0
0 3
3 1
3 0
3 0
3 0
3 0
3 0
3 1
3 1
输出样例:
30
答案 / 解析
参考代码:
#include <iostream>
int main() {
int sum=0, n;
std::cin >> n;
for (int i=0; i<n; i++) {
int team, opponent;
std::cin >> team >> opponent;
if (team == 3) {
if (opponent == 0 || opponent == 1) sum+=3;
if (opponent == 2) sum+=2;
}
else if (team == 2) sum+=1;
}
std::cout << sum << std::endl;
} 四、哥德巴赫猜想
哥德巴赫猜想中写到,一个充分大的偶数(大于等于4),它可以分解为两个素数之和。你的任务是用计算机简单验证哥德巴赫猜想,已知一个偶数n(大于等于4),将它分解为两个素数的所有可能情况打印出来。
输入格式:
只有一行,为一个偶数n(4≤n≤10000),代表待验证的偶数。
输出格式:
若干行,为偶数分解为两个素数之和的所有可能情况,每种情况占一行。输出顺序为第一个素数较小的先输出,具体格式见样例。
输入样例:
66
输出样例:
5 and 61
7 and 59
13 and 53
19 and 47
23 and 43
29 and 37
答案 / 解析
可能检测点:质因数包含2的数(如4)等。
参考代码:
#include <iostream>
bool isPrime(int n);
int main() {
int evenNum;
std::cin >> evenNum;
for (int i=2; i<=evenNum/2; i++) {
if ((isPrime(i) && isPrime(evenNum-i))) std::cout << i << " and " << evenNum-i << std::endl;
}
return 0;
}
bool isPrime(int n) {
if (n==0 || n==1) return false;
if (n==2) return true;
for (int i=2; i*i<=n; i++) {
if (n % i == 0) return false;
}
return true;
} 五、校园歌手大赛二
某校园歌手大赛要通过投票的方式评出十佳歌手。票分两种,一种为专家票(专家评委投的),一种为观众票(观众投的)。无论是专家票还是观众票上边最多都只能依次写三位歌手的名字,分别表示投票者认为这三位歌手可以获得本次比赛的第一名,第二名和第三名。歌手的排名规则为,1、每得到一位观众投的第一名的票积7分,每得到一位观众投的第二名的票积4分,每得到一位观众投的第三名的票积2分;2、每得到一专家评委投的第一名的票积400分,每得到一专家评委投的第二名的票积200分,每得到一专家评委投的第三名的票积100分;3、积分多的排名考前。先请你写一段程序来计算各选手的排名情况。
输入格式:
第一行为一个整数N(1<=N<=10),代表参赛歌手的人数。后边是N行,是每个歌手的数据。每行的格式都是一样的,为一个字符串和6个整数。字符串代表选手的名字,6个整数依次代表观众投该选手为第一名的票数、观众投该选手为第二名的票数、观众投该选手为第三名的票数、专家投该选手为第一名的票数、专家投该选手为第二名的票数及专家投该选手为第三名的票数。注:字符串长度不超过20,每位选手总积分可以用int型存储。
输出格式:
共N行,按选手排名从高到低每行输出一位选手的信息。测试数据保证合法且没有积分相同的选手。
输入样例:
3
Zhang 234 346 279 3 7 4
Wang 216 257 358 10 0 9
Zheng 292 279 371 4 7 4
输出样例:
Wang 216 257 358 10 0 9
Zheng 292 279 371 4 7 4
Zhang 234 346 279 3 7 4
答案 / 解析
可能检测点:人数为1、人数为10、名字长度为0、名字长度为20等
参考代码:
#include <iostream>
#include <string>
#include <algorithm>
const int arraySize = 10;
class Student {
public:
std::string name="";
int scores[6]={0};
int sum;
};
Student stu[arraySize];
int main() {
int n;
std::cin >> n;
for (int i=0; i<n; i++) {
std::cin >> stu[i].name;
for (int j=0; j<6; j++) std::cin >> stu[i].scores[j];
stu[i].sum = stu[i].scores[0] * 7 + stu[i].scores[1] * 4 + stu[i].scores[2] * 2 + stu[i].scores[3] * 400 + stu[i].scores[4] * 200 + stu[i].scores[5] * 100;
}
int pos = arraySize - 1;
while(pos) {
int bound = pos;
pos = 0;
for (int i=0; i<bound; i++) {
if (stu[i].sum < stu[i+1].sum) {
std::swap(stu[i], stu[i+1]);
pos = i;
}
}
}
for (int i=0; i<n; i++) {
std::cout << stu[i].name << ' ';
for (int j=0; j<6; j++) {
if (j!=0) std::cout << ' ';
std::cout << stu[i].scores[j];
}
std::cout << std::endl;
}
}