第3章 程序的控制.ppt_第1页
第3章 程序的控制.ppt_第2页
第3章 程序的控制.ppt_第3页
第3章 程序的控制.ppt_第4页
第3章 程序的控制.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 程序的控制结构,3.1 选择结构 3.2 循环结构 3.3 编译预处理,问题提出:,计算分段函数:,y=,3-x x0,2/x x0,解题的步骤:,C语言提供的选择结构有两种: if语句、switch语句。,3.1 选择结构,3.3.1 if 语句,if语句:对所给条件进行判定,根据判定结果决定是 否执行程序段。,语句形式:,if (表达式) 语句;,语句执行流程:,例3-1:读程序,理解数值作为if 表达式,#include void main() int i=10,m=3; if(i!=0) printf(“i is not 0n”); if(m) printf(“i is not

2、 0n”); ,程序运行结果: i is not 0 i is not 0,例3-2:读程序,理解”=”与”=”的作用及区别,#include void main() int m=10; if(m=100) printf(“m=%d”,m); if(m=100) printf(“m is assigned %dn”,m); ,程序运行结果: m is assigned 100,if (表达式) 语句1; else 语句2;,表达式,语句1,真(非0),假(0),语句2,3.3.1 if-else 语句,if-else 语句适合于解决双分支选择问题,语句形式:,语句执行流程:,例3-3:输入一个

3、整数,判断该整数的奇偶性,#include void main() int m; printf(“input m:”); scanf(“%d”, ,输入m,m%2=0,偶数,结束,真,假,奇数,例3-4:读程序,通过调试器理解浮点数的运算,#include void main() float f;double d; f=1.0; d=f/12.0; f=d; d=f*12.0; if( d=1.0) printf( “d is still 1.0n”); else printf( “d isnt still 1.0n”); ,程序运行结果:d isnt 1.0在vc中,f如果没有被使用过,也会

4、是1.涉及到复杂的版本运算机制不同,不必深究。养成不要对实型数据做等于比较的习惯,一定要比就做减法以后取绝对值和一个很小的数比较,小于这个数就认为是等于。,注意:有的if-else语句可以用条件运算符(? :)来实现,if(ab) max=a else max=b;,max=(ab)?a:b;,例3-5:输入一个英文字符,若为大写则改为小写,输出得到的字符。,#include void main() char zm; scanf(“%c”, ,程序运行结果: B b,if (表达式1) 语句1; else if (表达式2)语句2; else if (表达式n)语句n; else 语句n+1;

5、,3.1.3 嵌套的if-else 语句,语句形式:,表达式1,语句1,真(非0),假(0),语句执行流程:,例3-6:将0100分的百分制换算成AE的五级学分制。,#include void main() int s; scanf(“%d”,程序运行结果: 84 B,else if(s=70) printf(“score is Cn”); else if(s=60) printf(“score is Dn”); else printf(“score is en”); ,例3.7:计算分段函数:,#include void main() int x,y; scanf( %f , ,语句形式:,

6、switch (表达式) case 常量1: 语句 1; case 常量2: 语句2; case 常量3: 语句3; . case 常量n: 语句n; default : 语句n+1; ,根据表达式的不同值,选择不同的程序分支,又称开关语句。,数值型 或 字符型,常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。,3.1.4 switch 语句,语句执行流程:,指语句的最后一条是否为break,简单语句或复合语句,case语句出 现的次序并 不影响执行 结果。,例3-8: 按照考试成绩等级打印出百分制分数段。,程序运行结果: B 8089,#include

