(C语言程序设计)第3章结构化程序设计的三种基本结构_第1页
(C语言程序设计)第3章结构化程序设计的三种基本结构_第2页
(C语言程序设计)第3章结构化程序设计的三种基本结构_第3页
(C语言程序设计)第3章结构化程序设计的三种基本结构_第4页
(C语言程序设计)第3章结构化程序设计的三种基本结构_第5页
已阅读5页,还剩176页未读, 继续免费阅读

下载本文档

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

文档简介

第3章结构化程序设计的三种根本结构3.1顺序结构程序设计

3.2分支结构程序设计

3.3循环结构程序设计

3.1顺序结构程序设计

3.1.1赋值语句

赋值是把一个常量、变量或运算表达式的值赋给变量。

1)格式

简单赋值是把一个运算表达式的值赋给一个变量,一般的形式为

变量=<运算表达式>;

2)功能

赋值语句的功能是将运算表达式的值赋给左边的变量。3)说明

(1)赋值号与数学中的等于符号“=〞完全不一样,并非相等的意思。故可以有如下的赋值语句:

s=s+1;

x=x+s;

d=d-1;

(2)赋值号左边必须是变量,右边可以是常量、变量或表达式。以下赋值表达式都是正确的:

y=4;

x=y;

p=p+4;(3)在一个运算表达式中,可以出现多个赋值号,运算顺序是从右到左。例如:

x=y=k=6;

执行时,先执行k=6,然后把它的结果赋值给y,再把y的赋值表达式的结果6赋给x。(4)在程序中需要对一些变量预先设置初值,下面几个语句可以给变量赋初值:

inta=4;

floatx=3.14;

charc= 'A';

也可以对几个变量赋同一个初值,例如:

inta=4,b=4,c=4;

也可以只对局部变量赋初值,例如:

inta=4,b,c;图3.1例3.1的运行结果程序说明:

(1)参加算术运算的两个运算量,首先进行算术运算,然后将其结果赋给第一个运算量。例如:a+=b,a和b是参加运算的两个运算量,首先计算a+b,然后再将结果赋值给a。

(2)赋值运算符是一种具有辗转赋值的运算符,例如a=8表示将8赋值给变量a。这里具有两种含义:一种是使变量a的值重新改变,另一种是表达式具有a=8的值,且可以将该值再次赋给其他变量。例如:x=a=8时,x也得到了8的值。

(3) a+=b等价于a=a+b,这两种书写的方式显然是不同的,前者书写的方式不仅比后者简洁,而且计算后所生成的目标代码要比后者少。3.1.2标准输入/输出语句及使用

1.标准格式输入函数scanf()

1)格式

输入函数scanf()的一般格式为

scanf("<格式控制串>",参数表);

其中,函数的参数分为格式控制串和参数表两局部,中间用逗号分隔。

(1)格式控制串局部是加上双引号的一个字符串,可以用一般字符作为匹配符,也可以用格式说明符。

(2)格式控制串由以下形式组成:

%<修饰符><格式说明符>其中,“%〞是格式标识符;格式说明符用来表示输入的格式,scanf函数常用的格式说明符如表3.1所示;修饰符作为附加格式说明符,常用的修饰符如表3.2所示。表3.1scanf函数常用格式说明符表3.2scanf函数常用修饰符(3)参数表局部由一个或多个参数组成,每个参数要求是一个地址值,多个参数之间用逗号分隔,参数的个数和类型要与格式控制串中格式说明符的个数和类型一致。例如:

scanf("%d%c%f",&a,&b,&c)

三个格式说明符分别对应三个参数a、b、c。

2)功能

该函数的功能是从标准输入设备(键盘)上接收输入的数值,按照所指定的格式给函数的参数赋值。3)说明

(1) scanf函数中的“格式控制串〞后面的参数表必须是变量的地址,而不应是变量名。例如,m和n是整形变量,那么

scanf("%d%d",m,n);

是错误的,应将“m,n〞改为“&m,&n〞。

(2)如果在“格式控制串〞中除了格式标识符、修饰符和格式说明符以外还有其他字符,那么应在输入数据时输入与这些字符相同的字符。例如:

scanf("%d,%d",&m,&n);

输入时两个整数之间应参加“,〞:

234,123↙因为在scanf函数中的“格式控制串〞中使用了逗号分隔,所以必须在234后面加一个逗号,使其与之对应。否那么,将输出错误结果。

