第4章c语言的三种基本结构.ppt_第1页
第4章c语言的三种基本结构.ppt_第2页
第4章c语言的三种基本结构.ppt_第3页
第4章c语言的三种基本结构.ppt_第4页
第4章c语言的三种基本结构.ppt_第5页
免费预览已结束,剩余68页可下载查看

下载本文档

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

文档简介

1、,第四章 c程序的三种基本结构,1. 理解程序控制的方法和作用,2. 学会制定简单程序的算法,3. 掌握选择结构的使用方法,4. 掌握实现循环的各种方法,5. 掌握break,continue的用法,本章目标:,4.1 C程序三种基本结构,从结构化程序设计角度出发,程序只有三种结构:,顺序结构,选择结构,循环结构,1. 顺序结构,表示,先执行A, 再执行B.,2. 选择结构,表示为,存在某条件P, 若P为真,则执行A, 否则执行B。,另一种选择结构多分支结构.,3. 循环结构,表示为,(1) 当型结构 当P条件成立时(T),反复执行A,直到P为“ 假”时才停止循环.,有两种结构:当型和直到型,

2、(2) 直到型,先执行A, 再判断P,若为F,再执行A,如此反复,直到P为F.,已证明: 上述三种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述三种结构。,函数调用语句:,如: printf ();,1. 表达式语句,赋值语句: 如: i=i+1; i+; x+y;,空语句: 任何事情都不做。,C程序语句可分为五大类:,如: ;,4.2 C 语句,2. 控制语句改变语句的执行顺序,if ( ) else (条件),for ( ) (循环),while ( ) (循环),do while (循环),switch (多分支选择),( )表示条件, 表示语句,continue (结

3、束本次循环),break (中止整个循环),return ( 函数返回),3. 限定转向(无条件转向)语句,5. 终止程序运行语句,4.无条件转移语句,goto,exit,6. 复合语句(语句体),用 括起来的一系列语句。 如: z=x+y; t=z/100; printf (%f, t); ,1. if (表达式) 语句,一、if 语句的三种形式,执行过程: 当表达式的值为“真” (非零)时,执行语句, 否则,不执行语句。,如: if ( x y ) z = x;,4.3 选择结构程序设计,2. if (表达式) 语句1 else 语句2,执行过程: 当表达式的值为“真” (非零)时,执行语

