C语言-循环结构程序设计

为什么需要循环控制

循环结构(或称重复结构),在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题,因为工作量大、程序冗长、重复、难以阅读和维护,所以需要用到循环控制语句来解决这些问题;

实际上,几乎每一种计算机高级语言都提供了循环控制,用来处理需要进行的重复操作 ,在C语言中,可以用循环语句来处理上面的问题:例如向计算机输入50名学生的成绩

scanf("%f,%f,%f,%f,%f",&score1,&score2,&score3,&score4,&score5);//输入一个学生5门课的成绩
aver=(score1+score2+score3+score4+score5)/5;//求该学生平均成绩
printf("aver=%7.2f",aver);//输出该学生平均成绩 
int i=1;//设整型变量i初值为1
while(i<=50)//当i的值小于或等于50时执行花括号内的语句
{
scanf("%f,%f,%f,%f,%f",&score1,&score2,&score3,&score4,&score5);
aver=(score1+score2+score3+score4+score5)/5;
printf("aver=%7.2f",aver);
i++;//每执行完一次循环使i的值加1
}

用一个循环语句(while语句),就把需要重复执行50次程序段的问题解决了,一个while语句实现了一个循环结构;大多数的应用程序都会包含循环结构,循环结构和顺序结构、选择结构是结构化程序设计的3种基本结构,它们是各种复杂程序的基本构成单元。

用while语句实现循环(先检查,再执行)

while语句的执行过程:

开始时给变量赋值,如int i=1;//设整型变量i初值为1;

while语句首先检查变量的值是否符合循环条件,如果符合循环条件则执行while后面的语句(称为循环体),while(i<=50)//当i的值小于或等于50时执行花括号内的语句

i++;//每执行完一次循环使i的值加1

流程返回到while语句开头,再次检查是否满足循环条件

while语句的一般形式如下:

while (表达式) 语句

其中“语句”就是循环体,循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句(用花括号{ }括起来的若干语句);执行循环体次数是由循环条件控制的,这个循环条件就是上面一般形式中的“表达式”,它也称为循环条件表达式;当此表达式的值为“真”(以非0值表示)时,就执行循环体语句,当值为“假”时,就不执行循环体语句。

while语句可简单地记为:只要当循环条件为真(即给定的条件成立),就执行循环体语句。

while循环的特点先判断条件表达式,后执行循环体语句。

例如,求1~100的和:

#include<stdio.h>
int main()
{
int i=1,sum=0;    //定义变量i的初值为1,sum的初值为0
while(i<=100)    //当i>100时,条件表达式i<=100的值为假,不执行循环体
{                //循环体开始
sum=sum+i;        //第一次累加后,sum的值为1
i++;            //加完后,i的值加1,为下次累加做准备
}                //循环体结束
printf("sum=%d\n",sum);    //输出1+2+...+100的累加和
return 0;
}
  1. 循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现;如果不加括号,则while语句的范围只到while后面第一个分号处。

  1. 不要忽略给i和sum赋初值(这是未进行累加前的初始情况),否则它们的值是不可预测的,结果显然不正确。

  1. 在循环体中应有使循环趋向于结束的语句,如果无此语句,则i的值始终不变,循环永远不结束。

用do...while语句实现循环(先执行,再检查)

C语言还提供了do...while语句来实现循环结构。

如:

int i=1;    //设变量i初值为1
do        //循环结构开始
    {
        printf("%d",i++);    //循环体,输出i的值,然后使i加1
    }
while(i<=100);    //当i小于或等于100时,继续执行循环体

它的作用是

执行(用do表示“做”)printf语句,然后在while后面的括号内的表达式中检查i的值,当i小于或等于100时,就返回再执行一次循环体(printf语句),直到i大于100为止。

printf函数中的输出项i++的作用:先输出当前i的值,然后再使i的值加1,如果改为printf("%d",++i),则是先使i的值加1,然后输出i的新值;若在执行printf函数之前i的值为1,则printf函数的输出是i的新值2.

为了使程序清晰、易读、建议把循环体用花括号括起来;

do...while语句的执行过程是:

先执行循环体,然后再检查条件是否成立,若成立,再执行循环体,这是与while不同的。

do...while语句的特点:

先无条件地执行循环体,然后判断循环条件是否成立。

do...while语句地一般形式

do

语句

while (表达式);

其中地“语句”就是循环体,先执行一次指定地循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0(“假”)为止,此刻循环结束。

例如:

#include<stdio.h>
int main()
{
int i=1,sum=0;
do
{
sum=sum+i;
i++;
}
while(i<=100);
printf("sum=%d\n",sum);
return 0;
}

当while后面的表达式的第一次的值为”真“时,两种循环得到的结果相同;否则,二者结果不相同(指二者具有相同的循环体的情况)。

