C語言程式設計第六次作業——迴圈結構(2)

來源:互聯網
上載者:User

標籤:include   個數   負數   .com   代碼   差距   類型   原始碼   題目   

(一)改錯題

序列求和:輸入一個正實數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;}

錯誤資訊一:

錯誤原因:
while語句後面沒有加分號
解決辦法:
在while語句後面加上分號
錯誤資訊二:

錯誤原因:
迴圈條件設定錯誤
解決辦法:
while中的的迴圈條件改為
while( item >= eps)
錯誤資訊三:

錯誤原因:item = 1/ n 語句錯誤,這樣item只會等於整數,而題目給出了小數
解決辦法:將item = 1/ n改為item = 1.0/ n
錯誤資訊四:

計算結果與例題仍有差距
錯誤原因:eps和s在開始時都定義為了double類型函數,但使用時都用了%f。而這會損失精度,使結果出現誤差
解決辦法:%f改為%lf
最終正確

(二)學習總結
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:兩個都是無限迴圈。想要正常運行,就得保證能夠就結束迴圈,可以使用break跳出迴圈或者exit(0)直接結束程式。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
答:第(1)種是for語句最優。
舉例: 2017迴圈結構(1)7-1求奇數分之一序列前N項和

#include<stdio.h>int main(){   int n,i;    double sum;    scanf("%d",&n);    for(i = 1,sum = 0;i <= n;i=i+1)    {        sum = sum + 1.0 / (2*i-1);    }    printf("sum = %.6f",sum);    return 0;}

因為已知迴圈次數為輸入的,是已知的,所以用for迴圈最優。

第(2)種是用while語句最優。
舉例:2017迴圈結構(2)7-7 尋找250

#include<stdio.h>int main(){    int a,i=0;    a=0;    while(a < 250 || a>250)    {        scanf("%d",&a);        i=i+1;     }    printf("%d",i);    return 0; }

因為迴圈條件在進入迴圈時明確,就是要找250。

第(3)種是用do while語句最優。
舉例:2017迴圈結構(2)7-3 求奇數和

int main(){    int n = 0, sum = 0;    do    {        scanf("%d", &n);        if (n % 2 == 1)         sum += n;    }    while (n > 0);    printf("%d\n", sum);    return 0;}

因為迴圈次數未知,且迴圈條件在進入迴圈時未知,但可以在迴圈體中瞭解。

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

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

while語句

#include<stdio.h>int main(){int x,i=0,sum=0;double average; scanf("%d",&x);while(x >=0 ){sum = sum + x;i = i + 1;scanf("%d",&x);}average = (double)sum / i;printf("%lf",average);return 0;}    

do while語句

#include<stdio.h>int main(){    int x,i=0,sum=0;double average; scanf("%d",&x);do{    sum = sum + x;    i = i + 1;    scanf("%d",&x);}while(x >=0 ); average = (double)sum / i; printf("%lf",average); return 0;}

我覺得while語句更好一些,因為結束條件是明確的。

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;}    

(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;}

結果分別是
(1)
(2)
第(1)個當輸入1時,1%2=1,迴圈,輸入2時2%2=0break,跳出迴圈輸出s=1,結束程式。
第(2)個 continue就是當輸入偶數時不執行下一步s = s + n,單迴圈繼續,所以程式計算的是輸入的奇數的和。

(三)(實驗總結)

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

(3)原始碼

#include<stdio.h>#include<math.h>int main(){double eps,sum = 0.0,n = 1.0,a = 0.0;int i = 1;scanf("%lf",&eps);do    {        a = (1.0/i) * pow(-1,n+1);        sum = sum + a;        i = i + 3;        n++;    }while(fabs(a) > eps);printf("sum = %.6f",sum);return 0;}

(4)實驗分析
剛開始不太瞭解,do while語句,看到題後不知道如何控制迴圈結束。
(5)本題PTA提交列表

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

(3)原始碼

#include<stdio.h>int main(){int a = 0,N = 0,i = 0,b = 0;scanf("%d%d",&a,&N);for(i = 1;i <= N;i++){    scanf("%d",&b);    if(b < 0 )    {        printf("Game Over");        break;    }    else if(b > a)    {        printf("Too big\n");    }    else if(b < a)    {        printf("Too small\n");    }    else if(a == 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)實驗分析
每一步都不是很複雜,但是合起來看就感覺很複雜了,要把每一步都弄清楚。
(5)本題PTA提交列表

  1. (1) 求奇數和
    本題要求計算給定的一系列正整數中奇數的和。
    (2)流程圖

(3)原始碼

#include<stdio.h>#include<math.h>int main(){int sum=0,a;scanf("%d",&a);while(a>0){    if(a%2!=0)    {        sum = sum + a;    }    else    {        sum = sum + 0;    }    scanf("%d",&a); }printf("%d",sum);return 0; }

(5)本題PTA提交列表

(四) 部落格互評
http://www.cnblogs.com/moying456/p/7859207.html
http://www.cnblogs.com/he111923/p/7840814.html
http://www.cnblogs.com/ying-7/p/7857820.html

C語言程式設計第六次作業——迴圈結構(2)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.