4、句1, 否则,执行语句2。,如: if (xy) z=x ; else z=y ;,3. if (表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 : else if(表达式m) 语句m else 语句n,如:if (grade=85) level=A; else if (grade=70) level=B; else if (grade=60) level=C; else level=D;,if 语句说明:, if后面的表达式一般为逻辑表达式或关系表 达式,也可以是任意数值类型表达式。,该语句是合法的:if(3) printf(“ok!”);, if

5、 语句中的“语句”为一个简单语句或复合语句。,如:下面程序段是否有错?,if (x=0) printf(“X is positive.”); x+; else printf(“X is negative.”);,if (x=0) printf(“X is positive.”); x+; else printf(“X is negative.”);,二、if 语句的嵌套,在 if 语句中又包含一个或多个if 语句称为 if 语句的嵌套。,一般形式:,if (条件1) if (条件2)语句1 else 语句2 else if (条件3)语句3 else 语句4,内嵌if,内嵌if,如: if(x

6、0) if(y0) printf(x0,y0); else printf(“x0,y0) printf(“x0); else printf(“x=0, y=0”);,说明:,else与if的匹配原则是:一个else应与其之前距离最近且没有与其它else配对的if 配对。,if (n6) if (n12) printf(“6n12”); else printf(“n=6”);,if (n6) if (n12) printf(“6n12”); else printf(“n=6”);,三、用if 语句实现选择结构举例,main( ) int x,y; scanf(%d, ,main() float

7、a,b,c; scanf(“%f%f%f”, ,程序2:将程序1的if语句改为: /*exp52.c*/#include main ( ) int x, y; scanf(“%d, ,程序1: /*exp51.c*/#include main ( ) int x, y; scanf(“%d, ,程序4:将程序1的if语句改为: /*exp54.c*/ #include main() int x,y; scanf(“%d, ,程序3:将程序1的if语句改为: /*exp53.c*/ #include main() int x,y; scanf(“%d, ,1. 程序1 和程序2 是正确的。 它们

8、代表的函数为:,2. 程序3 和程序4 是错误的。 它们代表的函数为:,结论:,四 switch 多分支选择语句,用if或if/else或它们的嵌套也可使程序实现多路分支,但容易出现下面的问题:, 可读性差, 破坏结构,解决问题的方法:采用switch语句。,switch(变量) case 常量表达式1: 语句体1 case 常量表达式2: 语句体2 case 常量表达式n: 语句体n default : 语句体(n+1) ,一般形式:, 根据表达式的取值, 判断其与哪一个常量表达式相等。如=表达式i,则自语句i开始执行,直到语句n+1止。, 若与所有常量表达式值不相等,则从default后的

9、语句开始执行。,功能:,注:default 可有可无。,例: 根据成绩等级打印百分数段.,switch (grade), case A: printf (85100n);,case B: printf (7084n);,case C: printf (6069n);,case D: printf (60n);,default: printf (errorn);,程序如下:,/*exp55.c*/ #include main() char grade; scanf(%c, ,运行结果为:,A,程序运行结果不在预料之中!,产生错误的原因: 没有完全起到分支作用。,85-100 70-84 60-6

10、9 60 Error,switch (表达式) case 常表1: 语句1; break; case 常表2 : 语句2; break; case 常表n : 语句n; break; default: 语句n+1; ,一般形式为:,解决办法: 增加break语句, 使之跳出switch结构。,修改程序为:,/*exp56.c*/ #include main() char grade; scanf(%c, ,1. 常量表达式的值必须互不相等,否则会有二异性。,2. case顺序无关紧要。,3. 不一定非用break不可,有时几种情况合并执行一组语句。,注意:,switch (grade) cas

11、e A : case B: case C: printf(60n); break; case D: printf(60n); break; ,例如:,4.4 循环结构,循环结构的特点是: 程序的流程是在给定条件时,反复执行,某个程序段。,语言中可以用以下语句来实现循环: 用goto语句和 if 语句构成循环; 用while语句; 用do_while语句; 用for语句。,4.4.1 goto语句和goto语句构成的循环,一、 goto 语句,goto 语句为无条件转向语句,其作用为:使程序的执行无条件地转移到指定处。,如: goto label_1; goto 123;,执行过程:执行语句时,

12、程序转移到以标号 为前缀的语句处继续执行。,如: p1: x+; . . . goto p1;,说明:, goto语句是一种非结构化语句,结构化程序设计方法不提倡使用goto语句,因为滥用goto语句将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程序效率时才使用。,且记:不要从循环体外跳到循环体内!,二、用goto语句和 if 语句构成循环,例:计算10!并输出结果。,main() int i=1, sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum); ,运行结果:10!=2432

13、0,本应是:10!=3628800,main() int i=1; long sum=1; loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); ,4.4.2 while 语句,例:将上面计算10!并输出结果的程序用 while语句写出:,main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); ,main() int i=1; long int sum=1; loop: if (i=10) sum=sum*

14、i; i+; goto loop; printf(“10!=%ldn”,sum); ,循环结构的术语,1. 循环条件: 是循环结构中的测试表达式。,如:while(i=10),2. 循环体:是在每个循环周期均要执行一次的语 句。语句可以是任何语句,简单语、 复合语句、空语句均可以。,如:上例while语句中用花括号括起来的复合语句。,3. 循环控制变量:是在循环条件中控制条件是真 是假的变量。,如:上例while语句中使用的变量 i 。,注意: 循环条件中的表达式一般是逻辑表达式和关系表达式,也可以是算数表达式(非0为真,0为假)。一般表达式中应含有循环控制变量。 while (3)和whil

