第四章 循环结构

第四章 循环结构

while语句

while(表达式)                        //表达式为真循环执行,为假循环终止
{
    循环体语句;
}

格雷戈里公式求π的近似值

用格雷戈里公式求π的近似值.精度eps,精确到最后一项得绝对值小于定精度eps

在这里插入图片描述

#include<stdio.h>
#include<math.h>                      //运用到数学函数,绝对值fabs( )
int main()
{
    int denominator,flag,i;           //有式子得,分母、正负号、项数、精度、项、和
    double eps,item,pi;
    scanf("%lf",&eps);               
    i=1;                             //循环初始化
    flag=1;
    denominator=1;
    item=1.0;
    pi=0;                            //累加值,初值为0
    while(fabs(item)>=eps)           //循环执行条件:项的绝对值大于定精度(精确到最后一项得绝对值小于定精度eps)
    {                                //执行条件是运用while语句的关键
        pi=pi+item;
        i++;
        flag=-flag;
        denominator=denominator+2;
        item=flag*1.0/denominator;  //item值计算得
    }
    pi=pi+item;                      //最后一项得出后,没有进行循环语句中的累加
    pi=pi*4;                            //公式π/4=pi
    printf("pi=%.4f\n",pi);
    printf("i=%d\n",i);
    return 0;
}

在这里插入图片描述

*重点:多个变量的确定、运行条件fabs(item)>=eps 、循环顺序以及对其的补充pi=pi+item;

多次输入数据

统计一批学生的平均成绩与不及格人数

scanf("%lf",&score);          //*对第一输入数据执行程序
while(score>=0)               //输入多个成绩,成绩为非负数,得运行条件
{
    total=total+score;        //total,总和
    num++;                    //num,个数
    if(score<60)
    {
        count++;
    }
    scanf("%if",&score);     //*读入一个新数据,为下个循环做准备
}
if(num!=0){}                 //求平均数,average=total/num,分母num不能为0,故分支
else{}
return 0;

*重点:两个scanf()、循环运行条件score>=0

与for语句比较

*while构成简单,一个表达式和一条循环体语句

*转化

for(表达式1;表达式2;表达式3)       //     表达式1;
{                               //     while(表达式2)
  循环体语句;                    //     {    for循环体语句;
}                               //           表达式3;
                                //      }

*择优

题目指定循环次数则用for语句;由某一项的值来控制循环则用while语句

do-while语句

do
{
    循环体语句;
}
while(表达式);        //注意要加‘;’

*for和while是循环前先判断条件,为真才进行。

do-while语句是先执行循环体,后判断循环条件,故循环至少进行一次

*小程序:统计位数

t_number=number;
if(number<0)                       //解决正负数据  ,用省略else的if语句
{
    t_number=-t_number;            // t_number:为保护输入数据number不该变,代替number执行下面的执行程序     
}
do{
    count++;                       
    t_number=t_number/10;          //位数用/10,重新赋值t-number
}while(t_number!=0);               //判断循环条件

*小程序:逆序输出一个正整数

do{
    printf("%d ",number%10);       //直接取余,输出最后一位
    number=number/10;              //除10,消末位
}while(number!=0);

break语句

break语句的作用:为真,强制循环结束。除循环,还可用于switch语句,即只用于两个

continue语句:为真,跳过后面语句继续下一个循环。只能用于循环,一个

判断素数