用for语句实现循环

除了可以用while和do...while语句实现循环外,C语言还可以用for语句实现循环,for语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,完全可以代替while语句。

for (i=1;i<=100;i++)    //控制循环次数,由i变到100,共循环100次
    printf("%d",i);        //执行循环体,输出i的当前值

for语句的一般形式为:

for(表达式1;表达式2;表达式3)

语句

括号中3个表达式的主要作用

表达式1:设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值。

表达式2:是循环条件表达式,用来判断是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环。

表达式3:作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的。

最常用的for语句形式是:

for(循环变量赋初值;循环条件;循环变量增值)

语句

例如:

for(i=0;i<=100;i++)
    sum=sun+i;

for语句的执行过程

  1. 求解表达式1,本例把整数1赋给变量i。

  1. 求解表达式2,若此条件表达式的值为真(非0),则执行for语句中的循环体,然后执行第3步;若条件为假(0),则结束循环,转到第5步。

  1. 求解表达式3,本例执行i++,使i的值加1,i的值变成2。

  1. 转回第2步继续执行。

  1. 在执行完循环体后,循环变量的值“超过”循环终值,循环结束,执行for语句下面的一个语句。

用for语句简单、方便。

  1. for语句的一般形式如下:

  1. for(表达式1;表达式2;表达式3)语句

改写为while循环的形式:

表达式1;

while 表达式2

{

语句

表达式3

}

二者无条件等价

  1. "表达式1"可以省略,即不设置初值,但表达式1后的分号不能省略:

for(;i<=100;i++) sum=sum+i;    //for语句中没有表达式1
  1. 为了能正常执行循环,应在for语句之前给循环变量赋以初值:

i=1;        //对循环变量i赋初值
for(;i<=100;i++) sum=sum+i;    //for语句中没有表达式1
  1. 表达式2也可以省略,即不用表达式2来作为循环条件表达式,不设置和检查 循环的条件:

for(i=1;;i++) sum=sum+i;
  1. 此时循环无终止地进行下去,也就是认为表达式2始终为真;相当于:

i=1;
while(1)
{
sum=sum+i;
i++;
}
  1. 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束:

  1. 例如:

for(i=1;i<=100;)    //没有表达式3
{
sum=sum+i;
i++;                //这时可以在循环体中使循环变量增值
}

i++的操作不放在表达式3的位置,而作为循环体的一部分,效果也是一样的,都能使循环正常结束;如果在循环体中无此”i++;“语句,则循环体无止境地执行下去。

  1. 如果表达式1和表达式3都没有,只有表达式2,即只给循环条件,应当在for语句前给循环变量赋初值,否则循环无法正常执行:

  1. 例如:

i=1;        //给循环变量赋初值
for(;i<=100;)    //没有表达式1和表达式3,只有表达式2
{
sum=sum+i;
i++;        在循环体中使循环变量增值
}
  1. 相当于:

i=1;
while(i<=100)
{
sum=sum+i;
i++;
}

for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等

  1. 当然也可以3个表达式都省略:

  1. 例如:

for(;;) printf("%d\n",i);

相当于:

while(1) printf("%d\n",i);

即不设初值,不判断条件(认为表达式2为真值),循环变量也不增值,无终止地执行循环体语句,显然这是没有实用价值的。

  1. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式:

for(sum=0;i<=100;i++)sum=sum+i;

表达式3也可以是与循环控制无关的任意表达式,无论怎么写for语句,都必须使循环能正常执行。

  1. 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,既包含一个以上的简单表达式,中间用逗号间隔:

for(sum=0,i=1;i<=100;i++) sum=sum+i;
或
for(i=0,j=100;i<=j;i++,j--) k=i+j;

在逗号表达式内按自左向右顺序求解,整个逗号表达式的值为最右边的表达式的值。

  1. 表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b && x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环;把本来要在循环体内处理的内容放在表达式3中作用是一样的,for语句可以在表达式中完成本来应该在循环体内完成的操作;

  1. C99允许在for语句的”表达式1“中定义变量并赋初值: 过分地利用这一特点会使for语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中。

for(int i=1;i<=100;i++)    //定义循环变量i,同时赋初值1
sum=sum+i;

循环的嵌套

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套;内嵌的循环中还可以嵌套循环,这就是多层循环。

三种循环(while循环、do...while循环、for循环)可以相互嵌套

while()
{
...
while()    //内层循环
{...}
}
do
{...
do        //内层循环
{...
}
while()
}
while()
for(;;)
{
for(;;)    //内层循环
{...}
}
while()
{...
do        //内层循环
{...}
while();
}
for(;;)
{...
while()    //内层循环
{...}
}
do
{...
for(;;)       内层循环
{...}
}while();

几种循环的比较

