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


1改錯題

(一)改錯題

序列求和:輸入一個正實數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”后加分號即可。
錯誤信息:

經過運行本人發現如上錯誤,經檢查得知
錯誤原因:定義“item”運算是由於其是double型所以應使結果未浮點型。
改正:把“1”改為“1.0”即可。
錯誤信息:本人繼續運行程序發現仍然是如上錯誤

錯誤:后來本人發現在輸入函數中定義類型有錯誤,不應該為“%f”
改正:應該改為"%lf"變為double型變量即可。
繼續運行結果領本人覺得不可思議,結果仍然如上:

之后發現錯誤:while語句內循環結束條件錯誤。
改正:將"<"改為">="即可。
改正后輸出結果如下:

與預期結果相符改錯完畢,此處附加改正的源程序:

#include<stdio.h>
int main()
{
    int flag,n;
    double eps,item,s;

    printf("Input eps: ");
    scanf("%lf",&eps);
    flag = 1;
    s = 0;
    n = 1;
    do{
        item = 1.0/ n;
        s = s + flag * item;  
        flag = -flag;
        n = n + 3;
    }while( item >= eps);
    printf( "s = %f\n",s);

    return 0;
}

2學習總結

1.語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?
此處while語句內條件代表循環條件,只要為非零數即可循環。所以里面只要是非零數即可,即無限循環語句,"for(;😉"語句表示循環語句為空,沒有循環條件,也表示無限循環;為保證這兩個程序正常運行就要在循環內加入循環條件並且配合"break"用來跳出循環。
2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
(2)循環次數未知,但循環條件在進入循環時明確
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
針對上面三種情況,分別采用什么循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。
在循環次數已知的情況下用for語句較好對應的題目有循環結構一中的統計字符問題——本題要求編寫程序,輸入10個字符,統計其中英文字母、空格或回車、數字字符和其他字符的個數。本題給定了循環次數,所以用for循環更好。
其次在循環次數未知的情況下但循環條件明確,應使用while語句——尋找250,對方不想和你說話,並向你扔了一串數…… 而你必須從這一串數字中找到“250”這個高大上的感人數字。本題只需要在while(1)的無限循環內給定循環判定條件以及break結束即可。
對於循環次數未知且循環條件進入循環未知應該使用do...while語句——爬動的蠕蟲,一條蠕蟲長1寸,在一口深為N寸的井的底部。已知蠕蟲每1分鍾可以向上爬U寸,但必須休息1分鍾才能接着往上爬。在休息的過程中,蠕蟲又下滑了D寸。就這樣,上爬和下滑重復進行。請問,蠕蟲需要多長時間才能爬出井?
本題需要先執行一次循環條件才可以計算爬行時間並讓答案正確。
3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句和無限循環四種循環語句實現,並說明你認為哪種形式更合適?
首先用for語句是對於確定的次數進行循環,此處無法運用for語句因為次數未知,但是可以使用“for語句的無限循環”也就是“for(;;)”,源程序如下:

#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
for(;;)
{
	scanf("%d",&grade);
if(grade!=-1)
{

	sum=sum+grade;

	i++;
}
else
{
	break;
}
}
    average=(double)sum/i;
     printf("%f",average);
return 0;
}

while語句的程序(對於未知次數的循環):

#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
while(grade!=-1)
{
	scanf("%d",&grade);

	sum=sum+grade;

	i++;

}
    average=(double)(sum+1)/(i-1);
     printf("%f",average);
    return 0;
}

此程序在不知道輸入數字為多少是(不給定-1時)無法使用。
do...while語句:

#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
    do
{
	scanf("%d",&grade);

	sum=sum+grade;

	i++;

}
   while(grade!=-1);
    average=(double)(sum+1)/(i-1);
     printf("%f",average);
    return 0;
}

無限循環語句:

#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
    while(1)
{
	scanf("%d",&grade);
if(grade!=-1)
{
	sum=sum+grade;
	i++;

}
    else
    {
	    break;
}
}
    average=(double)sum/i;
     printf("%f",average);
    return 0;
}

for語句的使用也只能是無限循環的形式,while與do...while語句在輸入的數字未知時無法使用,所以相比較而言使用無限循環更合適。
4.運行下面程序,輸入1到10,結果分別是什么?為什么?

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

結果如下:

因為循環控制語句“break”的作用,在判斷輸入數字與2求余時若不符合直接就控制語句結束跳出語句,導致在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;
}

運行結果如圖:

因為continue 語句只控制當前語句結束,在繼續進行程序運行,不會直接使程序結束,接下來輸入的數字繼續參與程序運行,兩個程序體現了兩個語句的區別,break語句,若條件第一次不符合直接結束程序,而continue語句只結束當前語句,接下來繼續參與程序運行,而不會直接結束語句。

3實驗總結

(1)求給定精度的簡單交錯序列部分和
1.流程圖:

2.源程序:

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

問題:do...while語句while括號內判斷條件錯誤,本應為循環條件。如圖:

解決方法:將判斷條件改為循環的條件即可,即fabs(m)>eps 。
提交列表:

(2)猜數字游戲
1.流程圖:


2.源程序:

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

    }
    printf("Game Over");

    return 0;
}

問題:當i初始值為1時,循環次數應該不大於本人設定的結束次數N,而最開始本人因范圍設定錯誤導致錯誤。
解決方法:把最初本人寫入的“i<N”改為“i<=N”即可。
錯誤:判斷條件句if時讓本人犯了一個低級錯誤,定義的猜的數字與隨機數相等時運算符使用錯誤,使用了賦值運算符導致結果錯誤。
解決方法:把“=”改為“==”即可。
提交列表:

(3)求奇數和
1.流程圖:

2.源程序:

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

本題運用了while語句的無限循環,運行過程中未出現較大問題。
提交列表:

4博客互評

以下是本人與三位同學的博客互評,相互學習借鑒。
李曉曉:http://www.cnblogs.com/Reloaded/p/7825734.html
許天笑:http://www.cnblogs.com/snxtx/p/7824427.html
任佳鵬:http://www.cnblogs.com/rjp123/p/7859004.html


免責聲明!

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



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