《C程序的流程--程序控制结构与语句.pptx》由会员分享,可在线阅读,更多相关《C程序的流程--程序控制结构与语句.pptx(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章 C程序的流程程序控制结构与语句 程序流程概述 语句 顺序结构与语句 选择结构与语句 循环结构与语句 转向语句5.1 程序流程概述 程序流程就是计算动作执行的过程。程序的流程分为三种:顺序结构选择结构循环结构 5.2 语句 o5.2.1 基本赋值语句o5.2.2 表达式语句o5.2.3 基本输入/输出语句o5.2.4 控制语句o5.2.5 空语句和复合语句5.2.1 基本赋值语句 赋值语句就是在赋值表达式的后面加上分号,一般形式为:变量变量=表达式表达式;例如:int i;float a=3.5;i=1;i=i+a;a+1=a+1;/*错误*/5.2.2 表达式语句 由一个表达式加一个分
2、号构成一个表达式语句,一般形式为:表达式表达式;5.2.3 基本输入/输出语句1、基本输出语句:printf()功能是按指定的输出格式把相应的参数值在标准输出设备(通常是终端)上显示出来。一般使用格式是:printf(格式控制串,参数1,参数2,);例如:printf(a,b的值分别为:%d,%d,a,b);5.2.3 基本输入/输出语句1、基本输出语句:printf()转换说明输出形式举 例输 出%d十进制的int型printf(“count is%d”,34);count is 34%f十进制的double型printf(“the max is%f”,max=3.123);the max
3、is 3.123%c单个字符printf(“*%c*”,a=A);*A*%s字符串printf(“%s”,”hello world!”);hello world!%o无符号八进制数printf(“Oce=%o”,a=034);Oce=34%x无符号十六进制数printf(“Hex=%x”,a=0 xFF4e);Hex=FF4e%本身printf(“a%b=3”);a%b=3常用的转换说明及作用 范例5-1 5.2.3 基本输入/输出语句2、基本输入语句:scanf()功能是接收用户从键盘上输入的数据,并按照格式控制符的要求进行类型转换,然后送到由对应参数所指定的变量单元中去。一般格式为:sca
4、nf(格式控制串,参数地址1,参数地址2,.);例如:scanf(“%d%f”,&a,&b);输入:10 3.0&变量名变量名5.2.3 基本输入/输出语句2、基本输 入语句:scanf()常用的转换说明及作用 转换说明输出形式举 例输 入%d匹配带符号的十进制的int型scanf(“%d”,&a);输入20,则a为20%f匹配带符号的十进制的浮点数scanf(“%f”,&a);输入2.0,则a为2.000000%c匹配单个字符scanf(“%c”,&a);输入a,则a为a%s匹配非空白的字符序列scanf(“%s”,&s);输入hello,则数组s中放置hello,末尾自动加上空字符%o匹配
5、带符号八进制数scanf(“%o”.&a);输入754,则a为八进制754%x匹配带符号的十六进制数scanf(“%x”,&a);输入123,则a为十六进制123【范例5-2】计算圆的面积,半径由用户指定。5.2.4 控制语句C语言中有9种控制语句,它们分别是:if-else语句、for语句、while语句、do-while语句、break语句、switch语句、goto语句、continue语句、return语句 5.2.5 空语句和复合语句o空语句只有一个分号构成,即:;如:while(getchar()!n);o复合语句就是用 把多个单一的语句括起来,如:z=x+y;t=z/100;pr
6、intf(%f,t);5.3 顺序结构与语句 o在顺序结构中,程序是按照语句的书写顺序依次执行,语句在前的先执行,语句在后的后执行。可用如下流程图表示:语句1语句2例如:a=3;b=4;c=a+b;5.3 顺序结构与语句【范例5-3】“鸡兔同笼问题”。鸡有2只脚,兔有4只脚,如果已经鸡和兔的总头数为h,总脚数为f。问笼中各有多少只鸡和兔。问题分析:设笼中的鸡有m只,兔有n只,可以列出方程组:5.4 选择结构与语句 o5.4.1 选择结构o5.4.2 单分支选择结构if语句o5.4.3 双分支选择结构if-else语句o5.4.4 多分支选择结构if-else的嵌套形式o5.4.5 多分支选择结
7、构switch语句5.4.1 选择结构 选择结构可以用分支语句来实现。分支语句包括 if 语句和 switch 语句。5.4.2 单分支选择结构if语句 一般语法为:if(表达式)语句;执行过程为:先计算表达式的值,如果表达式为非0(即为真)时,则执行语句;否则不执行任何语句,退出if语句,继续执行if语句之后的部分。例如:if(xy)printf(“%d”,x);5.4.2 单分支选择结构if语句【范例5-4】输入三个不同的数,按从大到小的顺序输出。先将a与b比较,把较大者放在a中,较小者放在b中;再将a与c比较,把较大者放在a中,较小者放在c中,此时,a为三者中的最大者;最后将b与c比较,
8、把较大者放在b中,小者放在c中,此时a、b、c已经按从大到小的顺序排列。5.4.2 单分支选择结构if语句 ba交换a,bTca交换a,cTcb交换b,cT输入a,b,c输出a,b,c5.4.3 双分支选择结构if-else语句 作用:当给定的条件满足时,执行一个语句;当条件不满足时,执行另一个语句。一般语法为:if(表达式)语句1;else 语句2;其执行过程为:先计算表达式的值,如果表达式的值为为非0(即为真)时,则执行语句1;否则执行语句2。表达式truefalse语句1语句2流程图表示5.4.3 双分支选择结构if-else语句 例如:if(a0)printf(“a is positi
9、ve.n”);else printf(“a is not positive.n”);【范例5-5】判断输入的整数是否是13的倍数。注注 意:意:else部分不能独立存在,即else前一定有一个“;”,它一定是if语句的一部分。5.4.4 多分支选择结构if-else的嵌套形式 o在if语句中又可以包含一个或多个if 语句,这种形式称作if语句的嵌套。o嵌套有以下两种形式:1.嵌套在else分支中,形成if.else.if语句;2.嵌套在if分支中 表达式truefalse语句1语句25.4.4 多分支选择结构if-else的嵌套形式 1.嵌套在else分支中,其形式为:if(表达式1)语句1;
10、else if(表达式2)语句2;else if(表达式3)语句3;.else 语句n;【范例5-6】评价学生的成绩。按分数score输出等级:score90为优,80score90为良,70score80为中等,60score70为及格,score60为不及格。表达式1语句1FT表达式2语句2FT语句n表达式3语句3FT5.4.4 多分支选择结构if-else的嵌套形式 2.嵌套在if分支中,其形式为:if(表达式1)if(表达式2)语句1;else 语句2;else 语句3;【范例5-7】判断某学生的成绩score是否及格;如果及格是否达到优秀(score90)。表达式1FT语句2表达式2
11、语句3FT语句n注意:C语言规定了if和else的“就近配对”原则,即else总是与前面最近的(未曾配对的)if配对。5.4.5 多分支选择结构switch语句 switch语句的一般语法格式为:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1;执行过程为:先计算表达式的值,并逐个与case后面的常量表达式的值相比较,当表达式的值与某个常量表达式i的值一致时,则从语句i开始执行;直到遇到break语句或switch语句的”;若表达式与任何常量表达式的值均不一致时,
12、则执行default后面的语句或执行后续语句。5.4.5 多分支选择结构switch语句 例如:switch(x)case 1:printf(“statement 1.n”);break;case 2:printf(“statement 2.n”);break;default:printf(“default”);说明:switch后的表达式类型一般为整形、字符型和枚举型,但不能为浮点型;常量表达式i仅起语句标号作用,不作求值判断;每个常量表达式的值必须各不相同,没有先后次序;多个case语句可以共用一组执行语句【范例5-8】根据一个代表星期几的0到6之间的整数,在屏幕上输出它代表的是星期几。5
13、.5 循环结构与语句 o5.5.1 循环结构o5.5.2 当型循环语句for语句o5.5.3 当型循环语句while语句o5.4.4 直到型循环语句do-while语句o5.4.5 循环的嵌套5.5.1 循环结构o循环结构是指在满足循环条件时反复执行循环代码块,直到循环条件不能满足为止。oC中有3种循环语句:while语句do_while语句for语句【范例5-9】计算100之内的奇数之和。5.5.2 当型循环语句for语句 一般语法格式为:for(表达式1;表达式2;表达式3)循环体语句;表达式2FT计算表达式3循环体语句for后面的语句计算表达式1执行过程如下:计算表达式1的值;判断表达式
14、2,如果其值为非0(真),则执行循环体语句,然后执行第步;如果其值为0(假),则结束循环,执行第步;计算表达式3;返回继续执行第步;循环结束,执行for语句的后续语句。5.5.2 当型循环语句for语句 例如:sum=0;for(i=0;i=100;i+)sum+=i;可以将for语句的形式改写为:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;5.5.2 当型循环语句for语句 o【范例5-10】经典问题:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=135333。o【范例5-11】计算n!,即
15、n!=1*2*.*n。5.5.2 当型循环语句for语句 for循环的扩展形式:表达式1和表达式3可以是一个简单的一个简单的表达式,也可以是逗号表达式,例如:for(i=0,j=100;ij;i+,j-)k=i+j;循环条件可由一个较复杂表达式的值来确定,例如:for(i0;si!c&si!0;i);表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值不等于就执行循环体。如:for(k=1;k-4;k+)s=s+k;5.5.2 当型循环语句for语句 for循环的省略形式:省略“表达式1”,此时应在for语句之前给循环变量赋初值。如:i=1;for(;i=100;i+
16、)sum+=i;省略“表达式2”,表示不判断循环条件,循环无终止的进行下去,也可以认为表达式2始终为真。如:for(i=1;i+)sum+=i;省略“表达式3”,此时应在循环体内部实现循环变量的增量,以保证循环能够正常结束。如:for(i=1;i=100;)sum+=i;i+5.5.2 当型循环语句for语句 for循环的省略形式:省略“表达式1”和“表达式3”,此时只给出了循环条件,如:i=1;for(;i=100;)sum+=i;i+三个表达式都省略,即不设初值,也不判断条件,循环变量不增值。无终止地执行循环体。如:for(;)循环体语句5.5.3 当型循环语句while语句 语法格式为:
17、while(表达式)循环体语句;表达式FT循环体语句while后面的语句执行过程是:当表达式为非0(真)时,执行循环体语句,然后重复上述过程,一直到表达式为0(假)时,while语句结束。如:i=1;while(i=100)sum+=i;i+;5.5.3 当型循环语句while语句 说明:循环体包含一条以上语句时,应用“”括起来,以复合语句的形式出现,否则它只认为while后面的第一条语句是循环体;循环前,必须给循环控制变量赋初值;循环体中,必须有改变循环控制变量值的语句,否则循环永远不结束。【范例5-12】求数列1/2、2/3、3/4前20项的和。5.5.4 直到型循环do-while语句直
18、到型循环:先执行语句,后判断表达式。其一般的语法格式为:do 循环体语句;while(表达式);表达式FT循环体语句do-while后面的语句执行过程是:先执行一次循环体语句,然后判断表达式是否为非0(真),如果为真,则再次执行循环体语句,如此反复,一直到表达式的值等于0(假)时,循环结束。分号不能分号不能省略省略5.5.4 直到型循环do-while语句说明:do-while语句与while语句不同,二者的区别在于:当while后面的表达式一开始的值为0(假)时,while语句的循环体一次也不执行,而do-while语句的循环体至少要执行一次。循环体部分要用花括号括起来,即使只有一条语句也如
19、此;do-while语句最后以分号结束。do-while语句也可以构成无限循环,此时要利用break语句或 return语句直接从循环体内跳出循环。5.5.4 直到型循环do-while语句【范例5-13】计算两个数的最大公约数。采用“辗转相除法”,方法如下:比较两数,并使m大于n。将m作被除数,n作除数,相除后余数为r。将mn,nr;若r=0,则m为最大公约数,结束循环。若r0,执行步骤步骤(2)和(3)。m nm n362424365.5.5 循环的嵌套循环的嵌套是指一个循环结构的循环体内又包含另一个完整的循环结构。之前三种循环之间可以互相嵌套。比如:1.while 嵌套 while wh
20、ile()while()2.do-while 嵌套 do-while do do while();while();5.5.5 循环的嵌套3.for嵌套for for(;)for(;)4.while 嵌套do-while while()do while();5.for 嵌套while for(;)while()等等。5.5.5 循环的嵌套【范例5-14】编写程序打印如下金字塔图形。【范例5-15】在算经中张丘建提出一个“百鸡问题”:就是公鸡一只值钱五,母鸡一只三块,小鸡三只一块。用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各买多少只?*0=x=200=y=33z=100-x-y5.6 转向语句 o5
21、.6.1 goto语句o5.6.2 break语句o5.6.3 continue语句5.6.1 goto语句 goto语句是无条件转向语句,即转向到指定语句标号处,执行标号后面的程序。其一般语法格式为:goto 语句标号;例如:goto end;说明:结构化程序设计不主张使用goto语句。【范例5-16】用goto语句来显示1100的数字。5.6.2 break语句作用:可使程序跳出当前循环结构,执行循环后面的语句。语句格式为:break;/*无break语句*/int sum=0,number;scanf(“%d”,&number);while(number!=0)sum+=number;s
22、canf(“%d”,&number);/*有break语句*/int sum=0,number;while(1)scanf(“%d”,&number);if(number=0)break;sum+=number;5.6.2 break语句break语句只是跳出当前的循环语句,对于嵌套的循环语句,break语句的功能是从内层循环跳到外层循环。例如:01 int i=0,j,sum=0;02 while(i 5)03 for(j=0;j 5;j+)04 sum+=i+j;05 if(j=i)break;06 07 i+;08 【范例5-17】输入一个大于2的整数,判断该数是否为素数。若是素数,输出
23、”是素数”,否则输出”不是素数”。5.6.3 continue语句作用:在满足另一个特定条件时跳出本次循环。语句格式为:continue;【范例5-18】输出100200之间所有不能被3和7同时整除的整数。表达式1表达式2表达式3continue循环体truefalse5.7 综合应用简单计算器 【范例5-19】编写一个程序,模拟具有加、减、乘、除等4种功能的简单计算器。5.9 跟我上机1编写程序,找到1000以内的所有“完数”。所谓“完数”是指一个数是其所有因子之和,例如6=1+2+3。2输出斐波那契(Fibonacci)数列的前20项。该数列的第1项和第2项为1,从第3项开始,每一项均为其前面2项之各和,即:1,1,2,3,5,8,.。f1 f21 1 f32f1f43f2f1=f1+f2f2=f1+f25.9 跟我上机3猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。问第一天共摘了多少。today=before/2+1before=2(today+1)
限制150内