C语言程序设计课程辅导.doc_第1页
C语言程序设计课程辅导.doc_第2页
C语言程序设计课程辅导.doc_第3页
C语言程序设计课程辅导.doc_第4页
C语言程序设计课程辅导.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

C+语言程序设计课程辅导-循环语句辅导 中央电大 徐孝凯 一、for循环 1. 格式 for语句又称for循环,它也是一种结构性语句,其语句格式为: for(;) 其中是for语句的循环体,它将按条件被重复执行多次;,和都可以被省略,但它们之间的分隔符(即分号)必须保留;另外,除了可以是一个表达式外,还可以兼有对变量进行定义的功能,此变量在离开此循环后仍然可以使用。如i=1和int i=1都可以作为使用,当使用i=1时,i必须被定义过,当使用int i=1时,i在此之前必须没有定义,此表达式同时具有定义变量i和给它赋初值这两种功能。 2. 语句执行过程 for语句的执行过程为: (1) 计算,当然若此项被省略则无须计算; (2) 计算得到一个值,假定为M,若该表达式被省略则当作数值1看待; (3) 若M为非0,则执行一遍循环体,否则结束整个for语句的执行; (4) 计算,当然若此项被省略则无须计算; (5) 自动转向第(2)步执行。 执行for循环的过程如图6-1所示。 图6-1 for语句执行流程 3. 语句格式举例 (1)for(i=1; i10; i+) couti ;(2) for(int i=1; i+=1000;);(3) for(int i=0,j=0; i+j100) break; (5) for(i=0,y=0; ix; y+=x; (6) for(int k=2; ksqrt(m); 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; couta ; if(a%2) c1+; else c2+; 上述第(1)条语句使循环体重复执行9次,每次输出i的当前值和一个空格。 第(2)条语句省略了,并且循环体是一条空语句,该循环体被重复执行1000次,而表达式i+=1000被计算1001次。 第(3)条语句中的分别给i和j赋初值为0,并对它们进行变量说明,和分别为关系表达式和逗号表达式,循环体是一条赋值语句。 第(4)条语句中省略了全部三个表达式,循环体是一条复合语句。 第(5)条语句中的为逗号表达式,循环体是一条复合语句,该循环语句完成从键盘上输入n个常数,并把它们依次累加到y上的任务。 第(6)条语句中的循环体是一条条件语句,该循环体将被反复执行,直到ksqrt(m)不成立时正常结束循环为止,或循环体中if语句使用的条件m%k=0成立时转出循环为止,称此为非正常结束循环。 第(7)条语句中省略了,为一个简单变量b,是一个逗号表达式,循环体是一条赋值语句。 第(8)条语句的循环体将被循环执行20次,每次首先得到099之间的一个随机数a并输出它,接着若a为奇数就使c1增1,否则使c2增1。该循环的功能是得到并输出099之间的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*; coutendl; (3) for(i=0; im; i+) for(j=0; jmax) max=aaij; 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+L+502的值。 分析:此题所给的计算公式是一个和式,它除第一项外,其余项为从2至50的每一个偶数的平方,因此可采用循环累加的方法来计算,即依次把每个数据项(在此为偶数的平方)累加到一个变量中。设循环变量为i,它的初值、终值和步长(即每次循环后循环变量的增加值)应分别为2、50和2,设用于累加的变量为s,它的初值应为和式中的第一项1,因为它不能够通过有规律的循环累加到s上。在循环体中通过赋值语句每次把i的平方值累加到s上,当循环结束后,s的值就是所求的结果。根据分析编写出程序如下: #include void main() int i,s=1; for(i=2;i=50;i+=2) s+=i*i; couts=sendl; 例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 void main() double x,p1=1,p2=1,s=0; int i,j=1; coutx; 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取反,为下一数据项计算做准备 coutsendl; 例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 void main() double x,a,y1,y2; cout0):; cina; /也可把a设定为数值常量 for(int i=0; i=12; i+) x=0.25*i; y1=(1+exp(x)/(sqrt(2*a)+1); y2=(1+exp(-x)/(sqrt(2*a)-1); coutsetw(10)xsetw(10)y1setw(10)y2endl; 例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 const int n=10; /n等于待处理数据的个数 void main() double x,s1,s2; s1=s2=0; cout从键盘上输入n个实验数据:; for(int i=1; ix; s1+=x; s2+=x*x; double v,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平均值:vendl; cout方 差:fendl; cout均方差:tendl; 该程序上机运行后,按所给数据输入,则运行结果为: 从键盘上输入10个实验数据: 3.62 2.93 3.16 3.73 2.86 3.40 2.86 3.07 3.29 3.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 const int n=30; void main() int a,b; double c; 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(a,b,c)endl; 因为进行双精度运算时,可能存在着小于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不是素数,应结束循环,若不能则继续循环。当整个循环正常结束(即因的值为0而结束循环的情况)后,表明n不能被2至之间的任何自然数整除,得到n是一个素数。 要求出所给的2至99区间内的所有素数,需要依次对每个整数进行判断,这又是一个循环处理的过程。为此设循环变量为n,它的初值、终值和步长应分别为2,99和1,若进一步考虑除2之外的偶数不可能是素数,则循环变量n的初值、终值和步长应分别为3,99和2,对于n的每一取值,都要执行判断它是否为素数的循环过程,所以解决此题的程序模块结构是一个双重循环。 根据以上分析,编写出程序如下: #include #include void main() int i,n; cout2 ; /素数2单独输出 for(n=3; n=99; n+=2) int temp=int(sqrt(n); for(i=2; itemp) coutn ; /输出一个素数 coutn; 当这个程序中的for内循环执行结束后,若i的值大于temp,则表明内循环是正常结束的,n为一个素数,所以要把它打印出来,否则内循环是非正常结束的,n是一个非素数,此时的i值必然小于等于temp,它不会被打印出来。 该程序运行后得到的输出结果为: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 二、while循环 1. 语句格式 while语句又称为while循环,它也是一种结构性语句,它的循环体是一条语句。While语句格式为: while() 成分是while语句的循环体,它可以是任何一条可执行语句或空语句。 2. 执行过程 while语句的执行过程为: (1) 计算的值,假定为M; (2) 若M为非0,则执行一遍循环体,否则结束整个语句的执行; (3) 自动转向第(1)步执行。 While语句的执行过程可用图6-2表示出来。 图6-2 while语句的执行过程 3. 格式举例 (1) while(xx; (2) while(x) s+=x; cinx; (3) while(n-) cinx; if(x0)n1+; else n2+; (4) while(in & x!=ai) i+;(5) while(i+N) x=rand()%100; if(x%2=0) c2+; if(x%3=0) c3+; if(x%5=0) c5+; (6) while(1) coutop; 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”Input error!”endl; 对于上面每一条while语句,若第一次计算的值为0(如对于第一条语句,即当x的值大于0时,其的值为0),则循环体不会被执行就离开了循环,否则循环体至少被执行一次。 在while语句的循环体内,也可以同在for语句的循环体内一样使用break语句,使之非正常地结束其执行过程,自动转向所属while语句的后面继续向下执行。 请读者分析以上每一条while语句的执行过程和功能。 while循环中的循环体语句可以为任何一条可执行语句或空语句,因此同样可以为一条while语句或其他循环语句,若循环体是一条复合语句,则在复合语句内也同样可以使用while语句或其他循环语句。总之,允许各种循环语句之间的嵌套使用,并且嵌套的层数不受限制。 4. 程序举例 (1) #include void main() int x,c1=0,c2=0; cinx; while(x=0) /当输入一个负数时结束循环 if(xx; coutc1 c2endl; 该程序的功能是:分别统计出从键盘上输入的所有整数中小于60和大于等于60的数据个数,然后显示出来。在程序中用输入负数作为终止while循环的结束标志,使用x作为输入变量,使用c1和c2作为统计变量。 (2) #include void main() int a,b; coutab; while(a=0 | b=0) coutab; while(b) int r=a%b; a=b; b=r; coutaendl; 该程序的功能是:采用辗转相除法求出两个整数的最大公约数。 如假定从键盘上输入的两个整数为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 void main() int i=10,a; while(i0) a=rand()%190+10; int j, k=int(sqrt(a)+1e-5); for(j=2; jk) couta ; i-; 该程序是一个双重循环,外层为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 void main() int i=0; double s=0; while(s5) s+=double(1)/+i; coutn=iendl; 若采用for循环编写程序,则如下所示: #include void main() int i; double s=0; for(i=1; s5; i+) s+=1.0/i; coutn=i-1endl; /注意:此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的值,当y2成立时继续下一次循环,直到y2为止,此时的i值就是所求的年数。 根据题目要求,x不是取一次值,而是取多次值。对于x的每一次取值,都需要求出对应的n值。由于x的取值是有规律的,它从 0.02开始到0.20结束,每次增加0.02,所以可使用x作为for循环的循环变量,控制循环体的循环执行的次数,每次循环求出x值所对应的n值。 根据分析编写出程序如下: #include void main() double x,y; int n; for(x=0.02; x=0.201; x+=0.02) /终值为0.20, /考虑到数据运算精度,使用时最好增加半个步长值 n=0; y=1; while(y2) n+; y*=1+x; coutx*100% n yendl; 若上机运行该程序,则得到的显示结果如下: 2% 36 2.03989 4% 18 2.02582 6% 12 2.0122 8% 10 2.15892 10% 8 2.14359 12% 7 2.21068 14% 6 2.19497 16% 5 2.10034 18% 5 2.28776 20% 4 2.0736 三、do语句 1. 语句格式 do语句又称do循环,它也是一种结构性语句,其语句格式为: do while (); 其中是do循环的循环体,它可以为任何可执行语句或空语句。 2. 执行过程 do语句的执行过程为: (1) 执行一遍循环体; (2) 求作为循环条件使用的的值,若其值非0则自动转向第(1)步,否则结束do循环的执行过程,继续执行其后面的语句。 图6-3所示描述了do循环的执行过程。 在do语句的循环体中,也可以使用break语句,用它来非正常结束该循环的执行,使执行流程转向所属do语句的后面。 图6-3 do语句执行流程 3. 格式举例 (1) do i+; while(xix; while(xx; s+=x; while(-n0); (4) do int x=rand()%98+2; int y=int(sqrt(x); for(int i=2; iy) n+; coutx is prime.endl; while(n5); 第一条语句中的循环体执行i+的操作,当数组元素xi的值小于y时,转去执行下一遍循环体,直到条件xiy不成立为止。 第二条语句中的循环体执行从键盘上输入一个数据的操作,当x=0成立时,则重新给x输入数据,一旦输入的数据大于0则结束循环输入过程,继续向下执行。 第三条语句的功能是把从键盘上输入的n个数值累加到变量s中。其中n表示进入此循环前的n的值。 第四条语句的功能是连续求出并输出5个(假定n的初值为0)随机产生的2至99之间的素数。在这条语句的循环体中又使用了for循环,从而构成了双重循环。 在C+语言中,共包含有三种循环语句,到此全部介绍完了,其中do语句的循环体至少被执行一遍,其他两种语句的循环体可能一次都不会被执行。do循环称为先执行(循环体)后判断(条件),其余两种循环称为先判断(条件)后执行(循环体)。每一种循环语句内都可以嵌套任一种循环语句,并且嵌套的层数不受限制。 在实际编程中,对于重复计算或重复处理的问题,可以采用任一种循环语句编写,只要描述正确,从而能够得到正确的运行结果即可。 若要从循环体中退出循环语句,转去执行其后面的语句,则只要使用break语句即可。break语句在循环体中经常作为条件语句中的子句使用。另外,break语句也能够被使用在switch 语句中,用于退出switch 语句的执行过程,接着执行其后的语句。 4. 程序举例 (1) #include const int NM=10; void main() int x,n=1,c=0; do cinx; if(x=30 & x=60) c+; while(n+NM); coutc=cendl; 该程序的功能是:根据从键盘上输入的10个整数,统计出30至60范围内的整数个数,最后输出统计结果。 (2) #include void main() int x; coutx; while(x=2); int i=2; do while(x%i=0) couti ; x/=i; i+; while(ix); if(x!=1) coutx; coutendl; 在这个程序中,第6行为do循环,它确保输入给x的是一个大于等于3的整数,第7行定义整数变量i并赋予2作为初值,第8至14行为一个do循环,循环体中的第一条语句为while循环,每当x能够被i整除则就输出i的值和一个空格,接着修改x为除以i的整数商,第二条语句使i增1,每次执行完do循环体后,都判断条件ix是否成立,若成立则进入下一轮循环,否则结束循环,接着执行后面的条件语句。 此程序的功能是:把从键盘上输入的一个大于等于3的整数分解为质因子的乘积。如输入24时得到的输出结果为“2 2 2 3”,输入50时得到的输出结果为“2 5 5”,输入37时得到的输出结果为“37”。 5. 应用举例 例1编一程序把从键盘上输入的一个十进制整数转换为对应的十六进制数字串输出。 分析:由计算机基础知识可知,一个十进制整数转换为任意r进制的整数时应采用逐次除r取余法。其转换过程是一个重复处理的过程,适合采用循环来解决。按题目要求,每次循环用被除数x(开始为待转换的十进制整数)整除以16所得余数赋给一个整数变量rem,把所得到的整数商又赋给x,当rem在0至9之间时直接输出它,否则应输出它所对应的十六进制数字字符。此循环直到x为0时止。 注意:上述输出得到的十六进制数是按从低位到高位的次序排列的,对它再按相反次序排列时才是所求的十六进制数。待以后学习了数组,就可以利用数组顺序存储转换过

温馨提示

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

评论

0/150

提交评论