《C语言程序的基本结构.ppt》由会员分享,可在线阅读,更多相关《C语言程序的基本结构.ppt(72页珍藏版)》请在三一办公上搜索。
1、第二章 C程序的基本结构,2,第二章 C程序的基本结构,2.1 分支结构2.2 关系运算和逻辑运算2.3 循环结构2.4 break和continue语句2.5 goto语句2.6 经典算法举例,3,2.1 分支结构,为什么需要分支结构顺序结构只能解决一些简单的问题,遇到需要进行条件判断的问题,就必须采用分支结构来处理。例:请输出2个数中的较大的数,4,2.1.1 单分支结构,语法形式 if(表达式)语句;执行过程先计算表达式的值,若为真(非0值),则执行其后的语句;若值为0,则继续向下执行其他语句注意:语句可以是一条,也可以是多条,5,例1、输入一个字符,并输出。其中有一个条件是如果该字符是
2、小写的英文字母,则需把它转换成大写字母再输出。#include void main()char ch;ch=getchar();if(ch=a,如果条件满足后还想再输出该字母的前导字符和后继字符怎么做?,EG201.C,6,#include void main()int a,b,t;printf(“input a,b:”);scanf(“%d%d”,例2:输入2个整数,按由小到大的顺序输出,EG202.C,7,例3、输入三个整数,把最大的输出。,#include void main()int a,b,c,max;printf(“input a,b,c:”);scanf(“%d%d%d”,EG2
3、03.C,8,作业:输入3个整数,按由小到大的顺序输出,9,2.1.2 双分支结构,语法形式 if(表达式)语句1;else 语句2;执行过程先计算表达式的值,若为真(非0值),执行if后的语句1;若为假(值为0),执行else后的语句2,10,#include void main()int x,y;printf(“input x,y:”);scanf(“%d%d”,例4、输入2个整数,请输出其中的较大的数,EG204.C,11,#include void main()int x,y;printf(“input x:”);scanf(“%d”,例5、编程求解函数:,EG205.C,12,2.1
4、.3 多分支结构,语法形式if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式n)语句n;else 语句n+1;,执行过程按顺序求各表达式的值。如果某一表达式的值为真(非0),那么执行其后相应的语句,执行完后整个if语句结束,其余语句则不被执行;如果没有一个表达式的值为真,那么执行最后的else语句。最后的else部分可有可无。,13,例6、编程求解函数:,#include#includevoid main()double x,y;printf(Input x:);scanf(%lf,写成else if(x3)可以吗?,EG206.
5、C,14,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,规定:else总是与它前面最近的且未曾配对的if配对。,(1)if(表达式1)if(表达式2)语句1;else 语句2;,(2)if(表达式1)if(表达式2)语句1
6、;else 语句2;,对第4种形式可以有两种理解方式:,要想实现这种方式应该怎么做,if(表达式1)if(表达式2)语句1;else 语句2;,16,例 编程求解函数:,程序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,关于if语句的说明:表达式一般为关系表达式或逻辑表达式。但在C语言中它也可以是任意的数值表达式。表达式后面不
7、能有任何标点符号!每个语句都要以“;”结束。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,关于if语句的说明(续):if后的语句可以是一个语句也可以是若干个语句,这时要用花括号括起来构成复合语句。注:复合语句的花括号后不能再写分号,复合语句在语法上是一个整体,相当于一个语句。,例:if(ab)t=a;a=b;b=t;,19,2.1.5 条件运算符
8、,条件运算符:?:(C中唯一的三目运算符)优先级:仅高于赋值运算符结合性:右结合条件表达式的形式:表达式1?表达式2:表达式3执行过程首先求表达式1的值,若为真(非0),则求表达式2的值,且整个表达式的值为表达式2的值;若表达式1为假(0),则求表达式3的值,且整个表达式的值为表达式3的值。,20,说明条件表达式不能完全取代if语句,只有在if语句中内嵌语句为赋值语句、且两个分支都给同一个变量赋值时才能代替if语句。条件表达式中,表达式1、表达式2和表达式3的类型可以不同。若表达式2和表达式3类型不同,则整个条件表达式的值应为二者中较高的类型。,例:x=ab?a:b+1;,x=(ab)?a:(
9、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,例7、输入一个字符,如果是大写字母,转换为小写,如果不是则不转换。输出最后得到的字符。#includevoid main()char ch;scanf(%c,EG207.C,22,2.1.6 switch语句,请将输入的百分制成绩,转换成五分制成绩输出,转换标准如下:,对于这种类型的问题,需要讨论的情况比较多,如果用if嵌套的层次会比较多,程序可读性不好,这时通常会使用多分支选择语句switch
10、。,23,语法格式switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;:case 常量表达式n:语句n;default:语句n+1;执行过程先计算表达式的值,测试该值是否与某常量表达式的值相同若有相同者,流程转向其后面的语句执行若无,再看有没有default部分:若有default,则执行其后面的语句;若无default,则switch语句什么也不做,流程转向其后继语句。,24,例8:#include void main()int k;scanf(“%d”,if(k=1)printf(“Executing case 1!n”);else if(k=2)prin
11、tf(“Executing case 2!n”);else if(k=3)printf(“Executing case 3!n”);else printf(“Executing default!n”);,25,#include void main()int k;scanf(“%d”,EG208.C,26,说明switch后的表达式一般多为整型或字符型表达式各个case后常量表达式的值必须互不相同各个case和default的出现次序不影响执行结果;case后的语句为复合语句时可省略花括号 case后常量表达式只起语句标号的作用,每个case之后通常都有一个break,使流程跳出switch语句
12、多个case可以共用一组执行语句switch语句可以嵌套,但有多层switch语句时,break只能退出本层的switch语句体,case 6:case 7:printf(Resetn);break;,但不能写成:case 6,7:.,27,#includevoid main()int grade;printf(“input grade:”);scanf(“%d”,EG209.C,例9、将输入的百分制成绩,转换成五分制成绩输出,28,2.2 关系运算和逻辑运算,关系运算符:、=、x+3;a=?(2)a=y!=1=x;a=?,1,0,29,例:ca+b 等价于 c(a+b)ab=c 等价于(ab
13、)=c a=bc 等价于 a=(bc)注意:字符数据按其ASCII码值进行比较,ab避免2个实数作=或!=的比较允许写成3x6 这样吗?在数学上表示什么?当x取不同值时,该表达式?,30,逻辑运算符:&、|、!优先级:由高到低为:!&|!高于关系运算符,&和|低于关系运算符 结合性:!是右结合性,&和|是左结合性 逻辑表达式:用逻辑运算符连接关系表达式或逻辑量而成的式子值:只有两种:“逻辑真”或“逻辑假”结果:以数值1代表“真”,以数值0代表“假”进行判断时,非零值代表“真”,零值代表“假”例:表示 x-1,1区间,应写为:x=-1&x=1,31,逻辑运算的真值表,a b!a!b a&b a|
14、b非0 非00 0 1 1非0 00 1 0 10 非01 0 0 10 01 1 0 0,注意:a和b可以是任意表达式,在判断逻辑量的真假时,用非0代表真,0代表假,而在判断逻辑运算的结果时,用1代表真,0代表假。,32,例:写出满足下列要求的表达式ch是小写英文字母。答案:ch=a&ch=a&ch=A&ch=Zx为零。答案:关系表达式:x=0或答案:逻辑表达式:!xx不为零答案:x!=0 或 x例:判断某一年是否是闰年。判断条件:能被4整除,但不能被100整除;或能被4整除,又能被400整除。,33,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求
15、出表达式的解时,才执行该运算符。例:a,m=0,n=1,m=1,n=1,m=1,n=1,34,2.3 循环结构,请编程求解以下2个问题:请在屏幕上输出10行星号,每行星号由8个*组成。请输出110这十个整数。,#includevoid main()printf(*n);printf(*n);printf(*n);,#includevoid 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
16、+;,35,C语言有三种循环语句:while语句:当型循环dowhile语句:直到型循环for语句:功能强大,经常使用,while循环语法形式:while(表达式)语句;执行过程:见图,36,用循环怎么实现上述两个程序?,#includevoid main()int i;i=1;while(i=10)printf(*n);i+;,#includevoid main()printf(*n);printf(*n);printf(*n);,37,#includevoid main()int i;i=1;while(i=10)printf(“%d”,i);i+;,#includevoid main()
17、printf(“%d“,1);printf(“%d“,2);printf(“%d“,10);,如果输出1100呢?怎么改?,38,使用while语句要注意:表达式中使用的循环控制变量必须赋初值 表达式必须用()括起来循环体为多条语句时,必须用 把它们括起来循环体中必须有使循环趋向结束的语句,#includevoid main()int i;i=1;while(i=10)printf(*n);i+;,39,例10、求123100的和。,#include void main()int i,sum;sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“sum=%dn”
18、,sum);,变量i一方面用来控制循环次数,同时又作为求和运算中的一个运算对象,计算1+2+3+n(n为任意正整数)和。计算1+3+5+n(n为奇数)的和。,EG210.C,40,例11、求某个班英语成绩的平均分,该班学生人数和每个学生的成绩由键盘输入。,#include void main()int i,n;float s,sum,ave;sum=0;i=1;scanf(“%d”,EG211.C,41,do-while循环语法形式:do语句;while(表达式);执行过程:见图。注意事项:同while,42,#include void main()int i,sum;sum=0;i=1;do
19、 sum=sum+i;i+;while(i=100);printf(“sum=%dn”,sum);,EG212.C,例12、用do-while语句实现求1100 的和。,43,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,for循环语法形式 for(表达式1;表达式2;表达式3)语
20、句;,执行过程(1)计算表达式1(只执行一次)(2)计算表达式2,若值为真则执行循环体,再执行第(3)步;若值为假则结束循环(3)计算表达式3,再重复执行第(2)步,45,说明:,、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=
21、1;i+)if(i100)break;sum=sum+i;,46,、表达式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,、for语句中的表达式1和表达式3可以由一个或多个赋值表达式组成,当为多个表达式时,各表达式之间要用逗号运算符(即组成逗号
22、表达式)。,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,while和for,while(表达式)语句;,for(exp1;exp2;exp3)语句;,exp1;while(exp2)语句;exp3;,49,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,例13、求正整数n的阶乘n!,n由键盘
23、输入。,#include void main()int n,i;long fact;printf(“input n:”);scanf(“%d”,EG213.C,51,循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环嵌套。内层的循环中还可以嵌套循环,构成多重循环。,while()while(),for(;)for(;),do do while();while();,while()for(;),for(;)do while();,while()do while();,52,例14、输出如图所示的矩形:,*,#include void main()printf(*n);printf(*n
24、);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,#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
25、实现。,*,EG214_3.C,EG214_2.C,54,C语言中的三种循环结构,一般情况下可以相互代替用while和do-while时,循环变量的初始化应在while和do-while之前完成;而for语句一般在表达式1中实现循环变量的初始化当循环次数及控制条件要在程序运行过程中确定时,选用while或do-while语句;在初值、增量及控制条件明显,或循环次数已经给定的情况下,选用for语句;在循环的执行过程中,应不断的改变循环控制表达式的值,以便逐步形成使它为0的条件,否则将可能出现死循环,几种循环的比较:,55,几种循环的比较:,三种循环可以相互嵌套,形成多重循环,外循环可以包含多个或
26、多重内循环,循环之间可以并列但不能相交,并列的循环控制变量可以同名,但嵌套的循环控制变量不能同名不允许用其它的控制语句把程序流程从循环体外转入循环体内,但必要时可以用break、goto等语句把流程从循环体内转到循环体外。,56,break语句格式:break;功能:中止当前循环语句或switch语句的执行说明:若是多重循环,break只能使流程跳出离break最近的一层;break只用于switch语句和循环语句。,2.4 break语句和continue语句,57,例15、计算 r=1到 r=10时的圆面积,直到面积大于100为止,#include void main()float are
27、a;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,continue语句格式:continue;功能:提前结束本次循环体的执行(不再执行循环体中continue后面的语句),接着进行下一次是否执行循环的判定说明:continue语句只能用于循环语句中,它是一种具有特殊功能的转移语句;continue与break不同:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则结束整个循环,不再判断循环条件是否成
28、立。,59,例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,例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,判断m是否是素数可以让m被2、3、4 去除,若 能被其中的任何一个整数整除,则证
29、明不是素数;相反,若不能被其中的任何一个整数整除,则证明是素数。,例18、输入一个大于3的正整数,判断该数是否为素数,62,#include#include void main()int m,i,k;scanf(%d,i=k+1,EG218_1.C,63,例、如果要打印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,goto语句goto语句是一种使程序的流程无条件转移的语句一般形式为:goto 语句标号;语句标号
30、是由用户自行定义的标识符(由字母、数字、下划线组成,且第一个字符必须为字母或下划线),不能用整数来做标号。例如:goto label_1;goto 123;goto 语句的功能是无条件地跳转到语句标号所指定的本函数内的那条语句。,2.5 goto语句,65,例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,例20、输出*组成的直角三角形,*,#include void
31、 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,例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个数开始,每个数是其前
32、两个数之和,输出结果:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,EG221.C,68,例22、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少桃子?,分析:假设第1天摘了x1个桃子,第1天吃了x1/2+1个,则剩了x1/2-1个,如果用x2表示剩下的桃子数(即x1/2-1=x2),则x1=(x2+1)*2。已知第10天只有一个
33、桃子,可以通过这个公式求出第9天的桃子数,再继续用公式求出第8天的桃子数,直至求出第1天的桃子数,这种方法称为递推法,思路是根据题目的描述发现规律,写出递推公式,由此进行循环操作。,69,#includevoid main()int day,x1,x2;day=9;x2=1;while(day0)x1=(x2+1)*2;x2=x1;day-;printf(the total is%dn,x1);,第10天:1第9天:(1+1)*2=4第8天:(4+1)*2=10第7天:(10+1)*2=22:,EG222.C,70,例23:公鸡5文钱买1只,母鸡3文钱买1只,小鸡1文钱买3只,用100文钱买1
34、00只鸡,公鸡、母鸡、小鸡各有几只?,分析:假设用变量x、y、z分别代表公鸡数、母鸡数、小鸡数,根据题目描述可以列出以下两个方程:x+y+z=100 5x+3y+z/3=100,由方程可以确定x、y、z的取值范围:1 x 20,1 y 33,3 z 100,为找出解答,需逐一验证x、y、z的取值,看其是否满足条件:,x、y、z这种有规律的变化可用循环嵌套实现,71,第1层的循环体,第2层的循环体,方法1:用三层循环实现,#include void main()int x,y,z;for(x=1;x20;x+)for(y=1;y33;y+)for(z=3;z100;z+=3)if(5*x+3*y+z/3=100,该方法的缺点:最内层的if语句要执行19*32*33次需要考虑如何减少循环执行的次数,EG223_1.C,72,#include void main()int x,y,z;for(z=3;z0,方法2:用一层循环实现,x+y+z=100 y=100-x-z 5x+3y+z/3=100 5x+3(100-x-z)+z/3=100 x=4z/3-100 求z 求x 求y 因此只需要z作循环变量,EG223_2.C,