(一)改錯題
序列求和:輸入一個正實數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:
錯誤原因:第十七行的do while語句出現錯誤,在while()后缺少分號。
改正方法:在第十七行的while()后加分號。
改正后:
試運行:
錯誤信息2:
錯誤原因:第八行的輸入語句出現錯誤,eps是double類型的,定義輸入必須要用%lf表示。
改正方法:將第八行的%f改為%lf。
改正並試運行:
錯誤信息3:
錯誤原因:第十七行的while語句中的循環條件不滿足題意,while()中的括號里的item應該大於且eps。
改正方法: 將第十七行的<改為>=。
改正並試運行:
錯誤信息:
錯誤原因:item在定義中是double類型的,而n是整型變量,在第十三行中1/n的結果是整型變量的,因此需要對式子進行強制性轉換。
改正方法:將第十三行的item=1/n改為item=(double)1/n。
改正並運行后:
(二)學習總結
1.語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?
答:這兩種語句都表示無限循環;要保證這種循環正常執行需要將輸出放在循環外,並且需要在循環結構里加break以保證循環的停止。
2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
答:使用for語句。
題目說明:
一 ,
7-1 求奇數分之一序列前N項和
本題要求編寫程序,計算序列 1 + 1/3 + 1/5 + ... 的前N項之和。
二,
7-2 統計學生平均成績與及格人數
本題要求編寫程序,計算學生們的平均成績,並統計及格(成績不低於60分)的人數。題目保證輸入與輸出均在整型范圍內。
(2)循環次數未知,但循環條件在進入循環時明確
答:使用while語句。
題目說明:
一,
7-1 求給定精度的簡單交錯序列部分和
本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。
二,
7-2 猜數字游戲
猜數字游戲是令游戲機隨機產生一個100以內的正整數,用戶輸入一個數對其進行猜測,需要你編寫程序自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程序。程序還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程序。如果在到達N次之前,用戶輸入了一個負數,也輸出“Game Over”,並結束程序。
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
答:使用do while語句。
題目說明:
一,
7-3 求奇數和
本題要求計算給定的一系列正整數中奇數的和。
二,
7-6 掉入陷阱的數字
對任意一個自然數N
0
,先將其各位數字相加求和,再將其和乘以3后加上1,變成一個新自然數N
1
;然后對N
1
重復這種操作,可以產生新自然數N
2
;……多次重復這種操作,運算結果最終會得到一個固定不變的數N
k
,就像掉入一個數字“陷阱”。
本題要求對輸入的自然數,給出其掉入“陷阱”的過程。
針對上面三種情況,分別采用什么循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。
3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種循環語句實現,並說明你認為哪種形式更合適?
答:三種循環方式的比較:
for語句:for語句是一種C編程結構,它將一個由一條或多條語句組成的代碼塊執行特定的次數。它有時候也被稱為for
循環。
while語句:while語句也叫while循環,他不斷地執行一個語句塊,直到條件為假為止。
do 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)
原因 :第一個程序中for循環語句中的選擇結構中的判斷條件是當n%2=0時以break結尾,表示跳出循環,即循環結束;而第二個程序中的循環結構中的選擇結構中的判斷條件以continue結尾,表示循環繼續,繼續執行,直到條件不滿足循環條件,表達輸出為止。
(三)實驗總結
本次實驗總結,完成循環結構(2)中的1、2、3題。
格式如下:
1 求給定精度的簡單交錯序列部分和
(1)題目
本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。
(2)流程圖
(3)源代碼
include<stdio.h>
include<math.h>
int main()
{
int n;
double eps,sum,item;
scanf("%le",&eps);
sum=0;
n=1;
while(fabs(1.0/n)>eps)
{
item=1.0/n;
if(n%2 == 1)
{
sum=sum+item;
n=n+3;
}
else
{
sum=sum-item;
n=n+3;
}
}
if(n%2==1)
{
sum=sum+1.0/n;
}
else
{
sum=sum-1.0/n;
}
printf("sum = %.6lf",sum);
return 0;
}
(4)實驗分析
記錄實驗中遇到的問題及解決方法,格式如下:
問題:無
(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”,並結束程序。
(2)流程圖
(3)源代碼
include<stdio.h>
int main()
{
int M,N,L,i=0;
scanf("%d %d",&M,&N);
while(1)
{
scanf("%d",&L);
if(L<0)
{
break;
}
i++;
if(L<M)
{
printf("Too small\n");
}
else if(L>M)
{
printf("Too big\n");
}
else
{
break;
}
}
if(i>N||L<0)
{
printf("Game Over\n");
}
else if(i==1)
{
printf("Bingo!\n");
}
else if(i<=3&&i!=1)
{
printf("Lucky You!\n");
}
else
{
printf("Good Guess!\n");
}
return 0;
}
(4)實驗分析
問題1:
原因:沒有考慮猜中3次的情況。
解決辦法:將第三十七的i<3改為i<=3。
問題2:
原因:第三十九行的“Luck you”不符合題目要求。
解決辦法:將“Luck you”改為“Lucky you”。
(5)本題PTA提交列表
3 求奇數和
(1)題目
本題要求計算給定的一系列正整數中奇數的和。
(2)流程圖
(3)源代碼
include<stdio.h>
int main()
{
int a,Sum;
Sum=0;
do
{
scanf("%d",&a);
if(a%2!=0&&a>0)
{
Sum=Sum+a;
}
}
while(a>0);
printf("%d",Sum);
return 0;
}
(4)實驗分析
問題:無
(5)本題PTA提交列表
(四)博客互評
1.http://www.cnblogs.com/xing--/p/7844921.html
2.http://www.cnblogs.com/123456lxl/p/7854248.html
3.http://www.cnblogs.com/lsx123/p/7841763.html