C语言新教材PPT课堂课件-4(1)-顺序与选择结构.ppt
1第四章第四章 程序控制结构程序控制结构主要内容主要内容4.1 C4.1 C语言的执行语句语言的执行语句4.2 4.2 顺序结构顺序结构4.3 4.3 选择结构选择结构4.4 4.4 循环结构循环结构24.1 C语言的执行语句语言的执行语句一、表达式语句:一、表达式语句:表达式表达式;例如:例如:a-=a*a;赋值语句赋值语句 a=b=5*3;赋值语句赋值语句 i+;自增自增1语句语句 x=0,y=1;逗号表达式语句逗号表达式语句 printf(Hello!);函数调用语句函数调用语句 二、空语句:二、空语句:;3三、复合语句:三、复合语句:用一对花括号括起来的一组语句。用一对花括号括起来的一组语句。语句语句1 语句语句2 语句语句n 说明:说明:1 1、复合语句在语法上是一个语句。、复合语句在语法上是一个语句。2 2、一般将复合语句用在语法上是、一般将复合语句用在语法上是一个语句而相应操作需多条语句完一个语句而相应操作需多条语句完成的场合。成的场合。3 3、复合语句内的各条语句都必须、复合语句内的各条语句都必须以分号以分号“;”结尾,而右花括号结尾,而右花括号“”后面则不能有分号。后面则不能有分号。4 4、复合语句又称为分程序,、复合语句又称为分程序,它它可以有属于自己的数据说明部分。可以有属于自己的数据说明部分。4四、控制语句四、控制语句(1)条件选择语句)条件选择语句:if语句语句(2)开关分支语句)开关分支语句:switch语句语句(3)当循环语句)当循环语句:while语句语句(4)直到循环语句)直到循环语句:dowhile语句语句(5)计数循环语句)计数循环语句:for语句语句(6)中止本次循环语句)中止本次循环语句:continue语句语句(7)中止整个循环语句)中止整个循环语句:break语句语句(8)无条件转移语句)无条件转移语句:goto语句语句(9)函数返回语句)函数返回语句:return语句语句54.2 顺序结构顺序结构l顺序结构程序:由两个或两个以上的语句组成,顺序结构程序:由两个或两个以上的语句组成,先执行先执行 A A 操作操作,然后再执行然后再执行 B B 操作。操作。AB(入口)入口)(出口)出口)ABN-S流程图流程图传统流程图传统流程图6顺序结构程序举例顺序结构程序举例l【例例4.1】求两数之和及平均值求两数之和及平均值 l【例例4.2】数的分离数的分离l【例例4.3】截取二进制位截取二进制位l【例例4.4】求一元二次方程的实数根求一元二次方程的实数根7P63例例4.1 输入任意两个整数,求它们的和及平均值输入任意两个整数,求它们的和及平均值#include void main()int num1,num2;float sum,aver;printf(Please input two integers:n);scanf(%d,%d,&num1,&num2);sum=(float)num1+num2;aver=sum/2.0;printf(sum=%.0f,aver=%.2fn,sum,aver);取两位小数输出取两位小数输出小数部分不输出小数部分不输出int型数之和可能超出型数之和可能超出int型的表示型的表示范围,故将范围,故将sum定义为定义为float型型 num1强制转换为强制转换为float型,型,以使以使num1、num2和为和为float型型 8拆分方法:拆分方法:m0=m%10;m0=m%10;m1=(m/10)%10;m1=(m/10)%10;m2=m/100;m2=m/100;方法方法2)/*1:/*1:将个位数拆分出来将个位数拆分出来 */*2:/*2:将十位数拆分出来将十位数拆分出来 */*3:/*3:将百位数拆分出来将百位数拆分出来 */例例4.2 给定一个三位正整数,分别输出它的个位数、给定一个三位正整数,分别输出它的个位数、十位数和百位数。十位数和百位数。方法方法1)m2=m/100;m2=m/100;m1=(m-m2*100)/10;m1=(m-m2*100)/10;m0=m-m2*100-m1*10;m0=m-m2*100-m1*10;/*1:/*1:将百位数拆分出来将百位数拆分出来 */*2:/*2:将十位数拆分出来将十位数拆分出来 */*3:/*3:将个位数拆分出来将个位数拆分出来 */9推广到五位数的拆分:推广到五位数的拆分:m0=m%10;m0=m%10;m1=(m/10)%10;m1=(m/10)%10;m2=(m/100)%10;m2=(m/100)%10;m3=(m/1000)%10;m3=(m/1000)%10;m4=(m/10000)%10;m4=(m/10000)%10;即即m4=m/10000;m4=m/10000;方法方法2)个位数个位数十位数十位数百位数百位数千位数千位数万位数万位数方法方法1)long m;long m;intint m0,m1,m2,m3,m4;m0,m1,m2,m3,m4;m4=m/10000;m4=m/10000;m3=(m-m4*m3=(m-m4*10000L10000L)/1000;)/1000;m2=(m-m4*m2=(m-m4*10000L10000L-m3*1000)/100;-m3*1000)/100;m1=(m-m4*m1=(m-m4*10000L10000L-m3*1000-m2*100)/10;-m3*1000-m2*100)/10;m0=m-m4*m0=m-m4*10000L10000L-m3*1000-m2*100-m1*10;-m3*1000-m2*100-m1*10;万位数万位数千位数千位数百位数百位数十位数十位数个位数个位数若从个位拆起,若从个位拆起,方法方法2 2更好!更好!10/*以十六进制形式输入以十六进制形式输入a*/*使使a右移右移4位存于位存于b*/*置置c=(1111)2*/*b&c得到结果得到结果d*/*以十六进制形式输出以十六进制形式输出d*/#include void main()unsigned a,b,c,d;scanf(%x,&a);b=a4;c=(04);d=b&c;printf(%xn%xn,a,d);例例4.3 取一个取一个1616位的二进制数位的二进制数a a的的7 74 4位位。15876543210了解了解11例例4.4 求方程求方程ax2+bx+c=0的实数根。的实数根。#include#include void main()float a,b,c,d,x1,x2;printf(Input a,b,c:);scanf(%f,%f,%f,&a,&b,&c);d=b*b-4*a*c;x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(x1=%.4fnx2=%.4fn,x1,x2);124.3 选择结构选择结构4.3.1 if4.3.1 if语句语句4.3.2 switch4.3.2 switch语句语句4.3.3 4.3.3 选择结构的嵌套选择结构的嵌套4.5.4 4.5.4 选择结构程序举例选择结构程序举例13选择结构选择结构l选择结构:先判断条件选择结构:先判断条件P,P,若条件成立若条件成立,跳过跳过B B执执行行A A操作;若条件不成立,跳过操作;若条件不成立,跳过A A执行执行B B操作。操作。BAP(入口)入口)(出口)出口)YNPY NABN-S流程图流程图传统流程图传统流程图144.3.1 if 语句语句lif if 语句是用来判断所给定的条件是否满足,语句是用来判断所给定的条件是否满足,根据判定的结果根据判定的结果(真或假真或假)决定执行给定的某决定执行给定的某种操作之一。种操作之一。15一、一、if 语句的形式语句的形式1单分支选择结构单分支选择结构l格式格式:if (表达式表达式)语句语句 执行过程:执行过程:表达式表达式语句语句(入口)入口)(出口)出口)YN举例举例:if (c=A&c=A&cy)printf(%d,x);else printf(%d,y);此处此处不能不能加加“;”此两此两处不处不能加能加“;”17l用双边用双边ifif实现单边选择结构实现单边选择结构表达式表达式语句语句(入口)入口)(出口)出口)NY 格式格式:if(if(表达式表达式);else else 语句语句 此处此处“;”不能少不能少,代表空语句代表空语句举例举例:if (cZ);else c=c+32;18三、三、if 语句的形式语句的形式3多分支选择结构多分支选择结构表达式表达式1语句语句1Y表达式表达式2N语句语句2Y表达式表达式3N语句语句3Y表达式表达式4N语句语句4Y语句语句5Nl格式格式:if(表达式表达式1)语句语句1 else if(表达式表达式2)语句语句2 else if(表达式表达式3)语句语句3 :else if(表达式表达式n)语句语句n else 语句语句n+1执行过程:执行过程:19例例4.5#include void main()char c;printf(Input a letter:);c=getchar();/*等效于等效于 scanf(%c,&c);*/if(c=A&c=Z)c=c+32;putchar(c);/*等效于等效于 printf(%cn,c);*/举例:输入一字母,以小写字母形式输出举例:输入一字母,以小写字母形式输出Input a letter:Input a letter:A A a aInput a letter:Input a letter:a a a a单分支单分支if20#include void main()char c;printf(Input a letter:);c=getchar();c=(c=A&c=A&c=Z)?c=c+32:c=c;21举例:按升序输出两个数举例:按升序输出两个数#include void main()int a,b;scanf(%d,%d,&a,&b);if(a=b)printf(%d,%dn,a,b);else printf(%d,%dn,b,a);双分支双分支if(条件(条件判断一次)判断一次)例例4.6 P70解解1)222个单分支个单分支if(条件判(条件判断两次)断两次)#include void main()int a,b,t;scanf(%d,%d,&a,&b);if(ab)printf(%d,%dn,b,a);例例4.6P69解解2)23单分支单分支if(条件(条件判断一次)判断一次)#include void main()int a,b,t;scanf(%d,%d,&a,&b);if(ab)t=a;a=b;b=t;/*两个变量交换数据*/printf(%d,%dn,a,b);例例4.6 P68解解3)3个语句用花括个语句用花括号括起来构成号括起来构成 1个复合语句个复合语句去掉花括号,去掉花括号,会是什么效会是什么效果?果?24#include void main()int a,b,t;scanf(%d,%d,&a,&b);if(ab)t=a;a=b;b=t;printf(%d,%dn,a,b);将分号改为逗号将分号改为逗号则成为则成为1个语句,个语句,可可去掉花括号去掉花括号t=a,a=b,b=t;25 举例:求分段函数的值举例:求分段函数的值#include void main()float x,y;scanf(%f,&x);if(x0)y=0;else if(x=50)y=x;else y=x*x;printf(x=%f,y=%fn,x,y);0 (x0)x (0 x50)x2 (x50)y=例例4.84.8 根据所输入的根据所输入的x x之值之值,求求用多边用多边if 语句:语句:26这是一这是一个嵌套个嵌套结构结构#include void main()float x,y;scanf(%f,&x);if(x=0)if(x=50)y=x;else y=x*x;else y=0;printf(x=%f,y=%fn,x,y);例例4.8另解:用双分支另解:用双分支if 语句的嵌套语句的嵌套 0 (x0)x (0 x50)x2 (x50)y=27四、四、if 语句的嵌套语句的嵌套一般形式一般形式:if (条件条件1)if(条件条件2)语句语句1 else 语句语句2 else if(条件条件3)语句语句3 else 语句语句4在在if if 语句中又包含一个或多个语句中又包含一个或多个if if 语句语句,称为称为if if 语句的嵌套语句的嵌套if if 与与 else else 的配对关系:从最内层开始的配对关系:从最内层开始,else,else 总是总是与它上面最近的且尚未配对的与它上面最近的且尚未配对的 if if 配对。配对。为了使逻辑关系清晰,建议采用为了使逻辑关系清晰,建议采用“分层缩进书写格式分层缩进书写格式”。28在内嵌在内嵌if语句中要注意配对关系语句中要注意配对关系#include void main()float x,y;scanf(%f,&x);y=x;if(x=0)if(x50)y=x*x;else y=0;printf(x=%f,y=%fn,x,y);该程序得不到正确结果!该程序得不到正确结果!例例4.8 以下程序正确吗?以下程序正确吗?/*x=0成立且成立且x50,即即x50成立成立*/*x=0成立且成立且x50不成立,即不成立,即0=x=50*/0 (x0)x (0 x50)x2 (x50)y=29在内在内嵌嵌if语句中加花括号改变配对关系语句中加花括号改变配对关系#include void main()float x,y;scanf(%f,&x);y=x;if(x=0)if(x50)y=x*x;else y=0;/*x=0不成立即不成立即x0 */printf(x=%f,y=%fn,x,y);改变配对关系后可以得出正确改变配对关系后可以得出正确结果结果结论:如果内层结论:如果内层if 语句为单边结构,要加花括号语句为单边结构,要加花括号例例4.8 0 (x0)x (0 x50)x2 (x50)y=304.3.4(1)选择结构程序举例选择结构程序举例-1【例例4.7】百分制成绩转换为五级制成绩百分制成绩转换为五级制成绩【例例4.13】判断数字、字母判断数字、字母【例例4.14】输入三角形三边长,求三角形面积输入三角形三边长,求三角形面积【例例4.15】三个数中求最大数、最小数三个数中求最大数、最小数31举例:百分制成绩转化为五级制成绩举例:百分制成绩转化为五级制成绩#include void main()int score;printf(nPlease input the score(0-100):);scanf(%d,&score);if(score=90)printf(An);else if(score=80)printf(Bn);else if(score=70)printf(Cn);else if(score=60)printf(Dn);else printf(En);例例4.7多分支多分支if分支顺序分支顺序能随意调能随意调换吗?换吗?用多分支用多分支if,程序最简洁,程序最简洁32举例举例:判断一个字符是数字、大写字母、小写字母或其它判断一个字符是数字、大写字母、小写字母或其它#include void main()char c;c=getchar();if(c=0&c=A&c=a&c=z)printf(This is a small letter.n);else printf(This is an other character.n);P81例例4.1333#include void main()char c;c=getchar();if(c=0&c=A&c=a&c=z)printf(This is a small letter.n);else printf(This is an other character.n);例例4.1334#include#include /*用到数学函数库中的用到数学函数库中的sqrt()*/void main()float a,b,c,s,area;scanf(%f,%f,%f,&a,&b,&c);if(a+bc&a+cb&b+ca)s=(a+b+c)/2;/*或或 0.5*(a+b+c)或或 1.0/2*(a+b+c)*/area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area=%7.2fn,area);else printf(Not a triangle.n);举例:输入三角形三边长,求三角形面积举例:输入三角形三边长,求三角形面积例例4.1435举例:从三个数中找出最大数和最小数举例:从三个数中找出最大数和最小数l思路之一:思路之一:1.1.先将先将a a、b b进行比较,将二者之中的大数放入进行比较,将二者之中的大数放入maxmax中,小数放入中,小数放入minmin中;中;2.2.将将c c与与maxmax进行比较,若进行比较,若c c大于大于maxmax,把,把c c放入放入maxmax中,否则再将中,否则再将c c与与minmin进行比较,若进行比较,若c c小于小于minmin,把把c c放入放入minmin中,这样,中,这样,maxmax、minmin中分别存放的中分别存放的就一定是三个数中的最大数和最小数。就一定是三个数中的最大数和最小数。例例4.154.15 解题思路解题思路36#include void main()int a,b,c,max,min;printf(input three numbers:);scanf(%d,%d,%d,&a,&b,&c);max=ab?a:b;min=amax)max=c;else if(cmin)min=c;printf(max=%dnmin=%d,max,min);举例:从三个数中找出最大数和最小数举例:从三个数中找出最大数和最小数例例4.1537根据此根据此表达式表达式的值找的值找入口入口4.3.2 switch 语句语句(多分支选择语句,开关语句多分支选择语句,开关语句)switchswitch (表达式表达式 )case case 常量常量1 1:语句语句1 1 break;break;casecase 常量常量2 2:语句语句2 2 break;break;casecase 常量常量n n:语句语句n n break;break;default:default:语句语句n+1n+1 执行过程:执行过程:先计算先计算switch后面后面表达式表达式的的值,如果与某个值,如果与某个case后的常后的常量值相等,则执行该量值相等,则执行该case分分支及其后各分支内嵌的语句,支及其后各分支内嵌的语句,直到遇到直到遇到break语句或最后语句或最后的的“”为止;若所有为止;若所有case中的常量值都不能与之匹配,中的常量值都不能与之匹配,则执行则执行default后的语句后的语句n+1。注意注意:switch后面的表达式后面的表达式和和case后面常量,后面常量,TC要求为要求为int、char或枚举型或枚举型38switch 语句流程图语句流程图39举例:输入成绩等级举例:输入成绩等级,打印出分数段打印出分数段#include void main()char grade;grade=getchar();grade=(grade=a&grade=z)?grade-32:grade;switch(grade)case A:printf(90100n);break;case B:printf(8089n);break;case C:printf(7079n);break;case D:printf(6069n);break;case E:printf(60n);break;default:printf(errorn);/*以下语句将以下语句将grade中字母转换成大写中字母转换成大写*/例例4.9:程序运行后,如果从键盘上输程序运行后,如果从键盘上输入入b,则程序运行的顺,则程序运行的顺序和结果如下:序和结果如下:输出:输出:808940去掉去掉break语句,程序运行后,从语句,程序运行后,从键盘上输入键盘上输入b,则程序运行,则程序运行的顺序和结果如下:的顺序和结果如下:输出:输出:80897079606960errorswitch语句的分支中无语句的分支中无break语句的效果语句的效果#include void main()char grade;grade=getchar();grade=(grade=a&grade=z)?grade-32:grade;switch(grade)case A:printf(90100n);case B:printf(8089n);case C:printf(7079n);case D:printf(6069n);case E:printf(60n);default:printf(errorn);41switch 语句使用说明语句使用说明l各个分支中如果没有各个分支中如果没有breakbreak语句,则执行了相应的语句,则执行了相应的操作后,会自动转到下一个操作后,会自动转到下一个casecase后面的语句执行。后面的语句执行。lcasecase后面的常量值不能相同。后面的常量值不能相同。l各个分支中允许有多个语句,可以不用各个分支中允许有多个语句,可以不用 括起来。括起来。l各个各个casecase和和defaultdefault分支的顺序可以改变,但分支的顺序可以改变,但defaultdefault总是最后考虑的入口。如果各个分支中均总是最后考虑的入口。如果各个分支中均有有breakbreak语句(最后一个分支无需语句(最后一个分支无需breakbreak语句,等同语句,等同于有于有breakbreak语句),各个分支的出现次序不影响执语句),各个分支的出现次序不影响执行结果。行结果。l可以使多个可以使多个casecase共用同一组执行语句。共用同一组执行语句。42switch(score/10)case 10:case 9:printf(An);break;case 8:printf(Bn);break;case 7:printf(Cn);break;case 6:printf(Dn);break;default:printf(En);举例:输入百分制成绩举例:输入百分制成绩,输出等级输出等级#include void main()int score;printf(nPlease input the score(0-100):);scanf(%d,&score);if(score100)printf(error.n);else例例4.10注意:关键字注意:关键字case与后面与后面数字之间要留空格。数字之间要留空格。两个两个case共用一组执共用一组执行语句行语句434.3.3 选择结构的嵌套选择结构的嵌套#include void main()int x,y,a=0,b=0;scanf(x=%d,y=%d,&x,&y);switch(x)case 1:switch(y)case 0:a+;case 1:b+;default:a+;b+;break;case 2:a+=2;b+=2;break;default:a+=3;b+=3;printf(a=%d,b=%dn,a,b);例例4.11444.3.4(2)选择结构程序举例选择结构程序举例-2【例例4.12】计算器程序计算器程序【例例4.16】判断闰年判断闰年 判断指定日期是当年的第几天判断指定日期是当年的第几天【例例4.17】求一元二次方程的根求一元二次方程的根45例例4.12 用户输入运算数和四则运算符,输出计算结果。用户输入运算数和四则运算符,输出计算结果。#include#include void main()float a,b;char c;printf(input expression:n);scanf(%f%c%f,&a,&c,&b);switch(c)case+:printf(=%fn,a+b);break;case-:printf(=%fn,a-b);break;case*:printf(=%fn,a*b);break;case/:if(b=0)printf(Division by zero!n);else printf(=%fn,a/b);break;default:printf(Operator error!n);举例举例:计算器程序计算器程序输入:输入:输入:输入:10+1410+14输出:输出:输出:输出:=24.000000=24.00000046举例:判断指定日期是当年的第几天举例:判断指定日期是当年的第几天算法分析:以算法分析:以5月月4日为例日为例l先把先把14月份的天数加起来,然后再加上本月的月份的天数加起来,然后再加上本月的4天即本年的第几天。天即本年的第几天。l当输入月份大于当输入月份大于3时需要考虑闰年情形。若是闰时需要考虑闰年情形。若是闰年,年,2月份应是月份应是29天。天。l闰年的判断:闰年的判断:符合以下条件之一是闰年符合以下条件之一是闰年:能被能被4整除整除,但不但不能被能被100整除整除;能被能被400整除。整除。即即(year%4=0&year%100!=0)|(year%400=0)l程序代码(两种解法):见程序代码(两种解法):见教程教程P84-86P83例例4.1647举例:求一元二次方程的完全解举例:求一元二次方程的完全解例例4.17 ax2+bx+c=0 48举例:求一元二次方程的完全解举例:求一元二次方程的完全解#include#include void main()float a,b,c,d,x1,x2,p,q;printf(Input a,b,c:);scanf(%f,%f,%f,&a,&b,&c);if(a=0)if(b=0)if(c=0)printf(Infinite solution.n);else printf(No solution.n);else printf(A root:x=%.4fn,-c/b);else d=b*b-4*a*c;if(d=0)x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(x1=%.4f,x2=%.4fn,x1,x2);else p=-b/(2*a);q=sqrt(-d)/(2*a);printf(x1=%.4f+%.4fin,p,q);printf(x2=%.4f-%.4fin,p,q);输出输出复根复根例例4.17