1、C C语言程序设计语言程序设计、结构化程序设计的有哪几种基本结构?结构化程序设计的有哪几种基本结构?、算法的描述方法都有哪几种?、算法的描述方法都有哪几种?、C C语句的分类有哪些?语句的分类有哪些?课程回顾课程回顾4.1有节约要求的水费问题4.2 if语句4.3switch语句学习目标熟练掌握if语句的各种用法掌握switch语句的用法能够编写简单的选择结构程序选择结构选择结构单分支单分支双分支双分支if (if (表达式表达式)语句语句多分支多分支if (if (表达式表达式)语句语句else else 语句语句if (if (表达式表达式1)1)语句语句else if (else if
2、(表达式表达式)语句语句else else 语句语句n nif if 语句的嵌套语句的嵌套switchswitch语句语句4.14.1 有节约要求的水费问题有节约要求的水费问题 任务描述任务描述 为提倡节约用水,按照每月每户为提倡节约用水,按照每月每户每人每人3 3吨水进行定量,吨水进行定量,标准标准以内的用以内的用水量水费为水量水费为每吨每吨1.511.51元元,超额超额的部分的部分2 2倍付费倍付费。需要我们编写程序来解决每。需要我们编写程序来解决每户每个月要交的水费问题。户每个月要交的水费问题。问题分析:问题分析:1 1、每户的人口数、每户的人口数2 2、每个、每个月所用的水量月所用的水
3、量3 3、判断是否超出了定、判断是否超出了定量标准量标准4 4、进行水费的计算。、进行水费的计算。数据需求数据需求 1 1、程序常量、程序常量 DOSAGE 3 DOSAGE 3 CRITERION 1.51 CRITERION 1.51 2 2、输入数据、输入数据 int person /int person /*存放人口数存放人口数*/float previous,behind/float previous,behind/*存放上个月水表存放上个月水表 读数,这个月水表读数读数,这个月水表读数*/3 3、输出数据、输出数据 int ration /int ration /*每户标准用水量每
4、户标准用水量*/float water,charge/float water,charge/*用水总量,总水费用水总量,总水费*/4.14.1 有节约要求的水费问题有节约要求的水费问题 算法算法1 1获取数据:读入水表上个月和这个月的读数,读入获取数据:读入水表上个月和这个月的读数,读入人口数。人口数。2 2计算用水量:计算用水量:water=behind-previouswater=behind-previous。3 3计算用水标准量:计算用水标准量:ration=personration=person*DOSAGEDOSAGE4 4if if没有超出标准用水量没有超出标准用水量 charg
5、e=watercharge=water*CRITERIONCRITERION else else charge=ration charge=ration*CRITERION+(water-ration)CRITERION+(water-ration)*2 2*CRITERIONCRITERION5 5显示水费总数。显示水费总数。实践4.14.1 有节约要求的水费问题有节约要求的水费问题 流程图流程图 4.14.1 有节约要求的水费问题有节约要求的水费问题 功能实现功能实现#include#include#define DOSAGE 3#define DOSAGE 3#define CRITER
6、ION 1.51#define CRITERION 1.51main()main()int person,ration;int person,ration;float previous,behind,water,charge;float previous,behind,water,charge;printf(printf(请输入人口数、上月水表读数、本月水表读数:请输入人口数、上月水表读数、本月水表读数:););scanf(%d%f%f,&person,&previous,&behind);scanf(%d%f%f,&person,&previous,&behind);ration=perso
7、n ration=person*DOSAGE;DOSAGE;water=behind-previous;water=behind-previous;if(water=ration)/if(water=ration)/*条件判断,分支选择条件判断,分支选择 */charge=water charge=water*CRITERION;CRITERION;else else charge=ration charge=ration*CRITERION+(water-ration)CRITERION+(water-ration)*2 2*CRITERION;CRITERION;printf(n prin
8、tf(n用户水费是:用户水费是:%.2fn,charge);%.2fn,charge);4.1 4.1 有节约要求的水费问题有节约要求的水费问题单分支if语句 该语句的一般形式如下:if(表达式)语句;功能:如果表达式的值为真,则执行其后面的语句,否则不执行该语句。12#include#include int int main()main()float score;float score;scanf(scanf(%f%f,&score);&score);if(score=60)if(score=60)printf(printf(通过考试!通过考试!););return 0 return 0;8
9、9通过考试!通过考试!思考?思考?从键盘输入一个月考成绩,如果输入成从键盘输入一个月考成绩,如果输入成绩大于等于绩大于等于6060,在屏幕上输出通过考试!,在屏幕上输出通过考试!思考?在键盘上输入两个数,输出其中较大的那个数?#include#include int int main()main()float float a,b,maxa,b,max;scanf(scanf(%f,%f,f,%f,&a,&ba,&b););max=a;max=a;if(if(b b maxmax)max=b;max=b;printf(printf(max is%fnmax is%fn,max,max););re
10、turn 0 return 0;双分支if语句这是if语句比较完整的形式,包含一条if子句和一条else子句。该语句的一般形式如下:if(表达式)语句1;else 语句2;功能:如果表达式的值为真,则执行语句1,否则执行语句2。#include#include int int main()main()float score;float score;scanf(scanf(%f%f,&score);&score);if(score=60)if(score=60)printf(printf(通过考试通过考试!););else else printf(printf(没有通过考试没有通过考试!););
11、return 0 return 0;思考?思考?从键盘输入一个月考成绩,如果输入成绩大于等于从键盘输入一个月考成绩,如果输入成绩大于等于6060,在屏幕上输出通过考试!否则输出没有通过考试!在屏幕上输出通过考试!否则输出没有通过考试!void main()float a,b,t;scanf(%f,%f,&a,&b);if(ab)t=a;a=b;b=t;printf(%5.2f,%5.2f,a,b);思考?利用分双支结构,在键盘上输入两个数,按数据大小顺序输出?思考?输入3个数a,b,c,要求按由小到大的顺序输出?#include#include void main()void main()fl
12、oat a,b,c,t;float a,b,c,t;scanf(%f,%f,%f,&a,&b,&c);scanf(%f,%f,%f,&a,&b,&c);if(ab)if(ab)t=a;a=b;a=t;/t=a;a=b;a=t;/*实现实现a a和和b b的互换的互换*/if(ac)if(ac)t=a;a=c;c=t;/t=a;a=c;c=t;/*实现实现a a和和c c的互换的互换*/if(bc)if(bc)t=b;b=c;c=t;/t=b;b=c;c=t;/*实现实现b b和和c c的互换的互换*/printf(%5.2f,%5.2f,%5.2f,a,b,c);printf(%5.2f,%5
13、.2f,%5.2f,a,b,c);#include#include int int main()main()float a,b,c,float a,b,c,areaarea,s;,s;scanf(scanf(“%f,%f,%f%f,%f,%f”,&a,&b,&c);,&a,&b,&c);if(a+bc)&(a+cb)&(b+ca)if(a+bc)&(a+cb)&(b+ca)s s=(a+b+c)/2;=(a+b+c)/2;areaarea=sqrt(=sqrt(s s*(s s-a)-a)*(s s-b)-b)*(s s-c);-c);printf(printf(“area“area=%7.2
14、fn=%7.2fn”,areaarea););else else printf(printf(“Not a triangle!nNot a triangle!n”););reutrn 0;reutrn 0;【例】输入三角形的三边,求三例】输入三角形的三边,求三角形的面积。角形的面积。输入输入a,b,ca,b,c是三角形是三角形吗?吗?s s (a+b+c)/2(a+b+c)/2areaareasqrt(sqrt(s s*(s s-a)a)*(s s-b)-b)*(s s-c)-c)输出输出areaarea输出输出“非非三角形!三角形!”3,4,53,4,5 areaarea=6.00=6.00
15、3,4,83,4,8 Not a triangle!Not a triangle!多分支if语句该语句的一般形式如下:if(表达式1)语句1else if(表达式2)语句2.else if(表达式n)语句nelse 语句n+1 功能:依次判断表达式的值,当出现某个表达式的值为真时,则执行其对应的语句,然后跳转到整个if语句之后继续执行程序;如果所有的表达式均为假,则执行else后的语句n+1。多分支多分支if if语句语句#include void main()float number,cost,result;printf(“请输入消费:);scanf(%f,&number);商场打折商场打折
16、:花费超过花费超过500500元打元打8585折,花费超过折,花费超过300300元元打打9 9折,花费超过折,花费超过100100元,打元,打99.2599.25折,花费超过折,花费超过5050元元打打95,95,请输入商场消费,输出实际消费。请输入商场消费,输出实际消费。if(number500)c7st=0.15;if(number500)c7st=0.15;else if(number300)cost=0.10;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number100)cost=0.075;el
17、se if(number50)cost=0.05;else if(number50)cost=0.05;else cost=0;else cost=0;result=number-number result=number-number*cost;cost;printf(“printf(“实际消费:实际消费:%fn”,result);%fn”,result);#include int main()float score;char grade;printf(Please input the score:);scanf(%f,&score);if(score=90&score=80&score=70
18、&score=70&score=60&score=60&score=0&score=0&scoreb)if(ab)d=a;d=a;elseelse if(cb)if(cb)d=c;d=c;else else d=b;d=b;if(ab)if(ab)if(cb)if(cb)d=c;d=c;else else d=b;d=b;if(ab)if(ab)if(cb)if(cb)d=c;d=c;else else d=b;d=b;if(ab)if(ab)if(cb)if(cb)d=c;d=c;else else d=b;d=b;else else d=a;d=a;d=5d=5d=3d=3d=0d=0d=
19、4d=4int main()int a,b,c,max;scanf(%d,%d,%d,&a,&b,&c);if(ab)if(ac)max=a;else max=c;else if(bc)max=b;else max=c;printf(max=%dn,max);return 0;编写C程序,实现从键盘任意接收3个整数,输出最大数?实例分析 编写程序,输入一个x的值,按以下函数计算并输出y的值。-1 (x0)实例分析实例分析#include#include void main()void main()int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);if(x0)y
20、=-1;if(x0)y=-1;else if(x=0)y=0;else if(x=0)y=0;else y=1;else y=1;printf(x=%d,y=%dn,x,y);printf(x=%d,y=%dn,x,y);实例分析 编写程序,输入一个x的值,按以下函数计算并输出y的值。x (x1)y=2x-1 (1=x=10)实例分析#include#include int main()int main()intint x,y;x,y;printf(“please input the x:n”);printf(“please input the x:n”);scanf(“%d”,&x);sca
21、nf(“%d”,&x);if(x1)if(x=1&x=1&x=10)else if(x=10)y=3y=3*x-1;x-1;printf(“y is%d”,y);printf(“y is%d”,y);return 0;return 0;32课堂小结 1.1.单分支(单分支(if if结构)结构)2.2.双分支结构(双分支结构(ifelse ifelse)结构格式)结构格式 3.?:?:条件表达式条件表达式 4.if.if与与elseelse的配对原则:的配对原则:elseelse总是与它上面的最近的未配对的总是与它上面的最近的未配对的if if配对。配对。选择结构选择结构单分支单分支双分支双分
22、支if (if (表达式表达式)语句语句多分支多分支if (if (表达式表达式)语句语句else else 语句语句if (if (表达式表达式1)1)语句语句else if (else if (表达式表达式)语句语句else else 语句语句n nif if 语句的嵌套语句的嵌套switchswitch语句语句课堂小结1、if与else的配对原则?2、写出程序运行结果。#include intmain()int a=100,x=10,y=20,ok1=5,ok2=0;if(xy)if(y!=10)if(!ok1)a=1;else if(ok2)a=10;a=-1;printf(“%dn”
23、,a);return 0;4.1有节约要求的水费问题4.2 if语句4.3 switch语句if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。所以C语言提供了一种switch语句专门处理多分支的情形,使程序变得简洁易懂。switch语句的一般形式如下:switch(表达式)case 常量表达式1:语句块1 case 常量表达式2:语句块2 case 常量表达式n:语句块n default:语句块n+1 功能:首先计算switch后面括号内的“表达式”,然后依次与各个case后面的“常量表达式”的值进行比较,当“表达式”的值与某一个case后面的“常量表达式”的值相等时,就选择
24、这个标号作为入口,执行该case子句后面的语句块,并继续执行其后的所有case子句直到程序结束。如果“表达式”的值与所有case后面的“常量表达式”的值都不相等,则执行default后面的语句。int main()int a;scanf(%d,&a);switch(a)case 1:printf(Mondayn);break;case 2:printf(Tuesdayn);break;case 3:printf(Wednesdayn);break;case 4:printf(Thursdayn);break;case 5:printf(firdayn);break;case 6:printf(
25、Saturadayn);break;case 7:printf(Sundayn);break;default:printf(errorn);return 0;输入输入1717的整数,要求输出对的整数,要求输出对应的星期的英文单词。应的星期的英文单词。在使用switch结构时应注意以下几点:switch 语句中的“表达式”和case后面的“常量表达式”的结果值的类型应该一致。每一个case的常量表达式的值必须互不相同,否则出现矛盾现象。各个case的出现次序不影响执行结果。执行完一个case后面的语句后,流程控制转移下一个case继续执行,除非有break语句跳出switch。default 语
26、句可有可无。另外,default 后面可以不加break语句。实例分析输入一个百分制成绩,要求输出对应的成绩等级。#include int main()float score;int temp;char grade;printf(Please input:);scanf(%f,&score);temp=(int)score/10;switch(temp)case 10:case 9:grade=A;break;case 8:grade=B;break;case 7:grade=C;break;case 6:grade=D;break;default:grade=E;printf(score i
27、s%.2f,grade is%cn“,score,grade);return 0;#include int main()int year,month,day;int leap;printf(please input the year number:);scanf(%d,&year);printf(please input the month number:);scanf(%d,&month);if(year%400=0)|(year%4=0&year%100!=0)leap=1;else leap=0;编写一编写一C C程序,实现输入年份和月份,打印输出该年该月有多少天。程序,实现输入年份和月
28、份,打印输出该年该月有多少天。switch(month)switch(month)case 1:case 1:case 3:case 3:case 5:case 5:case 7:case 7:case 8:case 8:case 10:case 10:case 12:day=31;break;case 12:day=31;break;case 4:case 4:case 6:case 6:case 9:case 9:case 11:day=30;break;case 11:day=30;break;case 2:if(leap=0)day=28;case 2:if(leap=0)day=28
29、;else else day=29;day=29;break;break;default:day=1;default:day=1;if(day=1)printf(Invalid month input!n);else printf(%d.%d has%d days.n,year,month,day);return 0;小小 型型 案案 例例 任务描述任务描述 运输公司对用户计算运费。路程运输公司对用户计算运费。路程(s)(s)越远,每公里运费越低。标准如下:越远,每公里运费越低。标准如下:s250km s250km 没有折扣没有折扣250250s500 s500 2%2%折扣折扣500500s
30、1000 s1000 5%5%折扣折扣10001000s2000 s2000 8%8%折扣折扣20002000s3000 s3000 10%10%折扣折扣30003000s s 15%15%折扣折扣 分析分析 设每公里每吨货物的基本运费为设每公里每吨货物的基本运费为p(pricep(price的的缩写缩写),货物重为,货物重为w(weightw(weight的缩写的缩写),距离为,距离为s(spaces(space的缩写的缩写),折扣为,折扣为d(discountd(discount的缩写的缩写),则总运费则总运费f(freightf(freight的缩写的缩写)的计算公式为:的计算公式为:f
31、=p f=p*w w*s s*(1-d)(1-d)小小 型型 案案 例例 算法算法分析此问题,折扣的变化是有规律的:分析此问题,折扣的变化是有规律的:折扣的折扣的“变化点变化点”都是都是250250的倍数的倍数(250(250,500500,10001000,20002000,3000)3000)。可以在横轴上加一种坐标。可以在横轴上加一种坐标c c,c c的值为的值为s/250s/250。c c代表代表250250的倍数。的倍数。当当c1c1时,表示时,表示s250s250,无折扣;,无折扣;1 1c2c2时,表示时,表示250250s500s500,折扣,折扣d=2%d=2%;2 2c4c
32、4时,时,d=5%d=5%;4 4c8c8时,时,d=8%d=8%;8 8c12c=3000)c=12;if(s=3000)c=12;else c=s/250;else c=s/250;switch(c)switch(c)case 0:d=0;break;case 0:d=0;break;case 1:d=2;break;case 1:d=2;break;case 2:case 2:case 3:d=5;break;case 3:d=5;break;case 4:case 4:case 5:case 5:case 6:case 6:case 7:d=8;break;case 7:d=8;bre
33、ak;case 8:case 8:case 9:case 9:case 10:case 10:case 11:d=10;break;case 11:d=10;break;case 12:d=15;break;case 12:d=15;break;f=p f=p*w w*s s*(1-d/100.0);(1-d/100.0);printf(printf(货物运费为:货物运费为:%15.4fn,f);%15.4fn,f);46课堂小结 1.1.单分支(单分支(if if结构)结构)2.2.双分支结构(双分支结构(ifelse ifelse)结构格式)结构格式 3.?:?:条件表达式条件表达式 4.
34、if.if与与elseelse的配对原则:的配对原则:elseelse总是与它上面的最近的未配对的总是与它上面的最近的未配对的if if配对。配对。5.switch.switch分支结构:分支结构:switch switch语句使用时应注意的几点;语句使用时应注意的几点;breakbreak在在switchswitch中的作用;中的作用;选择结构选择结构单分支单分支双分支双分支if (if (表达式表达式)语句语句多分支多分支if (if (表达式表达式)语句语句else else 语句语句if (if (表达式表达式1)1)语句语句else if (else if (表达式表达式)语句语句else else 语句语句n nif if 语句的嵌套语句的嵌套switchswitch语句语句课堂小结作业作业1 1、教材第四章课后习题。、教材第四章课后习题。2 2、作业集第四章编程题。、作业集第四章编程题。