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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM