c语音学习----循环结构程序设计(1)
来源:互联网 发布:日本教科书知乎 编辑:程序博客网 时间:2024/05/27 02:29
while语句
while语句最简单的情况为循环体只有一个语句,其形式如下:
while(表达式)语句;
但是,while语句通常使用更复杂的形式,也就是其一般形式:
while(表达式)
{
语句序列;
}
其中表达式是循环条件,语句序列为循环体。其执行过程是:先计算while后面圆括号内表达式的值,如果其值为真(非0),则执行语句序列(循环体),然后再计算while后面圆括号内表达式的值,并重复上述过程,直到表达式的值为“假”(值为0)时,退出循环,并转入下一语句去执行。
While循环的执行流程如图6-1所示。
使用while语句时,需注意如下几个问题:
(1)while语句的特点是先判断表达式的值,然后根据表达式的值决定是否执行循环体中的语句,因此,如果表达式的值一开始就为“假“,则循环体将一次也不执行。
(2)当循环体由多条语句组成时,必须用左、右花括号括起来,使其形成复合语句。如:
while(x>0)
{
s+=x
x--;
}
(3)为了使循环最终能够结束,而不至于使循环体语句无穷执行,即产生“死循环”。因此,每执行一次循环体,条件表达式的值都应该有所变化,这既可以在表达式本身中实现,也可以在循环体中实现。
【例6-1】利用while语句,编写程序,求1+2+3+…+100的值。
main()
{
int i=1, sum=0; /*i的初值为1,sum的初值为0*/
while(i<=100) /*当i小于或等于100时执行循环体*/
{
sum=sum+i; /*在循环体中累加一次,i增加1*/
i=i+1; /*在循环体中i增加1*/
}
printf("sum=%d\n",sum);
}
注意:
如果在第一次进入循环时,while后圆括号内表达式的值为0,循环一次也不执行。在本程序中,如果i的初值大于100将使表达式i<=100的值为0,循环体不执行。
在循环体中一定要有使循环趋向结束的操作,以上循环体内的语句i=i+1使i不断增加1,当i>100时循环结束。如果没有这一语句,则i的值始终不变,循环将无限进行。
在循环体中,语句的先后位置必须符合逻辑,否则将会影响运算结果,例如,若将上例中的While循环体改写成:
while(i<=100)
{ i++; /*先计算i++,后计算sum的值*/
sum=sum+i;
}
运行后,将输出:
sum=5150
运行的过程中,少加了第一项的值1,而多加了最后一项的值101。
【例6-2】利用while语句,计算1+1/2+1/4+…+1/50的值,并显示出来。
#include“stdio.h”
main()
{
float sum=1;
int i=2;
while (i<=50)
{
sum +=1/(float) i;
i+=2;
}
printf("sum=%f",sum);
}
运行结果:
sum=2.907979
注意:在此程序中,在循环体中进行累加计算时,必须要对变量i进行强制类型转换,即利用(float)i使其变为浮点型中间变量后再参加运算,否则,由于i中存放的是大于1的整型量,所以,1/i将按整型规则运算,其结果总是为0。
2.do-while循环语句
do-while循环结构的形式如下:
do
语句序列(循环体);
while(表达式);
例如:
do
{
i++;
s+=i;
}
while(i<10);
说明:
do是C语言的关键字,必须与while联合使用。
do-while循环由do开始,用while结束。必须注意的是:在while(表达式)后的“;”不可丢,它表示do-while语句的结束。
while后一对圆括号中的表达式,可以是C语言中任意合法的表达式。由它控制循环是否执行。
按语法,在do和while之间的循环体只能是一条可执行语句。若循环体内需要多个语句,应该用大括号括起来,组成复合语句。
do-while 循环的执行过程是这样的(如图6-3所示):
执行do后面循环体中的语句。
计算While后面一对圆括号中表达式的值。当值为非零时,转去执行步骤1;当值为零时,执行步骤(3)。
退出do-while循环。
由do-while构成的循环与while循环十分相似,它们之间的主要区别是: while循环结构的判断控制出现在循环体之前,只有当 while后面表达式的值为非零时,才能执行循环体;在do-while构成的循环结构中,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式的值是零还是非零,循环体至少要被执行一次。
【例6-3】利用do-while语句,编写程序,求1+2+3+…+100的值。
根据do-while循环的结构,先画出流程图,见图6-4((a)是传统流程图,(b)是N-S图)。
程序如下:
#include"stdio.h"
main()
{
int i=1,sum=0;
do
{
sum=sum+i;
i=i+1;
}while(i<=100);
printf("sum=%d\n",sum);
}
使用do-while语句应注意如下几个问题:
由于do-while语句是先执行一次循环体,然后再判断表达式的值。所以,无论一开始表达式的值为“真”还是为“假”,循环体中的语句都至少被执行一次,这一点同while语句是有区别的。
如果do-while语句的循环体部分是由多个语句组成的话,则必须用左、右花括号括起来,使其形成复合语句。
C语言中的do-while语句是在表达式的值为真时重复执行循环体,这一点与别的语言中类似语句有区别,在程序设计时应引起注意。
【例6-4】 利用do-while语句计算1+1/2+1/4+…+1/50的值,并显示出来。
main()
{
int i=2;
float sum=1;
do
{
sum+=1/(float)i;
i+=2;
}while(i<=50);
printf("sum=%f\n",sum);
}
在一般情况下,用while语句和do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。如例6-1和例6-3中的循环体是相同的,得到的结果也相同。但在while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。
【例6-5】while和do-while循环的比较
main() main()
{ {
int sum=0,i; int sum=0,i;
scanf("%d",&i); scanf("%d",&i);
while(i<=10) do
{ {
sum=sum+i; sum=sum+i;
i++; i++;
} }while(i<=10);
printf("sum=%d\n",sum); printf("sum=%d\n",sum);
} }
3、for语句
for语句构成的循环通常称为for循环。for循环的一般形式如下:
for(表达式1;表达式2;表达式3)
循环体;
for其后的圆括号中通常含有3个表达式,各表达式之间用“;”隔开。这三个表达式可以是任意表达式,通常主要用于for循环的控制。紧跟在for(…)之后的循环体,在语法上要求是一条语句,若在循环体内需要多条语句,应该用大括号括起来,形成复合语句。
for循环的执行过程如下:
计算“表达式1”。
计算“表达式2”,若其值为非零,则转步骤(3);若其值为零,则转步骤(5)。
执行一次循环体。
计算“表达式3”,然后转向步骤2。
结束循环,执行for循环之后的语句。
【例6-6】请编写一个程序,计算半径为0.5、1.5、2.5、3.5、4.5、5.5mm时的圆面积。本例要求计算6个不同半径的圆面积,且半径的变化是有规律的,从0.5mm开始按增1mm的规律递增,可直接用半径r作为for循环控制变量,每循环一次使r增1直到r大于5.5为止。程序如下:
#include "stdio.h"
main()
{
float r, s;
const float Pai=3.14159;
for (r=0.5; r<6.0; r++)
{
s=Pai*r*r; /*计算圆面积s的值*/
printf("r=%3.1f s=%5.2f\n", r, s);
}
}
运行结果:
r=0.5 s=0.79
r=1.5 s=7.07
r=2.5 s=19.63
r=3.5 s=38.48
r=4.5 s=63.62
r=5.5 s=95.03
程序中定义了一个变量Pai,它的值是3.14159;变量r既用作循环控制变量又是半径的值,它的值由0.5变化到5.5,循环体共执行6次当r增到6.0时,条件表达式“r〈6.0”的值为0,从而退出循环。for循环的循环体是个用花括号括起来的复合语句,其中包含两个语句,通过赋值语句把求出的圆面积放在变量s中,然后输出r和s的值。
【例6-7】求正整数n的阶乘n!其中n由用户输入。
在本例中省略了对用户输入的n的合理性的检测,整个流程如图6-6所示。
阶乘结果用fac表示,它的值一般比较大,因此定义为实型变量。程序如下:
#include"stdio.h"
main()
{
float fac=1;
int n,i;
scanf("%d",&n);
/*以下省略了对用户输入的n的合理性的检测*/
for(i=1;i<=n;i++)
fac=fac*i;
printf("fac=%7.0f\n",fac);
}
说明:
for语句一般形式中的“表达式1”可以省略,此时应在for语句之间前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如
for(;i<=10;i++)
fac=fac*i;
执行时,跳过“求解表达式1”这一步,其它不变。
如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。见图6-7。例如:
for(i=1;;i++)
fac=fac*i;
它相当于:
i=1;
while(1)
{
fac=fac*i;
i++;
}
表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:
for(i=1;i<=10;)
{
fac=fac*i;
i++;
}
本例把i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。
可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:
for( ;i<=10;) while(i<=10)
{ {
fac=fac*i; 相当于: fac=fac*i;
i++; i++;
} }
在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。
三个表达式都可以省略,如
for(;;)
语句序列(循环体);
相当于
while(1)
语句序列(循环体);
即不设初值,不判断条件(认为表达式2为真),循环变量不增值。无终止地执行循环体。
表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式。如
for (fac=1;i<=10;i++) fac=fac*i;
表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:
for(fac=1,i=1;i<=10;i++) fac=fac*i;
或
for(i=0,j=100;i<=j;i++,j--) k=i+j;
表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值,执行情况见图6-8。
在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:
for(i=1;i<=10;i++,i++) fac=fac*i;
相当于
for(i=1;i<=10;i+2) fac=fac*i;
表达式2一般是关系表达式(如i<10)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:
① for(i=0;(c=getchar() )! =’\n’;i+=c);
在表达式2中先从终端接收一个字符给c,然后判断此赋值表达式的值是否不等于’\n’(换行符),如果不等于’\n’,就执行循环体。此for语句的执行过程见图6-9,它的作用是不断输入字符,将它们的ASCII码相加,直到输入一个“回车换行”符为止。
注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。
② for( ;(c=getchar() )! =’\n’;)
printf(“%c”,c);
无表达式1和表达式3,其作用是每读入一个字符输出该字符,直到输入一个“回车换行”符为止。请注意,从终端键盘向计算机输入时,是在输入回车以后才送到内存缓冲区中去的。运行情况是:
Computer↙ (输入)
Computer (输出)
而不是
CCoommppuutteerr
即不是从终端敲入一个字符马上输出一个字符,而是输入回车后数据送入内存缓冲区,然后每次从缓冲区读一字符,最后输出。
4、几种循环的比较
while和do-while型循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。
for语句可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。由此可见,for语句的功能更强,凡用while循环能完成的,用for循环都能实现。
用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
while和for循环是先测试表达式,后执行循环体;而do-while语句是先执行一次循环体,再判断表达式。
对while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。
循环结构这一部分很重要,很多程序都得用到。比选择循环还有有意思。
一个比一个有意思哈哈哈。
都是书面文字,很好理解。很多都是借鉴的老师的。
很简单嘛。明白几种循环的要求就可以了。
还有后续。等会奉上。
----ENDING
- c语音学习----循环结构程序设计(1)
- c语言学习----循环结构程序设计(2)
- 汇编学习---循环结构程序设计
- C语言程序设计---5:循环结构程序设计
- C语言学习-循环结构
- C语言学习循环结构
- C语言学习笔记(七)--循环程序设计
- C++学习 【3.4】 程序设计初步--循环结构和循环语句
- 【学习C++】学习C++ -> 选择结构程序设计
- python基础 循环结构程序设计(上)
- python基础 循环结构程序设计(下)
- 循环结构程序设计
- 五、循环结构程序设计
- 循环结构程序设计
- 5.循环结构程序设计
- 循环结构的程序设计
- 循环结构的程序设计
- 循环结构的程序设计
- MongoDB 排序文档
- win7 64位安装Oracle11g后,安装PL/SQL Developer用不了
- js修改IOS微信title
- Git常用命令
- javaSE学习 Day1
- c语音学习----循环结构程序设计(1)
- 时间复杂度的计算
- order string
- url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
- java反射机制
- 单例模式
- Live long and process (#LLAP) 翻译
- POJ 3254 Corn Fields [状压DP]【动态规划】
- iOS&OS X强大的内存管理总结