本文结合PTA专项练习带领读者掌握选择结构,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

文章目录

    • 7-1 选择-孔融让梨
    • 7-2 选择-最大数
    • 7-3 选择-奇偶判断
    • 7-4 选择-ASCII值
    • 7-5 选择-闰年
    • 7-6 选择 -排序
    • 7-7 选择-分段函数1
    • 7-8 选择-分段函数2
    • 7-9 选择-分段函数3
    • 7-10 选择-圆塔
    • 7-11 选择-买奶茶
    • 7-12 选择-三角形判别
    • 7-13 选择-三角形分类
    • 7-14 选择-五分制转百分制
    • 7-15 选择-大小写转换
    • 7-16 选择-体积最大
    • 7-17 选择-N以内所有正整数和
    • 7-18 选择-计算器
    • 7-19 选择-简易计算机
    • 7-20 选择-简单的运算
    • 7-21 选择-水仙花数
    • 7-22 选择-三角形面积
    • 7-23 选择-完全平方数
    • 7-24 选择-矩形与点的位置
    • 7-25 选择-数的判别
    • 7-26 选择-数字字符的判别
    • 7-27 选择-销售菜单
    • 7-28 选择-电话费
    • 7-29 选择-税收计算1
    • 7-30 选择-自然数
    • 7-28 选择-电话费
    • 7-29 选择-税收计算1
    • 7-30 选择-自然数

7-1 选择-孔融让梨

孔融小时候聪明好学,才思敏捷,巧言妙答,大家都夸他是奇童。4岁时,他已能背诵许多诗赋,并且懂得礼节,父母亲非常喜爱他。
一日,父亲买了一些梨子,特地拣了一个最大的梨子给孔融,孔融摇摇头,却另拣了一个最小的梨子说:“我年纪最小,应该吃小的梨,你那个梨就给哥哥吧。”父亲听后十分惊喜。

输入格式:

在一行中给出两个不超过32767的正整数a,b,分别表示孔融父亲拿出的两个梨的质量。

输出格式:

输出孔融选择的梨的质量。

输入样例:

3 4

输出样例:

3
#include int main(){int a,b;scanf("%d%d",&a,&b);printf("%d",a<b?a:b);}

7-2 选择-最大数

输入三个整数,输出其中最大的数。

输入格式:

输入三个整数,在 int 范围内。

输出格式:

输出其中最大的数。

输入样例:

23 78 32

输出样例:

78
#include int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("%d",a>(b>c?b:c)?a:(b>c?b:c));}

7-3 选择-奇偶判断

给定一个整数,请你判断其奇偶性。如果是奇数输出YES,否则输出NO。

输入格式:

输入仅一行,包含一个整数a。

输出格式:

输出仅一行,为整数a的奇偶判断结果。

输入样例:

9

输出样例:

YES
#include int main(){int a;scanf("%d",&a);if(a%2!=0){printf("YES");}elseprintf("NO");}

7-4 选择-ASCII值

从键盘输入一个字符,若输入的是数字字符则输出它的ASCII值,否则输出提示信息“input error”。

输入格式:

输入一个字符。

输出格式:

若输入的是数字字符则输出它的ASCII值,否则输出提示信息“input error”,输出不含引号。

输入样例1:

7

输出样例1:

55

输入样例2:

W
#include int main(){char c;scanf("%c",&c);if(c>='0'&&c<='9'){printf("%d",c);}elseprintf("input error");}

7-5 选择-闰年

判别用year表示的某一年是否闰年。

输入格式:

输入占一行,给出一个不大于32767的整数year。

输出格式:

输出占一行,如果该年是闰年,则输出YES,否则输出NO。

输入样例:

2021

输出样例:

NO
#include int main(){int year;scanf("%d",&year);if((year%4==0&&year%100!=0)||year%400==0){printf("YES");}elseprintf("NO");}

7-6 选择 -排序

对两个实数按代数值从大到小排序。