(3)从键盘输入的数据类型和个数必须与参数表中的数据类型和个数相匹配。例如:

scanf("%d,%d",&m,&n);

如果输入数据时的形式为

234,10.5↙(错误,因为数据类型不匹配)

234,105,123↙(错误,因为数据个数不匹配)

234,123↙(正确)(4)可以指定输入数据所占的列数,系统将自动按指定列数截取数据。例如:

scanf("%3d%3d",&m,&n);

输入

234123256↙

系统会自动将234赋给变量m,将123赋给变量n。

(5)“%〞后面的“*〞附加说明符用来表示跳过它相应的数据。例如:

scanf("%3d%*3d%3d",&m,&n);

如果输入如下的数据:

23411796↙那么系统将234赋给变量m,将96赋给变量n,中间的数据117被跳过不赋给任何变量。在使用一批现成数据时,有时不需要其中的某些数据,可以使用该方法将其“跳过〞。

(6)从键盘输入的数据先放在缓冲区内,当用户按了回车键后系统将缓冲区中的数据取出来按scanf()中指定的格式进行处理。假设缓冲区中还剩有数据,将会对后边的scanf()函数产生影响。2.标准格式输出函数printf()

1)格式

输出函数printf()的一般格式为

printf("<格式控制串>",参数表);

printf()函数的参数在形式上与scanf()函数的参数相同,格式也相同,但是实际上的具体含义是不相同的。

格式控制串局部是加上双引号("")的一个字符串,它包括可打印的一般字符、不可打印的特殊字符(转义字符)和格式说明符三个局部。

(1)可打印的一般字符指的是可直接从输出设备打印出来的字符,即“原样照打〞,例如:

printf("max=%d",x);

中的“max=〞就是可打印的一般字符。(2)不可打印的特殊字符也称为“转义字符〞,是C语言允许的一种特殊形式的字符常量,它是以“\〞开头的字符序列,表示反斜杠后面的字符不能直接从输出设备输出,而转换成其他意义,往往表示输出的字母字符、专用字符、图形字符和控制字符,如 \n表示换行。

转义字符的具体的格式为:\字母。其中:

·“\〞是转义字符序列的标识符,表示后面的字符是转义字符,是不可打印的字符;

·“字母〞表示不可打印的转义字符,用来使输出设备输出某一种格式。

C语言中的常用转义字符如表3.3所示。表3.3C语言中的常用转义字符表(3)格式说明符由以下形式组成:

%<修饰符><格式说明符>

其中,“%〞是格式标识符;格式说明符用来表示输出的格式,printf函数常用的格式说明符如表3.4所示;修饰符作为附加格式说明符,在printf函数中常用的修饰符如表3.5所示。表3.4printf函数常用格式说明符表3.5printf函数常用修饰符如果是0个参数,即该函数中只有格式控制串局部,没有参数表局部,二者之间的逗号可以省略,这时格式控制串局部是一个普通的字符串,该字符串将原样显示在屏幕上,常常用来显示提示信息或输出字符串。例如:

printf("请输入成绩");

scanf("%d",&score);

其中,输出函数printf()只原样显示一个普通的字符串,用来提示用户现在要输入“成绩〞。

如果是多个参数,参数之间必须用逗号分隔,每个参数要求是一个表达式(单独一个变量是表达式的特殊情况),参数的个数和类型要与格式控制串中的格式说明符的个数和类型相匹配。2)功能

printf( )函数的功能是从标准输出设备(显示器或打印机)上按照所指定的格式输出表达式的值的。

3)说明

由于该函数主要用来输出数据,因此,使用频率比较高,几乎所有程序都要用它把计算结果显示到屏幕上,否那么无法知道计算的结果是什么,以及结果是否正确。3.1.3单个字符输入/输出函数语句及使用

1.单个字符输入函数getchar()

1)格式

输入函数getchar()的一般格式为

getchar();

该函数没有参数。

2)功能

从标准输入设备(一般是用户终端)上读入一个字符,函数的值就是从输入设备上得到的字符。

3)说明

(1)从输入设备读入的一个字符可以直接赋给一个变量。如果用户输入g↙(输入字符g,再按回车键,字符送到内存,字符变量c的值为g),那么输出为g(输出字符变量c的值为g);如果用户输入8↙(字符变量c的值为8),那么输出为8。

运行结果如图3.2所示。图3.2例3.2的运行结果(2) getchar()函数只能接收一个字符。

