海南热带海洋学院18级C语言期末考试PAT编程题


写给19届的学弟学妹们


7-1 射击成绩

在这里插入图片描述
上图是 10m 气手枪靶纸。10 环的直径为 11.5mm,9 环的直径为 27.5mm,8 环的直径为 43.5mm。7~10 环区为黑色,直径为 59.5mm,外环直径为 155.5mm。1~6 环区直径差均为常数。

当所有环线标记都被擦除,你还能否判断成绩?

输入格式:

输入在一行中给出一个选手射击的点到靶心的直线距离,以微米(10​−3毫米)为单位。

输出格式:

根据输入的距离,输出该选手得到的环值。注意:脱靶计 0 分。

输入样例 1:
13100
输出样例 1:
9
输入样例 2:
29750
输出样例 2:
7
输入样例 3:
78000
输出样例 3:
0

思路:很简单的方法是用if语句单个判断,需要注意的是要题中给的是直径不是半径,而题中要求输入的数是半径。

参考代码:

#include <stdio.h>

int main()
{
	int length; //距离圆心的距离
	int d=(155500-59500)/6; //1~6环的等距(在判断时要除以2)
	scanf("%d",&length);
	if(length>=0&&length<=11500/2)	//10环,判断时记得除以2
		printf("10\n");
	else if(length>11500/2&&length<=27500/2)	//9话
		printf("9\n");
	else if(length>27500/2&&length<=43500/2)	//8环
		printf("8\n");
	else if(length>43500/2&&length<=59500/2)	//7环
		printf("7\n");
	else if(length>59500/2&&length<=(59500+d)/2)	//6环
		printf("6\n");
	else if(length>(59500+d)/2&&length<=(59500+2*d)/2)	//5环
		printf("5\n");
	else if(length>(59500+2*d)/2&&length<=(59500+3*d)/2)	//4环
		printf("4\n");
	else if(length>(59500+3*d)/2&&length<=(59500+4*d)/2)	//3环
		printf("3\n");
	else if(length>(59500+4*d)/2&&length<=(59500+5*d)/2)	//2环
		printf("2\n");
	else if(length>(59500+5*d)/2&&length<=(59500+6*d)/2)	//1环
		printf("1\n");
	else	//脱靶
		printf("0\n");
	return 0;
}

7-2 教超销量

“教育超市”是拼题 A 系统的一个衍生产品,发布了各种试卷和练习供用户选购。在试卷列表中,系统不仅列出了每份试卷的单价,还显示了当前的购买人次。本题就请你根据这些信息计算教育超市所有试卷的总销量(即购买人次的总和)和销售额。

输入格式:

输入首先在第一行中给出一个正整数 N(≤100),随后 N 行,每行给出一份卷子的单价(为不超过 100 的正整数)和购买人次(为不超过 10​4的非负整数)。

输出格式:

在一行中输出总销量和总销售额,其间以一个空格分隔。

输入样例:
4
39 10
19 38
9 332
95 7
输出样例:
387 4765

思路:……看代码吧
参考代码:

#include <stdio.h>

int main()
{
	int n,a,b;
	int cnt_money=0,cnt=0; //总销售额,总销售量
	scanf("%d",&n);	//每种试卷
	for(int i=0;i<n;i++){	//循环n次
		scanf("%d%d",&a,&b);	//输入单价和数量
		cnt+=b;	//总销售量
		cnt_money+=a*b;	//总销售额
	}
	printf("%d %d\n",cnt,cnt_money);
	return 0;
}

7-3 投票

本题请你实现一个简单的投票统计工具:投票同意的人输入 1,反对的人输入 0。简单多数胜。

输入格式:

输入在一行中给出一系列的投票值,1 表示同意,0 表示反对,-1 表示结束。

输出格式:

统计并输出投票的结果:如果同意的人多就输出 Yes;反对的人多就输出 No;平票就输出 Tie。然后在第二行输出同意的人数和反对的人数,其间隔 1 个冒号 :。

输入样例 1:
1 0 0 1 1 -1
输出样例 1:
Yes
3:2
输入样例 2:
0 0 0 1 -1
输出样例 2:
No
1:3
输入样例 3:
1 1 1 0 0 0 -1
输出样例 3:
Tie
3:3

思路:定义一个数组a[2]用来存放投票,a[0]表示反对,a[1]表示同意,要记得对数组进行初始化,如果投票是0则a[0]++,如果是1则a[1]++,-1则退出。
参考代码:

