《C++语言程序设计》课程辅导.docx

上传人:b****4 文档编号:12395468 上传时间:2023-04-18 格式:DOCX 页数:27 大小:49.44KB
下载 相关 举报
《C++语言程序设计》课程辅导.docx_第1页
第1页 / 共27页
《C++语言程序设计》课程辅导.docx_第2页
第2页 / 共27页
《C++语言程序设计》课程辅导.docx_第3页
第3页 / 共27页
《C++语言程序设计》课程辅导.docx_第4页
第4页 / 共27页
《C++语言程序设计》课程辅导.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

《C++语言程序设计》课程辅导.docx

《《C++语言程序设计》课程辅导.docx》由会员分享,可在线阅读,更多相关《《C++语言程序设计》课程辅导.docx(27页珍藏版)》请在冰豆网上搜索。

《C++语言程序设计》课程辅导.docx

《C++语言程序设计》课程辅导

《C++语言程序设计》课程辅导

------循环语句辅导

中央电大徐孝凯

一、for循环

 

1.格式

for语句又称for循环,它也是一种结构性语句,其语句格式为:

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

其中<语句>是for语句的循环体,它将按条件被重复执行多次;<表达式1>,<表达式2>和<表达式3>都可以被省略,但它们之间的分隔符(即分号)必须保留;另外,<表达式1>除了可以是一个表达式外,还可以兼有对变量进行定义的功能,此变量在离开此循环后仍然可以使用。

如i=1和inti=1都可以作为<表达式1>使用,当使用i=1时,i必须被定义过,当使用inti=1时,i在此之前必须没有定义,此表达式同时具有定义变量i和给它赋初值这两种功能。

2.语句执行过程

for语句的执行过程为:

(1)计算<表达式1>,当然若此项被省略则无须计算;

(2)计算<表达式2>得到一个值,假定为M,若该表达式被省略则当作数值1看待;

(3)若M为非0,则执行一遍循环体,否则结束整个for语句的执行;

(4)计算<表达式3>,当然若此项被省略则无须计算;

(5)自动转向第

(2)步执行。

执行for循环的过程如图6-1所示。

 

 

 

 

 

 

 

 

 

图6-1for语句执行流程

 

3.语句格式举例

(1)for(i=1;i<10;i++)cout<

(2)for(inti=1;i++<=1000;);

(3)for(inti=0,j=0;i+j<20;i++,j+=2)x=i*i+j*j;

(4)for(;;){i++;if(i>100)break;}

(5)for(i=0,y=0;i

cin>>x;

y+=x;

}