7、void main() char grade; scanf(%c, ,switch 的嵌套:switch语句允许嵌套,即switch本身可以作为另一个层switch语句的一部分,switch( i ) case 0: switch ( j ) case 0:printf( “i= =j”);break; case 1:printf(“ij”); break; case 1: . ,switch几个注意点,1、if语句能测试关系和逻辑表达式,而switch只能测试相等。 2、switch语句的每个case后面的常数必须是整型或字符型,在使用字符常量时。自动转换成整数。 3、switch语句中每个

8、case常数必须不同。,在C语言中有三种循环结构:while,do-while 和for循环,利用 有关的运算符构造表达式,以 控制循环的执行。,3.2 循环结构,循环: 就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。,3.2.1 while语句,真(非零),循环体,假(零),1、while 语句的形式: while (表达式) 循环体;,2 、 while 语句 常称为“当型”循环语句。,3、说明:,先判断表达式,后执行语句。,表达式同if语句后的表达式一样,可以是任何类型的表达式。,循环体多于一句时,用一对 括起。,while循环结构常用于循环次数不固定,根据是否

9、满足某个条件决定循环与否的情况。,例:分析下列程序段的循环次数,i=1; while (i=100) putchar(*); i+;,i=1; while (i=100) putchar(*); i+; ,例3- 9:用while编程实现1100的和。,#include void main() int i,sum; i=1; sum=0 ; while (i=100) sum=sum+i; i+; printf(%dn,sum); ,程序运行结果: 5050,例3-10:用while语句 计算n!。,#include void main() int n,m,temp; scanf(“%d”,

10、,程序运行结果: 5 5!=120,注意,表达式在判断前,必须要有明确的值。,循环体中一般有改变条件表达式的语句。,while (表达式)后面没有分号。,3.2.2 do-while语句,1、 do-while的形式: do 循环体; while (表达式);,2、 do-while语句 常称为“直到型”循环语句。,真(非零),循环体,假(零),例3-10:用do-while编程实现1100的和。,#include void main() int i, sum=0 ; i=1; do sum=sum+i; i+; while (i=100); printf(%dn,sum); ,程序运行结果:

11、 5050,例3-11:用do while语句 计算5!。,#include void main() int t=1,i=2; do t=t*i; i+; while (i=5); printf(“5!=%dn”,t); ,程序运行结果: 5 5!=120,3、说明:,do-while语句先执行语句,后判断表达式。,第一次条件为真时,while,do-while等价;第一次条件为假时,二者不同。,void main() int i,sum=0; scanf(%d, ,void main() int i,sum=0; scanf(%d, ,在if、while语句中,表达式后面都没有分号,而在do

12、-while语句的表达式后面则必须加分号。,do-while和while语句相互替换时,要注意修改循环控制条件 。,3.2.3 for语句,1、for的形式: for (初始表达式1;条件表达式2;循环表达式3) 循环体 ;,表达式1:用于循环开始前为循环变量设置初始值。,表达式2:控制循环执行的条件,决定循环次数,表达式3:循环控制变量修改表达式。,循环体语句: 被重复执行的语句。,表达式3,计算表达式1,循环体,零,非零,for的下一条语句,2、执行过程,例3- 13:用for语句编程实现1100的和。,#include void main() int i,sum=0; for(i=1;i

13、=100;i+) sum=sum+i ; printf(“%dn”,sum); ,程序运行结果: 5050,例3- 14:用for语句编程计算19的平方。,#include void main() int i,j; for(i=1,j=1;i10;i+,j+) printf(“%d*%d=%4dn”,i,j,i*j); ,注意:,三个表达式都可以是逗号表达式。,三个表达式都是任选项,都可以省略,但要注意省略表达式后,分号间隔符不能省略。,(1)在进入累加前先给累加器赋初值(一般为0); (2)用循环语句实现累加; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体语句的设计。

14、累加器当前值=累加器原值+循环变量当前值 ;,典型例题分析,【例】 求累加和1+2+3+1000,基本方法:,属于“累加器”类型问题。,累加器赋初值,思考:求偶数和 2+4+6+100,参考程序:,void main() long int k,s; s=0; for(k=1;k=1000;k+) s=s+k; printf( s=%ld ,s); ,累加,(1)给累乘器赋初值,一般为1; (2)用循环语句实现累乘; for(循环变量赋初值;循环条件;循环变量改变规律) (3)循环体设计。 累乘器当前值=累乘器原值*循环变量当前值;,例: 求累乘积。 如:123.100,基本方法:,属于“累乘器

