C語言程序設計第六次作業——循環結構(2)
阿新 • • 發佈:2017-11-19
但是 n-1 輸入輸出 printf 控制 運行 進行 定義 small
(一)改錯題
序列求和:輸入一個正實數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( item < eps)
改正方法:後加;
發現沒有錯誤,進行運算
2.錯誤信息:
錯誤原因:在定義時n為整型
改正方法:item = 1/ n;改為item = 1.0/ n;
3.錯誤信息:發現答案還是不對
錯誤原因:與題意不符合
while( item < eps)改為while( fabs(item) > eps)
4.答案正確
(二)學習總結
1.語句while(1)和for(;;)是什麽意思?,如何保證這種循環能正常執行?
語句while(1)是無限循環,一直在執行是無限循環。
for(;;)是有指定次數的循環。兩個都是循環結構
2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
(2)循環次數未知,但循環條件在進入循環時明確
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
針對上面三種情況,分別采用什麽循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。
第一個應該用for語句;第二個用while循環;第三個用do while循環
3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種循環語句實現,並說明你認為哪種形式更合適?
應該用while語句比較好
(1) for語句
#include <stdio.h> int main() { int s; double sum=0,average,n=0; { for(;1;) { scanf("%d",&s); if(s != -1) { sum=sum+s; n=n+1; } else { break; } } average=sum/n; printf("%lf",average); } }
(2)while語句
#include <stdio.h>
int main()
{
int s;
double sum=0,average,n=0;
{
while(1)
{
scanf("%d",&s);
if(s != -1)
{
sum=sum+s;
n=n+1;
}
else
{
break;
}
}
average=sum/n;
printf("%lf",average);
}
}
(3)do while語句
#include <stdio.h>
int main()
{
int s,i;
double sum=0,average,n=0;
scanf("%d",&i);
{
do
{
scanf("%d",&s);
if(s != -1)
{
sum=sum+s;
n=n+1;
}
else
{
break;
}
}while(n<i);
average=sum/n;
printf("%lf",average);
}
}
運行下面程序,輸入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>輸入1時不運行if語句,執行了s=s+n,<2>輸入2時運行if語句,break直接結束語句,所以s=1。
第二個程序用continue倆控制循環條件,他進行判斷後不會跳出而是直接進行下一個,並且把能整除2的數過濾掉,所以最後輸出的是25。
(三)實驗總結
1.(1)題目
求給定精度的簡單交錯序列部分和
(2)流程圖
(3)源代碼
#include <stdio.h>
int main(void)
{
double eps=0;
scanf("%lf",&eps);
int f=1,d=1;
double sum=0;
if(eps>=1)
{
printf("sum = 1.000000");
}
else
{
while((1.0/d)>=eps)
{
sum+=(1.0/d)*f;
f=-f;
d+=3;
}
printf("sum = %.6f",sum);
}
return 0;
}
(4)實驗分析
問題1:輸出的答案一直是1.0000
原因:對while的判斷條件不了解
解決辦法:分出兩種情況判斷一下。
(5)本題PTA提交列表
2.(1)(1)題目
猜數字遊戲
(2)流程圖
(3)源代碼
#include<stdio.h>
int main()
{
int key, n;
scanf("%d %d",&key,&n);
int i;
int m;
int flag = 0;
for (i = 1;i <= n;i ++)
{
scanf("%d",&m);
if (m < 0)
break;
if (m > key)
printf("Too big\n");
if (m < key)
printf("Too small\n");
if (m == key)
{
if (i == 1)
{
flag = 1;
printf("Bingo!\n");
break;
}
if (i == 2 || i == 3)
{
flag = 1;
printf("Lucky You!\n");
break;
}
if (i > 3)
{
flag = 1;
printf("Good Guess!\n");
break;
}
}
}
if (flag == 0)
printf("Game Over\n");
return 0;
}
(4)實驗分析
無問題
(5)本題PTA提交列表
3.(1)題目
猜數字遊戲
(2)流程圖
(3)源代碼
#include <stdio.h>
int main()
{
int n,s,sum;
sum=0;
scanf("%d",&s);
while(s > 0)
{
if(s%2!=0)
{
sum=sum+s;
}
scanf("%d",&s);
}
printf("%d",sum);
}
(4)實驗分析
問題1: 老是運行超時
原因:使用for循環
解決辦法:換成了while
(5)本題PTA提交列表
(四)博客互評
一只貓の磊?的博客:http://www.cnblogs.com/8426224ll/p/7847221.html
王映丹:http://www.cnblogs.com/windsky-1999/
姚慶虎:http://www.cnblogs.com/yaole10086/p/7851074.html
C語言程序設計第六次作業——循環結構(2)