首页 理论教育 C++中学版:循环语句

C++中学版:循环语句

时间:2023-08-13 理论教育 版权反馈
【摘要】:+49+50的值为例,来说明for循环的几种形式,虽然形式不同,但是功能和结果是相同的。

C++中学版:循环语句

1.语句格式、流程图及执行过程(见表5-5)

表5-5 for循环语句执行过程

表达式2表示循环条件,用于判断循环是否执行,其他说明同while循环。

2.正常运行三要素

通过以上分析可以得知,循环能正常运行要具有如下三要素:

(1)为循环变量赋初值(语句格式中的表达式1——初值)。

(2)设置循环条件,用于判断循环是否执行(语句格式中的表达式2——判断)。

(3)改变循环变量(语句格式中的表达式3——更新)。

for循环的形式比较灵活,下面以求1+2+3+…+49+50的值为例,来说明for循环的几种形式,虽然形式不同,但是功能和结果是相同的。

3.最常用的形式

语句分析:

循环变量的初值被赋为1(初值),当循环条件i<=50(判断)成立的情况下,进行累加和计算sum+=i,此处的50也可以理解为循环变量的终值,通过i++(更新)来改变i值,这里的i既是循环变量,又充当了所求式中的第i项的值。

图5-2  “常用形式”流程图

执行过程(如图5-2所示):

这里要特别注意:表达式1只在循环最开始时执行一次。

首先执行表达式1,将i的初始值赋为1,接下来计算表达式2,i<=50结果为真,条件成立,所以要执行循环体,将i的值与sum相加并把结果赋给sum,然后执行表达式3,将i值增1,执行完后i值为2,结束第一次循环;第二次循环直接从计算表达式2开始,判断条件是否成立,即将第一次循环结束时的i值2与表达式2(i<=50)中的终值50进行比较,条件成立,结果为真,所以要继续执行循环体,将i值2与sum相加并把结果赋给sum,接下来执行表达式3(i++),执行完后i值为3,结束第二次循环;如此反复,直到表达式2中的条件i<50不成立时,跳出循环,执行循环后面的语句。

4.省略表达式1的形式

语句分析:

语句格式中的表达式1被省略,但它后面的“;”不能省略。表达式1的功能为循环变量赋初值,被移到了for循环之前完成,这与上面的表达式1只在循环最开始时执行一次相一致。

执行过程:

程序顺序执行,先执行进入for循环之前的语句i=1;将i值赋为1,然后执行循环语句,由于表达式1的位置为空,所以直接计算表达式2的值,根据结果判断是否执行下面的循环体语句sum+=i;接下来的执行过程与上述相同。

5.省略表达式1和表达式3的形式

语句分析:

语句格式中的表达式1和表达式3均被省略,表达式1的功能为循环变量赋初值,被移到了for循环前完成,表达式3的功能改变循环变量的值,被移到了循环体内完成。

执行过程(如图5-3所示):

程序按顺序先执行进入for循环前面的语句i=1;然后执行循环语句,由于表达式1省略,所以直接计算表达式2的值,根据结果判断是否执行下面的循环体语句sum+=i;和i++;接下来因为表达式3也被省略,所以第一次循环结束,直接进行下一轮的循环,计算表达式2,结果为真,返回继续执行循环体,结束第二次循环,继续进入下一轮的循环,如此反复,直到表达式2的结果为假时跳出循环,执行后面的语句。此形式相当于while循环。

6.表达式1中的“初值”大于表达式2中的“终值”

(www.xing528.com)

图5-3  “省略表达式1和表达式3”流程图

语句分析:

循环变量的初值被赋为50,当循环条件i>=1成立时,执行循环体,进行累加和运算sum+=i,此处的50为循环变量的初值,1为循环变量的终值,通过i--来改变i值,可以把上面所求改成50+49+48+47+…+3+2+1这样的形式更易理解。这里只是想说明初值可以大于终值,当初值大于终值时,要实现循环,只需要将表达式3做相应的自减即可。

执行过程:

首先执行表达式1,将i的初始值赋为50,接下来计算表达式2,i>=1结果为真,条件成立,执行循环体,将i的值与sum相加并把结果赋给sum,然后执行表达式3,将i值减1,执行完后i值为49,结束第一次循环;第二次循环直接从计算表达式2开始,判断条件是否成立,将第一次循环结束时的i值49与表达式2(i>=1)中给出的终值1进行比较,条件成立,结果为真,所以返回继续执行循环体,将i值49与sum相加并把结果赋给sum,接下来执行表达式3(i--),执行完后i值为48,结束第二次循环;如此反复,直到表达式2中的条件i>=1不成立时,跳出循环,执行循环后面的语句。

7.循环变量声明在括号

语句分析:

将循环变量i定义在为循环变量初始化的表达式1处,此时i的作用范围仅为循环内,出了循环,i就不存在了,也就是i的生命周期从被定义开始,到循环结束终止。若在循环外加一条将i值输出的语句,程序在编译时就会报错,因为此时的i已经无效了。

执行过程:

除了i的生命周期外,此执行过程与第一种形式是完全一样的。

思考:若求1到50间的偶数和该如何做呢?

提示:判断一个数是否为偶数的方法就是看这个数能否被2整数,即对2取余看结果,若结果为0,则能被2整数,是偶数;若结果为非0,则不能被2整数,是奇数。

方法1:从1到50依次判断,若为偶数则累加,否则继续判断下一个数。

方法2:1到50之间最小的偶数为2,两个偶数之间的差为2,可以用初值为2、终值为50,i的更新用自增2的方法来实现(i+=2),对应到for循环中各表达式。此方法的执行效率要更高些。

例5-9 求n!(0<=n<=20)

思路分析:

(1)阶乘表达式n!=n∗(n-1)∗(n-2)∗…∗4∗3∗2∗1,由此可以发现,n!=n∗(n-1)!,(n-1)!=(n-1)∗(n-2)!,也就是一个数的阶乘等于该数乘以前一个数的阶乘。比如4!=4∗3!,3!=3∗2!,2!=2∗1!,1!=1,这是一种递推关系。求1∗2∗3∗4∗…∗n积的过程称为“累乘”,就像求1+2+3+…+n的和为累加一样,只是此处的运算是乘,不是加,但是在进行乘法操作时,积的初始值要初始化为1而不能是0。

(2)累乘操作可以像累加一样用for循环实现,在此for循环中,初值为n,终值为1,循环变量自减1,循环体累乘的表达式为s=s∗i,简写为s∗=i。

程序清单:

例5-10 请用循环打印2019年1月的日历,已知2019年1月1日是星期二,输出显示格式如图5-4所示。

图5-4 2019年1月日历

思路分析:

(1)1月共31天,1月的日历就是循环输出1~31这31个数值,但是格式要符合每行从星期一到星期日的格式。星期几之间的间隔可以通过输出“\t”来实现,每周输出完成后要另起一行,通过回车可以实现,即通过输出“\n”来实现。只有当前的日子是周日时才输出“\n”,其他日子都输出“\t”。

(2)通过观察,每月第一天在星期几的位置也可以通过输出“\t”来实现,输出“\t”个数的规律是星期几-1,即\t的数量=星期几-1,程序中用dayofweek-1表示。

(3)为了程序具有通用性,可以将该月的天数和该月的1号是星期几定义为常量,const int day=31;const int dayofweek=2,这样若想制作其他月份的日历就可以直接修改此处的常量。

程序清单:

说明:两个循环变量都是i,二者不冲突,作用范围分别在各自的循环内。

表5-6列出了三种循环结构的特点。

表5-6 三种循环结构的特点

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