程序的控制结构概述.pptx

上传人:j*** 文档编号:30794475 上传时间:2023-10-09 格式:PPTX 页数:63 大小:155.30KB
下载 相关 举报
程序的控制结构概述.pptx_第1页
第1页 / 共63页
程序的控制结构概述.pptx_第2页
第2页 / 共63页
程序的控制结构概述.pptx_第3页
第3页 / 共63页
程序的控制结构概述.pptx_第4页
第4页 / 共63页
程序的控制结构概述.pptx_第5页
第5页 / 共63页
点击查看更多>>
下载资源
资源描述

程序的控制结构概述.pptx

《程序的控制结构概述.pptx》由会员分享,可在线阅读,更多相关《程序的控制结构概述.pptx(63页珍藏版)》请在冰豆网上搜索。

程序的控制结构概述.pptx

第4章程序的控制结构,4.1语句及程序框架,4.1.1语句的基本分类语句是程序的基本组成部分,一段程序或者一个函数就是由若干语句按照算法规定的逻辑关系组成的。

各种表达式都要以语句的形式出现在程序中。

C语言中的语句有如下类型:

(1)变量定义语句;

(2)表达式语句;(3)复合语句;(4)函数调用语句;(5)控制语句;,1.变量定义语句语法格式如下:

;其含义是:

告诉系统,变量表中列出的一个或多个变量的存在,同时要求系统为每个变量分配存储空间,其大小和类型与所规定的一致。

变量定义语句不需要与操作步骤对应。

例如:

charaChar;inttotal=0;/用于累计素数的总数intscore;doublex,y;,2.表达式语句语法格式如下:

;从上述语法格式可以看出,表达式语句是由前面章节提及的各种表达式及后缀的分号构成。

其作用是:

一旦表达式语句被执行时,就要按照表达式的求值顺序计算出表达式的值。

例如:

i+;,3.复合语句语法格式如下:

其作用是:

告诉编译系统,将多个语句看成是一个整体,在语法要求上相当于一个语句。

因此,在分支和循环结构中经常使用,函数的定义体也是一个复合语句。

例如:

intx,y=20;x=y+10;printf(“%d;%d”,x,y);,4.函数调用语句语法格式如下:

();函数调用语句的作用是:

将执行控制流程转移到与此语句完全匹配的函数定义体的第一条语句处,开始执行;函数体执行结束后,返回到此语句的下一条语句处继续执行。

执行流程如教材图4-1.,5.控制语句就是用于控制程序执行路径的相关语句,可以实现程序的各种控制结构。

语言中包含有九种控制语句。

分成三类介绍如下:

(1)分支语句:

if语句、switch语句;

(2)循环语句:

do-while语句、while语句、for语句;(3)跳转语句:

break语句、continue语句、goto语句、return语句。

分支和循环语句是程序中经常使用的,灵活熟练掌握其用法是本章的主要任务,后面会详细讲解。

4.1.2C程序框架一个C程序由若干源文件和头文件组成,称之为一个工程。

头文件包括用户自定义的和系统定义的,这两种都是由若干函数及全局量的声明和编译预处理组成,文件名一般是*.h。

系统定义的如stdio.h,stdlib.h,string.h,math.h,limits.h等,其内容可以在本地安装有C编译器的机器中找到。

一般在安装路径的包含文件夹内,如:

ProgramFilesMicrosoftVisualStudioVC98Include。

4.2分支结构,分支结构与顺序结构相对应,可以称之为判断结构或选择结构,也就是有选择地执行某些语句,改变了完全顺序执行的程序结构。

在日常生活中的表达方式是:

如果;那么。

在计算机领域的基本表达方式是:

如果条件成立,则执行操作1;否则条件不成立,则执行操作2。

其中,操作1,操作2可以是一条或多条语句。

分支结构包含if和switch两个语句.,4.2.1if语句的基本格式语法格式如下:

if()复合语句1else复合语句2if语句基本格式的语义是:

如果条件表达式的值为真,则执行复合语句1,否则,即条件表达式的值不为真,则执行复合语句2。

格式中“()”写法与“(!

=0)”写法等价。

【例4.1】任意输入两个不同的整数,输出其中较大的一个。

#includevoidmain()c4:

intx,y;c5:

printf(nInputtwonumbers:

n);c6:

scanf(%d%d,使用if语句需要注意如下内容:

(1)从if关键词开始到复合语句2结束,在语法上就是一条语句,虽然其中包含着两个复合语句,这并不矛盾。

(2)if语句中的两个复合语句都可以由空语句,一个语句或者多个语句构成。

仅包含空语句或一个语句时,一对大括号可以省略。

此处增加大括号的好处是可以减少不必要的语法错误。

(3)if语句中的条件表达式必需使用一对匹配的圆括号括起来。

(4)条件表达式可以是逻辑表达式,关系表达式,算术表达式及赋值表达式等,单个变量构成的表达式也是正确的。

只要表达式的值不是0值,条件即为成立。

【例4.2】判断某年份是否是闰年。

满足以下两个条件之一的年份均是闰年:

一是年份能够被4整除,但不能被100整除;二是能被400整除的年份。

4.2.2if语句的第二种格式语法格式如下:

if()复合语句if语句第二种格式的语义是:

如果条件表达式的值不为真,则直接执行此if语句的下一条语句,否则,条件表达式的值为真,则执行其后的复合语句,复合语句执行完成后同样要执行if语句的下一条语句。

【例4.3】任意输入两个不同的整数,输出其中较大的一个。

#includevoidmain()c4:

intx,y,max;c5:

printf(nInputtwonumbers:

n);c6:

scanf(%d%d,4.2.3if语句的嵌套形式可以写出如下几种嵌套形式的if语句:

(1)在第二种格式的复合语句处嵌套第二种格式,形如:

if()其它语句1if()复合语句2其它语句2,

(2)第二种格式嵌套第一种格式,形如:

if()if()复合语句21else复合语句22,(3)第一种格式嵌套第二种格式,形如:

if()if()复合语句2elseif()复合语句3,(4)第一种格式嵌套第一种格式,形如:

if()if()复合语句21else复合语句22elseif()复合语句31else复合语句32,【例4.4】要求按任意顺序从键盘输入三个整数,编写程序完成输出最大值和最小值的算法。

基本思路:

首先任取其中两个数,判断最大和最小;使用例4.3的方法。

其次,用第三个数分别与刚刚得到的最大和最小数再次比较,就可以得到三个数中的最大和最小。

4.2.4if语句的第三种格式其语法格式如下:

if()复合语句1elseif()复合语句2elseif()复合语句3elseif()复合语句melse复合语句m+1,【例4.5】设计程序完成将百分制成绩转换成五分制表示。

#includevoidmain()charchscore;intnscore;printf(npleaseinputScore(0100):

n);scanf(%d,elseif(nscore80)chscore=C;elseif(nscore90)chscore=B;elsechscore=A;printf(nYourScoreis%c!

n,chscore);return;,【例4.6】从键盘读取一个字符数据,判断其类型是:

控制类字符,数字字符,大写字符,小写字符,其他字符等类别中的哪一类?

设计程序完成。

基本思路:

读入字符数据,依据字符的ASCII值判断所属范围。

4.2.5switch语句及break语句switch语句的语法格式:

switch()case:

复合语句1case:

复合语句2case:

复合语句ndefault:

复合语句n+1,下面使用switch语句改写例题【例4.5】。

【例4.7】设计程序完成将百分制成绩转换成五分制表示。

#includevoidmain()c4:

intnscore;c5:

charchscore;c6:

printf(ninputScore(0100):

n);c7:

scanf(%d,/变换后,nscore的值是010之间的整数,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;,c23:

printf(nYourScoreis%c!

n,chscore);c24:

return;c23句输出chscore变量的当前值。

编译运行此段程序应该是正确的。

但是程序运行后,不管百分制成绩是多少,输出结果总是如下:

YourScoreisA!

程序一定是存在问题。

这里说的流程控制语句,就是指跳转语句break。

break语句的作用之一就是从某个case子句处跳出switch语句,继续执行switch的下一条语句。

break语句还用于循环语句当中,后面介绍。

例4.7的正确写法需要break与switch语句配合使用,程序如下:

#includevoidmain()c4:

intnscore;c5:

charchscore;c6:

printf(ninputScore(0100):

n);c7:

scanf(%d,/变换后,nscore的值是010之间的整数c9:

switch(nscore)c10:

c11:

case0:

c12:

case1:

c13:

case2:

c14:

case3:

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;,【例4.8】设计能够完成单步四则运算的简易运算器,输出运算结果。

4.3循环结构,C语言中的循环结构主要包括三个语句,分别是:

while语句,do-while语句,for语句。

每个语句各有自身的特点,学习时注意它们在构成循环结构时的异同。

4.3.1while语句while语句也可以称之为“当语句”。

表达的含义是:

当条件表达式的值为真(非0值)时,就执行循环体,之后重新判断条件表达式的值;如此重复多次执行循环体,直到条件表达式的值为假(0值)时,while语句结束,顺序执行其后的下一条语句。

使用流程框图表示如教材图4-8。

while语句的语法格式如下:

while()复合语句其语义是:

1.计算条件表达式的值;2.如果值为真(或者称为成立,或者非0),则按顺序执行复合语句;返回步骤1;3.如果值为假(或者称为不成立,或者0值),则执行while语句的下一条语句。

【例4.9】输出ASCII表的可见字符,字符之间用逗号分隔。

可见字符的ASCII值在32126之间。

#includevoidmain()c4:

intch=32;c5:

while(ch127)c6:

c7:

printf(%c,ch);/输出字符的同时,用逗号分隔不同字符c8:

ch+;c10:

return;,【例4.10】复制输入的一行字符串,并统计字符个数。

可以使用getchar()函数获得键盘输入的一个字符。

一行字符串的结尾是回车符(n)。

由于系统提供了键盘缓冲区,所以能够实现复制字符串的效果。

#includevoidmain()intnCh=0;charch;printf(inputastring:

n);while(ch=getchar()!

=n)putchar(ch);nCh+;printf(nThenumberofcharis:

%d!

n,nCh);,【例4.11】对例4.9改进,每行输出十个字符。

#includevoidmain()c4:

intch=32,i=1;c5:

while(ch127)c6:

c7:

printf(%c,ch);c8:

if(i%10=0)c9:

printf(n);c10:

i+;c11:

ch+;return;,4.3.2do-while语句do-while语句与while语句的区别之一是,条件表达式的计算与判断时机不同。

首先看语法格式:

do复合语句while();其执行过程是:

首先执行复合语句,然后判断条件表达式是否成立,如若成立则再次执行复合语句,否则不成立时,do-while语句结束,执行下一条语句。

其流程描述如教材图4-9.,【例4.12】求两个正整数的最大公因子。

此问题最著名的解法是欧几里德Euclid算法,也称之为辗转相除法。

用自然语言描述如下:

1.任意输入两个正整数m和n;2.求r=m%n;3.如果r等于0,则说明n是m的最大公因子,算法结束;4.否则r不等于0,则将n赋值给m,r赋值给n;转2处继续。

#includevoidmain()intm,n,r,m1,n1;printf(ninputm,n:

n);scanf(%d%d,【例4.13】任意输入一个整数,将其倒序后输出。

如输入5678,则输出8765#includevoidmain()intm,r;printf(ninputanintegerm:

n);scanf(%d,4.3.3for语句for语句是结构比较完备,使用比较灵活的,用于构造循环结构的语句之一。

甚至可以取代do-while和while语句.语法格式为:

for(;)复合语句与do-while和while语句相比较,除了关键字不同之外,还多了两个表达式;而且表达式之间必须使用分号相分隔;即使某个表达式缺省,分号也不能少。

表达式前面添加初值,条件和增量字样仅是为了表达各自的作用和功能。

for语句的执行步骤描述如下:

1.计算初值表达式;2.计算条件表达式,若值为真(非0),则按顺序执行复合语句,之后执行步骤4;3.若值为假(0值),则转到步骤5;4.计算增量表达式;跳转到步骤2;5.循环语句结束,执行其后的第一个语句。

【例4.14】求0到200累加和。

#includevoidmain()intsum=0,i;for(i=0;i=200;i+)sum+=i;printf(nThesumis%d!

n,sum);,总结循环结构设计的一般步骤如下:

1.选择恰当的循环变量;2.明确循环的结束条件;3.循环变量的增量(步长)如何变化;4.循环体包含哪些语句。

【例4.15】分别打印输出Fabonacci数列的前20项。

【例4.16】任意输入一个整数m,判断其是否素数。

#includeintmain()inti,m,isTrue=1;/m保存输入的整数,isTrue=1首先认定输入的数是素数printf(ninputanumbern);scanf(%d,4.3.4跳转语句1.break语句从前面的叙述可知,break语句有两种用法:

一是用在switch语句,结束分支语句,执行下一条语句;二是用在循环结构中,同样是结束循环,执行下一条语句。

其语法格式如下:

break;也就是关键字后面直接加一个分号构成。

【例4.17】如下数列,求累加和sum大于5时,是第几项。

1/1,1/2,1/3,1/4,.,1/n下面给出使用break语句完成的算法。

#includevoidmain()inti;doublesum=0.0;for(i=1;i+)/*设置无限循环*/sum+=1.0/i;/求1/n的累加和if(sum5)/条件成立时,跳出循环break;printf(nTheNo.is%d,Thesumis%lf.n,i,sum);,2.continue语句continue语句的作用是跳过循环中剩余的语句而强行执行下一次循环。

continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。

其语法格式如下:

continue;,3.return语句语法格式如下:

return;return语句一旦被执行,其作用有三:

一是计算表达式的值;二是将表达式的值带回到函数调用语句所在位置;三是结束当前函数的执行,即使return后面还有其它语句。

如果表达式为空,则return语句的作用是结束当前函数的执行,并返回到函数调用语句处。

注意表达式的值必须与函数返回值类型一致。

举例说明如下:

intfunc1()c3:

.c4:

return1*2;c5:

.c6:

c7:

intmain()c8:

c9:

intx;c10:

x=func1();c11:

.,4.4循环的嵌套,从判断语句可以包含判断语句的事实,推而广之,循环语句的循环体既然是复合语句,当然有循环语句的嵌套形式。

也就是每一种循环语句的循环体内,均可以包含有三种循环语句的任何一种。

为了叙述方便,定义单层循环是循环体内不包含循环语句的结构;双层循环是循环体内仅包含单层循环的结构形式;三层循环就是双层循环内又包含单层循环的结构形式。

四层以上的循环很少有应用。

【例4.18】请设计程序完成,统计100以内的全部素数的个数;并输出最大的素数。

总结一下:

双层循环的嵌套形式共可分9种,这里仅以for作为外层循环为例,以while和do-while为外层循环的嵌套与此相似。

1.for-for嵌套for(;)/各个表达式均被省略了,以下相同/其它必要的语句for(;)/内层循环体/必要语句,2.for-while嵌套for(;)/其它必要的语句while()/内层循环体/必要语句,3.for-do-while嵌套for(;)/必要的语句do/内层循环体while();/必要语句,【例4.19】请设计程序输出如下图形。

*,【例4.20】设计程序完成,输出等腰三角形的图形如下:

*,【例4.21】设计程序输出y=cos(x)的图像。

由于有字符窗口的限制,只能将cos(x)的图像顺时针旋转90o输出,也就是屏幕向右的方向设为y轴正向,屏幕向下的方向设为x轴的正向。

另外,屏幕宽度一般是80个字符,所以将x轴设定在屏幕的40列位置处。

x值从0o开始,间隔15o取值,到360o结束。

cos(x)的值在-1到+1之间变化,为了比较好地反映值的变化情况,特别将y值放大35倍,并向屏幕的右侧移动40个字符,使之介于5到75之间。

【例4.22】百马百担问题。

共有100匹马,要驮100担货,其中大马驮3担,中马驮2担,两匹小马驮1担,求大、中、小马各有多少匹?

解决此问题,不妨设大、中、小马各有x,y,z匹。

可以列出方程组如下:

x+y+z=100

(1)3*x+2*y+0.5*z=100

(2),4.5常见的错误,1.在条件表达式中,将=误写为=。

例如:

if(year%4=0&year%100!

=0)|(year%400=0)此处产生的错误是:

errorC2106:

=:

leftoperandmustbel-value。

是由于将=误写为=造成的。

2.将数学中的不等式写法,直接应用于程序设计之中。

例如:

(xyz)/正确的写法是(xy&yz)3.else子句之前的语句缺少分号。

4.case子句缺少匹配的break语句。

5.case子句的常值重复出现。

6.括号不匹配。

建议书写程序时不管大括号,方括号,圆括号均要成对输入。

7.误写空语句。

例如:

while(ch=getchar()!

=n);putchar(ch);while语句同一行的分号是误写的,但是编译系统却错误理解为循环体是空语句。

所以得不到希望的运行结果,因为putchar(ch)仅被执行一次。

而这样的错误有时是很隐蔽的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1