本文结合PTA专项练习带领读者掌握选择结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。
文章目录
7-1 选择-星期
日历是一种日常使用的出版物,用于记载日期等相关信息。请问经常使用日历的你:今天是星期五,N天后是星期几。
输入格式:
输入一个整数N,表示N天后。(0<N<100000)
输出格式:
输出N天后是星期几。
输入样例1:
8
输出样例1:
Saturday
输入样例2:
51
输出样例2:
Sunday
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
n=n%7;
switch (n) {
case 1:
printf("Saturday");
break;
case 2:
printf("Sunday");
break;
case 3:
printf("Monday");
break;
case 4:
printf("Tuesday");
break;
case 5:
printf("Wednesday");
break;
case 6:
printf("Thursday");
break;
case 0:
printf("Friday");
}
}
7-2 21选择-我们是冠军
学校举办了新一届的校运会。你作为 100m 赛跑和跳远的裁判,需要将冠亚季军的成绩按从高到低排序。注意赛跑的成绩是秒而跳远的成绩是米。
输入格式:
输入共两行。
第一行包含一个整数,表示成绩类型,0 表示赛跑成绩,1 表示跳远成绩。
第二行包含三个实数,表示三个人的成绩,单位由成绩类型决定,保证输入数据保留小数点后两位。
输出格式:
输出共一行,按成绩从高到低依次输出,保留小数点后两位。
输入样例:
0
10.00 12.91 9.83
输出样例:
9.83 10.00 12.91
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
if(a<b)
{
double t;
t=b;
b=a;
a=t;
}
if(a<c)
{
double s;
s=c;
c=a;
a=s;
}
if(b>c)
{
double i;
i=c;
c=b;
b=i;
} //经过三次排序使得a>c>b
switch (n) {
case 1:
printf("%.2f %.2f %.2f",a,c,b);
break;
case 0:
printf("%.2f %.2f %.2f",b,c,a);
}
}
7-3 21选择-盘闰年
闰年要比平年多一天。sxtc 不喜欢数字 4,所以他认为数位中含有数字 4 的年份干干巴巴麻麻赖赖一点都不圆润,需要盘一下。比如“2004”虽然是闰年但是需要盘一下。希望你在判断闰年的基础上,判断一下这个闰年是不是需要盘一下。
输入格式:
输入仅一行,包含一个四位正整数 n (1000 ≤ n ≤ 9999)。
输出格式:
输出仅一行,如果不是闰年输出 0;如果是闰年且不需要盘则输出 1;如果是闰年且需要盘一下则输出“panta!”。
输入样例:
2004
输出样例:
panta!
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if((n%4==0&&n%100!=0)||n%400==0)
{
if(n%10==4||n/10%10==4||n/100%10==4||n/1000==4)
{
printf("panta!");
}
else
printf("1");
}
else
printf("0");
}
7-4 选择-合法日期
判断一个日期是否合法。
输入格式:
输入格式:YYYY/MM/DD(分别表示年、月、日,其中1000<=YYYY<=3000),如1972/02/12。
输出格式:
若该日期合法,输出“Yes”,否则输出“No”(输出不带引号)。
输入样例:
1900/08/99
输出样例:
No
#include <stdio.h>
int main() {
int year, month, day;
scanf("%d/%d/%d",&year,&month,&day);
if (year<1000||year>3000||month<1||month>12)
{
printf("No"); // 年份或月份不合法
return 0;
}
int da[]={31,28,31,30,31,30,31,31,30,31,30,31};
if ((year%4==0&&year%100!=0)||year%400==0) {
da[1]=29; // 闰年2月有29天
}
if (day<1||day>da[month-1])
{
printf("No"); // 日期不合法
}
else
{
printf("Yes"); // 合法日期
}
}
7-1 选择-奇数平方和
输入五个数,判断其奇偶性,并分别计算奇数的平方和和偶数的平方和。
输入格式:
输入五个整数a,b,c,d,e(0<a,b,c,d,e<1000)。
输出格式:
输出两行,第一行为奇数的平方和,第二行为偶数的平方和。如果不存在奇数,则在第一行输出“No Odd Number”,如果不存在偶数,则在第二行输出“No Even Number”。(输出不包括引号)。
输入样例1:
1 2 3 4 5
输出样例1:
35
20
输入样例2:
1 3 5 7 9
输出样例2:
165
No Even Number
#include <stdio.h>
int main()
{
int a[5];
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
int sum=0,zh=0,c1=0,c2=0;
for(int i=0;i<5;i++)
{
if(a[i]%2!=0)
{
sum=sum+a[i]*a[i];
c1++;
}
else
{
zh=zh+a[i]*a[i];
c2++;
}
}
if(c1==0)
printf("No Odd Number\n");
else
printf("%d\n",sum);
if(c2==0)
printf("No Even Number\n");
else
printf("%d",zh);
}
7-2 选择-外卖
yz大佬中午点了份心仪已久的外卖。但是他如果看到舍友点的外卖的美味值比他多,他会很不开心,所以他会再点一份一样的外卖,如果两份加起来还不够,他会点第三份…直到超过他的舍友。你知道他点了多少份外卖吗?
输入格式:
两个实数 x,y (float范围内) 代表yz大佬和他舍友的外卖美味值。
输出格式:
yz大佬购买的外卖数量。
特别的,如果yz大佬没法超过他的舍友,请输出 “O/”
输入样例1:
1.0 0.5
输出样例1:
1
输入样例2:
0 0
输出样例2:
\^O^/
#include <stdio.h>
int main()
{
double a,b;
scanf("%lf %lf",&a,&b);
int c;
if(a<=0 && b>=a)
{
printf("\\^O^/");
}
else if(a>=b)
{
printf("1");
}
else
{
c=b/a;
if(c==b/a)
{
printf("%d",c);
}
else
{
printf("%d",c+1);
}
}
return 0;
}
7-3 选择-糖果
桌子上有1堆糖果,一共有n颗,两人轮流取糖果。规定每次最少拿1颗,最多拿m颗,最后拿完的人获胜。(两个人都很聪明,都懂得使用最优策略)
输入格式:
输入两个整数n,m(0<m,n<10000000)。
输出格式:
先拿的人获胜输出"First win",否则输出"Second win"。
输入样例1:
7 5
输出样例1:
First win
输入样例2:
6 5
输出样例2:
Second win
注:本题可了解巴什博弈相关知识
#include <stdio.h>
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(n%(m+1)==0)
printf("Second win");
else
printf("First win");
}
7-4 C程序设计 实验2-2-2成绩转换(switch)
用switch语句编程,根据输入的百分制成绩score(整数),转换成相应的五分制成绩grade后输出。
当 90≤ score≤100时, grade=A ;
当80≤ score<90时,grade=B;
当70≤ score<80时, grade=C;
当60≤ score<70时,grade=D;
当0≤ score<60时,grade=E。
如果输入成绩 score<0或 score>100,则输出“Input error!”。
输入格式:
输入一个百分制成绩(整数)。
输出格式:
输出对应等级。输入成绩不合理时,输出提示信息“Input error!”。
输入样例:
85
输出样例:
B
输入样例:
120
输出样例:
Input error!
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
switch(n/10)
{
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("E");
break;
default:
printf("Input error!");
break;
}
}
7-5 选择-计算器2
编写四则运算计算器。输入格式为:data1 op data2,运算符和操作数之间用一个空格隔开,其中,整型变量 data1 和 data2 为参加运算的两个操作数,op为算术运算符(值为+、-、*、/、%)。
输入格式:
输入两个整数a和b(0<=a,b<=1000)和一个运算符op,形式如“a + b”,中间用一个空格隔开。
输出格式:
当运算符为+、-、*、/(浮点数除法,结果保留两位小数)、%时,在一行输出相应的运算结果。若输入是非法符号(即除了题中五种运算符以外的其他符号)或者无意义的运算则输出“Error”。
输入样例1:
3000 + 2000
输出样例1:
5000
输入样例2:
10 / 3
输出样例2:
3.33
#include <stdio.h>
int main()
{
int a,b;
char c,d,e;
scanf("%d%c%c%c%d",&a,&c,&d,&e,&b);
switch(d)
{
case '+':
printf("%d",a+b);
break;
case '-':
printf("%d",a-b);
break;
case '*':
printf("%d",a*b);
break;
case '/':
if(b!=0){
printf("%.2f",(double)a/b);
break;
}
else
{
printf("Error");
break;
}
case '%':
if(b!=0)
{
printf("%d",a%b);
break;
}
else
{
printf("Error");
break;
}
default:
printf("Error");
break;
}
}
7-6 选择-我是特种兵
在《我是特种兵》里面,特种兵个个是神枪手。现在要给他们增加难度进行考察,在同一瞬间要射中两个目标。据调查双手同时开枪最佳角度是双手成90度,在这里认为如果双手没成90度射击将无法同时击中目标。现在在一平面内,给出特种兵坐标,和两个目标的坐标。判断特种兵能否在考察中同时射中目标。
输入格式:
输入包含6个整数x1,y1,x2,y2,x3,y3。分别为特种兵和两个目标的坐标。
输出格式:
能同时射中两个目标输出yes,否则输出no。
输入样例1:
0 0 1 0 0 1
输出样例1:
yes
输入样例2:
0 0 1 1 0 1
输出样例2:
no
#include <stdio.h>
#include <math.h>
int main() {
int x1, y1, x2, y2, x3, y3;
scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3);
double t = ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1) - (x3 - x2) * (x3 - x2) - (y3 - y2) * (y3 - y2));
double s = 2 * sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1));
if (t / s == 0) {
printf("yes");
} else {
printf("no");
}
return 0;
}
7-7 选择-奖学金
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;
现要求根据每个学生的情况输出他所获得的奖学金。
输入格式:
输入包括5个int型整数,分别表示每个学生的学号、期末平均成绩、班级评议成绩、是否为班级干部(1 代表是;0代表不是),发表的论文数。
输出格式:
输出仅有1行,为士每个学生获得的奖学金。
输入样例:
1 100 100 1 10
输出样例:
14850
#include <stdio.h>
int main()
{
int a,b,c,d,e;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
int sum=0;
if(c>80&&d==1)
{
sum+=850;
}
if(b>90)
{
sum+=2000;
}
if(b>85&&c>80)
{
sum+=4000;
}
if(b>80&&e>=1)
{
sum+=8000;
}
printf("%d",sum);
}
952

被折叠的 条评论
为什么被折叠?