#include <stdio.h>

int main()
{
	int a[2]={0},x;	//初始化a
	while(1){	//循环输入
		scanf("%d",&x);	//投票
		if(x==-1) break;	//-1退出
		a[x]++;
	}
	if(a[0]>a[1])	//反对
		printf("No\n%d:%d\n",a[1],a[0]);
	else if(a[1]>a[0])	//同意
		printf("Yes\n%d:%d\n",a[1],a[0]);
	else	//平
		printf("Tie\n%d:%d\n",a[1],a[0]);
	return 0;
}

7-4 月份翻译机

本题要求你写一个程序帮助不懂英文的用户翻译月份。已知英文的 12 个月份为:

一月:January

二月:February

三月:March

四月:April

五月:May

六月:June

七月:July

八月:August

九月:September

十月:October

十一月:November

十二月:December

输入格式:

输入包括若干行,每一行里给出一个英文单词,长度不超过 10 个英文字母。

输出格式:

对每一行的输入,如果该单词是一个英文的月份(不区分大小写),则在一行中输出这个月份对应的数字;否则输出 ? 并结束程序。题目保证程序会结束。

输入样例:
october
MAY
what
aaaa
输出样例:
10
5
?

思路:用二维字符数组存储月份,对于输入的字符串,由于参杂着大小写,建议先进行转换,把他们都转换成小写字母,然后在把该字符串同每一个月份一一比较(月份定义时要设置它为小写),若找到则输出该月份,否则输出?
参考代码:

#include <stdio.h>
#include <string.h>

int main()
{
	//定义月份
	char month[12][20]={"january","february","march","april","may","june","july",
				"august","september","october","november","december"};
	char str[20];
	int i;
	while(gets(str)){	//循环输入字符串
		for(i=0;i<strlen(str);i++)
			if(str[i]>='A'&&str[i]<='Z')	//如果有大写字母则转换成小写
				str[i]=str[i]-'A'+'a';
		for(i=0;i<12;i++)	//寻找
			if(strcmp(str,month[i])==0)
				break;
		if(i==12){	//找不到
			printf("?\n");
			return 0;
		}
		else 	//找到,则输出i+1,因为下标从0开始
			printf("%d\n",i+1);
	}
	return 0;
}

7-5 相生相克

古代先民认为,天下万物皆由五类元素组成,分别是金、木、水、火、土,彼此之间存在相生相克的关系。

相生关系为:木生火,火生土,土生金,金生水,水生木。

相克关系为:金克木,木克土,土克水,水克火,火克金。

本题就请你编写程序,判断任意一对给定的元素之间的关系。

输入格式:

输入在一行中给出一个正整数 N(≤10),随后 N 行,每行给出 2 个正整数 A 和 B,为两种元素的编号。这里假设金、木、水、火、土的编号顺次为 1、2、3、4、5。

输出格式:

对输入的每一对 A 和 B,如果 A 生 B,则输出 A sheng B;如果 A 克 B,则输出 A ke B。反之亦然。

输入样例:
2
4 2
5 3
输出样例:
2 sheng 4
5 ke 3

思路:和第一题类似,简单模拟就行了,看代码把……
参考代码:

#include <stdio.h>

int main()
{
	int n,a,b;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&a,&b);
		if(a==4&&b==2||a==2&&b==4)
			printf("2 sheng 4\n");
		else if(a==4&&b==5||a==5&&b==4)
			printf("4 sheng 5\n");
		else if(a==1&&b==5||a==5&&b==1)
			printf("5 sheng 1\n");
		else if(a==1&&b==3||a==3&&b==1)
			printf("1 sheng 3\n");
		else if(a==3&&b==2||a==2&&b==3)
			printf("3 sheng 2\n");
		else if(a==1&&b==2||a==2&&b==1)
			printf("1 ke 2\n");
		else if(a==5&&b==2||a==2&&b==5)
			printf("2 ke 5\n");
		else if(a==5&&b==3||a==3&&b==5)
			printf("5 ke 3\n");
		else if(a==3&&b==4||a==4&&b==3)
			printf("3 ke 4\n");	
		else if(a==1&&b==4||a==4&&b==1)
			printf("4 ke 1\n");
	}
	return 0;
}

写在最后,其实多刷算法题,锻炼思维的话,做这些题目至少有一半的分,建议大家好好复习吧,虽然说学院不会挂很多人,但是去年200多个0分也是真的,最后祝大家期末考试顺利~

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值