指导老师:叶晓红
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函数求每个数的立方,加起来对原数进行判断。