#include<stdio.h>
#include<math.h>
int main()
{
    int i,limit,m;               //素数,确定范围
    scanf("%d",&m);              //分类讨论
    if(m<=1)                     //不可能是;一定是;可能是(进行判断条件)
    {
        printf("no!\n");
    }
    else if(m==2)
    {
        printf("yes!\n");
    }
    else
    {
        limit=sqrt(m)+1;
        for(i=2;i<=limit;i++)     //进行循环条件是i<=limit
        {
            if(m%i==0){break;}    //正常结束循环是i>limit
        }
        if(i>limit)       { printf("yes!\n");}
        else              { printf("no!\n"); }
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

进阶版,求m到n之间的全部素数

自测

#include<stdio.h>
#include<math.h>
int main()
{
    int i,k,limit,flag,m,n,count;
    scanf("%d%d",&m,&n);                                   //漏打函数scanf(),无法输入
    if(m<1||n>500||m>n){   printf("Invalid.\n") ;    }
    else
    {
       for(k=m;k<=n;k++)
       {
        if(k<=1)      {   flag=0;  }
        else if (k==2){   flag=1;  }
        else
        {
            flag=1;                    //先假设k为素数
            limit=sqrt(k)+1;
            for(i=2;i<=limit;i++)
            {
                if(k%i==0)              //素数条件,写反了
                { flag=0; 
                  break;                //漏打break语句,运行时间变长     
                }
            }
        }
        if(flag==1)                    //不知道在哪里进行flag取值判断结果     通过flag取值,对外循环进行的k进行结果表示
        {
            printf("%6d",k);           
            count++;
            if(count%10==0){    printf("\n");   }
        }
       }
    }
    return 0;
}

在这里插入图片描述

*flag表示是否为素数

求1!+2!+…+n!

方法1:定义和调用函数

#include<stdio.h>
double fact(int n);                      //定义和调用求阶层函数fact(),有“;”
int main()
{
    int i,n;                             //
    double sum;                          //
    scanf("%d",&n);
    sum=0;
    for(i=1;i<=n;i++)                    
    {
        sum=sum+fact(i);
    }
    printf("1!+2!+...+%d!=%.0f\n",n,sum);
    return 0;
}
double fact(int n)                     //定义函数,注意格式
{
    int i;
    double result;
    if(n<0)                            //分类情况
    {
        return 0;
    }
    result=1;
    for(i=1;i<=n;i++)
    {
        result=result*i;
    }
    return result;                     //返回所需值,result
}

在这里插入图片描述

带程序除了可以通过调用函数实现,也可通过,嵌套循环实现。

方法2:嵌套循环

sum=0;                     //sum和item的数值初始化不要放错位置
for(i=1;i<=n;i++)          //区别i与j  数!i=数  有1到n个  表示阶乘的个数
{
    item=1;                //item放在这表示每一次进入内循环,item的值重新为1
    for(j=1;j<=i;j++)      //	求阶乘    i!=1*2*3*...*i  表达阶乘的单个值
    {
        item=item*j;
    }
    sum=sum+item;
}

循环结构程序设计

求最值问题

//从输入的n个成绩中选出最高分,用for语句
int i,n,mark,max;
scanf("%d",&n);
scanf("%d",&mark);
max=mark;                         //先将第一输入的分数赋值给max
for(i=i;i<n;i++)
{
    scanf("%d",&mark);
    if(mark>max)                  //通过比较,之后输入的mark和当前的max,确定是否重新赋值max
    {
        max=mark;
    }
}
printf("Max is %d\n",max);

//从输入的一批以负数结束的成绩中选出最高分,用while语句

while的执行循环条件是mark>=0

斐波那契数列

1,1,2,3,5,8,… ,n

运用迭代法——一个不断从变量的旧值递推新值的过程

//输入正整数n(1<=n<=46),输出前n项
#include<stdio.h>
int main()
{
    int i;n;x1;x2;x;
    scanf("%d",&n);                          //n确定个数
    if(n<1||n>46){   printf("Invalid.\n")}   //范围确定
    else if(n==1){   printf("%10d",1)}       //%10d 输出格式:在输出值前有10个空格
    else
    {
        x1=1;
        x2=1;
        printf("%10d%10d",x1,x2); 
        for(i=3;i<=n;i++)                      //从第三个数开始进行循环
        {
            x=x1+x2;                           //得到新值
            printf("%10d",x);                  //将新值输出
            if(i==5){       printf("\n");    } //要求5个换行
            x1=x2;                             //更新x1和x2
            x2=x;
        }
    }
    return 0;
}

习题解惑

++i:先加后赋值

i++:先赋值后加

do-while语句结束循环,2种,break和条件表达式为假(0)

求序列和 s=1+12+123+1234+12345

int i,s=0,t=0;                //变量 t 用于存放其表达式的各项
for(i=1;i<=5;i++)
{
   t=10*t+i;                  //关键步:t=t*10+i
   s=s+t;                     //由于 i =1时,要使得 t =1; i =2时,要使得 t =12; i =3时,要使得 t =123;依此类推。
}                             //故每一次循环的 t 的值与此次的 i 及上次的 t 密切相关
printf("%d",s);               //即每一次的 t 值可用上次的 t 乘以10再加上此次的 i 的值代替
int i,s=0,t=0;                //变量 t 用于存放其表达式的各项
for(i=1;i<=5;i++)
{
   t=10*t+i;                  //关键步:t=t*10+i
   s=s+t;                     //由于 i =1时,要使得 t =1; i =2时,要使得 t =12; i =3时,要使得 t =123;依此类推。
}                             //故每一次循环的 t 的值与此次的 i 及上次的 t 密切相关
printf("%d",s);               //即每一次的 t 值可用上次的 t 乘以10再加上此次的 i 的值代替
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值