【C/PTA】选择结构进阶练习

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

文章目录

    • 7-1 选择-星期
    • 7-2 21选择-我们是冠军
    • 7-3 21选择-盘闰年
    • 7-4 选择-合法日期
    • 7-1 选择-奇数平方和
    • 7-2 选择-外卖
    • 7-3 选择-糖果
    • 7-4 C程序设计 实验2-2-2成绩转换(switch)
    • 7-5 选择-计算器2
    • 7-6 选择-我是特种兵
    • 7-7 选择-奖学金

7-1 选择-星期

日历是一种日常使用的出版物,用于记载日期等相关信息。请问经常使用日历的你:今天是星期五,N天后是星期几。

输入格式:

输入一个整数N,表示N天后。(0

输出格式:

输出N天后是星期几。

输入样例1:

8

输出样例1:

Saturday

输入样例2:

51

输出样例2:

Sunday
#include 
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 
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 
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 
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 输出格式:

输出两行,第一行为奇数的平方和,第二行为偶数的平方和。如果不存在奇数,则在第一行输出“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 
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 
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 输出格式:

先拿的人获胜输出"First win",否则输出"Second win"。
输入样例1:

7 5

输出样例1:

First win

输入样例2:

6 5

输出样例2:

Second win

注:本题可了解巴什博弈相关知识

#include 
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 
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 
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 
#include 

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 
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);
}

你可能感兴趣的:(C语言入门教程,c语言,算法,开发语言,数据结构,数组,选择结构,pta)