目录
练习3-2 计算符号函数的值
练习3-3 统计学生平均成绩与及格人数
练习3-4 统计字符
练习3-5 输出闰年
练习3-7 成绩转换
练习3-8 查询水果价格
习题3-1 比较大小
习题3-2 高速公路超速处罚
习题3-3 出租车计价
习题3-4 统计学生成绩
习题3-5 三角形判断
对于任一整数n,符号函数sign(n)的定义如下:
请编写程序计算该函数对任一输入整数的值。
输入在一行中给出整数n。
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。
#include
int main()
{
int n;
scanf("%d",&n);
if(n<0)
{printf("sign(%d) = -1",n);}
else if(n>0)
{printf("sign(%d) = 1",n);}
else
{printf("sign(0) = 0");}
return 0;
}
考点:分段函数,可以用if-else来给出不同分支
注意:0不是整数
如果if条件框中想表示n=0,要写成n==0
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
按照以下格式输出:
average = 成绩均值
count = 及格人数
其中平均值精确到小数点后一位。
#include
int main()
{
int n,s=0,grade,c=0;
float avg=0;
scanf("%d",&n);
if(n<=0){
avg=0;
c=0;
}
else{
for(int i=0;i=60)
c++;
}
avg=s*1.0/n;
}
printf("average = %.1f\n",avg);
printf("count = %d\n",c);
return 0;
}
考点:循环输入
因为只要求计算成绩均值,求得累加值除以总人数就可以了
计算及格人数需要在循环中嵌套选择
注意非负整数这个条件需要加上选择建立分支
本题要求编写程序,输入10个字符,统计其中的英文字母、空格或回车、数字字符和其他字符的个数。
输入为10个字符。最后一个回车表示输入结束,不算在内。
在一行内按照
letter = 英文字母个数, blank = 空格或回车个数
,digit = 数字字符个数, other = 其他字符个数
的格式输出。
考点:循环嵌套选择
首先是用循环+scanf控制输入10个字符
然后输入的字符存放在
- 数组里,遍历判断种类
- 变量里,直接判断其种类
退出条件是已经输入10个字符,以及一个回车
- 对于英文字母,条件是(ch>='a' && ch<='z')||(ch>='A' && ch<='Z')
- 对于数字字符,条件是ch>='0' && ch<='9'
- 对于空格,条件是ch==' '
#include
int main()
{
int i, letter = 0, blank = 0, digit = 0, other = 0;
letter=digit=blank=other=0;
char ch;
for(i=0;i<10;i++)
{
ch=getchar();
if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z'))
letter++;
else if(ch>='0' && ch<='9')
digit++;
else if(ch==' ' || ch=='\n')
blank++;
else
other++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",
letter, blank, digit, other);
return 0;
}
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。
输入在一行中给出21世纪的某个截止年份。
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。
考点:选择嵌套循环
21世纪是2001年~2100年,年份条件就是year>2100||year<2001(作为不成立条件)
判断闰年条件:year%400 == 0 || ((year%4 == 0) && (year%100 != 0))
输入的年份是截止条件,当输入的年份也是闰年也需要输出,因此是i<=year
首先判断是否非21世纪,如果是,循环输出到这个年份的闰年并计数;如果不是,输出Invalid。
没有闰年,也就是计数为0,输出Invalid year
#include
int main()
{
int i,year,cnt=0;
scanf("%d",&year);
if(year<2001 || year>2100){
printf("Invalid year!");
}else{
for(i=2001;i<=year;i++){
if(i%400 == 0 || (i%4 == 0 && i%100 != 0)){
printf("%d\n",i);
cnt++;
}
}if(cnt==0){
printf("None\n");
}
}
return 0;
}
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
输入在一行中给出一个整数的百分制成绩。
在一行中输出对应的五分制成绩。
考点:选择语句中的switch
switch不常用,要记清语法,和if语句差不多
百分转等级制需要注意数字要除以10,这样得到的数字就能用字符代替,switch只能用字符(单字节数字),100分和90分一样,50多分和更低的一样,所以10和5这两种情况直接用下一种情况的语句就行
#include
int main()
{
int score;
scanf("%d",&score);
switch(score/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:
default:printf("E");
}
return 0;
}
给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。
首先在屏幕上显示以下菜单:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。
输入在一行中给出用户连续输入的若干个编号。
首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。
考点:循环嵌套选择
循环控制输入次数为5
输入1~4,输出对应的价格值。当输入0时直接退出for循环
#include
int main()
{
int i,choice;
printf("[1] apple\n");
printf("[2] pear\n");
printf("[3] orange\n");
printf("[4] grape\n");
printf("[0] exit\n");
for(i=0;i<5;i++)
{
scanf("%d",&choice);
if(choice==0)
break;
switch(choice)
{
case 0:break;
case 1:printf("price = 3.00\n");break;
case 2:printf("price = 2.50\n");break;
case 3:printf("price = 4.10\n");break;
case 4:printf("price = 10.20\n");break;
default:printf("price = 0.00\n");break;
}
}
return 0;
}
本题要求将输入的任意3个整数从小到大输出。
输入在一行中给出3个整数,其间以空格分隔。
在一行中将3个整数从小到大输出,其间以“->”相连。
考点:分支结构
首先输入三个整数,存放在变量里,用if语句判断大小调整顺序然后输出
- 首先调整ab大小顺序,让a为最小,所以当a>b时交换
- 让后调整bc大小顺序,让c为最大,当b>c时交换
- 最后,由于bc交换,不清楚此时ab的大小关系,所以再调整一次ab
那么ac要不要再判断呢?因为前两次已经确定了大小关系为ab,b作为中间值已经确定了ac的关系即a
#include
int main()
{
int a,b,c,t;
scanf("%d %d %d",&a,&b,&c);
if(a>b){
t=b;
b=a;
a=t;
}if(b>c){
t=b;
b=c;
c=t;
}if(a>b){
t=b;
b=a;
a=t;
}
printf("%d->%d->%d",a,b,c);
return 0;
}
按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。
在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。
考点:分支结构,整数转浮点数
如果没有超速,输出OK,超速>=10罚款200,超速>=50吊销驾驶证。三种限速分别为60,100,120
先求超速比例,以此作为判据,注意比例是浮点数,所以要把速度等整数在表达式里乘以一个浮点数来转换。
#include
int main()
{
int speed,Limited_speed;
double per;
scanf("%d %d",&speed,&Limited_speed);
per = (speed - Limited_speed)*100*1.0/Limited_speed;
if(per<10){
printf("OK");
}else if(per >= 10&&per<50){
printf("Exceed %.f%%. Ticket 200",per);
}else{
printf("Exceed %.f%%. License Revoked",per);
}
return 0;
}
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
考点:分支结构,四舍五入,整转浮
路阻停车和正常计费是分开的
小于等于三公里为10元,3到10每公里+2,10公里就是24元。超过10公里是24+3*公里
(等待时间/5)*2则是路阻停车的费用
其中的四个变量,由题得等待时间wtime是整型,公里数是浮点型。而计算总价格和行驶价格时,因为与浮点型的公里数相关,也设定成浮点型。值得一提的是,题目中要求给出的最终结果需要四舍五入,此时要用到格式控制符%.0f
#include
int main()
{
int wtime;
double kilo,fee=0,price=0;
scanf("%lf %d",&kilo,&wtime);
if(kilo<=3)
{
price = 10;
}else if(kilo<=10){
price = 10+(kilo-3)*2.0;
}else{
price = 24+(kilo-10)*3.0;
}
fee=(wtime/5)*2 + price;
printf("%.0f",fee);
return 0;
}
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。
在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
考点:循环嵌套选择分支
用输入的N来控制循环,for循环读入并在内部判断,存入变量
注意要把人数分布的变量赋初值
#include
int main()
{
int N,A,B,C,D,E,i,score;
A=B=C=D=E=0;
scanf("%d",&N);
for(i=0;i=90)
A++;
else if(score>=80)
B++;
else if(score>=70)
C++;
else if(score>=60)
D++;
else
E++;
}
printf("%d %d %d %d %d", A, B, C, D, E);
return 0;
}
给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
输入在一行中顺序给出六个[−100,100]范围内的数字,即三个点的坐标x1、y1、x2、y2、x3、y3。
若这3个点不能构成三角形,则在一行中输出“Impossible”;若可以,则在一行中输出该三角形的周长和面积,格式为“L = 周长, A = 面积”,输出到小数点后2位。
考点:分支结构,数学公式
要成为三角形,满足:两边之和大于第三边,两边之差小于第三边,用负判据更方便写。所以条件是(a+b)<=c||(a+c)<=b||(c+b)<=a
要用这个规律判断,首先要得到三边的边长,两个点的差值平方和得到边长,要用到pow,sqrt两个函数,所以要声明math.h。本次的运算可以全用浮点型
最后要得到长度和面积,长度累加,面积用海伦公式即可。注意结果要用两位小数
#include
#include
int main()
{
double x1,x2,x3,y1,y2,y3;
double lenth,area,a,b,c;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
a=sqrt(pow((x1-x2),2)+pow((y1-y2),2) );
b=sqrt(pow((x2-x3),2)+pow((y2-y3),2) );
c=sqrt(pow((x1-x3),2)+pow((y1-y3),2) );
//如果两边之和小于等于第三边
if((a+b)<=c||(a+c)<=b||(c+b)<=a)
{
printf("Impossible");
}
else
{
lenth=a+b+c;
area=sqrt(lenth/2*(lenth/2-a)*(lenth/2-b)*(lenth/2-c));//海伦公式
printf("L = %.2f, A = %.2f",lenth,area);
}
return 0;
}