输入格式:

一行中给出2个两个实数a,b。

输出格式:

将两个实数按从大到小输出,保留三位小数,两个实数间以空格隔开。

输入样例:

9.9 10.0

输出样例:

10.000 9.900
#include int main(){double a,b;scanf("%lf%lf",&a,&b);printf("%.3f %.3f",a>b?a:b,a<b?a:b);}

7-7 选择-分段函数1

有一函数:

输入格式:

每组输入数据占一行,包含一个整数x(-32768<=x<181)。

输出格式:

每组输出数据占一行,输出y的值。

输入样例:

5

输出样例:

15
#include int main(){int x;scanf("%d",&x);if(x>0)printf("%d",x*x-10);else if(x==0)printf("0");else printf("%d",x+10);}

7-8 选择-分段函数2

输入一个实数 x,按如下公式计算并输出y的值

输入格式:

输入一个实数 x

输出格式:

输出计算结果,要求结果保留两位小数。

输入样例1:

0.5

输出样例1:

0.50

输入样例2:

3

输出样例2:

4.58
#include #include int main(){double x;scanf("%lf",&x);if(x<1)printf("%.2f",abs(x));else if(x==1)printf("3.00");elseprintf("%.2f",sqrt(x*x*x-2*x));}

7-9 选择-分段函数3

分数 100

作者 Fzu_C

单位 福州大学

设有函数

输入格式:

输入一个实数 x(-1000<x<1000)。

输出格式:

输出y的值,结果保留3个小数点。

输入样例:

11

输出样例:

3.091
#include #include int main(){double x;scanf("%lf",&x);if(x<1)printf("%.3f",x);else if(x<10)printf("%.3f",sqrt(2*x-1));else printf("%.3f",log(3*x-11));}

7-10 选择-圆塔

有4个圆塔(圆柱体)。圆心坐标分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1。这4个塔的高度为10m,塔以外无建筑物。令输入任一点的二维平面坐标,求该点的建筑高度(塔外的高度为0)。

输入格式:

输入一个点的平面坐标 (x, y),-3 <= x, y <= 3。

输出格式:

输出该点的建筑高度。

输入样例1:

2 -1.5

输出样例1:

10

输入样例2:

1 1

输出样例2:

0
#include #include int main() {double x, y;int a = 0;scanf("%lf %lf", &x, &y);if (pow(x - 2.0, 2) + pow(y - 2.0, 2) <= pow(1, 2)) {a = 1;} else if (pow(x + 2.0, 2) + pow(y - 2.0, 2) <= pow(1, 2)) {a = 1;} else if (pow(x + 2.0, 2) + pow(y + 2.0, 2) <= pow(1, 2)) {a = 1;}else if (pow(x - 2.0, 2) + pow(y + 2.0, 2) <= pow(1, 2)) {a = 1;}if (a == 1)printf("10");elseprintf("0");}

7-11 选择-买奶茶

yz大佬特别爱喝奶茶,他每天上午都要买两杯奶茶,特别的,如果这天是周六,他会在下午再买两杯,如果这天是周天,他会在下午再买四杯。
已知今天是星期x的早晨(1 <= x <= 7),请问直到明天晚上,yz大佬会买多少杯奶茶呢?

输入格式:

一个正整数x (int范围内),代表今天是星期几。

输出格式:

yz大佬购买的奶茶数量。

输入样例:

1

输出样例:

4
#include int main(){int x;scanf("%d",&x);switch(x){case 1:printf("4");break;case 2:printf("4");break;case 3:printf("4");break;case 4:printf("4");break;case 5:printf("6");break;case 6:printf("10");break;case 7:printf("8");break;}}

7-12 选择-三角形判别

已知三条边的长度为a,b,c,判断三条边是否能构成一个三角形。

输入格式:

每组输入数据占一行,包括不大于10000的3个整数a,b,c。

输出格式:

每组输出数据占一行,如果a,b,c能构成三角形,则输出Yes,否则输出No。

输入样例:

3 4 7

输出样例:

No
#include int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){printf("Yes");}elseprintf("No");}

7-13 选择-三角形分类

输入三角形三边长,判断三角形的种类:等边三角形、等腰三角形或一般三角形。

输入格式:

输入三个整数,表示三角形三边长,范围在 1 到 100 之间。保证输入的三个整数能构成三角形。

输出格式:

按要求输出三角形的类别:

​ 1. 如果是等边三角形,输出 “bian”

​ 2. 如果不是等边三角形,但是等腰三角形,输出 “yao”

​ 3. 否则,输出 “triangle”

输入样例1:

2 2 2

输出样例1:

bian

输入样例2:

3 4 5

输出样例2:

triangle
#include int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(a==b&&b==c){printf("bian");}else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a)){printf("yao");}elseprintf("triangle");}

7-14 选择-五分制转百分制

学生百分制成绩grade分类:

  • 当成绩grade大于等于85分为‘A’等;
  • 当成绩grade大于等于70分且小于85分为‘B’等;
  • 当成绩grade大于等于60分且小于70分为‘C’等;
  • 当成绩grade小于60分为‘D’等。

输入格式:

每组输入数据占一行,包括一个成绩等级。

输出格式:

每组输出数据占一行,根据成绩等级输出百分制分数段,输出不包括引号。

  • 当成绩为‘A’,输出“85~100”
  • 当成绩为‘B’,输出“70~84”
  • 当成绩为‘C’,输出“60~69”
  • 当成绩为‘D’,输出“<60”
  • 其他情况,输出“Error”

输入样例:

A

输出样例:

85~100
#include int main(){char a;scanf("%c",&a);switch(a){case 'A':printf("85~100");break;case 'B':printf("70~84");break;case 'C':printf("60~69");break;case 'D':printf("<60");break;default:printf("Error");break;}}

7-15 选择-大小写转换

给定一个字母,如果它是小写,请将其转换成大写字母并输出;如果它是大写字母,请将其转换成小写字母并输出。

输入格式:

输入为一行,仅包含一个英文字母。

输出格式:

输出仅为一行,包含一个经过大小写转换的英文字母。

输入样例:

a

输出样例:

A
#include int main(){char a;scanf("%c",&a);if(a>='a'&&a<='z')printf("%c",a-32);elseprintf("%c",a+32);}

7-16 选择-体积最大

小明做了一件好事,妈妈准备奖励他,于是让他在三个礼物中挑选一个。小明当然想选最好的,可是他不知道到底哪个最好。他就想应该是越大的越好,于是他就挑选了三个礼物中体积最大的那个。请你编写一段程序帮小明从三个礼物中挑选出体积最大的一个。

输入格式:

输入仅一行包含三个整数a,b,c,用空格隔开。

输出格式:

输出仅一行,是a,b,c中的最大值。

输入样例:

18 98 100

输出样例:

100
#include int main(){int x,y,z;scanf("%d%d%d",&x,&y,&z);printf("%d",x>(y>z" />:z)?x:(y>z?y:z));}

7-17 选择-N以内所有正整数和

给你一个整数,请你输出由1加到该数(包括该数)的和。

输入格式:2

输入仅一行,包含一个整数n。

输出格式:

输出为一个整数,表示1加到n的和值。

输入样例:

10

输出样例:

55
#include int main(){int n;scanf("%d",&n);printf("%d",(1+n)*n/2);}

7-18 选择-计算器

根据输入的数据按要求进行计算并输出计算所得的数值(switch语句实现)。

输入格式:

输入有三个整数a,x,y。

输出格式:

请输入a值,输出x与y的运算结果

  • 当a==1,计算x+y;
  • 当a==2,计算x-y;
  • 当a==3,计算x*y;
  • 当a==4,计算x÷y;(保留1位小数)
  • 当a==5,计算x xor y;(xor:异或)
  • 当a非上面的数值时输出:“orzzgg”(不带引号的字符串)

