文章目录
第5章 循环结构程序设计
5.1 为什么需要循环控制
在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题:
要向计算机输入全班50个学生的成绩
分别统计全班50个学生的平均成绩
求30个整数之和
教师检查30个学生的成绩是否及格
例如:全班有50个学生,统计各学生三门课的平均成绩。
输入学生1的三门课成绩,并计算平均值后输出
scanf(“%f,%f,%f”,&s1,&s2,&s3);
aver=(s1+s2+s3)/3;
printf(“aver=%7.2f”,aver);
输入学生2的三门课成绩,并计算平均值后输出
scanf(“%f,%f,%f”,&s1,&s2,&s3);
aver=(s1+s2+s3)/3;
printf(“aver=%7.2f”,aver);
要对50个学生进行相同操作.
程序中凡涉及求阶乘、累加、排序等问题都要用循环解决,因为程序中的某一程序段要重复执行若干次。
C语言实现循环的语句:
goto 和if组合
while语句
do while语句
for语句
5.2 用while语句实现循环
特点:先判断表达式,再执行循环体
其中:
while后面的括号( )不能省。
while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。
表达式的值是是循环的控制条件。
语句部分称为循环体,当需要执行多条语句时,应使用复合语句。
例5.1 用while语句构成循环,求1到100的和。
#include <stdio.h>
int main ( )
{
int i = 1, sum = 0;
while ( i <= 100 )
{
sum += i;
i++;
}
printf ("sum = %d\n", sum);
return 0;
}
运行结果:sum = 5050
注意:
(1) 如果while后的表达式的值一开始就为假,循环体将一次也不执行。
(2) 循环体中的语句可为任意类型的C语句。
(3) 遇到下列情况,退出while循环:
表达式为假(为0)。
循环体内遇到break、goto语句。
5.3 用do…while语句实现循环
其中:
while后面的括号( )不能省。
while最后面的分号;不能省。
while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。
表达式的值是是循环的控制条件。
语句部分称为循环体,当需要执行多条语句时,应使用复合语句。
把上一个例题转化:
#include <stdio.h>
int main ( )
{
int i = 1, sum = 0;
do
{
sum += i;
i++;
} while ( i <= 100 );
printf ("sum = %d\n", sum);
return 0;
}
例5.3 while和do-while语句比较
#include <stdio.h>
int main( )
{ int i,sum=0;
scanf("%d",&i);
do
{ sum+=i;
i++;
}while(i<=10);
printf("%d",sum);
return 0;
}
#include <stdio.h> int main()
{int i,sum=0;
scanf("%d",&i);
while(i<=10)
{ sum+=i;
i++;
}
printf("%d",sum);
return 0;
}
输入:11
输出:
11 0
do-while 循环,循环体至少执行一次;
while和do-while可以解决同一问题,两者可以互换。
while后的表达式一开始就为假时,两种循环结果不同。
5.4 用for语句实现循环
for (表达式1;表达式2;表达式3)
循环体语句;
for语句很好地体现了正确表达循环结构应注意的三个问题:
循环变量的初始化。
循环的条件。
循环控制变量的更新。
#include <stdio.h>
int main ( )
{
int i , sum = 0;
for (i = 1; i <= 100; i++)
sum += i;
printf ("sum = %d\n", sum);
return 0;
}
结果同上 sum =5050
5.5 循环的嵌套
5.6 几种循环的比较
5.7 改变循环执行的状态
break语句和continue语句
break语句
功能:在循环语句和switch语句中,终止并跳出循环体或开关体。
说明:
break只能终止并跳出最近一层的结构。
break不能用于循环语句和switch语句之外的任何其它语句之中。
一般形式:break;
例5.4 在全系1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目。
#include <stdio.h>
#define SUM 100000
int main()
{ float amount,aver,total; int i;
for (i=1,total=0;i<=1000;i++)
{ printf("please enter amount:");
scanf("%f",&amount);
total= total+amount;
if (total>=SUM) break;
}
aver=total / i ;
printf(“num=%d\naver=%10.2f\n”,i,aver);
return 0;
}
Continue语句
功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。
continue 语句仅用于循环语句中。
continue 语句只结束本次循环,break语句则是结束整个循环。
continue 语句只用于while,do-while,for循环语句中,break语句还可以用于switch语句中。
例5.5 把100~200之间不能被3整除的数输出
#include <stdio.h>
void main()
{ int i;
for(i=100;i<=200;i++)
{ if(i%3= =0)
continue;
printf(“%d”,n);
}
}
运行结果:
100,101,
103,104,
106,107,
109,110,
112,113,
115,116,
118,119
例5.6 输出以下4*5的矩阵。
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
#include <stdio.h>
int main()
{ int i,j,n=0;
for (i=1;i<=4;i++)
for (j=1;j<=5;j++,n++)
{
if (n%5==0) printf (“\n”);
printf ("%d\t",i*j);
}
printf("\n");
return 0;
}
5.8 循环程序举例
#include <stdio.h>
#include <math.h>
void main()
{ int s;
float n,t,pi;
t=1; pi=0; n=1.0; s=1;
while((fabs(t))>=1e-6)
{ pi=pi+t;
n=n+2;
s= -s;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
}
运行结果:
pi=3.141594
有一对兔子,出生三个月后每个月都生一对兔子。小兔子长到三个月后每个月又生一对兔子。假设所有的兔子都不死,问每个月的兔子总数是多少对?
#include <stdio.h>
int main()
{ int f1=1,f2=1; int i;
for(i=1; i<=20; i++)
{ printf("%12d %12d ",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
例5.9输入一个大于3的整数n,判定它是否素数(prime,又称质数)。
解题思路:
让n被i整除(i的值从2变到n-1)
如果n能被2~(n-1)之中任何一个整数整除,则表示n肯定不是素数,不必再继续被后面的整数除,因此,可以提前结束循环
注意:此时i的值必然小于n
#include <stdio.h>
int main()
{ int n,i;
printf(“n=?");
scanf("%d",&n);
for (i=2;i<=n-1;i++)
if(n%i==0) break;
if(i<n) printf("%d is not\n",n);
else printf("%d is\n",n);
return 0;
}
运行结果
n=?17
17 is
例5.10 求100~200间的全部素数。
for(n=101;n<=200;n=n+2)
{ k=sqrt(n);
for (i=2;i<=k;i++)
if (n%i==0) break;
if (i>=k+1)
{ printf("%d ",n);
m=m+1;
}
if(m%10==0) printf(“\n”);
}
例5.11 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。
非字母字符保持原状不变
输入一行字符,要求输出其相应的密码
char c;
while((c=getchar())!=‘\n’)
{ if((c>=‘A’ && c<=‘Z’) || (c>=‘a’ &&
c<=‘z’))
{ c=c+4;
if(c>=‘Z’ && c<=‘Z’+4 || c>‘z’)
c=c-26;
}
printf("%c",c);
}
本章主要讨论了循环结构程序设计的有关方法,重点介绍了与C语言三种循环控制结构有关的while语句、do-while语句及for语句。
本章所涉及到的主要关键字有:while、do、for、break、continue。
C语言提供了三种循环语句。
for语句主要适用于循环次数确定的循环结构。
循环次数及控制条件要在循环过程中才能确定的循环可用 while或do-while语句。
三种循环语句可以相互嵌套组成多重循环,循环之间可以并列但不能交叉。
三种循环结构可以相互转换。
在循环程序中应避免出现死循环,即应保证循环控制变量的值在运行过程中可以得到修改,并使循环条件逐步变为假,从而结束循环。
break、continue都可用于流程控制。其中,break语句用于退出switch或一层循环结构,continue语句用于结束本次循环,继续执行下一次循环。