例3.2中,如果用户输入school↙,那么输出s;如果用户输入789999↙,那么输出7。

运行结果如图3.3所示。

图3.3例3.2输入多个字符的运行结果虽然,用户在输入时可以输入多个字符,但getchar()函数只能接收一个字符,并把接收的一个字符赋给字符变量。

(3) getchar()函数接收的一个字符可以赋给一个字符变量,也可以不赋给任何一个变量,作为表达式的一局部。如在例3.2中,输出函数参数可以用getchar()替换。

printf("%c",getchar());

2.单个字符输出函数putchar()

1)一般格式

输出函数putchar()的一般格式为

putchar(c);

2)功能

从标准输出设备(一般是指显示器)上输出一个字符,函数的值就是字符变量c的值。

3)说明

(1)从输出设备输出一个字符变量的值。

(2) putchar()函数也可以输出控制字符。例如:putchar('\n'),输出一个换行符,即,使标准输出设备换行。图3.4例3.3的运行结果图3.5例3.4的运行结果图3.6例3.5的运行结果3.1.4顺序结构程序设计实例

【例3.6】原样输出字符。要求输入两门课程的成绩,输出总分。

程序如下:图3.7例3.6的运行结果

从以上程序运行的结果可以看出,字符数据可以以字符的形式输出,也可以以整数形式输出。同样整型数据也可以以字符的形式输出。即字符数据与整型数据可以互相赋值。图3.8例3.7的运行结果图3.9例3.8的运行结果图3.10例3.9的运行结果图3.11例3.10的运行结果 3.2分支结构程序设计

顺序结构的程序是自上而下顺序执行的。在实际问题中常常需要进行判断,如判断数值的正负、成绩的上下等,然后根据判断的结果来决定相应的处理方法。分支结构就是用来解决这类问题的。分支结构也叫做选择结构。

例如,输入一个整数,判断其是否是7的倍数,如果是,输出YES;否那么输出NO。

问题分析:设用变量x存放输入的整数,判断x是否是7的倍数也就是判断x除以7的余数是否为零,算法如图3.12所示。图3.12分支结构从图3.12中可以看出分支结构程序的设计要考虑以下两个方面的问题。

1)判断条件

判断条件是分支结构设计的关键。一个判断条件的结果只有两种可能:条件成立和条件不成立,并由此决定了程序流程的走向。

判断条件通常是关系表达式或逻辑表达式。

2)实现分支结构的控制语句

分支结构程序的设计就是要正确描述判断的条件,并将其与要实现的具体工作放在分支结构语句中。

C语言提供了实现分支结构的语句,包括if语句和switch语句。if语句包括简单if语句和if-else语句,可以实现二分支和多分支选择,switch语句是专门实现多分支选择的。3.2.1if语句

if语句用来根据不同的条件,选择执行不同的程序流程以及进行不同的处理。常见的选择结构有二分支和多分支两种形式。

1.二分支选择结构

1) if语句

(1)格式有如下两种:(2)功能:当执行该语句时,首先判断<条件表达式>的逻辑值,当逻辑值为“真〞时,执行if子句(表达式后面的语句);当该逻辑值为“假〞时,不执行if子句,接着执行if语句后面的语句。if语句的执行过程如图3.13所示。图3.13if语句的执行过程(3)说明:

①<条件表达式>可以是各种表达式,但必须符合C语言中的规定,表达式的值必须是逻辑值“真〞或“假〞;

② if子句可以是一个语句,也可以是复合语句(用一对花括号括起来的假设干个语句);

③ C语言以“分号〞作为语句的结束,因此,if是条件语句的开始,分号“;〞是条件语句的结束。

【例3.11】根据输入的学生成绩对其进行判断处理:如果成绩及格(假定60分是及格分数线),那么输出“Passed〞(及格);否那么,不做任何输出。图3.14例3.11的运行结果图3.15例3.12的运行结果(2)功能。

if-else语句执行时先判断条件表达式的值,假设结果为“真〞(非0),那么执行if子句(语句1),否那么执行else子句(语句2),然后执行if语句后面的语句。执行过程如图3.16所示。图3.16if-else语句的执行过程

程序说明:程序运行两次,第一次输入85,第二次输入50。图3.17例3.13的运行结果

程序说明:程序运行两次,第一次输入30,输出NO,第二次输入28,输出YES。

