zoukankan      html  css  js  c++  java
  • C语言程序设计笔记3循环结构

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

    例4-1  用格雷戈里公式求给定精度的π值。使用格雷戈里公式求π的近似值,要求精确到最后一项的绝对值小于给定精度eps。

    =1--+-+…

    #include<stdio.h>

    #include<math.h>

    int main(void)

    {

          int denominator,flag,i;

          double eps,item,pi;

          printf("Enter eps:");

          scanf("%lf",&eps);

          i=1;

          flag=1;

          denominator=1;

          item=1.0;

          pi=0;

          while(fabs(item)>=eps)

          {

               pi=pi+item;

               i++;

               flag=-flag;

               denominator=denominator+2;

               item=flag*1.0/denominator;

          }

          pi=pi+item;

          pi=pi*4;

          printf("pi=%.4f\n",pi);

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

          return 0;

    }

     例4-2  统计一批学生的平均成绩与不及格人数。更改例3-3。从键盘输入一批学生的成绩,计算平均成绩,并统计不及格学生的人数。

    #include<stdio.h>

    int main(void)

    {

          int count,num;

          double score,total;

         

          num=0;

          total=0;

          count=0;

          printf("Enter scores:");

          scanf("%lf",&score);

          while(score>=0)

          {

               total=total+score;

               num++;

               if(score<60)

               {

                     count++;

               }

               scanf("%lf",&score);

          }

          if(num!=0)

          {

               printf("Average is %.2f\n",total/num);

               printf("Number of failures is %d\n",count);

          }

          else

          {

               printf("Average is 0\n");

          }

         

          return 0;

    }

    例4-3  统计一个整数的位数。从键盘读入一个整数,统计该数的位数。例如,输入12345,输出5;输入-99,输出2;输入0,输出1。

    #include<stdio.h>

    int main(void)

    {

          int count,number,t_number;

         

          count=0;

          printf("Enter a number:");

          scanf("%d",&number);

          t_number=number;

          if(number<0)

          {

               t_number=-t_number;

          }

          do{

               count++;

               t_number=t_number/10;

          }while(t_number!=0);

          printf("It contains %d digits.\n",count);

         

          return 0;

    }

    例4-4  逆序输出一个整数的各位数字。输入一个整数,将其逆序输出。例如,输入12345,输出54321.

    #include<stdio.h>

    int main(void)

    {

          int number;

         

          printf("Enter a number:");

          scanf("%d",&number);

          do{

               printf("%d ",number%10);

               number=number/10;

          }while(number!=0);

         

          return 0;

    }

    例4-5  判断一个整数是否为素数。输入一个正整数m,判断它是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。

    #include<stdio.h>

    #include<math.h>

    int main(void)

    {

          int i,limit,m;

         

          printf("Enter a number:");

          scanf("%d",&m);

          if(m<=1)

          {

               printf("No!\n");

          }

          else if(m==2)

          {

               printf("%d is a prime number!\n",m);

          }

          else

          {

               limit=sqrt(m)+1;

               for(i=2;i<=limit;i++)

               {

                     if(m%i==0)

                     {

                          break;

                     }

               }

               if(i>limit)

               {

                     printf("%d is a prime nuber!\n",m);

               }

               else

               {

                     printf("No!\n");

               }

          }

         

          return 0;

    }

    例4-6  猜数游戏。更改例3-1简单的猜数游戏。输入你所猜的整数(假定为1-100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜7次。

    #include<stdio.h>

    #include<stdlib.h>

    #include<time.h>

    int main(void)

    {

          int count=0,flag,mynumber,yournumber;

         

          srand(time(0));

          mynumber=rand()%100+1;

          flag=0;

          while(count<7)

          {

               printf("Enter your number:");

               scanf("%d",&yournumber);

               count++;

               if(yournumber==mynumber)

               {

                     printf("Lucky you!\n");

                     flag=1;

                     break;

               }

               else if(yournumber>mynumber)

               {

                     printf("Too big\n");

               }

               else

               {

                     printf("Too small\n");

               }

          }

          if(flag==0)

          {

               printf("Game Over!\n");

          }

         

          return 0;

         

    }

    注:srand(time(0))是以当前时间,秒为单位,取种子,rand()以取的种子,产生随机数。实现每秒产生的随机数都不同的效果。

    例4-7  使用函数求阶乘和。输入一个正整数n(n<=16),计算1!+2!+3!+…+n!。要求定义和调用fact(n)计算n的阶乘,如果n是非负数,则该函数返回n的阶乘,否则返回0。

    //使用函数计算阶乘和

    #include<stdio.h>

    double fact(int n);

    int main(void)

    {

          int i,n;

          double sum;

          printf("Enter n:");

          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;

    }

    例4-8  求最值问题。输入一批学生的成绩,找出最高分。

    #include<stdio.h>

    int main(void)

    {

          /*

          int i,mark,max,n;

         

          printf("Enter n:");

          scanf("%d",&n);

          printf("Enter %d marks:",n);

          scanf("%d",&mark);

          max=mark;

          for(i=1;i<n;i++)

          {

               scanf("%d",&mark);

               if(max<mark)

               {

                     max=mark;

               }

          }

          printf("max=%d\n",max);*/

         

          int mark,max;

         

          printf("Enter marks:");

          scanf("%d",&mark);

          max=mark;

          while(mark>=0)

          {

               if(max<mark)

               {

                     max=mark;

               }

               scanf("%d",&mark);

          }

          printf("max=%d\n",max);

         

          return 0;

    }

    例4-9 斐波那契数列问题。输入正整数n(1<=n<=46),输出斐波那契数列的前n项:1,1,2,3,5,8,13,…,每行输出5个。斐波那契数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

    #include<stdio.h>

    int main(void)

    {

          int i,n,x1,x2,x;

         

          printf("Enter n:");

          scanf("%d",&n);

          if(n<1 || n>46)

          {

               printf("Invalid.\n");

          }

          else if(n==1)

          {

               printf("%10d",1);

          }

          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==0)

                     {

                          printf("\n");

                     }

                     x1=x2;

                     x2=x;

               }

          }

         

          return 0;

    }

    例4-10  素数问题。输入2个正整数m和n(1<=m<=n<=500),输出m到n之间的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。

    #include<stdio.h>

    #include<math.h>

    int main(void)

    {

          int count,i,k,flag,limit,m,n;

         

          printf("Enter m n:");

          scanf("%d%d",&m,&n);

          count=0;

          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;

                          limit=sqrt(k)+1;

                          for(i=2;i<=limit;i++)

                          {

                                if(k%i==0)

                                {

                                      flag=0;

                                      break;

                                }

                          }

                     }

                     if(flag==1)

                     {

                          printf("%6d",k);

                          count++;

                          if(count%10==0)

                          {

                                printf("\n");

                          }

                     }

               }

          }

         

          return 0;

    }

    例4-11  搬砖问题。已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块,问有哪些搬法。

    #include<stdio.h>

    int main(void)

    {

         

          int n,men,women,children,cnt;

         

          printf("Enter n:");

          scanf("%d",&n);

          cnt=0;

          /*

          for(men=0;men<=n;men++)

          {

               for(women=0;women<=n;women++)

               {

                     for(children=0;children<=n;children++)

                     {

                          if(men+children+women==n && men*3+women*2+children*0.5==n)

                          {

                                printf("men=%d,women=%d,children=%d\n",men,women,children);

                                cnt++;

                          }

                     }

               }

          }

          if(cnt==0)

          {

               printf("None\n");

          }*/

         

         

          int limit_m=n/3;

          int limit_n=n/2;

          cnt=0;

          for(men=0;men<=limit_m;men++)

          {

               for(women=0;women<=limit_n;women++)

               {

                     children=n-men-women;

                     if(men*3+women*2+children*0.5==n)

                     {

                          printf("men=%d,women=%d,children=%d\n",men,women,children);

                          cnt++;

                     }

               }

          }

         

          return 0;

         

    }

    例4-12  找零钱问题。有足够数量的5分、2分和1分的硬币,现在要用这些硬币来支付一笔小于1元的零钱money,问至少要用多少个硬币?输入零钱,输出硬币的总数量和相应面额的硬币数量。

    #include<stdio.h>

    int main(void)

    {

          int n1,n2,n5,money,flag=1;

         

          printf("Enter money:");

          scanf("%d",&money);

          for(n5=money/5;n5>=0&&flag==1;n5--)

          {

               for(n2=(money-n5*5)/2;n2>=0&&flag==1;n2--)

               {

                     for(n1=money-n5*5-n2*2;n1>=0&&flag==1;n1--)

                     {

                          if(n5*5+n2*2+n1==money)

                          {

                                printf("n5=%d,n2=%d,n1=%d,total=%d\n",n5,n2,n1,n5+n2+n1);

                                flag=0;

                          }

                     }

               }

          }

         

          return 0;

    }

    //贪心法

    参考资料

    C语言程序设计/何钦铭,颜晖主编.---4版.---北京:高等教育出版社,2020.9

  • 相关阅读:
    二级菜单实现
    Python监控日志中经常访问的ip
    Python判断一个数是否为小数
    Python-读写文件
    python-字典
    Python实现屏蔽敏感词
    Python生成随机密码
    Python-列表和元组
    Jmeter命令行参数
    启动Jmeter时遇到的几种错误
  • 原文地址:https://www.cnblogs.com/halflife/p/15524860.html
Copyright © 2011-2022 走看看