for语句的功能强大,凡用while循环能完成的,用for循环都能实现,三种循环(while循环、do...while循环、for循环)都可以用break语句跳出循环,用continue语句结束本次循环。

改变循环执行的状态

可以用break语句和continue语句来实现提前结束循环。

用break语句提前终止循环

用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句;break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。

#define SUM 10000 //指定符号常量SUM代表100000

break语句的一般形式为

break;

其作用是使流程跳转到循环体之外,接着执行循环体下面的语句。break语句只能用于循环语句和switch语句之中,不能单独使用。

用continue语句提前结束本次循环

提前结束本次循环,而接着执行下次循环,这时可用到continue语句。

执行continue语句,流程跳转到表示循环体结束的右花括号的前面,结束本次循环,然后进行循环变量的增值(n++),只要n<=200,就会接着执行下一次循环,如果n不能被3整除,就不会执行continue语句而执行printf函数语句,输出不能被3整除的整数。

continue语句的一般形式

continue;

作用:

结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行for语句中的”表达式3“,然后进行下一次是否执行循环的判定。

break语句和continue语句的区别

continue语句只结束本次循环,而不终止整个循环的执行;break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。

循环程序举例

abs(x)函数,求整数x的绝对值,结果是整型;

fabs(x)函数,x是双精度数,得到的结果是双精度型,在用数学函数时,要在本文件模块的开头加预处理指令:#include<math.h>。

#include<stdio.h>
#include<math.h>
int main()
{
int sign=1;        //用来表示数值的符号
double pi=0.0,n=1.0,term=1.0;    //n代表分母
while(fabs(term)>=1e-6)        //检查当前项term的绝对值是否大于或等于10**-6
{
pi=pi+term;            //把当前项term累加到pi中
n=n+2;                //n+2是下一项的分母
sign=-sign;        //sign代表符号,下一项的符号与上一项符号相反
term=sign/n;       //求出下一项的值term
}
pi=pi*4;        //多项式的和✖4
printf("pi=%10.8f\n",pi);    //输出pi的值
return 0;
}

sqrt()是求平方跟的函数,它要求参数为双精度数,在执行时会自动将整数n转换为双精度数。求出的函数值也是双精度数,再把它赋给整型变量,系统会自动将小数部分舍弃,只把整数部分赋给整型变量。

内嵌的if语句不能写成:

if(c>'Z'||c>'z') c=c-26;

因为所有小写字母都满足”c>'Z'“条件,必须限制其范围为”c >= 'A' && c <='Z'“,即原字母为'W'~'Z',在此范围以外的不是大写字母'W'~'Z',不应按此规律转换。

求Fibonacci数列的前40个数:

#include<stdio.h>
int main(){
int f1=1,f2=1,f3;
int i;
printf("%12d\n%12d\n",f1,f2);
for(i=1;i<=38;i++){
f3=f1+f2;
printf("%12d\n",f3);
f1=f2;
f2=f3;
}
return 0;
}
#include<stdio.h>
int main(){
int f1=1,f2=1;
int i;
for(i=1;i<=20;i++){        //每个循环输出2个月的数据,循环20此即可
printf("%12d\n%12d\n",f1,f2);    //输出已知的两个月的兔子数
if(i%2==0) printf("\n");
f1=f1+f2;        //计算出下一个月的兔子数,并存放在f1中
f2=f2+f1;        //计算出下两个月的兔子数,并存放在f2中
}
return 0;
}
#输入一个大于3的整数n,判定它是否为素数
#include<stdio.h>
int main(){
int n,i;
printf("please enter a integer number,n=?");
scanf("%d",&n);
for(i=2;i<n;i++)
if(n%i==0) break;
if(i<n) printf("%d is not a prime number.\n",n);
else printf("%d is a prime number.\n",n);
return 0;
}
#输入一个大于3的整数n,判定它是否为素数
#include<stdio.h>
#include<math.h>
int main(){
int n,i,k;
printf("please enter a integer number,n=?");
scanf("%d",&n);
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i<=k) printf("%d is not a prime number.\n",n);
else printf("%d is a prime number.\n",n);
return 0;
}
//求100~200的全部素数
#include<stdio.h>
#include<math.h>
int main(){
int n,k,i,m=0;
for(n=101;n<=200;n=n+2){//从100到200对每个n进行判定
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;//如果n被整除终止内循环,此时i<k+1
if(i>=k+1)//若i>=k+1,表示n未曾被整除
{
printf("%d ",n);//应确定n是素数
m=m+1;//m用来控制换行,一行内输出10个素数
}
if(m%10==0) printf("\n");//m累计到10的倍数,换行
}
printf("\n");
return 0;
}

以上就是C语言循环结构的一些小知识,还有很多不足之处,还望各位多多指导!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值