为简便起见,在不致引起混乱的情况下,将if语句和if-else语句都称做if语句。图3.18例3.14的运行结果图3.19

if语句嵌在if子句中(2) if(<条件表达式1>)

if(<条件表达式2>)语句1;

其流程图如图3.20所示,属于单分支选择结构。图3.20

if语句嵌在else子句中(3)在实际应用中,由于问题的复杂性,有时不易理解哪一个else与哪一个if配对,因此嵌套的if语句容易出错,建议初学者采用下面的一种较为标准、容易掌握的嵌套的if语句的结构形式,流程图如图3.21所示。图3.21标准的嵌套if语句从流程图中可以看出,这种嵌套的if语句结构实现了多路分支处理:各个表达式依次求值,一旦某个表达式为真,那么就执行与之相关的语句,从而终止整个语句序列的执行;最后一个else局部用于处理“上述条件均不成立〞的情况或缺省情况,此时,上面的各个条件均不满足。有时对缺省情况不需要采取明显的动作,在这种情况下,可以把该结构的末尾(else语句n+1;)省略掉。当然,也可以用它来检查错误,捕获“不可能〞条件。【例3.15】输入一个学生成绩,当成绩≥90时,输出“Verygood〞;当80≤成绩<90时,输出“Good〞;当60≤成绩<80时,输出“Passed〞;当成绩<60时,输出“Failed〞。

问题分析:根据学生成绩分别落入不同的分数段(4种),而输出不同的评语。这是一个具有四路分支的问题。

图3.22例3.15的运行结果程序说明:程序运行三次,分别输入95、55和75,输出分别为:Verygood、Failed和Passed。

关于if语句及if-else语句有以下几点需加以说明:

(1) if后面的表达式可以是C语言中任意合法的表达式(常常是关系表达式或逻辑表达式)。但无论是哪种类型的表达式,在处理时,系统都会将表达式的值理解为逻辑值,即表达式的值只区分为0和非0。

系统对if语句的处理流程是:先求解表达式的值,假设非零,那么按“真〞处理;假设为零,那么按“假〞处理。

以下是合法的if语句:

if(5)printf("finished!\n");因为常数5非零,那么按“真〞处理,执行其后的printf语句,输出“finished!〞。

再如,以下语句执行后x将被赋值为0:

if(3>6) x=1;

else x=0;

(2) if子句和else子句必须以分号结束,且else子句不能作为单独的语句使用,它必须是if语句的一局部,与if配对使用。为了使程序结构清晰,便于阅读,对于复杂的if语句应使用适当的缩进格式。3.2.2switch语句

虽然可以用if-else语句实现多分支结构,但是C语言提供的switch语句能够更方便地直接实现多分支选择结构。switch语句也叫开关语句。2)执行过程

先计算switch后面的表达式的值,然后将该值与case关键字后面的<常量表达式>的值进行比较。第一次先与<常量表达式1>的值进行比较,如果相等,那么从<程序段1>开始执行,依次执行<程序段1>,<程序段2>,……,<程序段n+1>;如果与<常量表达式1>的值不相等,那么与<常量表达式2>的值进行比较,如果相等,那么从<程序段2>开始执行,直到<程序段n+1>;如果不相等,那么与<常量表达式3>的值进行比较……如果<表达式>的值与所有<常量表达式>的值都不相等时,那么执行default后面的<程序段n+1>。图3.23例3.16的运行结果说明:从程序的运行结果可以看出,当用户输入0和1时,计算<表达式>的值为1,然后与<常量表达式1>的值进行比较,两者相等,所以输出结果为

1 2345888

如果用户输入1和2,计算<表达式>的值为3,与<常量表达式3>的值相等,所以输出结果为

345 888

如果用户输入3和4,计算<表达式>的值为7,与所有<常量表达式>的值都不相等,所以执行default后面的<程序段n+1>中的语句,输出结果为

8883)说明

(1)开关语句中的switch、case、default等都是该语句的关键字,整个switch语句必须用一对花括号“{}〞括起来。

(2) switch后面括号内的表达式允许为任何类型。当该表达式的值与某一个case后面的常量表达式的值相等时,就执行该case后面的语句,如果所有case后的常量表达式的值都与该表达式的值不匹配,就执行default后面的语句。