(6)for(intk=2;k

if(m%k==0)break;

(7)for(;b;a=b,b=r)r=a%b;

(8)for(k=20;k!

=0;k--){

a=rand()%100;

cout<

if(a%2)c1++;elsec2++;

}

上述第

(1)条语句使循环体重复执行9次,每次输出i的当前值和一个空格。

(2)条语句省略了<表达式3>,并且循环体是一条空语句,该循环体被重复执行1000次,而表达式i++<=1000被计算1001次。

第(3)条语句中的<表达式1>分别给i和j赋初值为0,并对它们进行变量说明,<表达式2>和<表达式3>分别为关系表达式和逗号表达式,循环体是一条赋值语句。

第(4)条语句中省略了全部三个表达式,循环体是一条复合语句。

第(5)条语句中的<表达式1>为逗号表达式,循环体是一条复合语句,该循环语句完成从键盘上输入n个常数,并把它们依次累加到y上的任务。

第(6)条语句中的循环体是一条条件语句,该循环体将被反复执行,直到k

第(7)条语句中省略了<表达式1>,<表达式2>为一个简单变量b,<表达式3>是一个逗号表达式,循环体是一条赋值语句。

第(8)条语句的循环体将被循环执行20次,每次首先得到0~99之间的一个随机数a并输出它,接着若a为奇数就使c1增1,否则使c2增1。

该循环的功能是得到并输出0~99之间的20个随机数,并分别统计出奇数和偶数的个数。

在for循环的循环体中允许使用break语句,其作用是:

当执行到该语句时,就使执行流程转出所属的for循环语句,然后再向下顺序执行。

4.语句嵌套

for循环体可以为任何可执行语句,当然也可以直接为一条for语句,或者在作为循环体的复合语句内使用for语句,并且嵌套的层数不受限制。

如:

(1)for(i=1;i<=5;i++)

for(j=1;j<=6;j++)s+=i*j;

(2)for(i=1;i<=5;i++){

for(j=1;j<=i;j++)cout<<'*';

cout<

}

(3)for(i=0;i

for(j=0;j

if(aa[i][j]>max){

max=aa[i][j];

row=i;col=j;

}

以上每一条语句都是for双重循环语句,处于外层的称为外循环,内部的称为内循环。

如对于第

(1)条语句,外循环控制循环体(即内循环)执行5次,每次执行内循环时又控制内循环体执行6次,所以内循环共被执行5*6=30次。

同理,第

(2)条语句的内循环体(即cout<<’*’;语句)共被执行1+2+3+4+5=15次,第(3)条语句的内循环体(即if语句)共被执行m*n次。

5.应用举例

例1.编一程序计算1+22+42+62++502的值。

分析:

此题所给的计算公式是一个和式,它除第一项外,其余项为从2至50的每一个偶数的平方,因此可采用循环累加的方法来计算,即依次把每个数据项(在此为偶数的平方)累加到一个变量中。

设循环变量为i,它的初值、终值和步长(即每次循环后循环变量的增加值)应分别为2、50和2,设用于累加的变量为s,它的初值应为和式中的第一项1,因为它不能够通过有规律的循环累加到s上。

在循环体中通过赋值语句每次把i的平方值累加到s上,当循环结束后,s的值就是所求的结果。

根据分析编写出程序如下:

#include

voidmain()

{

inti,s=1;

for(i=2;i<=50;i+=2)s+=i*i;

cout<<"s="<

}

例2.编一程序计算

的值,其中x值由键盘输入。

分析:

此题是一个累加求和问题,适合使用for循环来实现。

设循环变量为和式中的i,它从1取值到10,每次增长1,每次计算出一个数据项并把它累加起来。

为了计算一个数据项中的xi和i!

,还需要设定两个累乘变量,假定分别用p1和p2表示,它们的初值应均为1,在循环体中需要分别向p1和p2累乘x和i的值。

为了把每个数据项的值累加起来,需要设定一个累加变量,假定用s表示,它的初值为0,每次向它累加(-1)i+1p1/p2的值。

当和式中的所有10个数据项都累加到s之后,s的值就是所求的结果。

根据分析编写出程序如下:

#include

voidmain()

{

doublex,p1=1,p2=1,s=0;

inti,j=1;

cout<<"输入x的值:

";

cin>>x;

for(i=1;i<=10;i++){

p1*=x;//p1的值为xi

p2*=i;//p2的值为i!

s+=j*p1/p2;//j的值为(-1)i+1

j=-j;//j取反,为下一数据项计算做准备

}

cout<

}

 

例3.已知y1=

,y2=

,其中x从0开始取值,每次增加的步长为0.25,直到3,a的值由键盘输入,并要求大于0,编一程序依次求出x每一取值所对应的y1和y2的值。

分析:

设i为循环变量,让它的初值、终值和步长分别为0,12和1,则x的每次取值可表示为0.25i。

在循环体中计算y1和y2的公式应分别表示为:

y1=(1+exp(x))/(sqrt(2*a)+1)

y2=(1+exp(-x))/(sqrt(2*a)-1)

每次根据x的值(即0.25i)求出对应的y1和y2后都要输出出来。

根据分析编写出程序程序如下:

#include

#include

voidmain()

{

doublex,a,y1,y2;

cout<<"Inputa(a>0):

";cin>>a;//也可把a设定为数值常量

for(inti=0;i<=12;i++){

x=0.25*i;

y1=(1+exp(x))/(sqrt(2*a)+1);

y2=(1+exp(-x))/(sqrt(2*a)-1);

cout<

}

}

例4.已知一组实验数据:

3.62,2.93,3.16,3.73,2.86,3.40,2.86,3.07,3.29,3.24,编一程序分别求出它们的平均值、方差和均方差,要求每一结果只保留两位小数。

分析:

设它们的平均值、方差和均方差分别用变量v,f和t表示,由数学知识可知,相应的计算公式为:

v=

f=

t=

其中n表示数据个数,xi表示第i个数据。

此题需要首先求出

,然后才能够求出v,f和t。

而求所有数之和以及求所有数平方之和需要采用循环累加的方法。

为此设循环变量为i,它的初值、终值和步长应分别为1,n和1,设输入变量为x,每次从键盘缓冲区得到一个实验数据,设累加数据之和的变量为s1,累加数据平方之和的变量为s2。

每次分别向s1和s2累加xi和xi2的值。

根据以上分析编写出程序如下:

#include

#include

constintn=10;//n等于待处理数据的个数

voidmain()

{

doublex,s1,s2;

s1=s2=0;

cout<<"从键盘上输入"<

";

for(inti=1;i<=n;i++){

cin>>x;s1+=x;s2+=x*x;

}

doublev,f,t;

v=s1/n;

f=s2/n-v*v;

t=sqrt(f);

v=floor(v*100)/100;//使结果保留两位小数

f=floor(f*100)/100;//使结果保留两位小数

t=floor(t*100)/100;//使结果保留两位小数

cout<<"平均值:

"<

cout<<"方差:

"<

cout<<"均方差:

"<

}

该程序上机运行后,按所给数据输入,则运行结果为:

从键盘上输入10个实验数据:

3.622.933.163.732.863.402.863.073.293.24

v=3.21

f=0.08

t=0.28

 

例5.由勾股定理可知,在一个直角三角形中,两条直角边a和b与斜边c的关系为a2+b2=c2,编一程序求出每条直角边均不大于30的所有整数组解。

如(3,4,5),(5,12,13)等都是该题的解。

分析:

根据题意,需要使用二重循环来解决,设外循环变量用a表示,它的初值、终值和步长应分别取1,30和1,内循环变量用b表示,它的初值、终值和步长应分别取a+1,30和1。

内循环变量的初值若取1,而不是取a+1,则会出现象(3,4,5)和(4,3,5)这样的重复组,为了避免重复组的出现,所以让b从a+1开始,即使第二条直角边大于第一条直角边。

根据分析编写出程序如下:

#include

#include

constintn=30;

voidmain()

{

inta,b;

doublec;

for(a=1;a<=n;a++)

for(b=a+1;b<=n;b++){

c=sqrt(a*a+b*b);//求出斜边的长度

if(fabs(int(c+0.5)-c)<1e-5)//若斜边同为整数则输出

cout<<'('<

}

}

因为进行双精度运算时,可能存在着小于1e-15的微小误差,使得本来是整数值而可能变小一点,所以为了判断程序中c是否为整数,则采用fabs(int(c+0.5)-c)<1e-5条件进行判断比较合理。

若直接采用int(c)==c条件判断,则可能会漏掉一些解。

该程序运行后,将得到如下输出结果:

(3,4,5)

(5,12,13)

(6,8,10)

(7,24,25)

(8,15,17)

(9,12,15)

(10,24,26)

(12,16,20)

(15,20,25)

(16,30,34)

(18,24,30)

(20,21,29)

(21,28,35)

 

例6.编一程序打印出2至99之间的所有素数。

分析:

由数学知识可知,若一个自然数是素数(又称质数),则它必定不能被1和它本身之外的任何自然数整除。

因为任何一个自然数都不可能被比它大的自然数整除,所以要判断一个自然数是否为素数,只要看它能否被比它小的自然数(当然除1之外)整除,若只要存在能被一个自然数整除则就不是素数,否则是素数。

另一方面,若一个自然数n不是素数,则必然能表示成两个自然数n1和n2之积,并且其中之一必然小于等于

,另一个必然大于等于

所以要判断一个自然数n是否为素数,可简化为判断它能否被2至

之间的自然数整除即可。

因为若一个自然数n不能被2至

之间的自然数整除,则必然也不能被

至n-1之间的自然数整除。

由以上分析可知,判断一个自然数n是否为素数的过程是一个循环过程,设循环变量为i,它的初值、终值和步长应分别为2,int(sqrt(n)和1,在循环体内要判断n是否能被i整除,若能则表明n不是素数,应结束循环,若不能则继续循环。

当整个循环正常结束(即因<表达式2>的值为0而结束循环的情况)后,表明n不能被2至

之间的任何自然数整除,得到n是一个素数。

要求出所给的2至99区间内的所有素数,需要依次对每个整数进行判断,这又是一个循环处理的过程。

为此设循环变量为n,它的初值、终值和步长应分别为2,99和1,若进一步考虑除2之外的偶数不可能是素数,则循环变量n的初值、终值和步长应分别为3,99和2,对于n的每一取值,都要执行判断它是否为素数的循环过程,所以解决此题的程序模块结构是一个双重循环。

根据以上分析,编写出程序如下:

#include

#include

voidmain()

{

inti,n;

cout<<2<<’’;//素数2单独输出

for(n=3;n<=99;n+=2){

inttemp=int(sqrt(n));

for(i=2;i<=temp;i++)

if(n%i==0)break;//执行break时为非正常结束循环

if(i>temp)cout<

}

cout<<'\n';

}

当这个程序中的for内循环执行结束后,若i的值大于temp,则表明内循环是正常结束的,n为一个素数,所以要把它打印出来,否则内循环是非正常结束的,n是一个非素数,此时的i值必然小于等于temp,它不会被打印出来。

该程序运行后得到的输出结果为:

2357111317192329313741434753596167717379838997

 

二、while循环

 

1.语句格式

while语句又称为while循环,它也是一种结构性语句,它的循环体是一条语句。

While语句格式为:

while(<表达式>)<语句>

<语句>成分是while语句的循环体,它可以是任何一条可执行语句或空语句。

2.执行过程

while语句的执行过程为:

(1)计算<表达式>的值,假定为M;

(2)若M为非0,则执行一遍循环体,否则结束整个语句的执行;

(3)自动转向第

(1)步执行。

While语句的执行过程可用图6-2表示出来。

 

 

 

图6-2while语句的执行过程

3.格式举例

(1)while(x<=0)cin>>x;

(2)while(x){s+=x;cin>>x;}

(3)while(n--){

cin>>x;

if(x>0)n1++;elsen2++;

}

(4)while(i

=a[i])i++;

(5)while(i++

x=rand()%100;

if(x%2==0)c2++;

if(x%3==0)c3++;

if(x%5==0)c5++;

}

(6)while

(1){

cout<<”输入一个运算符(+,-,*,/或@):

”;

cin>>op;

if(op==’@’)break;

switch(op){

case‘+’:

z=Add(x,y);break;

case‘-’:

z=Subt(x,y);break;

case‘*’:

z=Mult(x,y);break;

case‘/’:

z=Divide(x,y);break;

default:

cout<<”Inputerror!

”<

}

}

 

对于上面每一条while语句,若第一次计算<表达式>的值为0(如对于第一条语句,即当x的值大于0时,其<表达式>的值为0),则循环体不会被执行就离开了循环,否则循环体至少被执行一次。

在while语句的循环体内,也可以同在for语句的循环体内一样使用break语句,使之非正常地结束其执行过程,自动转向所属while语句的后面继续向下执行。

请读者分析以上每一条while语句的执行过程和功能。

while循环中的循环体语句可以为任何一条可执行语句或空语句,因此同样可以为一条while语句或其他循环语句,若循环体是一条复合语句,则在复合语句内也同样可以使用while语句或其他循环语句。

总之,允许各种循环语句之间的嵌套使用,并且嵌套的层数不受限制。

4.程序举例

(1)#include

voidmain()

{

intx,c1=0,c2=0;

cin>>x;

while(x>=0){//当输入一个负数时结束循环

if(x<60)c1++;elsec2++;

cin>>x;

}

cout<

}

该程序的功能是:

分别统计出从键盘上输入的所有整数中小于60和大于等于60的数据个数,然后显示出来。

在程序中用输入负数作为终止while循环的结束标志,使用x作为输入变量,使用c1和c2作为统计变量。

(2)#include

voidmain()

{

inta,b;

cout<<"请输入两个正整数:

";

cin>>a>>b;

while(a<=0||b<=0){cout<<"重新输入:

";cin>>a>>b;}

while(b){

intr=a%b;

a=b;b=r;

}

cout<

}

该程序的功能是:

采用辗转相除法求出两个整数的最大公约数。

如假定从键盘上输入的两个整数为136和40,用它们分别作为a和b的值,因b=40不为0,所以执行第一遍while循环体,使得r为a整除以b而得到的余数,接着把a和b修改为除数b和余数r的值,即40和16;又因b的当前值为16,它不为0,接着执行第二遍循环体,使得r的值为8,接着把a和b修改为16和8;再进行条件判断时,因b=8不为0,接着执行第三遍循环体,使得r的值为0,a和b的值再一次被修改为8和0;进行第四次while循环条件判断时,因b等于0,所以结束循环。

结束循环后a的值就是原有两个整数136和40的最大公约数。

(3)#include

#include

#include

voidmain()

{

inti=10,a;

while(i>0){

a=rand()%190+10;

intj,k=int(sqrt(a)+1e-5);

for(j=2;j<=k;j++)

if(a%j==0)break;

if(j>k){cout<

}

}

该程序是一个双重循环,外层为while循环,内层为for循环,每执行一遍外循环体可能显示出一个10至199之间的一个素数。

该程序的功能是:

随机产生出10个10至199之间的素数并显示出来。

5.应用举例

例1.编一程序求出满足不等式

的最小n值。

分析:

此题不等式的左边是一个和式,该和式中的数据项个数是未知的,也正是要求出的。

对于和式中的每个数据项,对应的通式为

,i=1,2,...n,所以可采用循环累加的方法来计算出不等式的和。

设循环变量为i,它应从1开始取值,每次增加1,直到不等式的值不小于5为止,此时的i值就是所求的n。

设累加变量为s,在循环体内应把1/i的值累加到s上。

根据以上分析,采用while循环编写出程序如下:

#include

voidmain()

{

inti=0;doubles=0;

while(s<5)s+=double

(1)/++i;

cout<<"n="<

}

若采用for循环编写程序,则如下所示:

#include

voidmain()

{

inti;doubles=0;

for(i=1;s<5;i++)s+=1.0/i;

cout<<"n="<

//注意:

此i-1的值为所求的n值

}

该程序的输出结果应为:

n=83

例2.有一家企业,若年产值平均增长率分别按2%,4%,6%,...,20%计算,问分别需要经过多少年才能够使年产值翻一番。

分析:

假定把当年的年产值定为1个单位,则翻一番后就应变为2。

设年产值平均增长率为x,经过的年数为n,n年后的产值为y,则求y的计算公式为:

y=(1+x)n

由题意可知,当y正好等于2或刚好超过2时所得到的n值就是按年平均增长率为x,达到翻一番所需要的年数。

要根据x值求出y达到2之后的n值,应采用循环来解决。

设循环变量为i,它从1开始取值,每次增加1,每次向累乘变量y(它的初值应为1)乘上1+x的值,当y<2成立时继续下一次循环,直到y≥2为止,此时的i值就是所求的年数。

根据题目要求,x不是取一次值,而是取多次值。

对于x的每一次取值,都需要求出对应的n值。

由于x的取值是有规律的,它从0.02开始到0.20结束,每次增加0.02,所以可使用x作为for循环的循环变量,控制循环体的循环执行的次数,每次循环求出x值所对应的n值。

根据分析编写出程序如下:

#include

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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