《C++语言程序设计》课程辅导.docx
- 文档编号:12395468
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:27
- 大小:49.44KB
《C++语言程序设计》课程辅导.docx
《《C++语言程序设计》课程辅导.docx》由会员分享,可在线阅读,更多相关《《C++语言程序设计》课程辅导.docx(27页珍藏版)》请在冰豆网上搜索。
《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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+语言程序设计 C+ 语言程序设计 课程 辅导