C语言程序设计—基础篇第7章简单程序设计之二2020/3/16本章内容提要多分支选择结构—switch语句循环嵌套break语句和continue语句程序举例2020/3/16教学目标在三种基本结构的基础上,结合本章介绍流程控制的其他几个语句:switch语句、break语句和continue语句及循环的嵌套,实现复杂的算法,设计出结构清晰、功能强大的程序,对C语言程序开发设计有比较深刻的认识。2020/3/167.1多分支选择结构程序设计1、语句形式:switch(表达式){case常量1:语句1;case常量2:语句2;case常量3:语句3;.......case常量n:语句n;default:语句n+1;}根据表达式的不同值,选择不同的程序分支,又称开关语句。数值型或字符型常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。千万不能接(;)号2020/3/162、语句执行流程:指语句的最后一条是否为break简单语句或复合语句breakbreak有无break有无有计算表达式常量1常量2常量n=语句1…===语句2语句n其它=语句n+1无值case语句出现的次序并不影响执行结果。2020/3/16voidmain(){intn;printf(请输入成绩:);scanf(%d,&n);switch((int)(n/10)){case10:printf(成绩%d的等级为优秀\n,n);case9:printf(成绩%d的等级为优秀\n,n);case8:printf(成绩%d的等级为良好\n,n);case7:printf(成绩%d的等级为中等\n,n);case6:printf(成绩%d的等级为及格\n,n);default:printf(成绩%d的等级为不及格\n,n);}}【例7.1】编写程序,对学生成绩进行等级评定。将成绩分为几个等级:0~59分为不及格,60~69分为及格,70~79分为中等,80~89分为良好,90~100分为优秀。要求输入一个成绩,输出其对应的等级。请输入成绩:78↙成绩78的等级为中等成绩78的等级为及格成绩78的等级为不及格出错啦!?2020/3/16在“switch”语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,因此会继续执行所有后面语句的情况。为此,C语言提供了一种break语句,其功能是可以跳出它所在的switch语句。2020/3/16将上面的例7.1修改如下:voidmain(){intn;printf(请输入成绩:);scanf(%d,&n);switch((int)(n/10)){case10:printf(成绩%d的等级为优秀\n,n);break;case9:printf(成绩%d的等级为优秀\n,n);break;case8:printf(成绩%d的等级为良好\n,n);break;case7:printf(成绩%d的等级为中等\n,n);break;case6:printf(成绩%d的等级为及格\n,n);break;default:printf(成绩%d的等级为不及格\n,n);}}请输入成绩:78↙成绩78的等级为中等2020/3/16使用switch语句时还应注意以下几点switch后面圆括号内表达式的值和case语句中常量表达式的值,都必须是整型的、枚举型的或字符型的,不允许是浮点型的。在case后的各常量表达式的值不能相同。每个case子句既可以是一条语句,也可以是多条语句。当是多条语句时,不需要用花括号括起来。各个case子句和default子句的先后顺序可以变动,而不会影响程序执行结果。default子句可以省略不用。多个case的后面可以共用一组执行语句。如例7.1中等级为优秀的判断程序可改为:2020/3/16switch((int)(n/10)){case10:case9:printf(成绩%d的等级为优秀\n);break;…}2020/3/167.2嵌套循环结构程序设计在一个循环内又完整地包含另一个循环,称为循环的嵌套。for语句可以与while语句、do-while语句相互嵌套,构成多重循环,例如:2020/3/16(1)(2)for()do{{……while()for(){…}{…}……}}while();(3)(4)while()for(){{……for()for(){…}{……}}…}2020/3/16for(i=1;i=9;i++){打印第i行;}【例7.2】打印乘法小九九表。使用一个循环9次的循环语句,每次循环打印一行:打印第i行,循环i次,每次循环打印一个表达式:for(j=1;j=i;j++){打印第j个表达式;}打印完一行后换行2020/3/16#includestdio.hvoidmain(){inti,j;for(i=1;i=9;i++){for(j=1;j=i;j++)printf(%d*%d=%-3d,i,j,i*j);printf(\n);}}程序运行情况如下:1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=812020/3/16【例7.3】百鸡问题。#includestdio.hvoidmain(){intx,y,z;for(x=1;x=20;x++)/*用嵌套的for循环依次设公鸡有1,2,…,20只*/for(y=1;y=33;y++)/*设母鸡有1,2,…,33只*/for(z=3;z100;z+=3)/*设小鸡有3,6,…,99只*/if(x*5+y*3+z/3==100&&x+y+z==100)printf(“公鸡%d只、母鸡%d只、小鸡%d只\n,x,y,z);}程序运行结果如下:公鸡4只、母鸡18只、小鸡78只公鸡8只、母鸡11只、小鸡81只公鸡12只、母鸡4只、小鸡84只2020/3/167.3break语句和continue语句在循环中的应用break语句只能用在switch语句或循环语句中,其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为break;注意:break语句对if-else的条件语句不起作用。在多层循环中,一个break语句只向外跳一层。使用break语句可以使循环语句有多个出口2020/3/16continue语句continue语句只能用在循环体中,其一般格式是:continue;其语义是:结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,并不跳出循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。1)while(表达式1){……if(表达式2)break;……}2)while(表达式1){……if(表达式2)continue;……}2020/3/162020/3/16【例7.4】输出100以内能被7整除的数。#includestdio.hvoidmain(){intn;for(n=1;n=100;n++){if(n%7!=0)continue;printf(%d,n);}printf(\n);}程序运行情况如下:7142128354249566370778491982020/3/16【例7.5】判断m是否素数#includemath.h#includestdio.hintmain(){intm,i,k;scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i++)if(m%i==0)break;if(i=k+1)printf(%disaprimenumber\n,m);elseprintf(%disnotaprimenumber\n,m);return(0);}2020/3/167.4程序举例【例7.6】模拟自动饮料机#includestdio.hvoidmain(){intbutton;printf(=====自动饮料机=====\n);printf(1.可口可乐\n);printf(2.雪碧\n);printf(3.百事可乐\n);printf(4.芬达\n);printf(5.非常可乐\n);printf(请按1~5键选择饮料:\n);scanf(%d,&button);2020/3/16switch(button){case1:printf(\n你获得一听可口可乐\n);break;case2:printf(\n你获得一听雪碧\n);break;case3:printf(\n你获得一听百事可乐\n);break;case4:printf(\n你获得一听芬达\n);break;case5:printf(\n你获得一听非常可乐\n);break;default:printf(\n非法操作!\n);}}程序运行情况如下:=====自动饮料机=====1.可口可乐2.雪碧3.百事可乐4.芬达5.非常可乐请按1~5键选择饮料:3↙你获得一听百事可乐2020/3/16【例7.10】数组元素排序——冒泡排序(以升序为例)排序过程:比较第一个数与第二个数,若为逆序a[0]a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置重复上述过程,共经过n-1趟冒泡排序后,排序结束2020/3/16例3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟4938659776132730初始关键字n=8384976971397279730971376767627301365276530651313494930492738273830381327第七趟2020/3/16输入n个数给a[0]到a[n-1]for(i=0;in-1;i++)for(j=0;jn-i-1;j++)a[j]a[j+1]真假a[j]a[j+1]输出a[0]到a[n-1]#includestdio.hmain(){inta[10],i,j,t;printf(Input10numbers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);for(i=0;i9;i++)for(j=0;j9-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf(Thesortednumbers:\n);for(i=0;i10;i++)printf(%d,a[i]);}2020/3/16【例7.11】数组元素排序——选择排序(以升序为例)排序过程:首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序重复上述过程,共经过n-1趟排序