(3)每个case后面的常量表达式的值必须互不相同,即不允许对表达式的同一个值有两种或两种以上的处理方案。(4) <程序段>可以由0个、1个或多个语句组成,如果需要在执行完某一个<程序段>后使流程跳出switch结构,即终止switch语句的执行,可以在该<程序段>后面加上一个退出语句,即break语句。当流程遇到break语句后,系统将强制退出switch语句,执行switch语句的下一条语句。

当case后面包含一条以上的执行语句时,可以不用花括号括起来,系统会自动识别并顺序执行所有语句。当然加上花括号可以使程序更易于阅读。以上程序中增加了一个break语句。当系统执行完<程序段2>的语句后,遇到了break语句,使系统强制退出。

运行结果如图3.24所示。图3.24例3.17的运行结果(5)在switch语句中,可以有default

选择项,也可以没有。如果没有该选择项,当<表达式>的值与所有<常量表达式>的值都不相等时,那就什么也不执行。但良好的程序设计习惯是:在每个switch语句中,写上一条default语句来集中处理例外条件,从而防止一些条件没有被测试到。3.2.3分支结构程序设计实例

【例3.19】输入两个实数,按数值由大到小次序输出这两个实数。

这个程序比较简单,只需做一次比较。对于简单的问题可以不必先写出算法或画出流程图,直接编写程序即可。或者说,算法在编程者的脑子里。程序如下:图3.25例3.19的运行结果图3.26if子句内嵌套的结构图3.27else子句内嵌套的结构运行结果如图3.28所示。

程序说明:程序运行3次,分别输入了小于0、大于0和等于0的三个数。图3.28例3.20的运行结果【例3.21】某商店售货,按购置货物的款数多少分别给予不同的优惠折扣。

购货缺乏250元的,没有折扣;

购货满250元,缺乏500元,折扣5%;

购货满500元,缺乏1000元,折扣7.5%;

购货满1000元,缺乏2000元,折扣10%;

购货满2000元,折扣15%。

分析:用switch结构实现,设置mark标记变量:mark=m/250,其中m为客户购物款,根据mark的值而确定相应的折扣。图3.29例3.21的运行结果【例3.22】编一程序:将以英寸为单位表示的长度转换为以厘米为单位表示的长度;或者反之,从厘米转换为英寸。:1英寸=2.54厘米。

问题分析:因为要求两种单位可以互相转换,所以,设置一个变量select用于选择,select=1表示将英寸转换为厘米,select=2表示将厘米转换成英寸。

(1)用if语句实现,程序如下:图3.30例3.22的运行结果 3.3循环结构程序设计

在程序设计中,经常会遇到需要重复处理的内容,这样的功能由循环结构来实现。

一组被重复执行的语句称为循环体。执行中每执行一次循环体后,都必须做出是继续还是停止循环的决定,这个决定所依据的条件称为循环条件。

例如,从键盘上输入一个整数n,求n!。

问题分析:这是一个求累积的问题,n的阶乘可由以下公式计算:

n!=1*2*3*…*(n-1)*n为了便于编程实现,用变量i表示当前乘数,初始值为1;s表示累积,初始值为1。每次让s乘以i再存放到s中去,然后i的值增1,再继续进行下去,直至i的值增加到n+1停止。算法如图3.31所示。

从图3.31中可以看出:

变量i除了作为乘数,还有一个作用就是作为循环控制变量,控制循环的次数;

需要重复处理的步骤是:“s=s*i;i++;〞;

循环条件是:“i<=n〞。

一般来讲,循环结构程序设计要考虑以下两个方面的问题。图3.31求n!的流程(1)循环条件:循环条件是循环结构设计的关键,它决定着循环体重复执行的次数。循环条件常常由关系表达式或逻辑表达式来表示。

(2)循环体:循环体即是需要重复执行的工作。它可以是一组顺序结构的语句,也可以是一组具有选择结构的语句,甚至还可以是一组具有循环结构的语句。

循环结构程序设计就是要正确描述循环条件,并分析出问题的规律性,利用C语言提供的循环控制语句来实现具体的功能。3.3.1while循环

while语句用于构成“当型〞循环结构。

1)格式

while(<条件表达式>)

循环体语句;

2)功能

首先计算条件表达式(循环条件)的值,假设结果为“真〞(非零),那么执行循环体语句;然后回头再次计算表达式的值,重复上述过程,直到表达式的值为“假〞(零)时结束循环,流程控制转到循环结构的下一语句。其流程如图3.32所示。图3.32“当型〞循环流程图图3.33例3.23的运行结果3)说明