15、e (0)虽然从程序设计的角度上说是不合理的,但是合法的。,while (3) 语句 表示无限循环 while (0) 语句 表示不进入循环体,要写出一个正确的循环结构,对控制变量要做三方面工作:控制变量赋初值; 把控制变量写入正确的循环条件;控制变量的更新、调整。,4.4.3 do-while 语句,分号不能少,例:将上面计算10!并输出结果的程序用 do-while语句写出:,main() int i=1; long int sum=1; while (i=10) sum=sum*i; i+; printf(“10!=%ldn”,sum); ,main() int i=1; long in

16、t sum=1; do sum=sum*i; i+; while (i=10); printf(“10!=%ldn”,sum); ,我们将while和do-while循环做一下比较:,main() int i; long sum=1; scanf(“%d”, ,main() int i; long sum=1; scanf(“%d”, ,输入:9 输出:90,输入:11 输出:1,输入:9 输出:90,输入:11 输出:11,比较上面两个程序,虽然结构是相同的,在输入值为有效值时结果相同,但当输入无效值时输出结果是不同的。为什么?,while与do-while的主要区别:,4.4.4 for语

17、 句,表达式1:一组初始化表达式。 表达式2:循环控制条件。 表达式3:在执行完循环体语句之后执行的表达式。,我们前面已经说明,要正确表达循环结构应注意三方面的问题:控制变量的初始化,循环的条件和控制变量的更新。 for语句在书写形式上正好体现了这种紧密的逻辑关系。,执行过程:,例:将上面计算10!的程序用 for语句写出:,main() int i; long sum; for(i=1,sum=1; i=10; i+) sum=sum*i; printf(“10!=%ldn”,sum); ,main() int i; long sum; for(i=1,sum=1; i=10; sum=su

18、m*i, i+) ; printf(“10!=%ldn”,sum); ,空语句,说明:,表达式1:用于进入循环体之前给某些变量赋初值。 若省略,可在for语句前给变量赋初值。,main() int i=1; long sum=1; for( ; i=10; i+) sum=sum*i; printf(“10!=%ldn”,sum); , for 循环的三个表达式起着不同的作用, 根据需要可以省略。,表达式2:决定循环的条件,若省略,则为无限 循环。,表达式3:用于循环一次后对某些变量进行修改。 若省略,可在循环体内对变量进行修改。,main() int i; long sum=1; for(i

19、=1 ; i=10 ; ) sum=sum*i; i+; printf(“10!=%ldn”,sum); , for 语句最为灵活,它完全可以代替的while语句。,如:i=1; while(i=10) sum=sum*i; i+; ,等效于,for(i=1;i=10;i+) sum=sum*i;, for语句功能很强,其中表达式1和表达式3可以是逗号表达式,但为增强程序的可读性,一般不要把与循环无关的东西放到for语句中。,如:sum=1; for(i=1 ; i=10 ; i+) sum=sum*i;,三种循环语句的总结,三种循环语句共同的特点是:当循环控制条件非零时,执行循环体语句,否则

20、终止循环。,循环语句可以是任何语句,简单语句、复合语句、空语句均可以。,while和for语句先判断循环控制条件,do-while语句后判断循环控制条件,所以,while和for语句的循环体可能一次也不执行,而do-while语句的循环体至少也要执行一次。,在循环体内或循环条件中必须有使循环趋于结束的语句,否则会出现死循环等异常情况。,三种循环可以处理同一问题,一般情况可以互相代替。但在实际应用中,我们要根据具体情况来选用不同的循环语句。选用的一般原则如下:,如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do-whil

21、e语句。,(循环次数确定例) int i; long sum=1; for(i=1;i=10;i+) sum=sum*i;,(循环次数不确定例) char c do c=getchar(); printf(“%c”,c); while(c!=q|c!=Q);,当循环体至少执行一次时,用do-while语句;反之,如果循环体可能一次也不执行时,用while语句。,(循环体至少执行一次) /*只有当用户键入q或Q,才结束循环*/ char c do c=getchar(); printf(“%c”,c); while(c!=q|c!=Q);,(循环体可能一次不执行) /*只有不是q或Q的字符才被打

22、印*/ char c; c=getchar(); while (c!=q|c!=Q); printf(“%c”,c); c=getchar(); ,4.4.5 循环的嵌套,例:在屏幕上打印一个8行7列的星号矩阵。,#include main() int i; for( i=0; i7; i+ ) printf(*); /*打印第1行星号*/ printf(n); for( i=0; i7; i+ ) printf(*); /*打印第2行星号*/ printf(n); for( i=0; i7; i+ ) printf(“*”);/*打印第8行星号*/ ,什么叫循环嵌套?,一个循环的循环体中套有

23、另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。,一个循环外面包围一层循环称为二重循环。 一个循环外面包围二层循环称为三重循环。 一个循环外面包围多层循环称为多重循环。,while、do-while、for可以互相嵌套自由组合。,例:将上例(打印8行7列的星号矩形)用二重循环实现。,#include main() int i , k; for( i=0; i8; i+ ) for( k=0; k7; k+ ) printf(*); printf(n); ,4.4.6 break 和continue语句,一、break 语句,功能:结束当前的一层循环。,解释:break 语句只能用于循环语句

24、和Switch语句。,例:打印半径为110的圆的面积,如果面积超过100,则不再打印。,#include #define PI 3.14159 main() int r; float area; for(r=1; r100.0) break; printf(area=%fn,area); printf(now, r=%dn,r); ,注意:在嵌套循环中使用break语句,它只影响包含它的最内层循环,即程序仅跳出包围该break的那层循环。,例:编写程序,输出三角乘法表。 main( ) int i, j; for( i=1; ii ) break; printf(“%3d”, i*j ); p

25、rintf(“n”); ,运行结果: 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81,功能:结束循环体,进入下一个循环周期。,解释:一旦执行了continue语句,程序就跳 过循环体中位于该语句后的所有语句, 提前结束本次循环周期并开始下一个 循环周期。,二、continue语句,6.9 程序举例,例6.6 用/41-1/ 3+1/5-1/7+1/9 求近似的值。 直到最后一项的绝对值小于10-6为止

26、。,#include math.h main() int s; float n , t , sum, pi; t=1; sum=0 ; n=1 ; s=1; while(fabs(t)=.000001) sum=sum+t; n=n+2; s= -s; t=s/n; pi=sum*4; printf(pi=%fn,pi); ,运行结果: =3.141594,第几个月 小兔子对数 中兔子对数 老兔子对数 总数 1 1 0 0 1 2 0 1 0 1 3 1 0 1 2 4 1 1 1 3 5 2 1 2 5 .,例6.7 斐波纳契数列:1,1,2,3,5,8,例6.7 求斐波纳契数列:1,1,2

27、,3,5,8 的前20个数。,(该数列特点:第1、2两个数是1、1,从第3个数 开始,该数是其前两个数之和。),main() int f1=1, f2=1, i; for(i=1;i=10;i+) printf(%6d%6dn,f1,f2); f1=f1+f2; f2=f1+f2; ,运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,例6.7 求斐波纳契数列:1,1,2,3,5,8 的前40个数。,main() long int f1=1, f2=1, i; for(i=1;i=20;i+) pri

28、ntf(%12ld %12ld,f1,f2); if(i%2= =0) printf(“n”); f1=f1+f2; f2=f1+f2; ,运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 2584 4181 6765 ,例6.8 判断M是否为素数。,#include main() int m, i ,k; scanf(%d, ,素数的定义:只能被1和它他本身整除的正整数。,例6.9 求出100200以内的所有素数。,main() int m , k,i ,n=0; for(m=101;m=k+1) printf( %d,m); n=n+1; if( n%10= =0) printf(n); printf(“n”); ,例6.10 译密码。密码规律为每个字母用其后 第四个字母代替,26个字母循环排列。,#include

温馨提示

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

评论

0/150

提交评论