1、 前面已介绍了顺序结构,本章介绍选择结构和循环结构。C语言中,基本语句包括下列语句:(1)赋值语句 (2)条件语句 (3)循环语句 (4)转移语句 (5)函数语句5.1.1 5.1.1 简单赋值语句简单赋值语句 运算符加上“=”语句格式:r=v;5.1.2 5.1.2 特殊赋值语句特殊赋值语句 5.1.3 5.1.3 连续赋值语句连续赋值语句 ;21vrrrk例5.2 从键盘输入一个任意的小写字母,将其转换成大写字母输出。main()char ch,chep;int bu;printf(“please input a little letter:”);scanf(“%c”,&ch);bu=a-
2、A;chep=ch-bu;printf(“the capital letter is:%c”,chep);C C语言中有三类选择语句语言中有三类选择语句:(1)条件语句(if语句)(2)条件赋值语句(3)开关语句(switch语句)1 1、ifif的三种形式的三种形式 功能:当表达式值非0时,执行语句A,否则不执行语句A.表达式语句A00例如:if(xy)printf(%d,x);形式1 if(表达式)语句A其流程图:例5.5 计算y=|x|绝对值计算公式如下:main()float x;printf(“please input x:”);scanf(“%f”,&x);if(xy)printf
3、(%d,x);else printf(%d,y);例5.6 用键盘输入3个数(a、b、c),确定其中最大值。设max为a、b中最大者,公式如下:main()float a,b,max;printf(“please input a,b,c:”);scanf(“%f%f%f”,&a,&b,&c);if(a=b)max=a;else max=b;if(maxc)max=c;printf(“max=%fn”,max);)()(maxbabbaa再令max为max和c中最大者,此时公式如下:)(max)(maxmaxmaxccc 假设a就是三个数的最大者,并且始终让a中存放三个数中的最大者,计算过程如下
4、:先找a、b中真正大者,并存于a中,公式如下:main()float a,b,c;printf(“please input a,b,c:”);scanf(“%f%f%f”,&a,&b,&c);if(a b)a=b;if(ab?a:b);max=(maxc?max:c);printf(“max=%fn”,max);if语句的嵌套if(表达式1)内嵌ifelse内嵌if注意:else总是与它上面的最近的未配对的if 配对.一般形式 在上述形式的if语句中,又可以是if语句称为嵌套。if(表达式2)语句1if(表达式3)语句3else 语句2else 语句4例:if()if()语句2else 语句3
5、if ()if()语句1 else 所以:必要时加.if()语句1else补充例2 有一函数y=1 (x0)编一程序,输入一个x值,输出y值。有以下几种写法,请判断哪些是正确的?程序1:main()int x,y;scanf(d,&x);if(x=0)if(x0)y=1;else y=0;else y=1;程序3:将上述if语句改为:y=1;if(x!=0)if(x0)y=1;else y=0;程序4:y=0;if(x=0)if(x0)y=1;else y=1;1、语句形式:、语句形式:switch (表达式)(表达式)case 常量常量1:语句语句1;case 常量常量2:语句语句2;cas
6、e 常量常量3:语句语句3;.case 常量常量n:语句语句n;default:语句语句n+1;。数值型数值型或或字符型字符型常量表达式的值必须常量表达式的值必须互不相同,否则执行互不相同,否则执行时将出现矛盾,即同时将出现矛盾,即同一个开关值,将对应一个开关值,将对应多种执行方案。多种执行方案。千万不千万不能接能接(;)号号2、语句执行流程:、语句执行流程:指语句的最指语句的最后一条是否后一条是否为为break简单语句或简单语句或复合语句复合语句breakbreakbreakbreak有有无breakbreak有无有计算表达式计算表达式常量常量1 1常量常量2 2常量常量n n=语句语句1
7、1=语句语句2 2语句语句n n其它其它=语句语句n+1n+1无值值casecase语句出语句出现的次序并现的次序并不影响执行不影响执行结果。结果。例例3 3:假设用:假设用0 0、1 1、2.62.6分别表示星期日、星期一分别表示星期日、星期一.星期六。现输入一个数字,输出对应的星期几星期六。现输入一个数字,输出对应的星期几的英文单词。如果输入的英文单词。如果输入3 3,输出,输出“Wednesday”Wednesday”。#include stdio.hvoid main()int n;scanf(%d,&n);switch(n)case 0:printf(Sundayn);case 1:
8、printf(Mondayn);case 2:printf(Tuesdayn);case 3:printf(Wednesdayn);case 4:printf(Thursdayn);case 5:printf(Fridayn);case 6:printf(Saturdayn);default:printf(Error);程序运行情况如下:程序运行情况如下:3Wednesday ThursdayFridaySaturdayerror在在“switchswitch”语句中,语句中,“case case 常量表达式常量表达式”只相当于一个语句标号,表达式的值和某标号只相当于一个语句标号,表达式的值和
9、某标号相等则转向该标号执行,但不能在执行完该标相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个号的语句后自动跳出整个switch switch 语句,因此语句,因此会继续执行所有后面语句的情况。会继续执行所有后面语句的情况。为此,语言提供了一种为此,语言提供了一种breakbreak语句,其功能是语句,其功能是可以跳出它所在的可以跳出它所在的switchswitch语句。语句。将上面的例将上面的例3 3修改如下:修改如下:#include stdio.hvoid main()int n;scanf(%d,&n);switch(n)case 0:printf(Sundayn);br
10、eak;case 1:printf(Mondayn);break;case 2:printf(Tuesdayn);break;case 3:printf(Wednesdayn);break;case 4:printf(Thursdayn);break;case 5:printf(Fridayn);break;case 6:printf(Saturdayn);break;default:printf(Error);程序运行情况如下:程序运行情况如下:33Wednesday Wednesday 3、说明、说明多个多个casecase语句可以共用一组执行语句。语句可以共用一组执行语句。switch(
11、grade)case A:case B:case C:printf(grade=60n);break;default:printf(grade60);各各casecase和和defaultdefault子句的先后顺序可以变动,而子句的先后顺序可以变动,而不会影响程序执行结果。不会影响程序执行结果。defaultdefault语句可以省略不用。语句可以省略不用。casecase和和defaultdefault与其后面的常量表达式间至少有与其后面的常量表达式间至少有一个空格。一个空格。switchswitch语句可以嵌套,语句可以嵌套,breakbreak语句只跳出它所在语句只跳出它所在的的swi
12、tchswitch语句。语句。如如 case B:例例4 4 企业发放的奖金根据利润提成。从键盘输入当企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?月利润,求应发放奖金总数?10%1012%102014%204016%406018%6010020%100利润利润万利润利润万利润利润万奖金利润利润万利润利润万利润利润万利润xx=1010 x2020 x4040 x6060 x100100c&a+cb&b+ca)if(a=b&b=c)printf(equalateral triangle.n);else if(a=b|a=c|b=c)printf(isoscelestriang
13、le.n);else printf(other triangle.n);else printf(can notn);课堂练习课堂练习1.main()1.main()int x=1,y=0,a=0,b=0;int x=1,y=0,a=0,b=0;switch(x)switch(x)case 1:switch(y)case 1:switch(y)case 0:a case 0:a+;break;+;break;case case 1:b+;break;1:b+;break;case 2:a+;b+;break;case 2:a+;b+;break;case 3:case 3:a+;b+;a+;b+
14、;printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);结果结果:a=2,b=12.程序填空程序填空:以下程序判断输入的整数能否以下程序判断输入的整数能否被被3或或7整除整除.main()int x,f=0;scanf(“%d”,&x);if(1 )(2 )if(f=1)printf(“YESn”);else printf(“NOn”);在在C语言中可以用以下语句来实现循环:语言中可以用以下语句来实现循环:1.用用goto语句和语句和if语句构成循环;语句构成循环;2.用用while语句;语句;3.用用do-while语句;语句;4.用用for语句
15、。语句。循环循环:就是在给定的条件成立时反复执行某一程就是在给定的条件成立时反复执行某一程 序段,被反复执行的程序段称为循环体。序段,被反复执行的程序段称为循环体。S=1+2+3+1000S12100S+1SS+2SS+100S作100次加法S+iS累加器计数器1、语句形式:、语句形式:goto 语句标号语句标号;例如例如:goto label;label:.语句标号用标识语句标号用标识符表示,它的定符表示,它的定名规则与变量名名规则与变量名相同。相同。5.3.1 goto5.3.1 goto语句及与语句及与ifif语句构成循环语句构成循环2、语句执行流程、语句执行流程:在程序执行过程中,如果
16、遇到在程序执行过程中,如果遇到gotogoto语句,则程序执行流程无条件语句,则程序执行流程无条件地转向语句标号后的语句继续执行。地转向语句标号后的语句继续执行。3、说明、说明 语句标号仅仅对语句标号仅仅对goto goto 语句有效,对语句有效,对其它语句不影响。其它语句不影响。同一个程序中,不允许有同名标号。同一个程序中,不允许有同名标号。gotogoto语句通常与条件语句配合语句通常与条件语句配合使用。可用来实现条件转移、使用。可用来实现条件转移、构成循环、跳出循环体等功能构成循环、跳出循环体等功能 main()int i,sum=0;i=1;loop:if(i=100)sum=sum+
17、i;i+;goto loop;printf(%d,sum);运行结果如下:5050100211001ii例:求 main()int sum=0,i=1;loop:sum=sum+i;i+;if(i=100)goto loop;printf(sum=%d,sum);本例相当于当型循环本例相当于当型循环,若改为直到型若改为直到型:5.3.2 while5.3.2 while语句语句真真(非零非零)表达式表达式 循环体循环体假假(零零)1、while 语句的形式语句的形式:while(表达式表达式)循环体;循环体;2、while 语句语句 常称常称为为“当型当型”循环语句。循环语句。3、说明、说明:
18、先判断表达式,后执行语句。先判断表达式,后执行语句。表达式同表达式同ifif语句后的表达式一样,可以是语句后的表达式一样,可以是任何类型的表达式。任何类型的表达式。循环体多于一句时,用一对循环体多于一句时,用一对 括起括起。whilewhile循环结构常用于循环结构常用于循环次数不固定循环次数不固定,根,根据是否满足某个条件决定循环与否的情况。据是否满足某个条件决定循环与否的情况。i=1;s=0;while(i=100)s=s+i;i+;printf(“n1+2+3+100=%d”,s);循环变量的初始化(循环先导语句)累加器的初始化循环控制条件累加修改循环变量循环语句的三要素循环次数不固定的
19、循环语句循环次数不固定的循环语句,21222ns例例5.18 5.18 计算计算当当s s最接近且不大于最接近且不大于1000010000为止。为止。main()int i,s;s=i=0;while(s+i*i0)printf(+);else printf(-);scanf(%d,&x);判断正负号判断正负号修改循环变量的值修改循环变量的值#include stdio.h void main()char ch;int num=0;ch=getchar();【补充【补充 例例2】统计从键盘输入的一行字符的个统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。数(以回车键作为输入结束标记
20、)。while(ch!=n)判断是否输入结束判断是否输入结束num+;ch=getchar();printf(num=%dn,num);注意注意表达式在判断前,必须要有明确的值。表达式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。循环体中一般有改变条件表达式的语句。while(while(表达式表达式)后面没有分号。后面没有分号。5.3.3 do-while5.3.3 do-while语句语句1、do-while的形式:的形式:do 循环体;循环体;while(表达式);表达式);2、do-while语句语句 常称常称为为“直到型直到型”循环语句。循环语句。真真(非零非零)表
21、达式表达式 循环体循环体假假(零零)main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(%d,sum);例:用do-while语句求1001ii3、说明、说明:先先执行执行语句语句,后判断,后判断表达式表达式。第一次条件为真时,第一次条件为真时,while,do-while等价;等价;第一次条件为假时,二者不同。第一次条件为假时,二者不同。计算公式为计算公式为:例例5.215.21 输入若干个正整数,求其和,直到所输输入若干个正整数,求其和,直到所输 入数大于入数大于1010为止(该数不在求和之列)。为止(该数不在求和之列)。10
22、|,iiiixxxs用用whilewhile语句编写的程序如下:语句编写的程序如下:main()int x,s=0;printf(“please input first integer:);scanf(“%d“,&x);while(x10)goto L;do s=s+x;printf(“input next data:);scanf(“%d“,&x);while(x=10);L:printf(“s=%d,s);注意注意在在if、while语句中,表达式后面都没有分语句中,表达式后面都没有分号,而在号,而在do-while语句的表达式后面则必语句的表达式后面则必须加分号。须加分号。do-whil
23、e和和while语句相互替换时,要注意语句相互替换时,要注意修改循环控制条件修改循环控制条件。5.3.4 for5.3.4 for语句语句1、for的形式:的形式:for(初始表达式初始表达式1;条件表达式;条件表达式2;循环表达式;循环表达式3)循环体循环体;表达式表达式1:用于循环开始前为循环变量设置初始:用于循环开始前为循环变量设置初始值。值。表达式表达式2:控制循环执行的条件,决定循环次数。:控制循环执行的条件,决定循环次数。表达式表达式3:循环控制变量修改表达式。:循环控制变量修改表达式。循环体语句:循环体语句:被重复执行的语句。被重复执行的语句。表达式表达式3计算表达式计算表达式1
24、循环体循环体判断表达式判断表达式2零零非零非零for的下一条语句的下一条语句2、执行过程、执行过程 for(i=1;i=100;i+)sum=sum+i;例如:例如:它相当于以下语句:它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;表达式表达式1 1;while(表达式(表达式2)表达式表达式3 3;3、说明说明三个表达式都可以是逗号表达式。三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。意省略表达式后,分号间隔符不能省略。4.for语句中表达式省略的形式语句中表达式省
25、略的形式(1)for语句一般形式中的语句一般形式中的“表达式表达式1”可以省可以省略;此时应在略;此时应在for语句之前给循环变量赋初值语句之前给循环变量赋初值 如:如:sum=0;i=1;for(;i100)break;sum=sum+i;(3)表达式)表达式3也可以省略,但此时应保证循环也可以省略,但此时应保证循环能正常结束如:能正常结束如:for(sum=0,i=1;i=100;)sum=sum+i;i+;(4)可以省略表达式可以省略表达式1和和表达式表达式3,只有表达式,只有表达式2,如:如:i=1;sum=0;for(;i=100;)sum=sum+i;i+;i=1;sum=0;wh
26、ile(i100)break;sum=sum+i;i+;相当于相当于(6)循环体为空语句)循环体为空语句 对对for语句,循环体为空语句的一般形式为语句,循环体为空语句的一般形式为:for(表达式表达式1;表达式;表达式2;表达式;表达式3);如:如:for(sum=0,i=1;i=100;sum+=i,i+);表达式表达式2 2可以是关系表达式可以是关系表达式,也可以是数值表达式或也可以是数值表达式或字符表达式。只要值字符表达式。只要值 0.0.即执行循环体即执行循环体.for(i=0;(c=getchar()!=n;i+=c);(1)在进入累加前先给累加器赋初值(一般为)在进入累加前先给累
27、加器赋初值(一般为0););(2)用循环语句实现累加;)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。)循环体语句的设计。累加器当前值累加器当前值=累加器原值累加器原值+循环变量当前值循环变量当前值;典型例题分析典型例题分析例:例:求累加和求累加和1+2+3+1+2+3+1000+1000基本方法基本方法:属于属于“累加器累加器”类型问题。类型问题。累加器赋初值累加器赋初值求偶数和求偶数和2+4+6+100参考程序:参考程序:void main()long int k,s;s=0;for(k=1;k
28、=1000;k+)s=s+k;printf(s=%ld,s);累加累加思考思考(1)给累乘器赋初值,一般为)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体设计。)循环体设计。累乘器当前值累乘器当前值=累乘器原值累乘器原值*循环变量当前值;循环变量当前值;例例:求累乘积。求累乘积。如:如:123.100基本方法基本方法:属于属于“累乘器累乘器”类型问题。类型问题。累乘器赋初值累乘器赋初值求求n!=1 2 3 n参考程序:参考程序:void main()doub
29、le s=1;int k;for(k=1;k=1;x-)if(x%17=0)break;printf(x=%dn,x);找到满足条件的最找到满足条件的最大数,结束循环大数,结束循环(1)语句形式)语句形式:continue;(2)语句作用)语句作用:结束结束本次循环本次循环。2 2、continue continue 语句语句(3)语句执行流程)语句执行流程:continuecontinue语句可以结束本次循环,即不再语句可以结束本次循环,即不再执行循环体中执行循环体中continue continue 语句之后的语句,转语句之后的语句,转入下一次循环条件的判断与执行。入下一次循环条件的判断与
30、执行。【例】【例】求求300300以内能被以内能被1717整除的所有整数。整除的所有整数。#include stdio.hvoid main()int x,k;for(x=1;x=300;x+)if(x%17!=0)continue;printf(%dt,x);while(条件条件)语句语句A;break;语句语句 B;真真语句语句B条件条件语句语句Abreak假假结束循环结束循环4 4、breakbreak语句与语句与continuecontinue语句的区别语句的区别至此位置至此位置while(条件条件)语句语句A;continue;语句语句 B;真真语句语句B条件条件语句语句Aconti
31、nue假假结束循环结束循环至此位置至此位置#include stdio.hvoid main()int a,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf(%dn,a);【例【例5 5】分析以下程序的运行结果。分析以下程序的运行结果。程序运行结果:程序运行结果:4 4 在循环体语句中又包含有另一个完整的循环结构在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。嵌套的循环语句,则构成多重循环。5.3.6 5.3.6 循环的嵌套循
32、环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。称为外循环。while、do-while、for三种循环都可以互相嵌套。三种循环都可以互相嵌套。循环语句之间的关系循环语句之间的关系for(.).for(.).内循环内循环外循环外循环for(.).for(.).并列循环并列循环嵌套循环嵌套循环真真真真外循环初始条件外循环初始条件内循环初始条件内循环初始条件内循环体内循环体外循环条件外循环条件假假内循环条件内循环条件假假内循环循环条件内循环循环条件外循环循外循环循环条件环条件循环结束循环结束二重二重循环循环嵌套嵌套结构结构执行执行流程流程
33、 例例:输出图形输出图形:*编程分析编程分析:采用双重循环,一行一行输出。采用双重循环,一行一行输出。每一行输出步骤:一般每一行输出步骤:一般3步。步。1)光标定位)光标定位3)每输完一行光标换行)每输完一行光标换行(n)2)输出图形。)输出图形。例如本题:共例如本题:共4行行,若行号用若行号用k表示,表示,则每一行有则每一行有2*k-1个个*号。号。#include stdio.h void main()int k1,k2;for(k1=1;k1=4;k1+)putchar(t);for(k2=1;k2=k1;k2+)putchar(b);for(k2=1;k2=k1*2-1;k2+)put
34、char(*);putchar(n);定位(还可定位(还可以用空格的以用空格的方法)方法)输出输出1.1.对于同一问题对于同一问题,四种循环可相互替代。但不提四种循环可相互替代。但不提倡用倡用goto.goto.2.for2.for循环功能强于循环功能强于while,dowhile,dowhile.while.但若不是但若不是明显地给出循环变量初终值明显地给出循环变量初终值(或修改条件或修改条件),),则应则应用用while while 或或do do while.while.以增强程序的结构化和以增强程序的结构化和可读性。可读性。3.3.要防止无限循环要防止无限循环死循环。死循环。4.4.循
35、环过程中循环过程中,为了结束本次循环或跳出整个循为了结束本次循环或跳出整个循环。分别要用到环。分别要用到continuecontinue和和breakbreak语句。语句。5.3.7 5.3.7 循环结构程序设计举例循环结构程序设计举例【例【例5-15-1】求求 2358s.1 01235 求求 前前项项 之之 和和#include stdio.hvoid main()float s=0,f1=2,f2=1,f=1,t,n;/*累加器赋初值累加器赋初值*/for(n=1;n2)(n2)程序如下程序如下:main()long int f1,f2;int i;f1=1;f2=1;for(i=1;i
36、=20;i+)printf(%12ld%12ld,f1,f2);if(i%4=0)printf(n);f1=f1+f2;f2=f2+f1;f1=1,f2=1 for i=1 to 20 输出输出f1,f2 f1=f1+f2 f2=f2+f1运行结果为:运行结果为:153423315971094675025514229352457824157817185537725841771112113938320405702887390881692138961041812865719641813462699227465632459863211449876765463683178112178309149303
37、52102334155 判断一个数判断一个数m是否为素数的方法是否为素数的方法:每打印每打印10个数个数,换一次行。换一次行。m当用当用2,3,的整数去除它时均不能除的整数去除它时均不能除尽尽,则为素数。则为素数。程序如下:程序如下:#include main()【例【例5-4】求求100200的素数的素数.必考必考 int m,k,i,n=0;for(m=101;m=200;m=m+2)if(n%10=0)printf(n);k=sqrt(m);for(i=2;i=k+1)printf(%d ,m);n=n+1;1、写出程序运行结果、写出程序运行结果:void main()int i,j,x
38、=0;for(i=0;i2;i+)x+;for(j=0;j0)(i+=1 )if(n0)(j+=1 )(这因该是这因该是scanf(“%d”,%n);目的是修改循环变量目的是修改循环变量的值的值 )printf(“i=%4d j=%4dn”,i,j);3.百钱买百鸡百钱买百鸡.公鸡公鸡5元一只元一只,母鸡母鸡3元一只元一只,小鸡小鸡1元三只元三只;一百元买一百只鸡一百元买一百只鸡,且公鸡且公鸡,母鸡母鸡,小鸡都小鸡都要有要有.有几种买法有几种买法?void main()int i,j,k,n=0;for(i=1;i99;i+)for(j=1;j99;j+)k=100-i-j;if(i*5+3*j+k*1/3 =100)n+;printf(i=%d,j=%d,k=%dn”,i,j,k);printf(“n n=%d”,n);4、编程输出下面的数字金字塔、编程输出下面的数字金字塔(1到到9)。1 121 12321 .12345678987654321本本 章章 小小 结结 1.掌握掌握while,for及多重循环及多重循环注意!2.掌握典型例题及方法掌握典型例题及方法(1)累加、连乘、累加、连乘、判断素数、费氏数列等判断素数、费氏数列等(2)枚举、递推方法枚举、递推方法