(1) while循环结构的特点是“先判断,后执行〞。如果条件表达式的值一开始就为“假〞,那么循环体一次也不执行。

(2)循环体中,如果包含一个以上的语句,那么应用花括号括起来,以复合语句的形式出现。如例3.23的循环体包含两条语句,因此用花括号括起来。

(3)循环体内一定要有改变循环继续条件的语句,使得循环趋向于结束,否那么循环将无休止地进行下去,即形成“死循环〞。如例3.23中的语句i++,使得循环控制变量i每循环一次增加1,那么最终会到达或超过终值,结束循环。(4)为使循环能够正确开始运行,还要做好循环开始前的准备工作,如例3.23中的语句i=1;和s=1;分别给循环控制变量i和存放累积的变量s初始化。

【例3.24】从键盘上输入6个学生的成绩,对其进行处理:如果成绩及格,那么输出“Passed〞;否那么输出“Failed〞。问题分析:

每个学生成绩的处理流程都是一样的,6个学生成绩的处理无非是对一个学生成绩处理流程进行6次重复,而每次只需输入一个学生成绩即可。因此,该问题的求解算法,只需在例3.13的根底上加一个循环处理。设一个变量n来累计已处理完的学生个数,当处理完6个学生后,程序结束。

算法如图3.34所示。图3.34例3.24的流程图图3.35例3.24的运行结果3.3.2do-while循环

1)格式

do

循环体语句;

while(<条件表达式>);

2)功能

首先执行一次循环体语句,然后计算条件表达式(循环条件)的值。假设结果为“真〞(非零),那么回头再次执行循环体,接着再计算表达式的值,如此重复下去,直到表达式的值为“假〞(零)时,循环结束,并将流程控制转到循环结构的下一语句。其流程如图3.36所示。图3.36do-while循环流程图程序运行结果和例3.23的相同。

3)说明

(1)和while循环类似,当do-while循环体包含一个以上的语句时应该用花括号括起来,以复合语句形式出现;循环体内也一定要有改变循环条件的语句,使循环趋向于结束。

(2)由下面的两个程序可以明显地看出while循环和do-while循环的区别。图3.37while循环的运行结果第二个程序的运行结果如图3.38所示。

当输入1时,两个程序的运行结果是一样的:

Thesumis18,i=4

当输入5时,第一个程序的运行结果是:

Thesumis6,i=6

第二个程序的运行结果是:

Thesumis0,i=5图3.38do-while循环的运行结果从这两个程序中我们可以看到,当循环条件在第一次判断时就为非0时,while和do-while语句在执行过程中没有什么区别;当循环条件在第一次判断时就为0时,while的循环语句一次也不执行,而do-while的循环语句仍要执行一次。

3.3.3for循环

for语句是C语言提供的另一种应用灵活、功能强大的构成“当型〞循环结构的循环语句。它不但可以用于循环次数的情况,而且还可以用于循环次数未知的情况。1)格式

for(<表达式1>;<表达式2>;<表达式3>)

<循环体语句>;

2)功能

首先进行<表达式1>的运算,然后计算<表达式2>的值,假设结果为真(非零),那么执行循环体语句,然后进行<表达式3>的运算。然后回头再次计算<表达式2>的值,假设结果为“真〞(非零),再执行循环体语句,接着再进行<表达式3>的运算,然后再回头,如此循环重复下去,直到计算<表达式2>的结果为“假〞(零)时,循环结束,流程控制转到循环结构的下一语句。其流程如图3.39所示。图3.39for循环流程图(2)从语法上看,for的三个成分都是表达式,它们之间都以分号“;〞隔开。

表达式1和表达式3常常是赋值表达式或函数调用,有时也可以是逗号表达式,一般用来实现对循环控制变量初始化和循环控制变量的增(减)值。表达式2常常是关系表达式或逻辑表达式,但也可以是其他类型的表达式,它表示循环继续的条件,只要其值为非零,就可执行循环体,否那么退出循环。

(3)关键字for的三个表达式允许局部或全部省略,但其中的两个分号不能省略,否那么,系统将报错。需要注意:

●当省略表达式1时,在进入for循环之前应该有给循环控制变量赋初始值的语句。

●当省略表达式3时,应该在循环体内有修改循环控制变量的值的语句,以保证循环能够正常结束。

