C語言程序設計第六次作業


 

(一)改錯題
序列求和:輸入一個正實數eps,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精確到最后一項的絕對值小於eps(保留6位小數)。
  輸入輸出樣例:
  Input eps:1E-4
  s = 0.835699
  
源程序(有錯誤的程序)

 

  #include<stdio.h>

  int main()

  {

  int flag,n;

  double eps,item,s; 

  printf("Input eps: ");

  scanf("%f",&eps);

  flag = 1;
  s = 0;
  n = 1;
  do{
   item = 1/ n;
  s = s + flag * item; 
  flag = -flag;
  n = n + 3;
  }while( item < eps)
  printf( "s = %f\n",s);

  return 0;

  }

 

錯誤信息1:

錯誤原因1:while后沒加分號

改正方法1:加上分號

錯誤信息2:

錯誤原因2:n為整型變量,item為double型

改正方法2:將1改為1.0

錯誤信息3:

錯誤原因3:while中條件錯誤

改正方法3:改為item>=eps

錯誤信息4:

錯誤信息4:eps為double型

改正方法4:將%f改為%lf

運行成功!

(二)學習總結

1.語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?

while(1)表示無限循環,for(;;)for(;;)表示已知循環次數時用for語句。要想保證這種循環正常執行,需在程序中加入break終止循環。

2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
(2)循環次數未知,但循環條件在進入循環時明確
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
針對上面三種情況,分別采用什么循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。

當循環次數已知時,用for語句循環,當循環次數未知,但給出了循環條件結束時的條件時,用while語句循環,當循環體至少執行一次時,用do...while語句循環。

for語句:7-1 求給定精度的簡單交錯序列部分和 10

本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。

while語句:7-3 求奇數和 10

本題要求計算給定的一系列正整數中奇數的和。

輸入格式:

輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。

do...while語句:7-6 掉入陷阱的數字 20

對任意一個自然數N0​​,先將其各位數字相加求和,再將其和乘以3后加上1,變成一個新自然數N1​​;然后對N1​​重復這種操作,可以產生新自然數N2​​;……多次重復這種操作,運算結果最終會得到一個固定不變的數Nk​​,就像掉入一個數字“陷阱”。

本題要求對輸入的自然數,給出其掉入“陷阱”的過程。

3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種循環語句實現,並說明你認為哪種形式更合適?

for循環:

 

  #include <stdio.h>
  int main()
  {
  int x = 0,sum = 0,i = 0;
  float average = 0.0;
  for(;;)
  {
  scanf("%d",&x);
  if(x != -1)
   {
  sum = sum + x;
   i++;
   }
  else
   {
  break;
   }
   }
  average = sum/i;
  printf("%f",average);

  return 0;
  }

 

while循環:

 

  #include<stdio.h>
  #include<stdlib.h>
  int main()
  {
  int sum,x,i;
  double average;
  sum=0;
  i=0;
  while(1)
  {
  scanf("%d",&x);    
  if(x==-1)
  {
  printf("average=0.00");
  exit(0);
  }
   
  else
  {
  sum+=x;
   i++;       
  }
   
  }
  average=(double)sum/i;
  printf("%f",average);
  }

 

do while循環:

  #include<stdio.h>
  #include<stdlib.h>
  int main()
  {
  int sum,x,i;
  double average;
  sum=0;
  i=0;
  do
  {
  scanf("%d",&x);    
  if(n==-1)
  {
  printf("average=0.00");
  exit(0);
  }          
  else
  {
  sum+=x;
   i++;       
  }
   
  }while(1);
  average=(double)sum/i;
  printf("%f",average);
  }

 我認為用for更合適,因為for語句可以在表達式中實現循環變量的初始化,比較方便,用着順手。

4.運行下面程序,輸入1到10,結果分別是什么?為什么?
(1)

  #include<stdio.h>
  int main() {
  int n,s,i;
  s = 0;
  for(i = 1; i <= 10; i++)
  {
  scanf("%d",&n);    
  if(n % 2 == 0)
  break;     
  s = s + n;     
  }
  printf("s = %d\n",s);
  return 0;
  }

運行結果:

因為循環第一次執行是執行s=0+1=1,第二次執行if語句后break,結束循環,故輸出s=1。

(2)

  #include<stdio.h>
  int main() {
  int n,s,i;
  s = 0;
  for(i = 1; i <= 10; i++)

  { scanf("%d",&n);    
  if(n % 2 == 0)
  continue;      
  s = s + n;     
  }
  printf("s = %d\n",s);
  return 0;
  }

運行結果:

因為循環第一次執行s=1,循環第二次執行if語句后,因為有continue語句,故繼續執行,知道i>10結束,故將1到10所有的奇數求和。

break指結束循環,執行循環以為的語句,然而continue指循環本次循環。

(三)實驗總結

(1)本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。

(2)流程圖:

(3)源代碼

 

  #include<stdio.h>

  #include<math.h>
  int main()
  {   int m,n;
  double sum=0,eps,x;
  scanf("%lf", &eps);

   x=1.0;m=1;n=1;
   if(eps>=1)
   sum=1.0;
  else
  {
  while(fabs(x)>eps)
   {
  x=n*1.0/m;
  sum=sum+x;
  n=-n;
  m=m+3;

  }     
  }   
  printf("sum = %0.6lf\n",sum);
 
  return 0;
   }

(4)實驗分析

熟悉while,for,do while的使用,並清除什么時候用什么合適。

(5)pta提交

第二題:猜數字游戲
(1)令游戲機隨機產生一個100以內的正整數,用戶輸入一個數對其進行猜測,需要你編寫程序自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程序。程序還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程序。如果在到達N次之前,用戶輸入了一個負數,也輸出“Game Over”,並結束程序。

(3)源代碼

 

  #include<stdio.h>
  int main()
  {
  int x = 0,N = 0,i = 0,b = 0;
  scanf("%d%d",&x,&N);
  for(i = 1;i <= N;i++)
  {
  scanf("%d",&b);
  if(b < 0 )
  {
  printf("Game Over");
  break;
  }
  else if(b > x)
  {
  printf("Too big\n");
  }
  else if(b < x)
  {
  printf("Too small\n");
  }
  else if(x == b)
  {
  if(i == 1)
        {
  printf("Bingo!");
  break;
        }
        else if(i <= 3 && i > 1)
        {
  printf("Lucky You!");
  break;
        }
        else if(i > 3)
        {
  printf("Good Guess!");
  break;
        }
        break;
  }
  if(i >= N)
  {
  printf("Game Over");
  break;
  }
  }
  return 0;
  }

 

(4)實驗分析:

跳出if循環的話,要加break語句!

(5)pta提交

第三題:求奇數和
(1)題目:本題要求計算給定的一系列正整數中奇數的和。

(2)流程圖:

(3)源代碼:

 

  #include <stdio.h>
  int main()
  {
  int x,sum=0;
  while(1)
  {
  scanf("%d",&x);
  if(x<=0)
  {
  break;
  }
  if(x%2==1)
  {
  sum=sum+x;
  }

  }

  printf("%d",sum);
  return 0;
  }

(5)pta提交

(四)博客互評

http://www.cnblogs.com/wsd-lian/p/7860213.html

http://www.cnblogs.com/xing--/p/7844921.html

http://www.cnblogs.com/zy14122/p/7859463.html


免責聲明!

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



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