内容正文:
项目二 输入学生成绩转化为等级
项目要求
一个班进行了一次考试,教师打的是百分制成绩,现在学校要求打五级制,即90~100 分的转变为A,80~89 的转变为 B,70~79的转变为C,60~69的转变为D,60以下的转变为E。
项目分析
要完成对成绩的转换输出,第一步必须要对输入的成绩是否合法作一个判断,因为是百分制,所以0-100分都是合法的,此范围外输入的成绩是有问题的;第二步对输入的合法成绩转换成相应的等级。因此,将这个项目分解成二个任务来完成。任务一是输入学生成绩,判断其合法性;任务二是输入学生成绩转化为等级。
任务1 输入学生成绩,判断其合法性
一、任务要求
输入一个学生的成绩,判断它是否合法(成绩采用百分制)。
分析:
程序流程图:
方法一:首先判断输入的成绩是否在1到100之间,是的话输出提示信息“输入成绩合法”;再判断输入的成绩是否在0到100以外,是的话输出提示信息“输入的成绩不合法”。
二、具体实现
方法一:
参考程序:
#include "stdio.h"
main()
{ float x;
printf("请输入一个学生成绩");
scanf("%f",&x);
if(x>=0 && x<=100) printf("输入成绩合法
");
if(x<0||x>100) printf("输入成绩不合法
");
}
二、具体实现
方法二:
参考程序:
#include "stdio.h"
main()
{ float x;
printf("请输入一个学生成绩");
scanf("%f",&x);
if(x>=0&&x<=100) printf("输入成绩合法");
else printf("输入成绩不合法");
}
方法二:判断输入的成绩是否在1到100之间,是的话输出提示信息“输入成绩合法”;否则的话输出提示信息“输入的成绩不合法”。
程序流程图
本任务知识点:
1、关系运算符与关系表达式
2、逻辑运算符与逻辑表达式
3、if 和if else语句
三、相关知识
(一) 关系运算符与关系表达式
1. 关系运算符及优先级
< (小于)
> (大于)
< = (小于或等于)
>= (大于或等于)
== (等于)
!= (不等于)
优先级相同(高)
优先级相同(低)
1)前4种运算符(<,<=,>,>=)优先级相同,后两种也相同。前4种高于后2种。
(2)关系运算符的优先级低于算术运算符。
(3)关系运算符的优先级高于赋值运算符。
2. 关系表达式
用关系运算符将两个表达式连接起来的式子,称为关系表达式。
例如:a>b,a!=b,a+b>a+c,’a’>’b’
关系表达式的值是一个逻辑值,即“真”或“假”,在C语言中用1代表“真”,以0代表“假”。
【例如】若a=1,b=4,则:
(1)a>b的值为0。因为a=1,b=4,所以a>b的值为假,即表达式a>b的值为0。
(2)a!=b的值为1。
(3)a==b>=0的值为1。因为“>=”优先级比“==”的优先级要高,所以b>=0先做,结果为1;再做==运算符,a==1成立,所以整个表达式的值为1。
(4)b>=0==a的值为1。
(二) 逻辑运算符与逻辑表达式
1. 逻辑运算符及优先级
&& 逻辑与 优先级低
|| 逻辑或
! 逻辑非 优先级高
优先级:“!”运算符高于算术运算符,关系运算符高于逻辑运算符
a b !a !b a&&b a||b
真 真 假 假 真 真
真 假 假 真 假 真
假 真 真 假 假 真
假 假 真 真 假 假
其中“&&”相当于而且,要求有两个运算量 。
“||”相当于或者,要求有两个运算量。
“!”相当于否定 。
例如:10岁以下的小孩而且是女的
例如:10岁以下的小孩或者是女的
除了10岁以下的女小孩。
逻辑运算符的“真值表”
2. 逻辑表达式
逻辑表达式的值是一个逻辑值,即“真”或“假”, C语言编译系统在给出运算结果中,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。在C语言中一共只有4个0,分别是:0(整数0)、0.0(实数0)、‘\0’(字符0)和NULL(符号常量0)。
【例如】
若a=2,b=4,则a&&b的值为1。因为a,b的值均为非0,被认为是“真”,因此a&&b的值为“真”,表达式a&&b的值为1。
若x=5,则x>=0&&x<10的值为1。因为“>=”和“<”的优先级比“&&”的优先级高,先算x>=0和x<10表达式,结果都为1,而1&&1的结果为1,因此x>=0&&x<10的值为1。
若x=5,则x>=0&&x<3的值为0, 表达式x>=0的结果为1,表达式x<3的结果为0, 1&&0的结果为0。
若x=5,则x>=0||x<3的值为1,因为1||0的结果为1。
若x=5,则!(x>=0||x<3)的值为0。
(三) 条件语句
1. 单分支语句
【语法】
if(表达式)语句组 /*表达式值为非0时,执行语句组,为0时,不执行语句组*/
【流程图】
【例如】若a=3,b=4,c=5,
1)则执行语句if(a>b) c=a;后c的值为5,因为a>b不成立,则表达式的值为0,不执行后面的语句c=a,所以c的值不变,还是为5;
2)执行语句if(a<b)c=a;后c的值为3。
3)执行语句if(a>b) {t=a;a=b;b=t;}后a的值为3, b的值为4;
4)执行语句if(a<b){t=a;a=b;b=t;}后a的值为4, b的值为3。
其中的t=a;a=b;b=t;完成了变量a和b的值的交换,当语句组的语句有1句以上时,要用{ }把语句组括起来,注意在{ }外面不需要再加分号。因为{ }内是一个完整的复合语句,不需要另附加分号。
2. 双分支语句
【语法】
if(表达式)语句组1
else 语句组2 /*表达式值为非0时,执行语句组1,为0时,执行语句组2*/
【流程图】
【例如】若a=3,b=4,c=5,
则执行语句
if(a>b)c=a; else c=b;
后c的值为4。
执行语句
if(a<b)c=a; else c=b;
后c的值为3。
同样地,语句组1和语句组2的语句不止一句时,要用{ }将语句组括起来,作为一个复合语句。
【例如】若a=3,b=4,c=5,
执行语句
if(a<b){t=a;a=b;b=t;}
else {t=a;a=c;c=t;}后a、b、c的值分别为4,3,5。
【例2-1】输入任意三个整数a、b、c,输出其中最小的数。
方法一:
用一个变量min来暂时存放所有比较过数中的最小值。第一次将某个数赋给min,然后用min跟没有比较过的数一一进行比较,发现新的数比min的值还小的话,就修改min的值为新比较的数,直到所有的数都比较过为止。
参考程序:
#include "stdio.h"
main( )
{ int a,b,c,min;
printf("请输入三个数");
scanf("%d,%d,%d",&a,&b,&c);
min=a;
if(min>b)
min=b;
if(min>c)
min=c;
printf("%d,%d,%d中最小的数为%d
",a,b,c,min);
}
【例2-1】输入任意三个整数a、b、c,输出其中最小的数。
方法二:
分析:我们首先将a、b两个数进行比较,把两者中最小的数放到a中,然后用两者中最小的数a跟c进行比较,同样的把两者中最小的数放到a中,最后a中的值就是三者中最小的值。
参考程序:
#include "stdio.h"
main( )
{ int a,b,c,t;
printf("请输入三个数");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
printf("%d,%d,%d中最小的数为%d",a,b,c,a);
}
【例2-2】 输入一个年份,判断它是否是闰年。
某一年是闰年的条件是:能被4整除并且不能被100整除,或者能被400整除的年份是闰年。写成表达式是year%4==0&&year%100!=0||year%400==0。
方法一:先设一个变量t=0,然后判断该年份是否满足闰年的条件,满足的话将t的值修改为1,然后我们可以根据t 的值来判断该年是否是闰年,t为0的话不是闰年,t为1的话是闰年。
#include "stdio.h"
main( )
{int year,t=0;
printf("请输入年份");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0)
t=1;
if(t==0) printf("%d年不是闰年
",year);
if(t==1) printf("%d年是闰年
",year);}
方法二:判断该年份是否满足闰年的条件,满足的话输出是闰年的提示信息,否则输出不是闰年的提示信息。
#include "stdio.h"
main( )
{ int year,t;
printf("请输入年份");
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0)
printf("%d年是闰年
",year);
else
printf("%d年不是闰年
",year);
}
四、知识扩展
条件运算符与条件表达式
条件运算符为 ? :
条件表达式为 表达式1 ?表达式2:表达式3。
当表达式1值为真时,整个表达式的值为表达式2的值,当表达式1值为假时,整个表达式的值为表达式3的值。
例如:
若a=3,b=4,则表达式a>b?a:b的值为4。
因为表达式a>b的值为0,整个表达式a>b?a:b应该是表达式3的值,即b的值。
表达式a>b?a:b的值实际上是取a、b两者中最大值。
若a=3,b=4,c=5,则表达式c>(a>b?a:b)?c: (a>b?a:b)的值为5。这里表达式1是c>(a>b?a:b),表达式2是c,表达式3是(a>b?a:b) 。表达式c>(a>b?a:b)?c: (a>b?a:b)的值实际上是取a、b、c三者中最大值。
任务2 输入学生成绩转化为等级
一、任务提出
输入一个学生的成绩,若是合法成绩,则输出相应的等级,否则输出不合法的提示信息。
方法一:首先判断输入的成绩是否合法,不合法的话,输出“输入的成绩不合法”的提示信息;合法的话再判断成绩是否在90分到100分之间,是的话,将变量y赋好相应的值;同样再判断成绩是否在80分到90分之间,是的话,将变量y赋好相应的值等等。
参考程序:
#include "stdio.h"
main()
{float x; char y;
printf("请输入1-100内的一个成绩");
scanf("%f",&x);
if( x>=0 && x<=100 )
{if(x>=90 && x<=100) y='A';
if(x>=80 && x<90) y='B';
if(x>=70 && x<80) y='C';
if(x>=60 && x<70) y='D';
if(x>=0 && x<60) y='E';
printf("该学生的等级为%c
",y);}
else printf("输入的学生成绩不合法
");}
方法二:
方法二:首先判断输入的成绩是否合法,不合法的话,输出“输入的成绩不合法”的提示信息;合法的话再判断成绩是否大于等于90分,若是的话,将变量y赋好相应的值;否则再判断成绩是否大于等于80分,是的话,将变量y赋好相应的值;否则再判断成绩是否大于等于70分,是的话,将变量y赋好相应的值等等。
#include "stdio.h"
main()
{ float x;
char y;
printf("请输入1-100内的一个成绩");
scanf("%f",&x);
if(x<=100&&x>= 0)
{if(x>=90) y='A';
else if(x>=80) y='B';
else if(x>=70) y='C';
else if(x>=60) y='D';
else y='E';
printf("该学生的等级为%c
",y);}
else printf("输入的学生成绩不合法
");
}
方法三:
另外我们还可以用switch语句来实现。
#include "stdio.h"
main()
{ int x,t;
char y;
printf("请输入1-100内的一个成绩");
scanf("%d",&x);
t=x/10;
switch(t)
{ 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("输入的学生成绩有误");
}
}
本任务中要掌握的是:
1、if语句的嵌套用法。
2、switch语句的用法。
三、相关知识
1. if语句的嵌套
【语法】
if(表达式1)语句组1
else if(表达式2)语句组2
else if(表达式3)语句组3
.…
else 语句组n
【例如】
if(x>=90&&x<=100) y=’A’;
else if(x>=80) y=’B’;
else if(x>=70) y=’C’;
else if(x>=60) y=’D’;
else y=’E’;
这里实际上只有一个if else语句,只不过else后面跟的不是一般的语句,而又是一个if else语句而已。 if 和else 后面可以跟语句组,这个语句组里当然也可以是if else语句,这种情况称为if语句的嵌套。if语句的嵌套时,else语句与if的匹配原则是:与在它上面的、距离它最近的、在同一层括号内的、且尚未匹配的if配对。
【例2-3】 输入一个字符,判断它是小写、大写、数字还是其它字符。
分析:输入一个字符,判断它是否小写,是的话输出相应的提示信息;否则再判断它是否是大写,同样是的话输出相应的提示信息;等等。
参考程序:
#include “stdio.h”
main()
{
char a;
printf(“请输入一个字符
”);
scanf(“%c”,&a);
if(a>=‘a’&&a<=‘z’)
printf(“输入的字符是小写”);
else if(a>=‘A’&&a<=‘Z’)
printf(“输入的字符是大写”);
else if(a>=‘0’&&a<=‘9’)
printf(“输入的字符是数字”);
else
printf(“输入的字符是其它字符”);}
分析下面程序错误的原因:
#include “stdio.h”
main()
{
char a;
printf(“请输入一个字符
”);
scanf(“%c”,&a);
if(a>=‘a’&&a<=‘z’)
printf(“输入的字符是小写”);
if(a>=‘A’&&a<=‘Z’)
printf(“输入的字符是大写”);
if(a>=‘0’&&a<=‘9’)
printf(“输入的字符是数字”);
else
printf(“输入的字符是其它字符”);
}
2. switch语句
一般形式为:
switch(表达式)
{case 常量表达式1:语句组1;break;
case 常量表达式2:语句组2;break;
……
case 常量表达式n:语句组n;break;
default :语句组n+1;
}
说明:
switch后面的表达式可以是int char和枚举型中的一种。
case每个后面的表达式必须互不相同,否则会出现矛盾的现象。
case后面的常量表达式仅起语句标号的作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以要加上break语句,以便结束switch语句。
【例如】
switch(t)
{ case 10:
case 9: y=’A’; printf(“ %c
”,y);
case 8: y=’B’; printf(“ %c
”,y);
case 7: y=’C’; printf(“ %c
”,y);
case 6: y=’D’; printf(“ %c
”,y);
default:y=’E’; printf(“ %c
”,y);
}
若t=9,则连续输出
A
B
C
D
E
若t=7,则连续输出C
D
E
若修改成下面的程序:
switch(t)
{case 10:
case 9: y=’A’; printf(“ %c
”,y); break;
case 8: y=’B’; printf(“ %c
”,y); break;
case 7: y=’C’; printf(“ %c
”,y); break;
case 6: y=’D’; printf(“ %c
”,y); break;
dfault:y=’E’; printf(“ %c
”,y);
}
若t=9,则输出A
若t=7,则输出C
【例2-4】“生肖”也称“属相”,是以12个动物来命名的,顺次为鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪,是中国民间表示年份和计算年龄的方法,历史悠久,已证实早在春秋时期我国就有了生肖的记载。生肖以12年为一循环,周而复始。本例要求输入公元后的年份,计算并输出该年的生肖。
生肖是用来纪年的,每一年都对应于一个生肖。生肖以12年为一周期,用数字1,2,3….顺次表示为:
1 2 3 4 5 6 7 8 9 10 11 12
鼠 牛 虎 兔 龙 蛇 马 羊 猴 鸡 狗 猪
分析:若输入年份是2000年,假设已经计算出它在一个生肖周期中的序号为5,那么马上就能知道它的生肖是“龙”了。
已知,公元1年是鸡年(查资料或由已知生肖的年份反推),鸡在生肖中的顺号是10,与公元1年相差9,因此,先将年份加上9,再对12求余数:
(year+9)%12
得到的余数就正好是这一年在生肖周期中的顺序号(余数为0时,顺序号为12)
#include "stdio.h"
main()
{int year;
printf("请输入年份");
scanf("%d",&year);
printf("公元(A.D)%4d年是:",year);
switch((year+9)%12)
{case 1:printf("鼠(Rat) 年
");break;
case 2:printf("牛(Ox) 年
");break;
case 3:printf("虎(Tiger) 年
");break;
case 4:printf("兔(Hare) 年
");break;
case 5:printf("龙(Dragon) 年
");break;
case 6:printf("蛇(Snake) 年
");break;
case 7:printf("马(Horse) 年
");break;
case 8:printf("羊(Sheep) 年
");break;
case 9:printf("猴(Monkey) 年
");break;
case 10:printf("鸡(Cock) 年
");break;
case 11:printf("狗(Dog) 年
");break;
case 0:printf("猪(Boar) 年
");break;
default:printf("错误!
");
}}
【例2-5】运输公司对用户计算运费。路程(s)越远,每公里运费越低。
s<250 没有折扣
250<=s<500 2%折扣
500<=s<1000 5%折扣
1000<=s<2000 8%折扣
2000<=s<3000 10%折扣
s>=3000 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为
f=p*w*s*(1-d)
分析:公司对不同的路程采用了5种折扣,但实际上路程值有无数种,我们要把这无数种路程变为若干个值。通过观察我们可以把250公里作为一个单元,这样就把所有路程变成了13种情况,分别是0、1、……12。而其中0享受的是没有折扣;1享受的是2%折扣;2、3 享受的是5%折扣;4、5、6、7 享受的是8%折扣;8、9、10、11 享受的是10%折扣;12享受的是15%折扣。
参考程序:
#include “stdio.h”
void main()
{ int c,s;
float p,w,d,f;
printf(“请输入基本运费,货物重量,距离”);
scanf("%f,%f,%d",&p,&w,&s);
if (s>=3000) c=12;
else c=s/250;
switch(c)
{ case 0:d=0;break;
case 1:d=2;break;
case 2:
case 3:d=5;break;
case 4:
case 5:
case 6:
case 7:d=8;break;
case 8:
case 9:
case 10:
case 11:d=10;break;
case 12:d=15;break; }
f=p*w*s*(1-d/100.0);
printf("总运费=%15.4f
", f);
}
用switch语句解题的关键是要把多种情况分成若干个有限的值。
举一反三
【例2-6】从键盘输入两个整数及一个运算符(加、减、乘、除), 求其结果并输出。(分别用if else和switch语句完成)
分析:首先判断输入的运算符是否符合范围,符合的话再判断是否是’+’,是的话做加法;否则再判断是否是’-’,是的话做减法;否则的话再判断是否是’*’,是的话做乘法;否则做除法。
include "stdio.h"
main()
{
float s ,a,b;
char ch;
printf("请输入算式,仅限于加减乘除
");
scanf("%f%c%f",&a,&ch,&b);
if(ch=='+'|| ch=='-'|| ch=='*'|| ch=='/')
{ if(ch=='+') s=a+b; /*单引号不可少*/
else if(ch=='-') s=a-b;
else if(ch=='*') s=a*b;
else s=a/b;
printf("%f%c%f=%f
",a,ch,b,s);
}
else printf("输入的运算符有误
");
}
方法二
#include "stdio.h"
main()
{ int a,b;
float s;
char ch;
printf("请输入算式,仅限于加减乘除
");
scanf("%d%c%d",&a,&ch,&b);
if(ch=='+'|| ch=='-'|| ch=='*'|| ch=='/')
{switch(ch)
{ case '+': s=a+b; break;
case '-': s=a-b; break;
case '*' : s=a*b; break;
case '/' :s= (float)a/b; break;
}
printf("%d%c%d=%f
",a,ch,b,s);
}
else printf("输入的运算符有误
");
}
【例2-7】根据以下函数关系,对输入的每个x值,计算出y值。
分析:这是一个分段函数,函数值允许的范围是小于等于10的数,所以用if语句的嵌套实现。流程图如所示。
#include "stdio.h"
main()
{int x;
float y;
scanf("%d", &x);
if(x<=10)
{
if (x>2) y=x*(x+2);
else if (x>0) y=1.0/x;
else y=x-1;
printf("%f",y);
}
else printf("输入数据有误
"); }
【例2-8】将1~7中的任意一个数字转换成星期几的前三个字母,例:1转换成Mon,7转达换成Sun。
分析:此题的分支较多,所以用switch语句显得比较直观。
参考程序:
#include "stdio.h"
main()
{
int x;
printf("请输入1~7的数字: ");
scanf("%d",&x);
switch(x)
{case 1: printf("Mon
");break;
case 2: printf("Tue
");break;
case 3: printf("Wed
");break;
case 4: printf("Thu
");break;
case 5: printf("Fri
");break;
case 6: printf("Sat
");break;
case 7: printf("Sun
");break;
default:printf("输入数据有误
");
}
}
【例2-9】试编程:与电脑玩剪刀石头布的游戏。
分析:(1)因为是“剪刀石头布”的游戏,也就是说,电脑只要随机出0、1、2这三个数,所以需要用到rand()函数,但是rand()是一个伪随机数。而我们需要的是随机数,所以要用到随机种子函数srand((unsigned)time( NULL)),以time函数值(即当前时间)作为种子数,就可以保证随机性了。我们将产生的随机数进行除3取余:magic=magic%3,则就随机产生了0、1、2这三个数。
(2)要列出一个清单,告诉玩游戏的人,数字与剪刀石头布的关系,即用3个输出语句。 printf("石头请选择0
");
printf("剪刀请选择1
");
printf("布请选择2
");
(3)玩家有三种选择,而电脑也会随机产生三个数(看上去好像也是三种选择),所以要根据每一种情况进行判断。即:如果玩家选择石头(即选择数字0),我们就要根据电脑有可能产生的三种情况进行判断。当然,如果玩家选择的是剪刀或者布,我们也要像前面一样进行判断。
参考程序
#include<stdio.h>
#include<stdlib.h> /*用到了产生随机数的库函数rand(),所以要包含stdlib.h*/
#include <time.h> /*用到了产生随机种子库函数srand(),所以要包含time.h*/
main()
{ int magic; /*存放产生的随机数,认为是计算机出拳数*/
int guess; /*存放从键盘输入的数,即玩家出拳数*/
srand((unsigned)time( NULL ) ); /*产生随机种子*/
magic=rand(); /*产生一个随机数*/
magic=magic%3; /*让产生的随机数变成0、1、2这三个数*/
printf("石头请选择0
");
printf("剪刀请选择1
");
printf("布请选择2
"); /*产生一个菜单*/
printf("请输入一个数:");
scanf("%d",&guess); /*从键盘输入的数*/
if(guess==0) /*在玩家出石头的情况下,根据电脑产生的数,产生战绩*/
switch(magic)
{case 0:printf("双方都出石头,平了!
");break;
case 1:printf("玩家出石头,电脑出剪刀,所以玩家赢了!
");break;
case 2:printf("玩家出石头,电脑出布,所以玩家输了!
");}
if(guess==1) /*在玩家出剪刀的情况下,根据电脑产生的数,产生战绩*/
switch(magic)
{case 0:printf("玩家出剪刀,电脑出石头,所以玩家输了!
");break;
case 1:printf("双方都出剪刀,所以玩家平了!
");break;
case 2:printf("玩家出剪刀,电脑出布,所以玩家赢了!
");}
if(guess==2) /*在玩家出布的情况下,根据电脑产生的数,产生战绩*/
switch(magic)
{case 0:printf("玩家出布,电脑出石头,所以玩家赢了!
");break;
case 1:printf("玩家出布,电脑出剪刀,所以玩家输了!
");break;
case 2:printf("双方都出布,所以玩家平了!
");}
}
程序的运行结果如图2-15所示。(部分结果)
【例2-10】输入某年某月某日,判断这一天是这一年的第几天?
分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#include "stdio.h"
main()
{
int day,month,year,sum,leap;
printf("
请输入年月日
");
scanf("%d,%d,%d",&year,&month,&day);
switch(month) /*先计算某月以前月份的总天数*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("输入数据有误");break; }
sum=sum+day; /*再加上某天的天数*/
if(year%400==0||(year%4==0&&year%100!=0)) /*判断是不是闰年*/
leap=1;
else
leap=0;
if(leap==1&&month>2) /*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("这是本年的第 %d天
",sum);
}
【例2-11】输入4个学生的成绩,按从高到低的次序输出。
分析:前面我们已经求过3个数中的最大值,求4个数的最大值就只要把前面三个数的最大值与第四个数进行比较就可以了;求好四个数的最大值后,接下来就是求剩下的三个数的最大值;最后再求最后剩下的两个数的最大值即可。
参考程序:
#include "stdio.h"
main()
{float a,b,c,d,t;
printf("请输入4个学生的成绩,用逗号分隔");
scanf("%f,%f,%f,%f",&a,&b,&c,&d);
if(a>b){t=a;a=b;b=t;}
if(a>c){t=a;a=c;c=t;} /*求出了a、b、c三个数的最大值在a中,其它两个数分别在b、c中*/
if(a>d){t=a;a=d;d=t;}
if(b>c){t=b;b=c;c=t;}
if(b>d){t=b;b=d;d=t;} /*此时求好了两个最大的数a和b,其余的数在c、d中*/
if(c>d){t=c;c=d;d=t;}
printf("4个学生成绩从高到低的次序为:%.1f,%.1f,%.1f,%.1f
",d,c,b,a);
}
【例2-12】输入一个数,如果是7的倍数,则输出这个数的立方,否则输出这个数的平方。
分析:判断是否是7的倍数,就只要看能否被7整除就可以了;a的立方不能写成a3,可以简单地用a*a*a来表示,也可以调用C语言中提供的库函数pow(a,3)来表示,此时要用#include “math.h”语句把包含pow函数的库文件math.h包含进来。
#include "stdio.h"
main( )
{
int a,t;
printf("请输入一个整数");
scanf("%d",&a);
if(a%7==0)
t=a*a*a;
else
t=a*a;
printf("%d",t);
}
#include "stdio.h“
#include “math.h”
main( )
{
int a,t;
printf("请输入一个整数");
scanf("%d",&a);
if(a%7==0)
t=pow(a,3);
else
t=a*a;
printf("%d",t);
}
【例2-13】输入一个数,判断它是否是水仙花数(一个三位数,它的各位数字立方之和等于它本身,这个数就是水仙花数)。
分析:要求这个数的三位数字之和,首先要分解出这个数的每一位数字,这个一般通过对数求余或取整等运算来完成。
参考程序:
#include "stdio.h"
main( )
{
int a,b,c,x ;
printf("请输入一个三位整数");
scanf("%d",&x);
a=x/100; /*分离出百位数*/
b=x/10%10; /*分离出十位数*/
c=x%10; /*分离出个位数*/
if(a*a*a+b*b*b+c*c*c==x) /*判断三位数字之和是否与原数相等*/
printf("%d是水仙花数
",x);
else
printf("%d不是水仙花数
",x);
}
【例2-14】输入方程ax2+bx+c=0的系数值(设a≠0),输出方程的实根或输出没有实根的提示信息。
分析:输入方程的系数a、b、c后,首先要判断b2-4ac是否大于零,有实根则求出方程的实根,没有实根则输出没有实根的提示信息。
参考程序:
#include "stdio.h"
#include "math.h"
main()
{float a,b,c,d,p,q,x1,x2;
printf("输入一元二次方程的系数a,b,c");
scanf("%f,%f,%f",&a,&b,&c);
d=sqrt(b*b-4*a*c);
if(d<0) printf("方程没有实根");
else
{x1=(-b+sqrt(d))/(2*a); /*求两个实根*/
x2=(-b-sqrt(d))/(2*a);
printf("方程的两个实根分别为:x1=%f
x2=%f
",x1,x2);
}
}
$$