




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于程序的控制结构第1页,共64页,2022年,5月20日,15点1分,星期五4.1语句及程序框架
4.1.1语句的基本分类
语句是程序的基本组成部分,一段程序或者一个函数就是由若干语句按照算法规定的逻辑关系组成的。各种表达式都要以语句的形式出现在程序中。C语言中的语句有如下类型:
(1)变量定义语句;
(2)表达式语句;
(3)复合语句;
(4)函数调用语句;
(5)控制语句;第2页,共64页,2022年,5月20日,15点1分,星期五1.变量定义语句语法格式如下:
<类型标识符><变量表>;其含义是:告诉系统,变量表中列出的一个或多个变量的存在,同时要求系统为每个变量分配存储空间,其大小和类型与<类型标识符>所规定的一致。变量定义语句不需要与操作步骤对应。例如: charaChar; inttotal=0;//用于累计素数的总数 intscore; doublex,y;第3页,共64页,2022年,5月20日,15点1分,星期五2.表达式语句语法格式如下:
<表达式>;从上述语法格式可以看出,表达式语句是由前面章节提及的各种表达式及后缀的分号构成。其作用是:一旦表达式语句被执行时,就要按照表达式的求值顺序计算出表达式的值。例如:
i++;第4页,共64页,2022年,5月20日,15点1分,星期五3.复合语句语法格式如下:
{<语句1><语句2>…<语句n>}其作用是:告诉编译系统,将多个语句看成是一个整体,在语法要求上相当于一个语句。因此,在分支和循环结构中经常使用,函数的定义体也是一个复合语句。例如:{intx,y=20;x=y+10;printf(“%d;%d”,x,y);}第5页,共64页,2022年,5月20日,15点1分,星期五4.函数调用语句语法格式如下:
<函数名>(<实际参数表>);
函数调用语句的作用是:将执行控制流程转移到与此语句完全匹配的函数定义体的第一条语句处,开始执行;函数体执行结束后,返回到此语句的下一条语句处继续执行。执行流程如教材图4-1.第6页,共64页,2022年,5月20日,15点1分,星期五5.控制语句就是用于控制程序执行路径的相关语句,可以实现程序的各种控制结构。C语言中包含有九种控制语句。分成三类介绍如下:(1)分支语句:if语句、switch语句;(2)循环语句:do-while语句、while语句、for语句;(3)跳转语句:break语句、continue语句、goto语句、
return语句。分支和循环语句是程序中经常使用的,灵活熟练掌握其用法是本章的主要任务,后面会详细讲解。第7页,共64页,2022年,5月20日,15点1分,星期五4.1.2C程序框架一个C程序由若干源文件和头文件组成,称之为一个工程。头文件包括用户自定义的和系统定义的,这两种都是由若干函数及全局量的声明和编译预处理组成,文件名一般是*.h。系统定义的如stdio.h,stdlib.h,string.h,math.h,limits.h等,其内容可以在本地安装有C编译器的机器中找到。一般在安装路径的包含文件夹内,如:\ProgramFiles\MicrosoftVisualStudio\VC98\Include。第8页,共64页,2022年,5月20日,15点1分,星期五4.2分支结构
分支结构与顺序结构相对应,可以称之为判断结构或选择结构,也就是有选择地执行某些语句,改变了完全顺序执行的程序结构。在日常生活中的表达方式是:如果…;那么…。在计算机领域的基本表达方式是:如果条件成立,则执行操作1;否则条件不成立,则执行操作2。其中,操作1,操作2可以是一条或多条语句。分支结构包含if和switch两个语句.第9页,共64页,2022年,5月20日,15点1分,星期五4.2.1if语句的基本格式语法格式如下:
if(<条件表达式>)
复合语句1else
复合语句2if语句基本格式的语义是:如果条件表达式的值为真,则执行复合语句1,否则,即条件表达式的值不为真,则执行复合语句2。格式中“(<条件表达式>)”写法与“(<条件表达式>!=0)”写法等价。第10页,共64页,2022年,5月20日,15点1分,星期五【例4.1】任意输入两个不同的整数,输出其中较大的一个。
#include<stdio.h>voidmain(){c4:intx,y;c5:printf("\nInputtwonumbers:\n");c6:scanf("%d%d",&x,&y);c7:if(x>y)c8:{printf("max=%d\n",x);}elsec10:{printf("max=%d\n",y);}return;}第11页,共64页,2022年,5月20日,15点1分,星期五使用if语句需要注意如下内容:(1)从if关键词开始到复合语句2结束,在语法上就是一条语句,虽然其中包含着两个复合语句,这并不矛盾。(2)if语句中的两个复合语句都可以由空语句,一个语句或者多个语句构成。仅包含空语句或一个语句时,一对大括号可以省略。此处增加大括号的好处是可以减少不必要的语法错误。(3)if语句中的条件表达式必需使用一对匹配的圆括号括起来。(4)条件表达式可以是逻辑表达式,关系表达式,算术表达式及赋值表达式等,单个变量构成的表达式也是正确的。只要表达式的值不是0值,条件即为成立。第12页,共64页,2022年,5月20日,15点1分,星期五【例4.2】判断某年份是否是闰年。满足以下两个条件之一的年份均是闰年:一是年份能够被4整除,但不能被100整除;二是能被400整除的年份。第13页,共64页,2022年,5月20日,15点1分,星期五4.2.2if语句的第二种格式语法格式如下:
if(<条件表达式>)
复合语句
if语句第二种格式的语义是:如果条件表达式的值不为真,则直接执行此if语句的下一条语句,否则,条件表达式的值为真,则执行其后的复合语句,复合语句执行完成后同样要执行if语句的下一条语句。第14页,共64页,2022年,5月20日,15点1分,星期五【例4.3】任意输入两个不同的整数,输出其中较大的一个。
#include<stdio.h>voidmain(){c4:intx,y,max;c5:printf("\nInputtwonumbers:\n");c6:scanf("%d%d",&x,&y);c7:max=x;c8:if(y>x)c9:{max=y;}c10:printf("max=%d\n",max);c11:return;}第15页,共64页,2022年,5月20日,15点1分,星期五4.2.3if语句的嵌套形式可以写出如下几种嵌套形式的if语句:(1)在第二种格式的复合语句处嵌套第二种格式,形如:
if(<条件表达式1>){其它语句1if(<条件表达式2>)
复合语句2
其它语句2}第16页,共64页,2022年,5月20日,15点1分,星期五(2)第二种格式嵌套第一种格式,形如:
if(<条件表达式1>){if(<条件表达式2>)
复合语句21else
复合语句22}第17页,共64页,2022年,5月20日,15点1分,星期五(3)第一种格式嵌套第二种格式,形如:
if(<条件表达式1>){if(<条件表达式2>)
复合语句2}else{if(<条件表达式3>)
复合语句3}第18页,共64页,2022年,5月20日,15点1分,星期五(4)第一种格式嵌套第一种格式,形如:
if(<条件表达式1>){if(<条件表达式2>)
复合语句21else
复合语句22}else{if(<条件表达式3>)
复合语句31else
复合语句32}第19页,共64页,2022年,5月20日,15点1分,星期五【例4.4】要求按任意顺序从键盘输入三个整数,编写程序完成输出最大值和最小值的算法。基本思路:首先任取其中两个数,判断最大和最小;使用例4.3的方法。其次,用第三个数分别与刚刚得到的最大和最小数再次比较,就可以得到三个数中的最大和最小。第20页,共64页,2022年,5月20日,15点1分,星期五4.2.4if语句的第三种格式其语法格式如下:if(<条件表达式1>)
复合语句1elseif(<条件表达式2>)
复合语句2elseif(<条件表达式3>)
复合语句3……elseif(<条件表达式m>)
复合语句melse
复合语句m+1第21页,共64页,2022年,5月20日,15点1分,星期五【例4.5】设计程序完成将百分制成绩转换成五分制表示。
#include<stdio.h>voidmain(){charchscore;intnscore;printf("\npleaseinputScore(0~~100):\n");scanf("%d",&nscore);if(nscore<60){chscore='E';}elseif(nscore<70){chscore='D';}
第22页,共64页,2022年,5月20日,15点1分,星期五elseif(nscore<80){chscore='C';}elseif(nscore<90){chscore='B';}else{chscore='A';}printf("\nYourScoreis%c!!!\n",chscore);return;}第23页,共64页,2022年,5月20日,15点1分,星期五【例4.6】从键盘读取一个字符数据,判断其类型是:控制类字符,数字字符,大写字符,小写字符,其他字符等类别中的哪一类?设计程序完成。基本思路:读入字符数据,依据字符的ASCII值判断所属范围。第24页,共64页,2022年,5月20日,15点1分,星期五4.2.5switch语句及break语句
switch语句的语法格式:
switch(<表达式>){case<常值1>:复合语句1case<常值2>:复合语句2……case<常值n>:复合语句n
default:复合语句n+1}第25页,共64页,2022年,5月20日,15点1分,星期五下面使用switch语句改写例题【例4.5】。【例4.7】设计程序完成将百分制成绩转换成五分制表示。
#include<stdio.h>voidmain() {c4:intnscore;c5:charchscore;c6:printf("\ninputScore(0~~100):\n");c7:scanf("%d",&nscore);c8:nscore/=10;//变换后,nscore的值是0~10之间的整数第26页,共64页,2022年,5月20日,15点1分,星期五c9:switch(nscore)c10:{c11:case0:c12:case1:c13:case2:c14:case3:c15:case4:c16:case5:{chscore='E';}c17:case6:{chscore='D';}c18:case7:{chscore='C';}c19:case8:{chscore='B';}c20:case9:c21:case10:{chscore='A';} }第27页,共64页,2022年,5月20日,15点1分,星期五c23:printf("\nYourScoreis%c!!!\n",chscore);c24:return; }c23句输出chscore变量的当前值。编译运行此段程序应该是正确的。但是程序运行后,不管百分制成绩是多少,输出结果总是如下:YourScoreisA!!!程序一定是存在问题。第28页,共64页,2022年,5月20日,15点1分,星期五这里说的流程控制语句,就是指跳转语句break。break语句的作用之一就是从某个case子句处跳出switch语句,继续执行switch的下一条语句。break语句还用于循环语句当中,后面介绍。例4.7的正确写法需要break与switch语句配合使用,程序如下:第29页,共64页,2022年,5月20日,15点1分,星期五
#include<stdio.h>voidmain() {c4:intnscore;c5:charchscore;c6:printf("\ninputScore(0~~100):\n");c7:scanf("%d",&nscore);c8:nscore/=10;//变换后,nscore的值是0~10之间的整数c9:switch(nscore)c10:{c11:case0:c12:case1:c13:case2:c14:case3:第30页,共64页,2022年,5月20日,15点1分,星期五c15:case4:c16:case5:{chscore='E';}c16_1:break;c17:case6:{chscore='D';}c17_1:break;c18:case7:{chscore='C';}c18_1:break;c19:case8:{chscore='B';}c19_1:break;c20:case9:c21:case10:{chscore='A';}c21_1:break;}c23:printf("\nYourScoreis%c!!!\n",chscore);return;}第31页,共64页,2022年,5月20日,15点1分,星期五【例4.8】设计能够完成单步四则运算的简易运算器,输出运算结果。第32页,共64页,2022年,5月20日,15点1分,星期五4.3循环结构C语言中的循环结构主要包括三个语句,分别是:while语句,do-while语句,for语句。每个语句各有自身的特点,学习时注意它们在构成循环结构时的异同。第33页,共64页,2022年,5月20日,15点1分,星期五4.3.1while语句
while语句也可以称之为“当语句”。表达的含义是:当条件表达式的值为真(非0值)时,就执行循环体,之后重新判断条件表达式的值;如此重复多次执行循环体,直到条件表达式的值为假(0值)时,while语句结束,顺序执行其后的下一条语句。使用流程框图表示如教材图4-8。第34页,共64页,2022年,5月20日,15点1分,星期五while语句的语法格式如下:
while(<条件表达式>)
复合语句其语义是:1.计算条件表达式的值;2.如果值为真(或者称为成立,或者非0),则按顺序执行复合语句;返回步骤1;3.如果值为假(或者称为不成立,或者0值),则执行while语句的下一条语句。第35页,共64页,2022年,5月20日,15点1分,星期五【例4.9】输出ASCII表的可见字符,字符之间用逗号分隔。可见字符的ASCII值在32~126之间。
#include<stdio.h> voidmain() {c4: intch=32;c5: while(ch<127)c6: {c7: printf("%c,",ch);//输出字符的同时,用逗号分隔不同字符c8: ch++; }c10: return;}第36页,共64页,2022年,5月20日,15点1分,星期五【例4.10】复制输入的一行字符串,并统计字符个数。可以使用getchar()函数获得键盘输入的一个字符。一行字符串的结尾是回车符(‘\n’)。由于系统提供了键盘缓冲区,所以能够实现复制字符串的效果。
#include<stdio.h> voidmain() { intnCh=0; charch; printf("inputastring:\n"); while((ch=getchar())!='\n') {putchar(ch); nCh++; } printf("\nThenumberofcharis:%d!\n",nCh); }第37页,共64页,2022年,5月20日,15点1分,星期五【例4.11】对例4.9改进,每行输出十个字符。
#include<stdio.h> voidmain() {c4: intch=32,i=1;c5: while(ch<127)c6: {c7: printf("%c,",ch);c8: if(i%10==0)c9: {printf("\n");}c10: i++;c11: ch++; } return; }第38页,共64页,2022年,5月20日,15点1分,星期五4.3.2do-while语句
do-while语句与while语句的区别之一是,条件表达式的计算与判断时机不同。首先看语法格式:do复合语句while(<条件表达式>);
其执行过程是:首先执行复合语句,然后判断条件表达式是否成立,如若成立则再次执行复合语句,否则不成立时,do-while语句结束,执行下一条语句。其流程描述如教材图4-9.第39页,共64页,2022年,5月20日,15点1分,星期五【例4.12】求两个正整数的最大公因子。此问题最著名的解法是欧几里德Euclid算法,也称之为辗转相除法。用自然语言描述如下:1.任意输入两个正整数m和n;2.求r=m%n;3.如果r等于0,则说明n是m的最大公因子,算法结束;4.否则r不等于0,则将n赋值给m,r赋值给n;转2处继续。第40页,共64页,2022年,5月20日,15点1分,星期五#include<stdio.h>voidmain(){intm,n,r,m1,n1; printf("\ninputm,n:\n");scanf("%d%d",&m,&n);m1=m;n1=n; do{r=m%n;m=n;//这里做辗转赋值
n=r;}while(n!=0); printf("\nThe%dand%d’sgreatestcommondivisoris%d!\n",m1,n1,m);}第41页,共64页,2022年,5月20日,15点1分,星期五【例4.13】任意输入一个整数,将其倒序后输出。如输入5678,则输出8765#include<stdio.h>voidmain(){intm,r; printf("\ninputanintegerm:\n");scanf("%d",&m); do{r=m%10;printf("%d",r);}while(m/=10);printf("\n");}第42页,共64页,2022年,5月20日,15点1分,星期五4.3.3for语句
for语句是结构比较完备,使用比较灵活的,用于构造循环结构的语句之一。甚至可以取代do-while和while语句.语法格式为:for(<初值表达式>;<条件表达式>;<增量表达式>)
复合语句与do-while和while语句相比较,除了关键字不同之外,还多了两个表达式;而且表达式之间必须使用分号相分隔;即使某个表达式缺省,分号也不能少。表达式前面添加初值,条件和增量字样仅是为了表达各自的作用和功能。第43页,共64页,2022年,5月20日,15点1分,星期五for语句的执行步骤描述如下:1.计算初值表达式;2.计算条件表达式,若值为真(非0),则按顺序执行复合语句,之后执行步骤4;3.若值为假(0值),则转到步骤5;4.计算增量表达式;跳转到步骤2;5.循环语句结束,执行其后的第一个语句。第44页,共64页,2022年,5月20日,15点1分,星期五【例4.14】求0到200累加和。
#include<stdio.h> voidmain() { intsum=0,i;for(i=0;i<=200;i++){sum+=i; } printf("\nThesumis%d!\n",sum); }第45页,共64页,2022年,5月20日,15点1分,星期五总结循环结构设计的一般步骤如下:1.选择恰当的循环变量;2.明确循环的结束条件;3.循环变量的增量(步长)如何变化;4.循环体包含哪些语句。【例4.15】分别打印输出Fabonacci数列的前20项。第46页,共64页,2022年,5月20日,15点1分,星期五【例4.16】任意输入一个整数m,判断其是否素数。#include<stdio.h>intmain(){inti,m,isTrue=1;//m保存输入的整数,isTrue=1首先认定输入的数是素数printf("\ninputanumber\n");scanf("%d",&m);for(i=2;i<m–1;i++){if(m%i==0){isTrue=0;}}if(isTrue){printf("\n%disprimenumber!\n",m);}else{printf("\n%disnotprimenumber!\n",m);}}第47页,共64页,2022年,5月20日,15点1分,星期五4.3.4跳转语句1.break语句从前面的叙述可知,break语句有两种用法:一是用在switch语句,结束分支语句,执行下一条语句;二是用在循环结构中,同样是结束循环,执行下一条语句。其语法格式如下:
break;
也就是关键字后面直接加一个分号构成。【例4.17】如下数列,求累加和sum大于5时,是第几项。第48页,共64页,2022年,5月20日,15点1分,星期五1/1,1/2,1/3,1/4,......,1/n下面给出使用break语句完成的算法。#include<stdio.h>voidmain(){inti;doublesum=0.0;for(i=1;;i++)/*设置无限循环*/{sum+=1.0/i;//求1/n的累加和if(sum>5)//条件成立时,跳出循环{break;}}printf("\nTheNo.is%d,Thesumis%lf.\n",i,sum);}第49页,共64页,2022年,5月20日,15点1分,星期五2.continue语句
continue语句的作用是跳过循环中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其语法格式如下:
continue;第50页,共64页,2022年,5月20日,15点1分,星期五3.return语句语法格式如下:
return<表达式>;return语句一旦被执行,其作用有三:一是计算表达式的值;二是将表达式的值带回到函数调用语句所在位置;三是结束当前函数的执行,即使return后面还有其它语句。如果表达式为空,则return语句的作用是结束当前函数的执行,并返回到函数调用语句处。注意表达式的值必须与函数返回值类型一致。举例说明如下:第51页,共64页,2022年,5月20日,15点1分,星期五
intfunc1() {c3: ...c4: return1*2;c5: ...c6:}c7:intmain()c8:{c9: intx;c10: x=func1();c11: ... }第52页,共64页,2022年,5月20日,15点1分,星期五4.4循环的嵌套
从判断语句可以包含判断语句的事实,推而广之,循环语句的循环体既然是复合语句,当然有循环语句的嵌套形式。也就是每一种循环语句的循环体内,均可以包含有三种循环语句的任何一种。为了叙述方便,定义单层循环是循环体内不包含循环语句的结构;双层循环是循环体内仅包含单层循环的结构形式;三层循环就是双层循环内又包含单层循环的结构形式。四层以上的循环很少有应用。第53页,共64页,2022年,5月20日,15点1分,星期五【例4.18】请设计程序完成,统计100以内的全部素数的个数;并输出最大的素数。第54页,共64页,2022年,5月20日,15点1分,星期五
总结一下:双层循环的嵌套形式共可分9种,这里仅以for作为外层循环为例,以while和do-while为外层循环的嵌套与此相似。1.for-for嵌套for(;;)//各个表达式均被省略了,以下相同{//其它必要的语句
for(;;){//内层循环体}//必要语句}第55页,共64页,2022年,5月20日,15点1分,星期五2.for-while嵌套for(;;){//其它必要的语句
while(<表达式>){//内层循环体
}//必要语句}第56页,共64页,2022年,5月20日,15点1分,星期五3.for-do-while嵌套for(;;){//必要的语句
do{//内层循环体
}while(<表达式>)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论