本文结合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); }