输入样例:

5 6 10

输出样例:

12
#include int main() {int a, x, y;scanf("%d %d %d", &a, &x, &y);switch (a) {case 1:printf("%d", x + y);break;case 2:printf("%d", x - y);break;case 3:printf("%d", x * y);break;case 4:printf("%.1f", (float)x / y);break;case 5:printf("%d", x ^ y);break;default:printf("orzzgg");break;}}

7-19 选择-简易计算机

分数 100

作者 Fzu_C

单位 福州大学

​ 计算机指令就是指挥机器工作的指示和命令,通常一条指令包括两个部分:操作码和操作数,操作码决定要完成的操作,操作数指参加运算的数据及其所在的单元地址。在计算机中,操作要求和操作数地址都由二进制数码表示,分别称作操作码和地址码,整条指令以二进制编码的形式存放在存储器中。
现要求编程模拟一个简易计算机的计算功能。要求给出一条指令,输出相应的运行结果。为方便起见,给定的指令有一个操作码(用十进制数表示),和 3 个操作数(即通过寻址得到的操作数)。现规定这台简易计算机的操作码如下表所示:

操作符操作码操作数1操作数2操作数3等价表达式
+0abca+b
1abca-b
*2abca*b
/3abca/b
%4abca%b
?:5abca?b:c
>6abca>b
<7abca<b
!=8abca!=b
==9abca==b

例如指令“1 12 9 99”,其中“1”表示“-”。由于减法只需两个操作符,所以我们只需要使用前两个操作数12 和 9,即表达式为“12-9”。执行该指令的结果是“3”。

输入格式:

输入为标准输入,输入共一行,仅四个整数,即操作码X(0<=x<=9),操作数a,b,c(0<=|a|,|b|,|c|<= 1000)。

输出格式:

输出仅一行,为该指令的运行结果,对于逻辑运算符的结果,如果为真输出“1”,否则输出“0”。

输入样例1:

0 9 -1 9

输出样例1:

8

输入样例2:

8 2 2 9

输出样例2:

0
#include int main(){int x,a,b,c;scanf("%d%d%d%d",&x,&a,&b,&c);switch(x){case 0:printf("%d",a+b);break;case 1:printf("%d",a-b);break;case 2:printf("%d",a*b);break;case 3:printf("%d",a/b);break;case 4:printf("%d",a%b);break;case 5:printf("%d",a?b:c);break;case 6:printf("%d",a>b);break;case 7:printf("%d",a<b);break;case 8:printf("%d",a!=b);break;case 9:printf("%d",a==b);break;}}

7-20 选择-简单的运算

洛洛现在遇到了个很简单的算术题,给定一个实数n,求它的向上取整以及向下取整,当然如果这个数是整数,那么两个运算的结果是一样的。洛洛很懒不想写代码,所以就来找你帮忙了。

输入格式:

输入一个实数n(n<1000000)。

输出格式:

输出对n的向上取整值、向下取整值和n值(保留5位小数)。

输入样例:

3.5

输出样例:

4 3 3.50000
#include #include int main(){double x;scanf("%lf",&x);printf("%d %d %.5f",(int)ceil(x),(int)floor(x),x);}

7-21 选择-水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,它是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。现在要求你判断一个数是不是水仙花数。

输入格式:

输入包含一个整数n(99<n<1000)。

输出格式:

如果n是水仙花数输出yes,否则输出no。

输入样例:

555

输出样例:

no
#include int main(){int n;scanf("%d",&n);int a=n/100;int b=n/10%10;int c=n%10;if(a*a*a+b*b*b+c*c*c==n){printf("yes");}elseprintf("no");}

7-22 选择-三角形面积

根据输入的三角形的三条边a、b、c,计算并输出面积和周长。

输入格式:

输入为3个正整数,分别代表三角形的3条边a、b、c。

输出格式:

若输入的边能构成一个三角形,则在一行内输出三角形的面积和周长,保留两位小数。否则,输出 no triangle。

输入样例:

5 5 3

输出样例:

7.15 13.00
#include #include int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){double p=(a+b+c)/2.0;double s=sqrt(p*(p-a)*(p-b)*(p-c));double t=a+b+c;printf("%.2f %.2f",s,t);}elseprintf("no triangle");}

7-23 选择-完全平方数

输入一个正整数N,判断它是否为完全平方数。

输入格式:

一个正整数N(N<=1,000,000,000)

输出格式:

若是完全平方数输出“Yes”,否则输出“No”。

输入样例:

4

输出样例:

Yes
#include #include int main(){int n;scanf("%d",&n);int a=(int)sqrt(n);if(a*a==n){printf("Yes");}elseprintf("No");}

7-24 选择-矩形与点的位置

给定一个矩形A的左上、右下顶点坐标,以及另一个点B的坐标,判断点B是否在矩形A内(恰好在某条边上也算在矩形内)。

输入格式:

输入三个坐标(xL,yL),(xR,yR),(x,y) 分别表示矩形的左上、右下顶点坐标、点B坐标。(坐标均为绝对值<=1000000的整数,保证矩形合法,即xLyR)。

输出格式:

若点B在矩形A内,输出“Yes”,否则输出“No”(输出不带引号)。

输入样例1:

0 10 10 0 10 10

输出样例1:

Yes

输入样例2:

0 10 10 0 13 3

输出样例2:

No
#include #include int main(){int zs1,zs2,yx1,yx2,b1,b2;scanf("%d%d%d%d%d%d",&zs1,&zs2,&yx1,&yx2,&b1,&b2);int max=abs(zs1)>abs(yx1)?abs(zs1):abs(yx1);int min=abs(zs2)>abs(yx2)?abs(zs2):abs(yx2);if(abs(b1)<=max&&abs(b2)<=min){printf("Yes");}else printf("No");}

7-25 选择-数的判别

从键盘输入一个正整数n,先判断它是奇数还是偶数。当它是奇数的时候,进一步判断它是否能被3整除。

输入格式:

输入一个正整数n。

输出格式:

输出相应的判断结果。

  • n是偶数,输出“n is an even number”
  • n是奇数且能被3整除,输出“n is an odd number,it can be divided by 3”
  • n是奇数且不能被3整除,输出“n is an odd number,it can’t be divided by 3”

输出不包含引号。

输入样例:

17

输出样例:

17 is an odd number,it can't be divided by 3
#include int main(){int n;scanf("%d",&n);if(n%2!=0){if(n%3==0)printf("%d is an odd number,it can be divided by 3",n);elseprintf("%d is an odd number,it can't be divided by 3",n);}elseprintf("%d is an even number",n);}

7-26 选择-数字字符的判别

判断输入字符是否为数字字符,是数字字符,则输出该字符;否则输出“input error”

输入格式:

输入一个字符。

输出格式:

输出相应信息。

输入样例:

a

输出样例:

input error
#include int main(){char a;scanf("%c",&a);if(a>='0'&&a<='9'){printf("%c",a);}elseprintf("input error");}

7-27 选择-销售菜单

假设自动售货机出售四种商品:[1]薯片、[2]爆米花、[3]巧克力和[4]可乐,其单价分别为8元、4.5元、12.8元和3元。现从键盘输入商品编号,当输入为1~4时,输出对应商品的单价;当输入其他编号时,输出“Exit”。(用switch语句实现)

输入格式:

输入一个整数,表示商品编号。

输出格式:

输出所选商品的单价。如果商品编号不在[1,4]区间内,则输出“Exit”(输出不包含引号)

输入样例:

1

输出样例:

8

输入样例:

0

输出样例:

Exit
#include int main(){int n;scanf("%d",&n);switch (n) {case 1:printf("8");break;case 2:printf("4.5");break;case 3:printf("12.8");break;case 4:printf("3");break;default:printf("Exit");break;}}

7-28 选择-电话费

甲乙两家通讯公司,甲公司每月通话收费标准如下:

甲:

月租费通话费
25元0.1 元/分钟

乙:

0 < t (分)< 100t(分) >= 100
20 元/月0.3 元/分

输入格式:

输入每个月通话时长 t (0 < t < 10^10 ) ,t为整数。

输出格式:

输出选择哪家公司更实惠 ,甲公司更实惠输出 1 ,乙公司输出2 (两公司价格相等优先选择甲公司)。

输入样例1:

50

输出样例1:

2

输入样例2:

300

输出样例2:

1
#include int main(){int t;scanf("%d",&t);double s1,s2;s1=25+0.1*t;if(t<100)s2=20;elses2=0.3*t;if(s1>s2)printf("2");elseprintf("1");}

7-29 选择-税收计算1

若规定个人稿费纳税规则为:不超过800元不纳税;超过800不超过4000元的按超过800元部分的15%纳税;超过4000元的按全部稿酬的10%纳税。

输入格式:

输入某人获得的稿费 x(0 < x <10^9),x为整数。

输出格式:

输出应付的税费y (保留一位小数)。

输入样例1:

400

输出样例1:

0.0

输入样例2:

1000

输出样例2:

30.0
#include int main(){ int x; scanf("%d",&x); double y; if(x<=800) y=0; else if(x<=4000) y=(x-800)*0.15; elsey=x*0.1; printf("%.1f",y);}

7-30 选择-自然数

判断给定的数a是否为自然数

输入格式:

输入一个浮点数a,a在int的范围内。

输出格式:

若为自然数则输出“Yes”,反之输出“No”。(输出不包括引号)

输入样例:

95.27

输出样例:

No
#include int main() {float a;scanf("%f", &a);if (a >= 0 && (int)a == a) {printf("Yes");} else {printf("No");}}

7-28 选择-电话费

甲乙两家通讯公司,甲公司每月通话收费标准如下:

甲:

月租费通话费
25元0.1 元/分钟

乙:

0 < t (分)< 100t(分) >= 100
20 元/月0.3 元/分

输入格式:

输入每个月通话时长 t (0 < t < 10^10 ) ,t为整数。

输出格式:

输出选择哪家公司更实惠 ,甲公司更实惠输出 1 ,乙公司输出2 (两公司价格相等优先选择甲公司)。

输入样例1:

50

输出样例1:

2

输入样例2:

300

输出样例2:

1
#include int main(){int t;scanf("%d",&t);double s1,s2;s1=25+0.1*t;if(t<100)s2=20;elses2=0.3*t;if(s1>s2)printf("2");elseprintf("1");}

7-29 选择-税收计算1

若规定个人稿费纳税规则为:不超过800元不纳税;超过800不超过4000元的按超过800元部分的15%纳税;超过4000元的按全部稿酬的10%纳税。

输入格式:

输入某人获得的稿费 x(0 < x <10^9),x为整数。

输出格式:

输出应付的税费y (保留一位小数)。

输入样例1:

400

输出样例1:

0.0

输入样例2:

1000

输出样例2:

30.0
#include int main(){ int x; scanf("%d",&x); double y; if(x<=800)y=0; else if(x<=4000) y=(x-800)*0.15; elsey=x*0.1; printf("%.1f",y);}

7-30 选择-自然数

判断给定的数a是否为自然数

输入格式:

输入一个浮点数a,a在int的范围内。

输出格式:

若为自然数则输出“Yes”,反之输出“No”。(输出不包括引号)

输入样例:

95.27

输出样例:

No
#include int main() {float a;scanf("%f", &a);if (a >= 0 && (int)a == a) {printf("Yes");} else {printf("No");}}