C程序第5章第5章 循环结构
1、什么样的题型适合用循环结构来实现?(同时满足以下两条)
⑴数之间有规律。
⑵重复进行某项操作。
例如:求1+2+…+100的和。数之间的规律是差值为1的等差数列;而且是重复进行加法操作。满足循环结构的两个条件,适合用循环结构来实现。
2、构成循环结构的循环语句有三种:while、do-while和for。
3、while语句
⑴while语句的一般形式
while(表达式) 循环体
⑵while语句的执行过程如下:
先判断表达式的真假,若表达式为真,则执行循环体一遍,然后再次判断表达式...
第5章 循环结构
1、什么样的题型适合用循环结构来实现?(同时满足以下两条)
⑴数之间有规律。
⑵重复进行某项操作。
例如:求1+2+…+100的和。数之间的规律是差值为1的等差数列;而且是重复进行加法操作。满足循环结构的两个条件,适合用循环结构来实现。
2、构成循环结构的循环语句有三种:while、do-while和for。
3、while语句
⑴while语句的一般形式
while(表达式) 循环体
⑵while语句的执行过程如下:
先判断表达式的真假,若表达式为真,则执行循环体一遍,然后再次判断表达式的真假,若为真,则继续执行循环体,若为假,则彻底跳出循环,转去执行循环体下面的语句。while语句就是当型循环,即循环体有可能一次都执行不到。
⑶简单举例:
k=0;
while(k<10)
{printf(“*”);
k++;
}
本程序的功能是:连续输出10个*号。
⑷详细举例:
求1+2+…+100的和。(用while实现)
#include
main()
{ int i=1,sum=0;
while(i<=100)
{sum+=i;
i++;
}
printf(“1+2+…+100=%d\n”,sum);
}
⑸细节说明
1 while是关键字,系统专用,用户决不能用。
2 while后的圆括号不能为空,其中的表达式可以是任意合法的表达式。
③循环体只能是“一条”语句(可以是复合语句)。
举例:
<1> k=0;
while(k<10)
{printf(“*”);
k++;
}
本程序将连续输出10个*号。
<2> k=0;
while(0)
{printf(“*”);
k++;
}
本程序将不会输出任何*号。
<3> k=0;
while(1)
{printf(“*”);
k++;
}
本程序将会输出无穷个*号。
⑹如何跳出循环体,避免死循环的出现?(两种方法)
1 走正门:表达式为为假(即为0的时候)
举例:k=0;
while(k<10)
{printf(“*”);
k++;
}
2 走后门:在循环体中加入break。
举例:k=0;
while(1)
{printf(“*”);
k++;
if(k>=10)
break;
}
本程序将连续输出10个*号。
注意比较:
k=0;
while(1)
{printf(“*”);
k++;
if(k>10)
break;
}
本程序将连续输出11个*号。注意有等号和没等号的区别。
⑺if语句与while语句的相同点
1 执行的开始都是判断表达式的真假,以此判断是否执行管辖范围内的语句。
2 其后的语句都有可能一次都执行不到。
举例:<2>if(2>3)
printf(“*”);
<2>while(0)
printf(“*”);
3 管辖范围都是其后紧跟的“一条”语句(可以是复合语句)。
⑻if语句与while语句的不同点
1 if后的语句最多执行一次。
如:if(a<2)
printf(“*”);
printf(“&”);
2 while后的语句可反复执行多次。
如:k=0;
while(k<10)
{printf(“*”);
k++;
}
例5.1
#include
main()
{ int i,sum;
i=0;
sum=0;
while(sum<1000)
{sum+=i*i;
i++;
}
printf(“n=%d
sum=%d\n”,i-1,sum);
}
注意:
1 变量sum的角色是累加和,所以在用之前要清0。否则sum中产生的随机数会捣乱,从而影响累加的结果。
2 如果sum的初值为10000,则表达式sum<10000一开始就为0,所以循环体一次都执行不到。
3 i++语句的重要性:正是因为i不断地增1,才使得sum的值不断地增大,从而使表达式sum<10000有机会为假,进而避免死循环的出现。
4 语句的先后位置必须符合逻辑,否则影响结果。
i=1;
while(sum<1000)
{ i++;
sum+=i*i;
}
位置颠倒后,少加了第一项。
例5.2
#include
#include
main()
{int s;
float n,t,pi;
t=1.0;
pi=0;
n=1.0;
s=1;
while(fabs(t)>=1e-6)
{ pi=pi+t;
n+=2.0;
s=-s;
t=s/n;
}
pi=pi*4;
printf(“pi=%f\n”,pi);
}
1 变量s完成正负号的交替。变量t存放每项的值。变量n存放每项分母。pi存放累加和。
②#include 是为函数fabs()
而写的。函数fabs()的功能是求绝对值。如:fabs(0)就是求0的绝对值。C语言中的数学函数都在math.h文件中定义着,只要在程序中用到像fabs()这样的数学函数,都要把#include写上。
4、do-while语句
⑴do-while语句的一般形式
do
循环体
While(表达式);
⑵do-while语句的执行过程如下:
先执行循环体,然后判断表达式的真假,若表达式为真,则执行循环体一遍,然后再次判断表达式的真假,若为真,则继续执行循环体,若为假,则彻底跳出循环,转去执行循环体下面的语句。do-while语句就是直到型循环,即循环体至少执行一次。
⑶简单举例:
i=0;
do
{i++;
s+=i;
}while(i<10);
本程序的功能是求:1+2+…+10的和。
⑷详细举例:
求1+2+…+100的和。(用do-while实现)
#include
main()
{ int i=1,sum=0;
do
{sum+=i;
i++;
} while(i<=100);
printf(“1+2+…+100=%d\n”,sum);
}
⑸细节说明
1 do和while都是关键字,而且do不能单独使用,必须和while配对使用才有效。但是while可以单独使用,构成while语句。
2 在do-while语句中,while(表达式)后的分号必不可少。
3 在do-while语句中,while圆括号中的表达式可以是任意合法的表达式。
4 循环体只能是“一条”语句(可以是复合语句)。同while语句。
例5.4
Fibonacci数列如下:
0 1 1 2 3 5 8 ……
↑ ↑ ↑
f1 f2 f ↑
f1 f2 f
do
{f=f1+f2;
f1=f2;
f2=f;
}while(f2<=1000);
5、for语句
⑴for语句的一般形式
for(表达式1;表达式2;表达式3)
循环体
⑵for语句的执行过程如下:
先执行表达式1,再判断表达式2的真假,若表达式2为真,则执行循环体,然后执行表达式3,再次判断表达式2的真假,若为真,继续执行循环体,若为假,则跳出循环体,转去执行循环体下面的语句。
⑶简单举例:
for(k=0;k<10;k++)
printf(“*”);
本程序将连续输出10个*号。
⑷详细举例:
求1+2+…+100的和。(用for实现)
#include
main()
{ int i=1,sum=0;
for(i=1;i<=100;i++)
sum+=i;
printf(“1+2+…+100=%d\n”,sum);
}
⑸细节说明
1 for是关键字。
2 for圆括号中的三个表达式都可省略,但两个分号必不可少。如果省略表达式2,就会形成死循环。
3 for后一对圆括号中的表达式可以是任意有效的C语言表达式。for(sum=0,i=1;i<=100;sum=sum+i,i++);
例5.6
#include
main()
{double r,s,pi=3.1416;
for(r=0.5;r<=2.5;r+=0.5)
{s=pi*r*r;
Printf(“r=%3.1f s=%f\n”,r,s);
}
}
分析:半径之间有规律,相差0.5,并且是重复性的求圆的面积,所以本题符合循环操作的。可以用循环结构来实现。
6、循环嵌套
定义:循环语句中又套循环语句。
例5.7
使用双层for循环打印如下由星号组成的倒三角图形:
*******
*****
***
*
解析:该图形一共四行,每一行*的个数成等差数列递减,分别为7,5,3,1;以第一行的左边界为准,每一行的空格输出个数分别为:0,1,2,3。并且是重复的进行输出*的操作。符合循环结构的两个条件,故本题应用循环结构来实现。
#include
main( )
{int k,i,j;
for(i=0;i<4;i++)
{for(k=1;k<=i;k++)
printf(“ ”);
for(j=0;j<7-i*2;j++)
printf(“*”);
printf(“\n”);
}
}
:
1、 for(i=0;i<4;i++),i从0一直变到3,控制四行的输出。i为0时,对第1行进行输出,i为1时,对第2行进行输出,依次类推。
2、 for(k=1;k<=i;k++) printf(“ ”);控制每一行空格的输出。
3、 for(j=0;j<7-i*2;j++) printf(“*”);
控制每一行*的输出。
4、 printf(“\n”);一行输出完毕后的换行,为下一行的输出做好准备。
5、 内层for循环跳不出,是无法执行外层for循环的,循环嵌套的执行顺序是由内层到外层。
6、 稍微改动后,倒三角变正三角。
#include
main( )
{int k,i,j;
for(i=3;i>=0;i--)
{for(k=1;k<=i;k++)
printf(“ ”);
for(j=0;j<7-i*2;j++)
printf(“*”);
printf(“\n”);
}
}
例5.8(重点掌握)
编写程序,找出2—100以内的所有的质数(素数)。
解析:只能被1和它本身整除的数叫质数,也就是说,如果一个数i能被2到i-1之间的某个数整除,则这个数i就不是质数。比如:判断9是不是质数,只需让9与2到8期间的7个数都除一遍,若有一个能被整除的,9就不是质数,当9和3除时能整除,则说明9不是质数。
#include
main( )
{int k,i,tag;
for(i=2;i<=100;i++)
{tag=0;
for(k=2;k
#include
main( )
{int k,i,tag;
printf(“2,”);
for(i=3;i<=100;i+=2)
{tag=0;
for(k=2;tag==0&&k,就像printf、scanf与#include的关系一样。
7、 break语句
break语句可以出现在两个地方:switch语句体或循环体内,目的是强制跳出switch语句体或循环体。
8、 continue语句
遇到continue语句,将会余下循环体中尚未执行的语句,提前进入下次循环,可以理解为仅结束本次循环,并未彻底跳出循环体。
例5.10
#include
main( )
{int k=0,s=0,i;
for(i=1;i<=5;i++)
{s=s+i;
if(s>5)
{ printf(“****i=%d,s=%d,k=%d\n”,i,s,k);
continue;
}
k=k+s;
printf(“i=%d,s=%d,k=%d\n”,i,s,k);
}
运行后黑屏显示如下:
i=1,s=1,k=1
i=2,s=3,k=4
****i=3,s=6,k=4
**** i=4,s=10,k=4
**** i=5,s=15,k=4
解析:
只要执行到continue语句,则循环体中余下的语句k=k+s;
printf(“i=%d,s=%d,k=%d\n”,i,s,k);
都将被跳过,而是提前执行i++的操作。
例5.11从输入的若干个大于0的正整数中选出最大值,用-1结束输入。
#include
main( )
{int x,max;
printf(“Enter -1 to end:\n”);
do
{ printf(“Enter x:”);
scanf(“%d”,&x);
}while(x<0&&x!=-1);
max=x;
while(x!=-1)
{ printf(“Enter x:”);
scanf(“%d”,&x);
if(x>0&&x>max)
max=x;
}
if(max!=-1)
printf(“max=%d\n”,max);
}
解析:
do
{ printf(“Enter x:”);
scanf(“%d”,&x);
}while(x<0&&x!=-1);
此程序段是为了确保第一个输入数据的合法有效性。只要输入的数据小于0并且不是-1,表达式x<0&&x!=-1就为真,重复执行循环体后,程序要求重新输入数据。因为题目要求:从输入的若干个大于0的正整数中选出最大值。
本文档为【C程序第5章】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。