C语言程序的基本结构.ppt_第1页
C语言程序的基本结构.ppt_第2页
C语言程序的基本结构.ppt_第3页
C语言程序的基本结构.ppt_第4页
C语言程序的基本结构.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

第二章 C程序的基本结构,2/72,第二章 C程序的基本结构,2.1 分支结构 2.2 关系运算和逻辑运算 2.3 循环结构 2.4 break和continue语句 2.5 goto语句 2.6 经典算法举例,3/72,2.1 分支结构,为什么需要分支结构 顺序结构只能解决一些简单的问题,遇到需要进行条件判断的问题,就必须采用分支结构来处理。 例: 请输出2个数中的较大的数,4/72,2.1.1 单分支结构,语法形式 if (表达式) 语句; 执行过程 先计算表达式的值,若为真(非0值),则执行其后的语句;若值为0,则继续向下执行其他语句 注意:语句可以是一条,也可以是多条,5/72,例1、输入一个字符,并输出。其中有一个条件是如果该字符是小写的英文字母,则需把它转换成大写字母再输出。 #include void main() char ch; ch = getchar(); if (ch=a ,如果条件满足后还想再输出该字母的前导字符和后继字符怎么做?,EG201.C,6/72,#include void main( ) int a, b, t; printf(“ input a, b: ”); scanf(“%d%d”, ,例2:输入2个整数,按由小到大的顺序输出,EG202.C,7/72,例3、输入三个整数,把最大的输出。,#include void main( ) int a, b, c, max; printf(“ input a, b, c: ”); scanf(“%d%d%d”, ,EG203.C,8/72,作业:输入3个整数,按由小到大的顺序输出,9/72,2.1.2 双分支结构,语法形式 if (表达式) 语句1; else 语句2; 执行过程 先计算表达式的值,若为真(非0值),执行if后的语句1;若为假(值为0),执行else后的语句2,10/72,#include void main( ) int x, y; printf(“ input x, y: ”); scanf(“%d%d”, ,例4、输入2个整数,请输出其中的较大的数,EG204.C,11/72,#include void main( ) int x, y; printf(“ input x: ”); scanf(“%d”, ,例5、编程求解函数:,EG205.C,12/72,2.1.3 多分支结构,语法形式 if (表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; else if (表达式n) 语句n; else 语句n+1;,执行过程 按顺序求各表达式的值。如果某一表达式的值为真(非0),那么执行其后相应的语句,执行完后整个if语句结束,其余语句则不被执行;如果没有一个表达式的值为真,那么执行最后的else语句。最后的else部分可有可无。,13/72,例6、编程求解函数:,#include #include void main( ) double x,y; printf(“Input x:“); scanf(“%lf“, ,写成 else if (x3) 可以吗?,EG206.C,14/72,2.1.4 if语句的嵌套,概念:指if语句的if块或else块中,又包含一个if语句(可以是各种形式的) 作用:对复杂条件进行判断,实现多分支选择 形式:多种多样,1. if (表达式1) if (表达式2) 语句,2. if (表达式1) 语句1 else if (表达式2) 语句2,3. if (表达式1) 语句1 else if (表达式2) 语句2 else 语句3,4. if (表达式1) if (表达式2) 语句1 else 语句2,二义性?,15/72,规定:else总是与它前面最近的且未曾配对的if配对。,(1) if (表达式1) if (表达式2) 语句1; else 语句2;,(2) if (表达式1) if (表达式2) 语句1; else 语句2;,对第4种形式可以有两种理解方式:,要想实现这种方式应该怎么做,if (表达式1) if (表达式2) 语句1; else 语句2;,16/72,例 编程求解函数:,程序1: if (x0) y=-1; else if (x=0) y=0; else y=1;,程序2: if (x=0) if (x0) y=1; else y=0; else y=-1;,程序3: y=-1; if (x!=0) if (x0) y=1; else y=0;,改正程序3: y=-1; if (x!=0) if (x0) y=1; else y=0;,17/72,关于if语句的说明: 表达式一般为关系表达式或逻辑表达式。但在C语言中它也可以是任意的数值表达式。 表达式后面不能有任何标点符号!每个语句都要以“;”结束。 else只能与if配对使用。仅else本身不能单独作为一个语句使用。,if(3) n=1;,if (a) printf(“%d“, a);,if(n=3-3) x=1; else x=-1;,if(x5); y=x; else y=2*x-1;,if(x5) ; y=x; else y=2*x-1;,将出现语法错误,18/72,关于if语句的说明(续): if后的语句可以是一个语句也可以是若干个语句,这时要用花括号括起来构成复合语句。 注:复合语句的花括号后不能再写分号,复合语句在语法上是一个整体,相当于一个语句。,例: if (ab) t=a; a=b; b=t; ,19/72,2.1.5 条件运算符,条件运算符: ? : (C中唯一的三目运算符) 优先级:仅高于赋值运算符 结合性:右结合 条件表达式的形式: 表达式1 ? 表达式2 : 表达式3 执行过程 首先求表达式1的值,若为真(非0),则求表达式2的值,且整个表达式的值为表达式2的值;若表达式1为假(0),则求表达式3的值,且整个表达式的值为表达式3的值。,20/72,说明 条件表达式不能完全取代if语句,只有在if语句中内嵌语句为赋值语句、且两个分支都给同一个变量赋值时才能代替if语句。 条件表达式中,表达式1、表达式2和表达式3的类型可以不同。若表达式2和表达式3类型不同,则整个条件表达式的值应为二者中较高的类型。,例:x= ab? a:b+1;,x= (ab)? a:(b+1);,ab? a : cd? c : d,ab? a : (cd? c : d),if (ab) max=a; else max=b;,max = ab ? a : b;,x = 21 ? 1 : 1.5 值为1.0 x = 1 ? a : 10 值为97,21/72,例7、输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。输出最后得到的字符。 #include void main( ) char ch; scanf(“%c“, ,EG207.C,22/72,2.1.6 switch语句,请将输入的百分制成绩,转换成五分制成绩输出,转换标准如下:,对于这种类型的问题,需要讨论的情况比较多,如果用if嵌套的层次会比较多,程序可读性不好,这时通常会使用多分支选择语句switch。,23/72,语法格式 switch ( 表达式 ) case 常量表达式1 : 语句1; case 常量表达式2 : 语句2; : : : case 常量表达式n : 语句n; default : 语句n+1; 执行过程 先计算表达式的值,测试该值是否与某常量表达式的值相同 若有相同者,流程转向其后面的语句执行 若无,再看有没有default部分:若有default,则执行其后面的语句;若无default,则switch语句什么也不做,流程转向其后继语句。,24/72,例8: #include void main() int k; scanf(“%d”, ,if (k=1) printf(“Executing case 1!n”); else if (k=2) printf(“Executing case 2!n”); else if (k=3) printf(“Executing case 3!n”); else printf(“Executing default!n”);,25/72,#include void main() int k; scanf(“%d”, ,EG208.C,26/72,说明 switch后的表达式一般多为整型或字符型表达式 各个case后常量表达式的值必须互不相同 各个case和default的出现次序不影响执行结果; case后的语句为复合语句时可省略花括号 case后常量表达式只起语句标号的作用,每个case之后通常都有一个break,使流程跳出switch语句 多个case可以共用一组执行语句 switch语句可以嵌套,但有多层switch语句时,break只能退出本层的switch语句体,case 6 : case 7 : printf(“Resetn“); break;,但不能写成: case 6,7: .,27/72,#include void main( ) int grade; printf(“input grade:”); scanf(“%d”, ,EG209.C,例9、将输入的百分制成绩,转换成五分制成绩输出,28/72,2.2 关系运算和逻辑运算,关系运算符: 、=、 x+3; a = ? (2) a = y !=1 = x; a = ?,1,0,29/72,例: ca+b 等价于 c(a+b) ab=c 等价于 (ab)=c a=bc 等价于 a=(bc) 注意: 字符数据按其ASCII码值进行比较,ab 避免2个实数作 = 或 != 的比较 允许写成3x6 这样吗?在数学上表示什么? 当x取不同值时,该表达式?,30/72,逻辑运算符: &、|、! 优先级: 由高到低为: ! & | ! 高于关系运算符,&和 | 低于关系运算符 结合性: ! 是右结合性,& 和 | 是左结合性 逻辑表达式:用逻辑运算符连接关系表达式或逻辑量而成的式子 值:只有两种:“逻辑真” 或“逻辑假” 结果:以数值1代表“真”,以数值0代表“假” 进行判断时,非零值代表“真”,零值代表“假” 例:表示 x-1, 1区间,应写为: x= -1 & x=1,31/72,逻辑运算的真值表,a b !a !b a&b a|b 非0 非0 0 0 1 1 非0 0 0 1 0 1 0 非0 1 0 0 1 0 0 1 1 0 0,注意:a和b可以是任意表达式,在判断逻辑量的真假时,用非0代表真,0代表假,而在判断逻辑运算的结果时,用1代表真,0代表假。,32/72,例:写出满足下列要求的表达式 ch是小写英文字母。 答案:ch=a & ch=a & ch=A & ch=Z x为零。 答案:关系表达式:x = 0 或答案:逻辑表达式:!x x不为零 答案:x!=0 或 x 例:判断某一年是否是闰年。 判断条件:能被4整除,但不能被100整除;或能被4整除,又能被400整除。,33/72,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。 例:a,m=0,n=1,m=1,n=1,m=1,n=1,34/72,2.3 循环结构,请编程求解以下2个问题: 请在屏幕上输出10行星号,每行星号由8个*组成。 请输出110这十个整数。,#include void main( ) printf(“*n“); printf(“*n“); printf(“*n“); ,#include void main( ) printf(“%d ”, 1); printf(“%d ”, 2); printf(“%d ”, 10); ,使每个语句形式上保持一样, 改为: int i = 1; printf(“%d ”, i); i+; printf(“%d ”, i); i+; printf(“%d ”, i); i+;,35/72,C语言有三种循环语句: while语句:当型循环 dowhile语句:直到型循环 for语句:功能强大,经常使用,while循环 语法形式: while(表达式) 语句; 执行过程:见图,36/72,用循环怎么实现上述两个程序?,#include void main( ) int i; i = 1; while(i=10) printf(“*n“); i+; ,#include void main( ) printf(“*n“); printf(“*n“); printf(“*n“); ,37/72,#include void main( ) int i; i = 1; while(i=10) printf(“%d ”, i); i+; ,#include void main( ) printf(“%d“, 1); printf(“%d“, 2); printf(“%d“, 10); ,如果输出1100呢? 怎么改?,38/72,使用while语句要注意: 表达式中使用的循环控制变量必须赋初值 表达式必须用( ) 括起来 循环体为多条语句时, 必须用 把它们括起来 循环体中必须有使循环趋向结束的语句,#include void main( ) int i; i = 1; while(i=10) printf(“*n“); i+; ,39/72,例10、求123100的和。,#include void main ( ) int i , sum; sum=0; i=1; while ( i=100 ) sum=sum+i ; i+; printf(“sum=%dn”, sum); ,变量i一方面用来控制循环次数, 同时又作为求和运算中的一个运算对象,计算1+2+3+n(n为任意正整数)和。 计算1+3+5+n(n为奇数)的和。,EG210.C,40/72,例11、求某个班英语成绩的平均分,该班学生人数和每个学生的成绩由键盘输入。,#include void main ( ) int i , n ; float s , sum , ave ; sum=0; i=1; scanf(“%d”, ,EG211.C,41/72,do-while循环 语法形式: do 语句; while(表达式); 执行过程:见图。 注意事项:同while,42/72,#include void main ( ) int i , sum; sum=0; i=1; do sum=sum+i; i+; while (i=100) ; printf(“sum=%dn”, sum); ,EG212.C,例12、用do-while语句实现求1100 的和。,43/72,while循环和do-while循环的比较,while do-while (1)先判断条件再执行循环体 (1)先执行循环体再判断条件 (2)循环体可能一次也不执行 (2)至少执行一次循环体,void main( ) int sum=0 , i ; scanf(“%d”, ,void main( ) int sum=0 , i ; scanf(“%d”, ,假设输入i的值为11,则输出sum=?,44/72,for循环 语法形式 for(表达式1; 表达式2; 表达式3) 语句;,执行过程 (1) 计算表达式1 (只执行一次) (2) 计算表达式2,若值为真则执行循环体,再执行第(3)步;若值为假则结束循环 (3) 计算表达式3,再重复执行第(2)步,45/72,说明:,、for语句的表达式可以缺省,但两个分号不能缺省;,、若在for语句之前已经对循环控制变量赋初值,则表达式1可以缺省;,i=1; for ( ; i=100; i+) sum=sum+i;,for (i=1; i=100; i+) sum=sum+i;,、通常不缺省表达式2;有时缺省表达式2,此时不判断循环条件,循环将无终止的执行,即认为表达式2始终为真;在循环体内用if和break控制循环结束。,if (条件) break;,for (i=1; ; i+) if (i100) break; sum=sum+i; ,46/72,、表达式3也可以缺省,但应设法修改循环控制变量,保证程序正常结束,for (i=1; i=100; ) sum=sum+i; i+; ,、可以同时省略表达式1和表达式3,即只给循环条件。,i=0; for ( ; i=100; ) sum=sum+i; i+; ,此时,等同于while语句。,、3个表达式都可以省略,如:,for ( ; ; ) 循环体;,while (1) 循环体;,将无终止的执行循环。从语法上讲是正确的,但一般没有实际意义。,47/72,、for语句中的表达式1和表达式3可以由一个或多个赋值表达式组成,当为多个表达式时,各表达式之间要用逗号运算符(即组成逗号表达式)。,for (sum=0, i=1; i=100; i+) sum=sum+i;,for (i=0, j=100; i=j; i+, j-) k=i+j; printf(“i=%d,j=%d,k=%dn“,i, j, k);,48/72,while和for,while(表达式) 语句;,for(exp1; exp2; exp3) 语句;,exp1; while(exp2) 语句; exp3; ,49/72,sum=0; i=1; while(i=100 ) sum=sum+i ; i+ ; ,sum=0; for ( i=1 ; i=100 ; i+) sum=sum+i;,例、将1100求和的while循环转换为用for循环实现,50/72,例13、求正整数n的阶乘n!,n由键盘输入。,#include void main( ) int n, i ; long fact; printf(“input n:”); scanf(“%d”, ,EG213.C,51/72,循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环嵌套。内层的循环中还可以嵌套循环,构成多重循环。,while ( ) while ( ) ,for ( ; ; ) for ( ; ; ) ,do do while ( ); while ( );,while ( ) for ( ; ; ) ,for ( ; ; ) do while( ); ,while ( ) do while( ); ,52/72,例14、输出如图所示的矩形:,* * * * * * * * * * * * * * * * * * * *,#include void main( ) printf(“*n“); printf(“*n“); printf(“*n“); printf(“*n“); ,#include void main( ) int i=1, j ; while (i=4) j=1; while ( j=5 ) putchar(*); j+; putchar(n); i+; ,内外层循环的控制变量不能重名,EG214_1.C,53/72,#include main( ) int i , j ; i=1; while (i=4) for (j=1; j=5;j+) putchar(*); putchar(n); i+; ,#include main( ) int i , j ; for ( i=1; i=4; i+) for (j=1; j=5; j+) putchar(*); putchar(n); ,例、上述程序用for实现。,* * * * * * * * * * * * * * * * * * * *,EG214_3.C,EG214_2.C,54/72,C语言中的三种循环结构,一般情况下可以相互代替 用while和do-while时,循环变量的初始化应在while和do-while之前完成;而for语句一般在表达式1中实现循环变量的初始化 当循环次数及控制条件要在程序运行过程中确定时,选用while或do-while语句; 在初值、增量及控制条件明显,或循环次数已经给定的情况下,选用for语句; 在循环的执行过程中,应不断的改变循环控制表达式的值,以便逐步形成使它为0的条件,否则将可能出现死循环,几种循环的比较:,55/72,几种循环的比较:,三种循环可以相互嵌套,形成多重循环,外循环可以包含多个或多重内循环,循环之间可以并列但不能相交,并列的循环控制变量可以同名,但嵌套的循环控制变量不能同名 不允许用其它的控制语句把程序流程从循环体外转入循环体内,但必要时可以用break、goto等语句把流程从循环体内转到循环体外。,56/72,break语句 格式: break; 功能:中止当前循环语句或switch语句的执行 说明: 若是多重循环,break只能使流程跳出离break最近的一层; break只用于switch语句和循环语句。,2.4 break语句和continue语句,57/72,例15、计算 r=1到 r=10时的圆面积,直到面积大于100为止,#include void main( ) float area; int r; for (r =1; r 100) break; printf(“%6.2fn“, area); ,输出结果: 3.14 12.56 28.26 50.24 78.50,while ( ) break; ,EG215.C,58/72,continue语句 格式: continue; 功能:提前结束本次循环体的执行(不再执行循环体中continue后面的语句),接着进行下一次是否执行循环的判定 说明: continue语句只能用于循环语句中,它是一种具有特殊功能的转移语句; continue与break不同:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则结束整个循环,不再判断循环条件是否成立。,59/72,例16、输入30个字符,统计其中数字字符的个数。,#include void main( ) int i, sum=0; char ch; for (i=1; i9 ) continue; sum+; printf(“%dn“, sum); ,while ( ) continue; ,EG216.C,60/72,例17、把10到20之间能被3整除的数输出,#include void main( ) int n; for (n=10; n=20; n+) if (n%3 != 0) continue; printf(“%d “, n); ,12 15 18,EG217.C,61/72,判断m是否是素数可以让m被2、3、4 去除,若 能被其中的任何一个整数整除,则证明不是素数;相反,若不能被其中的任何一个整数整除,则证明是素数。,例18、输入一个大于3的正整数,判断该数是否为素数,62/72,#include #include void main( ) int m , i , k ; scanf (“%d“ , ,i = k+1,EG218_1.C,63/72,例、如果要打印3100之间的全部素数,怎么做?,for (m=3; m=100; m+=2) ,k=sqrt(m); for (i=2; i=k; i+) if (m%i=0) break; ,if (i= k+1) printf(“%-5d“,m);,EG218_2.C,64/72,goto语句 goto语句是一种使程序的流程无条件转移的语句 一般形式为:goto 语句标号; 语句标号是由用户自行定义的标识符(由字母、数字、下划线组成,且第一个字符必须为字母或下划线),不能用整数来做标号。 例如:goto label_1; goto 123; goto 语句的功能是无条件地跳转到语句标号所指定的本函数内的那条语句。,2.5 goto语句,65/72,例19、用if语句和goto语句构成循环,求1100的和,#include void main() int i, sum; i=1; sum=0; loop: if (i=100) sum=sum+i; i+; goto loop; printf (“sum=%dn”, sum); ,EG219.C,66/72,例20、输出*组成的直角三角形,* * * *,#include void main( ) int i , j ; for( i=1; i=4; i+) for (j=1; ; j+) putchar(*); putchar(n); ,特点: 第i行有i个星号,2.6 经典算法举例,EG220.C,j=i,67/72,例21、 求Fibonacci数列1 , 1 , 2 , 3 , 5 , 8 , 的前20个数,#include void main( ) int i , f1 , f2 , f3; f1=f2=1; printf(“%8d%8d”, f1 , f2); for ( i=3 ; i=20 ; i+ ) f3=f1+f2; f1=f2; f2=f3; printf(“%8d”, f3); if ( i%4=0) putchar(n); ,分析数列的规律: 从第3个数开始,每个数是其前两个数之和,输出结果: 1 1 2 3 5 8

温馨提示

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

评论

0/150

提交评论