(一)改錯題
輸出華氏攝氏溫度轉換表:輸入兩個整數lower和upper,輸出一張華氏攝氏溫度轉換表,華氏溫度的取值范圍是{lower,upper},每次增加2℉。計算公式如下:
c = 5×(f-32)/9
其中,c表示攝氏溫度,f表示華氏溫度。
輸入輸出樣例1:
Enter lower:32
Enter upper:35
fahr celsius
32 0.0
34 1.1
輸入輸出樣例2:
Enter lower:40
Enter upper:30
fahr celsius
源程序(有錯誤的程序)
#include <stdio.h>
int main(void)
{
int fahr , lower, upper; /* fahr表示華氏度 */
double celsius; /* celsius表示攝氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 顯示表頭 */
/* 溫度轉換 */
for (fahr = lower , fahr <= upper, fahr ++) ;
celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
return 0;
}
對源程序進行編譯,結果如下:
錯誤信息1:
錯誤原因:
for語句后面加了分號。
改正方法:
將分號去掉。
錯誤信息2:
錯誤原因:
for語句下沒有加“{}“
改正方法:
在for語句下加上“{}”
錯誤信息3:
錯誤原因:
發現for語句內語句用逗號隔開了。
改正方法:
將逗號改為分號。
編譯正確:
運行結果:
發現得不到先要的結果,繼續修改程序。
錯誤信息4:
錯誤原因:
題目要求是每次fahr的值加2,而源程序是加1.
改正方法:
把fahr++改為fahr=fahr+2。
運行結果:
發現運行結果還是不對,繼續檢查並修改程序。
錯誤信息5:
錯誤原因:
與題目中給出的攝氏度與華氏攝氏度的轉換不一致。
改正方法:
將celsius = 5 /9 * (fahr - 32.0)改為celsius = 5*(fahr-32.0)/9。
運行結果:
發現運行結果依然不正確,繼續尋找錯誤。
錯誤信息6:
錯誤原因:
在定義變量時,fahr被定義為整型變量,所以在輸出時不能寫%3.0f。
改正方法:
將%3.0f改為%3d。
運行結果1:
運行結果2:
滿足題目要求。
(二)學習總結
1.有如下程序:
#include <stdio.h>
int main()
{
int i,num,odd,even;
odd = 0;
even = 0;
for(i = 1; i <= 10;i++)
{
scanf("%d",&num);
if(num % 2 == 0)
{
even++;
}
else
{
odd++;
}
}
printf("%d %d",even,odd);
return 0;
}
詳細描述程序的執行過程,即說明程序的每一步是執行的哪條代碼,執行順序如何。循環需描述前兩次循環和最后一次循環的詳細執行過程。最后說明程序實現的功能是什么。
1.首先先定義三個整型常量,num,even,odd,分別表示輸入的值,偶數,奇數。
2.將奇數偶數賦初值為0。
3.開始執行循環體,i=1為真,進入循環。
4.輸入一個數,判斷該數和2求余是否為0。
5.若為0,則繼續執行even++,此時even=1。
6.若不為0,則執行odd++,則odd=1。
7.繼續執行循環體,此時i=2。
8.繼續輸入第二個數。
9.若第二個數和2求余等於0,則又執行even++。若第一個數和2求余也等於0,則此時的even=2,若不等於0,則even=1。
10.若第二個數和2求余不等於0,則執行odd++,若第一個數和2求余也不等於0,則此時odd=2,若等於0,則odd=1。
11.繼續執行,直到i=11時,不滿足i<=10。循環結束,輸出even和odd。
程序實現的功能是,在輸入的十個數中,判斷是奇數還是偶數,並且奇數有幾個,偶數有幾個。
2.增量運算符
(1)運行下面程序,結果是什么?增量運算符在單獨使用時,前綴和后綴形式有區別嗎?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
i++;
++j;
printf("i = %d\n",i);
printf("j = %d\n",j);
return 0;
}
運行結果:
增量運算符在單獨使用時,前綴和后綴形式沒有區別。但實際上增量運算符的前綴和后綴形式對計算還是有影響的。
(2)運行下面的程序,結果是什么?兩條輸出語句的執行過程是怎樣的?說明什么問題?這兩條輸出語句執行完后,i和j的值分別是多少?
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
printf("%d\n",i++);
printf("%d\n",++j);
return 0;
}
運行結果:
增量運算符作為表達式的一部分時,前綴形式和后綴形式執行過程是不一樣的。在該程序中,i=2,在輸出時,輸出i++,執行過程是,先輸出i的值,在執行i+1。而j=2,在輸出時,輸出++j,執行過程是,先執行j+1,在輸出賦值后j的值。所以在該程序中輸出結果是i=2,j=3。但實際上這兩條輸出語句執行完后i和j的值都是3。
3.有些循環語句后面有{},有些沒有,有些語句有縮進,運行下面的四個小程序,運行結果有什么不同?循環體的認定與縮格形式是否有關?與{}是否有關?那么,應該如何正確判斷一個循環語句中的循環體?下面的程序中,哪幾種格式是正確的縮進格式。
(1)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(2)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
運行結果:
(3)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
printf("\n");
}
return 0;
}
運行結果:
(4)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
}
printf("\n");
return 0;
}
運行結果:
在這四個程序中,前兩個程序是在證明在循環體的認定與縮格形式是否有關,由運行結果可知,兩個運行結果的格式完全相同,所以可知,循環體的認定與縮格形式沒有關系。
后兩個是在證明循環體的認定與“{}”是否有關,由運行結果可知,第三個程序,運行結果的格式是一排豎着的星號,而第四個程序,運行結果的格式是一排橫着的星號,二者產生區別的原因是,(3)程序中的換行語句也包括在了循環語句中,即在i<=5的范圍內,輸出一個星號就換一次行,直到循環結束。而(4)程序中換行語句在循環語句外面,即在i<=5的范圍內,輸出星號直到循環結束再換行。所以循環體的認定與“{}”是有關系的。
要正確判斷一個循環語句的循環體,要把想要循環的語句用“{}”括起來,在執行循環體時要分清輸出語句是在循環體內還是在循環體外。
在這四個程序中,第三個和第四個是正確的縮進格式。
4.對其他你認為需要進行總結的內容進行總結。
(1)for語句里的三個語句應該用分號隔開,而不是用逗號隔開。
(2)for語句下必須加大括號。
(3)循環結構比較復雜,總是寫着寫着代碼思緒就亂了,這就應該課下做好復習工作。
(三)實驗總結
本次實驗總結,學號末位數是單數的同學完成循環結構(1)中的1、3、5、7題,學號末位數是雙數的同學完成循環結構(1)中的2、4、6、8題。
-
求奇數分之一序列前N項和
(1)題目
本題要求編寫程序,計算序列 1 + 1/3 + 1/5 + ... 的前N項之和。
(2)流程圖
(3)源代碼include <stdio.h>
int main (void)
{
int N,i;
double sum;
scanf("%d",&N);
for(i=1,sum=0;i<=N;i++)
{
sum=sum+1.0/(2*i-1);
}
printf("sum = %.6f",sum);return 0;
}
(4)實驗分析
問題1:
在寫程序時,for語句里的i++寫成了i=i++。
原因:
沒有真正理解i++就代表了i=i+1。
解決辦法:
向同學詢問,改正錯誤。
(5)本題PTA提交列表
2.奇偶分家
(1)題目
給定N個正整數,請統計奇數和偶數各有多少個?
(2)流程圖
(3)源代碼
# include <stdio.h>
int main(void)
{
int i,N,number,j,o;
j=0;
o=0;
scanf("%d\n",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&number);
if(number%2==0)
o++;
else
j++;
}
printf("%d %d",j,o);
return 0;
}
(4)實驗分析
問題1:
編譯正確,但是運行錯誤。
原因:
沒有給j,o賦初值。
解決辦法:
將j,o賦初值,讓j=0,o=0。
(5)本題PTA提交列表
3.統計字符
(1)題目
本題要求編寫程序,輸入10個字符,統計其中英文字母、空格或回車、數字字符和其他字符的個數。
(2)流程圖
(3)源代碼
# include <stdio.h>
int main(void)
{
int letter = 0,blank = 0,digit = 0,other = 0,i;
char a;
for(i = 1;i <= 10;i++)
{
scanf("%c",&a);
if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
{
letter = letter + 1;
}
else if(a == '\n' || a == ' ')
{
blank = blank + 1;
}
else if(a >= '0' && a <= '9')
{
digit = digit + 1;
}
else
{
other = other + 1;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)實驗分析
問題:
因為該程序中a定義的是char類型的,不知道怎么表示字母,數字,空格還有回車。
原因:
對字符型數據應用不熟練。
解決辦法:
聽老師講解,修改程序。
(5)本題PTA提交列表
4.求交錯序列前N項和
(1)題目
本題要求編寫程序,計算交錯序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N項之和。
(2)流程圖
(3)源代碼
# include <stdio.h>
# include <math.h>
int main()
{
int N,i;
double sum;
sum=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
sum=sum+(i/(2.0*i-1))*pow(-1,i-1);
}
printf("%.3f",sum);
return 0;
}
(4)實驗分析
問題1:
輸不出想要的值。
原因:
因為該程序求的和是一加一減的,所以在計算過程中不會算。
解決辦法:
向同學詢問,並聽老師講解,修改程序。
(5)本題PTA提交列表
(四)博客互評
每個同學至少評論三篇其他同學的博客作業,依次列出你所評論的博客地址。對於同學對你的博客作業提出的問題,應積極進行回答,存在的錯誤應及時改正。希望大家能夠在互評的過程中取長補短,共同進步。
1.http://www.cnblogs.com/wlm312/p/7812154.html
王麗敏同學,在改錯題中,哪里錯了,還做出了標記,讓人一目了然。提交列表中犯的錯也比較少,整體值得學習。
2.http://www.cnblogs.com/myg123/p/7802056.html
整體上,馬陽光同學作業內容整齊,給人很清晰的感覺。然后在改錯題中,錯誤的部分也做出了標記,讓人知道錯在哪。
但是,她的代碼沒有用正確的markdown格式寫,希望能夠改正。
在第三大題實驗總結部分,如果源代碼也用markdown格式寫會更好。
整體還是值得學習的。
3.http://www.cnblogs.com/tengwenqing/p/7811860.html
滕文清同學,在做的流程圖下邊還給出了運行結果,給人清晰的感覺,這一點是值得我學習的。她的PTA提交列表錯誤也很少,縱觀整個作業是值得我學習的。