●当表达式2或三个表达式全部省略时,应该在循环体内设置相应的语句来结束循环,否那么程序始终认为判断条件成立,循环将无终止地执行下去,就形成了所谓的死循环。(4)如果循环体语句为一语句组,那么必须用一对花括号“{}〞括起来。

(5)for循环结构书写形式灵活多样,但是如果在三个表达式中过多的参加与循环控制无关的内容,那么容易降低可读性,因此,建议使用一种简单明了的for循环结构形式:

for(循环控制变量赋初值;循环条件;循环控制变量增(减)值)

循环体语句;

【例3.27】输入一批非零整数,以0为结束符,输出其中的最大值。分析:设一变量max用来存放最大值。先假定第一个数是最大值,所以把第一个数赋值给变量max,以后每输入一个数就要和max的值进行比较,如果该值大于max,那么把此值赋值给变量max,使max总是保持迄今为止的最大值,直到输入0结束,那么变量max的值即为所求。

程序如下:

程序说明:程序开始执行时,先将数字3赋值给变量max,然后依次输入6、5、2、9、7、0,当输入数字6时,变量max的当前值为3,6大于3,那么用6替换3,重复执行下去,直到输入0结束。最后输出max的值9即为最大值。图3.40例3.27的运行结果3.3.4循环结构的嵌套

循环的嵌套是指在一个循环体内包含了另一个完整的循环结构。三种循环(while循环、do-while循环和for循环)不仅可以自身嵌套,而且可以互相嵌套。

例如,下面是几种合法的循环嵌套形式:再观察第二行乘法表的变化规律。与第一行唯一不同的是被乘数为2,而处理过程完全一样,因此,只需将被乘数改为2,对上述循环再执行一次即可。

同理,第三行、第四行……只需让被乘数从1变化到9,对上述循环执行9次。因此在上述循环的外面再加上一个循环,即构成双重循环,就可得到所要求的乘法九九表。

算法的流程图如图3.41所示。图3.41九九乘法表流程图图3.42例3.28的运行结果

【例3.29】某小组有5位学生,每位学生考4门课。要求分别统计出每位学生各门课的平均成绩。

问题分析:首先考虑求一位学生各门课的平均成绩。设置循环控制变量i控制课程数,其变化从1到4,每次增量为1。对于每位学生,每执行一次内循环就输入一门课程的成绩,并且累加到总分sum中,内循环执行4次以后,退出内循环,就可以计算和打印该学生的平均分,从而结束该学生的处理。

每位学生的处理过程是一样的,因此,只需对上述流程重复执行5遍(即形成双重循环),每遍输入不同学生的各课成绩,即可求得5位学生的各门课的平均成绩。设置外循环控制变量j控制学生人数,其变化从1到5,每次增量为1。算法流程如图3.43所示。图3.43例3.29流程图图3.44例3.29的运行结果程序说明:

①程序中的变量sum作为累加单元,在累加一个学生的总成绩之前,一定要初始化为0,否那么会将前面学生的总成绩全部加到下一个学生的成绩上。此外sum初始化语句的位置也很关键,既不能放在内循环的里面,也不能放在外循环的外面。

②使用循环的嵌套结构要注意:外层循环应“完全包含〞内层循环,不能发生交叉;嵌套的循环控制变量一般不应同名,以免造成混乱。

例如以下程序中内外循环控制变量同名,显然会造成循环混乱:3.3.5break语句、continue语句和goto语句

1.break语句

break语句在前面介绍switch语句时已经接触过,它的功能是使程序流程从包含它的开关语句或最内层循环中跳出,转到switch结构或该循环结构外的下一语句执行。这将导致包含它的最内层循环(while、for、do-while语句)或switch语句提前终止。

break语句的一般形式为

break;

【例3.30】找出100~300之间第一个能被17整除的数。

用for循环结构来实现对每个数的判断,直到找出第一个能被17整除的数,输出该数,然后利用break语句跳出循环体,结束程序。

算法的流程图如图3.45所示。图3.45例3.30的流程图

程序说明:当i能被17整除时,输出该数,然后执行break语句,结束整个循环(即跳出for循结构);当i不能被17整除时,先使变量i自增1,然后进行下一次循环操作。

使用break语句应注意以下几点:

①break语句只能用于switch结构或循环结构中。在循环结构中应用时,通常与if语句配合使用。图3.46例3.30的运行结果2.continue语句

continue语句的作用是结束本次循环,使得包含它的循环(while、do-while、for)开始

温馨提示

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

评论

0/150

提交评论