15、”类型问题。,累乘器赋初值,思考:求n!=1 2 3 n,参考程序:,void main() double s=1; int k; for(k=1;k=100;k+) s=s*k; printf( s=%lf ,s); ,累乘,整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放,因此将存放累乘结果的变量s定义为double型。,在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。,3.2.4 循环的嵌套,嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。,while 、do-while、for三种循环都可

16、以互相嵌套。,下面几种都是合法的形式: (1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( );,(4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while( ),循环语句之间的关系,真,真,外循环初始条件,内循环初始条件,内循环体,外循环条件,假,内循环条件,假,内循环循环条件,外循环循环条件,循环结束,二重循环嵌套结构执行流程,循环的嵌套示例:输出九九乘法表,例:输出九九乘法表 1*1=1 2*1=2 3*1=3 4*1=4 5*1=5 6

17、*1=6 7*1=7 8*1=8 9*1=9 1*2=2 2*2=4 3*2=6 4*2=8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18 1*3=3 2*3=6 3*3=9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27 1*4=4 2*4=8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6

18、*6=36 7*6=42 8*6=48 9*6=54 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,#include main() int i,j; for(i=1;i10;i+) for(j=1;j10;j+) printf(“%d*%d=%2d ”,i,j,i*j);

19、printf(“n”); ,循环的嵌套示例:输出九九乘法表,J=i,编程,题目:一张面值为100圆的钞票要换成面值分别为5圆、1圆和0.5圆的钞票共100张,要求每种面额的钞票至少1张,求所有的兑换方案。,#include void main() int i,j,k; for (i=1;i100;i+) for (j=1;j100;j+) for (k=1;k100;k+) if(i+j+k=100 ,i=1,j=91,k=8 i=2,j=82,k=16 i=3,j=73,k=24 i=4,j=64,k=32 i=5,j=55,k=40 i=6,j=46,k=48 i=7,j=37,k=56

20、i=8,j=28,k=64 i=9,j=19,k=72 i=10,j=10,k=80 i=11,j=1,k=88,优化: #include void main() int i,j,k; for (i=1;i=98;i+) for (j=1;j=99-i;j+) for (k=1;k=100-i-j;k+) if(i+j+k=100 由于每种钞票最少一张,每种最多98张 5圆最多i张时,1圆最多(99i)张 5圆i张,1圆j张时,0.5圆最多(100ij)张 减少运算时间。,#include void main() int i,j; for (i=1;i12;i+) for (j=1;j=99-

21、i;j+) if(5*i+j+0.5*(100-i-j)=100) printf(i=%d,j=%d,k=%dn,i,j,100-i-j); 5圆钞票不会超过12张。 改3重循环为2重循环,节约运算时间。,1.break语句,3.2.5 break语句和continue语句,(1) 语句形式: break;,(2)作用: 结束break所在的 switch语句。 结束当前循环,跳出break所在的循环结构。,例3-16:计算半径为1,28的圆面积,但当面积大于100时结束计算。,#include void main() int r; float area; for(r=1;r100) brea

22、k; printf(“%n”,area); ,程序运行结果: 3.140000 12.560000 28.260000 50.240002 78.500000,例3-17:break语句用法示例,#include void main() int i; for(i=0;i=6;i+) printf(“%dn”,i); if(i=5) break; ,程序运行结果: 0 1 2 3 4 5,思考:为什么不输出6,(1)语句形式: continue;,(2)语句作用: 结束本次循环。,2、continue 语句,(3)语句执行流程: continue语句可以结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。,例3-18:continue语句用法示例,#include void main() int i; for(i=0;i=6;i+) if(i=5) continue; printf(“%dn”,i); ,程序运行结果: 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论