PTA-C语言课程作业--选择结构练习

指导老师:叶晓红

7-3 输出三角形面积和周长 (15分)

本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。
注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√s(s−a)(s−b)(s−c)
,其中s=(a+b+c)/2。

输入格式:

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

输出格式:

如果输入的边能构成一个三角形,则在一行内,按照

area = 面积; perimeter = 周长

的格式输出,保留两位小数。否则,输出

These sides do not correspond to a valid triangle

输入样例1:

5 5 3

输出样例1:

area = 7.15; perimeter = 13.00

输入样例2:

1 4 1

输出样例2:

These sides do not correspond to a valid triangle

#include <stdio.h>
#include "math.h"

int main(int argc, char *argv[]) {
	
	int a,b,c;
	float area,perimeter,s;
	
	scanf("%d %d %d",&a,&b,&c);
	if(a+b>c&&a+c>b&&b+c>a)
	{
		s=(a+b+c)/2.0;
		area=sqrt((s*(s-a))*(s-b)*(s-c));
		perimeter = a+b+c;
		printf("area = %.2f; perimeter = %.2f",area,perimeter);
	}
	else {
		printf("These sides do not correspond to a valid triangle");
	}
	
}

三角形中,任意两边之和大于第三边,这是小学就学过的公式,因此我在第一个if的判断条件中,对三条边进行判断,如果符合要求,就继续进行计算,否则就输出错误,这里我用了数学sqrt公示对area进行开平方根运算。

7-4 回文数 (10分)

判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。

输入格式:

直接输入一个5位数正整数。

输出格式:

输出“yes”或“no”。此处均为小写字母

输入样例:

12521

输出样例:

yes

输入样例:

65432

输出样例:

no

#include <stdio.h>

int main(int argc, char *argv[]) {
	
	int x;
	scanf("%d",&x);
	if(x%10==x/10000&&(x%100)/10==(x/1000)%10&&x/100%10==x%1000/100)
	printf("yes");
	else{
		printf("no");
	}
}

这里我用了一个超复杂的判断条件对所输入的数字进行判断,x%10 == x/10000 用来判断个位与万位,(x%100)/10 == (x/1000)%10十位与千位,x/100%10 == x%1000/100判读中间。虽然复杂,但是理解起来也是挺容易的。

7-5 A除以B (10分)

真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。

输入格式:

输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。

输出格式:

在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。

输入样例1:

-1 2

输出样例1:

-1/2=-0.50

输入样例2:

1 -3

输出样例2:

1/(-3)=-0.33

输入样例3:

5 0

输出样例3:

5/0=Error

#include <stdio.h>
int main(int argc, char *argv[]) {
	int a,b;
	float c = 0.0;
	scanf("%d %d",&a,&b);
	if(b>0)
	{
		c = a*1.0/b;
		printf("%d/%d=%.2f",a,b,c);
	}
	if(b<0)
	{
		c = a*1.0/b;
		printf("%d/(%d)=%.2f",a,b,c);
	}
	if(b==0)
	{
		printf("%d/%d=Error",a,b);
	}
}

根据题目要求来做,对分母的正负或者0进行判断,要注意格式匹配,int类型要变成小数类型再赋值给float类型,这里我乘了一个小数来进行判断。

7-6 出租车计价 (15分)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;

    营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

    输入格式:

    输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

    输出格式:

    在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

    输入样例1:

    2.6 2

    输出样例1:

    10

    输入样例2:

    5.1 4

    输出样例2:

    14

    输入样例3:

    12.5 9

    输出样例3:

    34
#include <stdio.h>

int main(int argc, char *argv[]) {
	
	double km;
	int min;
	scanf("%lf %d",&km,&min);
	double km_fee,sum;
	int min_fee;
	if (km<=3.0) {
		km_fee = 10;
	}
	else if(km<=10.0)
	{
		km_fee = 10+2*(km-3);
	}
	else {
		km_fee = 10+14+3*(km-10);
	}
	min_fee = 2*(min/5);
	sum = km_fee + min_fee;
	printf("%.0f\n",sum);
	return 0;
	
}

理解题目,起步价三公里内10元,超过三公里但十公里以内2元,在这十公里内,去除三公里的起步价,还剩7公里,需付7X2=14元,也就是说在十公里内最多付14+10=24元,超过十公里以后,加收3元的回空补贴费,也就是说,十公里以上的钱除了要加上之前的24元,还要多交上(m-10公里的路程)X3的钱,m为超过十公里的路程。另外题目还说因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费),这里不足五分钟不收费该如何处理呢?简单理解一下,如果刚好五分钟,5/5=1,不足5分钟,4/5=0,利用除法就能轻松解决了

7-7 三个数由小到大输出 (10分)

输入三个整数x,y,z,请把这三个数由小到大输出。

输入格式:

在一行中直接输入3个整数,之间各用一个空格间隔。

输出格式:

在一行中按照“x=最小值,y=次小值,
z=最大值”的顺序输出结果,最大值、次大值和最小值均原样输出,没有宽度控制。

输入样例:

2 1 3

输出样例:

x=1,y=2,z=3

include <stdio.h>
int main(int argc, char *argv[]) {
	int a,b,c;
	int tmp;
	scanf("%d %d %d",&a,&b,&c);
	if(a>b)
	{
		tmp = a;
		a =b ;
		b = tmp;
	}
	if(a>c)
	{
		tmp = a;
		a =c;
		c= tmp;
	}
	if(b>c)
		{
			tmp = b;
			b=c ;
			c= tmp;
		}
	
    printf("x=%d,y=%d,z=%d\n",a,b,c);
    return 0;
}

实现题目的要求,要借助一个中间变量,如果a大于b,借助中间变量t实现a与b值的互换,如果a大于c,借助中间变景t实现a与c值的互换,如果b大于c,借助中间变量t实现b与c值的互换

7-8 12-24小时制 (15分)

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。

提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6
PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。

输入样例:

21:11

输出样例:

9:11 PM

#include <stdio.h>
int main(int argc, char *argv[]) {
	
	int a ,b;
	scanf("%d:%d",&a,&b);
	if(a>=12)
	{
		if(12==a)
		printf("%d:%d PM",a,b);
		else {
			a = a -12;
			printf("%d:%d PM",a,b);
		}
	}else {
		printf("%d:%d AM",a,b);
	}
	return 0;
	
}

24小时制在上午12点之前跟12小时制的表达一样,因此本题主要考虑大于等于12点的情况,题目要求中说英文习惯中中午12点表示下午,因此当输入为12:00时,直接输出12:00 PM,此外,24小时转12小时,只需要24-12,24小时制中,大于12时的的均为下午。

7-9 成绩转换 (15分)

  • 本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

    输入格式:

    输入在一行中给出一个整数的百分制成绩。

    输出格式:

    在一行中输出对应的五分制成绩。

    输入样例:

    90

    输出样例:

    A
#include <stdio.h>
int main(int argc, char *argv[]) {
	int n;
	scanf("%d",&n);
	if(n>=90)
	printf("A\n");
	else if(n>=80)
	printf("B\n");
	else if(n>=70)
	printf("C\n");
	else if(n>=60)
	printf("D\n");
	else
	printf("E");
	return 0;
}

理解题目要求,用if语句来判断并输出

7-10 计算天数 (15分)

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

#include <stdio.h>
int main()
{
	int i,year,month,day,n=0,
	a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	scanf("%d/%d/%d",&year,&month,&day);
	if((year%4==0&&year%100)||year%400==0)
		a[2]=29;
	for(i=0;i<=month-1;i++)
		n=n+a[i];
	
	printf("%d",n+day);
	
	return 0;
}

首先为了方便计算,把每个月份的天数存在一个一维数组里,根据题目要求得出判断是否为闰年的条件为 ”year%4 == 0&&year%100)||year%400 == 0“,如果为闰年,2月为29天,遍历数组,把数组内元素相加。

7-11 4-5考研录取情况 (15分)

同学们以后准备考研的一定有不少.以河北某高校为例,一共要考4门,分别是:数学(满分150)、英语(满分100)、政治(满分100)、专业课(满分150).不过,你知道考研分数线的特点吗——不仅总分要过分数线,单科也必须过线!假设某年该校研究生录取的分数线是这样的:数学和专业课单科分数线是85(含), 英语和政治单科分数线是55(含),总分分数线是305(含).并且规定——在单科和总分均过线的前提下,总分370分(含)以上的是公费生,否则是自费生.现在告诉你一些考生的分数,你能判断他们的录取情况吗?

输入格式:

输入数据表示考生的考研成绩.
一行4个整数,分别表示考生的数学、英语、政治和专业课成绩,中间用空格分隔。

输出格式:

输出考生的录取情况,A表示公费生,B表示自费生,C表示未录取。

输入样例1:

在这里给出一组输入。例如:

100 80 85 120

输出样例1:

在这里给出相应的输出。例如:

A

输入样例2:

在这里给出一组输入。例如:

90 60 65 110

输出样例2:

在这里给出相应的输出。例如:

B

输入样例3:

在这里给出一组输入。例如:

140 50 75 135

输出样例3:

在这里给出相应的输出。例如:

C

#include <stdio.h>

int main(int argc, char *argv[]) {
	int sx,en,zz,zyk,sum=0;
	scanf("%d %d %d %d",&sx,&en,&zz,&zyk);
	sum = sx+en+zz+zyk;
	if(sx>=85&&zyk>=85&&en>=55&&zz>=55&&sum>=305)
	{
		if(sum>=370)
		printf("A");
		else {
			printf("B");
		}
	}else {
		printf("C");
	}
}

根据题目要求,写出相应的判断语句,注意只有所有单科和总分都过线才有接下来对分数的等级评价。

7-12 判断一个三位数是否为水仙花数 (15分)

本题要求编写程序,判断一个给定的三位数是否为水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

输入格式:

输入在一行中给出一个需要判断的整数 N(100≤N≤999)。

输出格式:

如果N是水仙花数,则在一行中输出Yes,否则输出No。如果N不是三位数,则输出Invalid Value.。

输入样例1:

153

输出样例1:

Yes

输入样例2:

500

输出样例2:

No

输入样例3:

-2

输出样例3:

Invalid Value.

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[]) {
	int a;
	scanf("%d",&a);
	int gewei = a%10;
	int shiwei = a%100/10;
	int baiwei = a/100;
	if(a<100||a>999)
		printf("Invalid Value.");
	else if(pow(gewei, 3)+pow(shiwei, 3)+pow(baiwei, 3)==a)
	{printf("Yes");}
	else {
		printf("No");
	}
}

看到立方,想到数学函数pow,看到个位十位百位,想到除法运算,取余运算,因此本题就好解决了,求出每个位次的数,利用pow函数求每个数的立方,加起来对原数进行判断。