第五章循环结构程序设计

while 循环

例5.1 求1+2+3+…+100。

编写程序如下:

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

运行程序如下:

do···while循环

例5.2 求1+2+3+…+100。

编写程序如下:

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

运行程序如下:

例5.3 若要募集慈善基金10000元,有若干人捐款,每输入一个人的捐款数后,计算机就输出当时的捐款总和。当某一次输入捐款数后,总和达到或超过10000元时,即宣告结束,输出最后的累加值。

编写程序如下:

#include <stdio.h>
int main()
{
    float amount,sum=0;
    do
    {
        scanf("%f",&amount);
        sum=sum+amount;
    }while(sum<10000);
    printf("sum=%9.2f\n",sum);
    return 0;
}

运行程序如下:

for循环 

 例5.4 国王的小麦。相传古代印度国王舍罕要褒赏聪明能干的宰相达依尔(国际象棋的发明者),国王问他要什么?达依尔回答说: “国王只要在国际象棋的棋盘第1个格子中放1粒麦子,第2个格子中放2粒麦子,第3个格子中放4粒麦子,以后按此比例每一格加一倍,一直放到第64格(国际象棋的棋盘是8×8=64格),我感恩不尽,其他什么都不要了。”国王想:这有多少!还不容易!让人打来一袋小麦,但不到一会儿全用没了,再来一袋很快又用完了。结果全印度的粮食全部用完还不够。国王纳闷,怎样也算不清这笔账。现在用计算机来计算一下。

编写程序如下:

#include <stdio.h>
int main()
{
    double p=1,t=1,v;
    int i;
    for(i=1;i<64;i++)     //执行63次循环
    {
        p=p*2;            //p是当前一个格子中的小麦粒数
        t=t+p;            //t是当前麦子总数
    }
    v=t/1.42e8;           //v是总体积,单位为立方米
    printf("total=%e\n",t);//用指数形式输出麦子总粒数
    printf("volume=%e\n",v);//用指数形式输出麦子总体积
    return 0;
}

运行程序如下:

例5.5 人口增长预测。据2012年末统计,我国人口约为13.54亿人,如果人口的年增长率为1%,请计算到哪一年中国总人口超过15亿。
解题思路:计算人口增长和计算存款利息的公式是相同的。假设原来人口为p0,一年后的人口为p:

p=p0 X (1 +r)

其中r是年增长率。用此公式依次计算出每年的人口,每算出一年的人口后就检查一下是否达到或超过15亿。如果未达到或超过15亿,就再计算下一年的人口,直到某一年的人口达到或超过15亿为止。

编写程序如下:

#include <stdio.h>
int main()
{
    double p=1.354e9,r=0.01;
    int year;
    for(year=2012;p<1.5e9;year++)
    {
        p=p*(1+r);//赋值号两侧的变量p代表不同意义
    }
    printf("year=%d,p=%e\n",year-1,p);
    return 0;
}

运行程序如下:

 break语句:提前退出循环

例5.6 统计各班级的学生的平均成绩。已知各班人数不等,但都不超过30人。编一个程序能处理人数不等的各班学生的平均成绩。

编写程序如下:

#include <stdio.h>
int main()
{
    float score,sum=0,average;
    int i,n;
    for(i=1;i<31;i++)
    {
        scanf("%f",&score);
        if(score<0) break;//如果输入负值,则跳出循环
        sum=sum+score;//累加成绩
    }
    n=i-1;            //学生数为i-1
    average=sum/n;
    printf("n=%d,average=%7.2f\n",n,average);
    return 0;
}

运行程序如下:

break语句不能用于循环语句和switch语句之外的任何其他语句。 

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

例5.7 输人一个班全体学生的成绩,把不及格的学生成绩输出,并求及格学生的平均成绩。(这里只假设有5个学生的情况)

编写程序如下:

#include <stdio.h>
int main()
{
    float score,sum=0,average;
    int i,n=0;
    for(i=1;i<6;i++)
    {
        printf("please enter score:");
        scanf("%f",&score);
        if(score<60)
            {
                printf("Fail:%7.2f\n",score);
                continue;
            }
        sum=sum+score;
        n=n+1;//统计合格学生人数
    }
    average=sum/n;
    printf("\nn=%d,average=%7.2f\n",n,average);
    return 0;
}

运行程序如下:

 

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

循环的综合举例

例5.8 有一对兔子,出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问40个月的兔子总数为多少?(P146)

编写程序如下:

#include <stdio.h>
int main()
{
    long int f1,f2;
    int i;
    f1=1;f2=1;
    for(i=1;i<=20;i++)
    {
        printf("%12ld %12ld",f1,f2);
        if(i%2==0) printf("\n");
        f1=f1+f2;
        f2=f2+f1;
    }
    return 0;
}

运行程序如下: 

 

例5.9给一个整数m,判断它是否素数。

编写程序如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int m,i,k;
    printf("please enter a integer number:");
    scanf("%d",&m);
    k=(int)sqrt(m);//对m求平方根,再取整
    for(i=2;i<=k;i++)//i作为除数
        if(m%i==0) break;//m被i整除,m肯定不是素数
    if(i>k) printf("%d is a prime number.\n",m);
    else printf("%d is not a prime number.\n",m);
    return 0;
}

运行程序如下: 

例5.10 译密码。

为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母按上述规律转换,非字母字符不变。例如“China!”转换为“Glmre!”。
输人一行字符,要求输出其相应的密码。

编写程序如下:

#include <stdio.h>
int main()
{
    char c;
    while((c=getchar())!='\n')
    {
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))//判断c是否字母
        {
            c=c+4;
            if(c>'Z'&&c<='Z'+4||c>'z') c=c-26;//如在字母范围外就-26
        }
        printf("%c",c);
    }
    printf("\n");
    return 0;
}

运行程序如下: 

 

例5.11 while 和do…while循环的比较。
以下两个程序,循环体是相同的,程序(1)用while循环,程序(2)用do…while 循环。运行时,在有的情况下结果相同,而另一些情况下结果不同,请仔细分析。

编写程序如下:

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

int main()
{
    int sum=0,i;
    scanf("%d",&i);
    do
    {
        sum=sum+i;
        i++;
    }while(i<=10);
    printf("sum=%d\n",sum);
    return 0;
}

运行程序如下: 

while语句:

do···while语句:

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值