C語言程序設計第六次作業——循環結構(2)


(一)改錯題

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

錯誤原因:while后沒有加分號。
改正方法:在while后的括號后加上分號。
錯誤信息2:

錯誤原因:item = 1/n結果為整形。
改正方法:將item = 1/n改成item = 1.0/n。
錯誤信息3:

錯誤原因:while后面的循環條件錯誤。
改正方法:將while( item < eps)改成while( item >=eps).
錯誤信息4:

錯誤原因:輸入的eps為double型輸入用%f錯誤。
改正方法:將%f改成%lf,且將輸出中的%f改成%.6f來確保輸出結果為六位小數。
(二)學習總結
1.語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?
答:
while后括號中為循環條件,即當循環條件為真是循環執行,那么while(1)是,“1”代表為真,所以此時為無限循環。for( ; ; )后括號中的三個表達式作用分別為:一給判斷的值賦值,只執行一次;二判斷條件;三變量的的變化情況。當三個括號為空時,即次時為無限循環。
為保證此程序正常進行應加入判斷語句,並在后加入break。即當判斷語句為真實跳出此循環。
2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
(2)循環次數未知,但循環條件在進入循環時明確
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
針對上面三種情況,分別采用什么循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。
答:
(1)用for語句, 7-1求奇數分之一序列前n項和;7-3求奇數和。
(2)用while語句,7-2 猜數字游戲。
(3)用 do while 語句,7-3 求奇數和。

3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種循環語句實現,並說明你認為哪種形式更合適?
答:
循環次數未知,但循環條件在進入循環時明確,所以用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時,if的判斷語句為真,執行break跳出循環。
(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;
}

結果:

原因:當輸入n的值為2的倍數時,即此時的判斷語句為真,則執行continue語句,此時不執行s = s + n語句,而是進入下一次循環。
(三)實驗總結
1.求給定精度的簡單交錯序列部分和(10 分)
(1)題目
本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。
注意:循環條件的寫法
輸入格式:
輸入在一行中給出一個正實數eps。
輸出格式:
在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點后六位。題目保證計算結果不超過雙精度范圍。
輸入樣例1:
4E-2
輸出樣例1:
sum = 0.854457
輸入樣例2:
0.02
輸出樣例2:
sum = 0.826310
(2)流程圖

(3)源代碼

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

return 0;
}

(4)實驗分析
問題1:絕對值使用錯誤。
原因:忘記定義函數。
解決辦法:在程序開頭定義# include <math.h>。
(5)本題PTA提交列表

2.猜數字游戲
(1)題目
猜數字游戲是令游戲機隨機產生一個100以內的正整數,用戶輸入一個數對其進行猜測,需要你編寫程序自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程序。程序還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程序。如果在到達N次之前,用戶輸入了一個負數,也輸出“Game Over”,並結束程序。
輸入格式:
輸入第一行中給出兩個不超過100的正整數,分別是游戲機產生的隨機數、以及猜測的最大次數N。最后每行給出一個用戶的輸入,直到出現負數為止。
輸出格式:
在一行中輸出每次猜測相應的結果,直到輸出猜對的結果或“Game Over”則結束。
輸入樣例:
58 4
70
50
56
58
60
-2
輸出樣例:
Too big
Too small
Too small
Good Guess!
(2)流程圖

(3)源代碼

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

return 0; 
}

(4)實驗分析
沒有問題
(5)本題PTA提交列表

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

注意:第一個值為負的情況。Sum初值
輸入格式:
輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。
輸出格式:
在一行中輸出正整數序列中奇數的和。
輸入樣例:
8 7 4 3 70 5 6 101 -1
輸出樣例:
116
(2)流程圖

(3)源代碼

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

return 0;
}

(4)實驗分析
沒問題。
(5)本題PTA提交列表

(四)博客互評
http://www.cnblogs.com/dsy7777777/
http://www.cnblogs.com/hfh0420/
http://www.cnblogs.com/Reloaded/


免責聲明!

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



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