0.展示PTA總分
1.本章學習總結
1.1 學習內容總結
-
循環結構的使用:
- for循環結構:第一個是初始化,第二個是條件語句,第三個是自處理語句。 循環時第一個語句只使用一次,然后判斷是否滿足第二個語句,滿足則進入循環體。直到不滿足循環體再跳出。
-
while循環結構:先對while()括號內的條件進行判斷,若為真則進入循環,否則跳出循環。
-
do-while循環結構:先執行循環體中的表達式的內容,之后再進行循環條件的判斷,決定是否進行下一次的循環。
-
總結:
- while循環結構與do-while循環結構的區別:while和do-while的區別在於判斷條件的先后,即while是先判斷,程序有可能不進入循環;do-while是后判斷,就是說do-while無論是否滿足條件都只是會進行一次循環。因此,同樣的條件,兩種循環的輸出結過可能不同。
- for循環結構:第一個是初始化,第二個是條件語句,第三個是自處理語句。 循環時第一個語句只使用一次,然后判斷是否滿足第二個語句,滿足則進入循環體。直到不滿足循環體再跳出。
例如:不相同的情況:兩種的輸入值與循環條件相同,但是輸入的值不滿足循環條件,此時while不進入循環而do while會循環一次
如:
和
此時兩種循環是不同的。
相同的情況:兩種輸入值與循環條件相同,同時進入循環的值與】滿足循環條件,兩者就是相同的。
如:
和
此時兩種循環是相同的。
2. **for循環結構**與**while循環結構**的區別:再使用for語句時,for語句中的成分直接完成了對變量的初始化,條件的控制以及自處理語句,使程序可以直接進行;而while語句因為只有一個條件,因此需要在循環之前做好對變量的初始化等工作。但在執行起來,兩者並沒有很多區別。
-
循環語句的控制
- break:在執行循環語句時,break也起到控制循環的作用。當滿足執行break的條件時,break強制循環結束,不再執行循環體中break之后的內容,並直接跳出循環。一般來說,在循環語句中,我們會用if與break搭配,當條件滿足時,起到跳出循環的作用。(注意!!!在嵌套循環中,break之后只能跳出它所在的那一次循環,而不是全部)
- continue:與break不同,當執行到comtinue語句時,continue會跳過循環體中continue下面的語句,並結束本次循環,並進入下一次循環(注意!!!是只結束本次循環,而不是跳出循環!!!),在循環語句中,一般也是與 if搭配。
-
嵌套循環
- 顧名思義,嵌套循環就是在一個循環中包含着其他循環(也可以叫做外循環與內循環)。在使用嵌套循環時,我們需要保持自己的邏輯性,明確內外循環分別代表這什么,並控制好變量的初始化,循環的條件與結束,否則很容易出錯甚至會死循環。
例如這道分硬幣的題目:
只有首先明確了三個變量的初值(循環的開始),再一層層嵌套,最后利用if的判斷輸出結果。
- 顧名思義,嵌套循環就是在一個循環中包含着其他循環(也可以叫做外循環與內循環)。在使用嵌套循環時,我們需要保持自己的邏輯性,明確內外循環分別代表這什么,並控制好變量的初始化,循環的條件與結束,否則很容易出錯甚至會死循環。
1.2 本章學習體會
- 兩周下來,我們又學習了嵌套循環,函數以及一點數據類型。現在學習起來已經開始有點難度以及吃力了,學習C語言的時間也在加長,希望可以通過大量有效的練習來鞏固已經學習完的知識。
- 嵌套循環:嵌套循環涉及了多次循環,需要在代碼時有完整的邏輯。對於PTA中於龍的那道對日期合法性的判斷還是不是很明白,不知道要怎么利用利用循環取判斷日期的合法性。
- 函數的定義與使用:個人感覺函數的使用大幅減少了主函數的代碼量,但是我在寫程序時一旦需要定自己定義的函數如果過多,我就開始有點吃力了,個人感覺使用函數還是要多練習。
- 在這幾周的學習中,特別是經過了第一次的機房考試后,我才可以感受到:只有自己一句一句寫出來,經過調試和優化的代碼才能真正成為你自己的代碼,多與別人探討,多獨立思考,才能把學習到的知識真正變成自己的。從網上找的或是從同學那里參考的,或許短期之內會印象深刻,但是時間一長就會逐漸淡忘。你可以與同學討論,對比同學與自己的想法與思路,最后再考慮是根據自己的私利優化還是借鑒同學的思路,最后再自己寫出代碼。(個人認為:思路可以參考借鑒,但是代碼一定要自己寫!!!)。開學已經快兩個月了,但是直到現在,當寫出了代碼並全部正確時,心中還是會很高興和激動。希望在今后的學習中,我還可以保持這樣的狀態一直努力下去。
- 代碼量:
2.PTA實驗作業
2.1 PTA題目1
c03-單循環結構
7-9 龜兔賽跑 (20 分)
本題要求:在一行中輸出比賽的結果:烏龜贏輸出@_@,兔子贏輸出^_^,平局則輸出-_-;后跟1空格,再輸出勝利者跑完的距離。
2.1.1 偽代碼
#include<stdio.h>
int main()
{
定義烏龜跑的總距離 tortoiseSum;定義兔子跑的總距離 rabbitSum;定義時間T;定義rest用於判斷是否休息,rest=0時奔跑,rest=30時休息;定義i;time用於循環
輸入時間T。
令tortoiseSum = 0;rabbitSum = 0;rest = 0;
for time = 0 to T-1
{
tortoiseSum = tortoiseSum + 3;
if 時間為10的倍數time % 10 == 0 && rabbitSum兔子距離 > tortoiseSum烏龜距離&& 休息時間rest == 0
{
兔子休息時間加30;
}
if 休息時間等於0
{
兔子結束休息,開始奔跑rabbitSum = rabbitSum + 9;
}
else休息時間不為0
{
隨着時間過去,休息時間減少rest--;
}
end if
}
end for
if (烏龜跑的總距離 > 兔子跑的總距離)
{
輸出@_@ %d"和tortoiseSum
}
else if (烏龜跑的總距離 < 兔子跑的總距離)
{
輸出^_^ %d"和 rabbitSum
}
else
{
輸出-_- %d"和rabbitSum
}
end if
return 0;
}
2.1.2 代碼截圖
2.1.3 造測試數據
2.1.4 PTA提交列表及說明
說明:
1.部分正確:在第一次提交之后,出現部分錯誤:問題出現在循環結構中,第一次將第一個if和第二個if-else的位置寫反,導致進入的條件判斷先后出現問題,在time=10的倍數時,先判斷
此時的rest,在第一個10分鍾時休息時間本應加上30分鍾,之后開始遞減,但是此時因為位置寫反,沒有進行應該進行的遞減,導致答案出現錯誤。
2.全部正確:將兩個if的判斷語句調換之后,全部正確。
2.2 PTA題目2
c03-單循環結構
7-10 jmu-c-二進制轉10進制
輸入一組二進制字符,輸出其對應的十進制數。當輸入回車鍵時,輸入結束。若輸入非二進制字符,輸出error input!
2.2.1 偽代碼
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
定義一個字符串num[1000]來儲存輸入的二進制數 ;定義i,item;sum;a
令item = 0;sign = 1;sum = 0;
輸入數字
for i = 0 to num[i] > 0
{
if (num[i] != '0' && num[i] != '1')
{
item = 1;
輸出error input!
break;
}
end if
}
end for
計算字符串的長度
if item等於0
{
for i = a - 1 to 0
{
逐位計算每一位二級制數轉換的十進制數並累加sum = sum + sign * (num[i] - '0')
sign = sign * 2;
}
輸出sum
}
end if
return 0;
}
2.2.2 代碼截圖
2.2.3 造測試數據
2.2.4 PTA提交列表及說明
說明:
1.部分正確:第一次使用數組和循環,通過取余數來將輸入的數字一位一位取出來,並用數組來存儲分離出來的每一個數,對題目給的樣例也輸出了正確答案,但是提交后卻是部分正確,
之后調試發現,一旦輸入的二進制數超過了10位,數據就會溢出。因此嘗試把數組的定義改成long int。
2.部分正確:第一次改為long int之后提交仍然顯示部分正確。
3.在VS中經過多次調試發現數組仍會溢出,因此想到用字符串的形式來存儲數字字符,最終通過了所有測試點。
2.3 PTA題目3
c03-單循環結構
7-2 求冪級數展開的部分和
已知函數ex可以展開為冪級數1+x+x^2/2!+...+x^k/k!,現給定一個實數x,要求利用此冪級數部分和求ex 的近似值,求和一直繼續到最后一項的絕對值小於0.00001。
2.3.1 偽代碼
#include <stdio.h>
#include <math.h>
int main()
{
定義x, sum ,result,i
令sum,result=1.0
輸入x
int i;
for i = 1 to
{
后一項均為前一項再乘(x/i)result = result *(x/i);
累加sum += result;
if 出現一項的絕對值小於0.00001。
{
結束循環break;
}
end if
}
end for
輸出4位小數sum
return 0;
}
2.3.2 代碼截圖
2.3.3 造測試數據
2.3.4 PTA提交列表及說明
1.部分正確:一開始循環時將分子與分母都用pow函數進行計算,導致最后在程序在進行時運行超時了
2.全部正確:后來將循環過程中的pow函數計算改為根據前后項之間的聯系來進行累加,就不會出現超時,答案全部正確
3.代碼互評
3.1.1
7-10 任務06-02-02 於龍又又遇見日期,叕哭了!
同學代碼:
我的代碼:
兩段代碼的異同:
- 同:
- 都能實現題目的要求,對輸入的日期進行合法的判斷。
- 兩段代碼的總體思路上都是通過窮舉法,將輸入三個數據進行6種排列判斷。
- 異
- 很明顯,同學的代碼雖然也是窮舉法,但是很簡潔;而我的代碼明顯太長了。
- 同學的代碼主要使用函數來解決閏年等需要判斷的量;而我全篇采用if來判斷。
- 同學利用數組對6種排列方法進行輸出;而我是用if語句對每一項進行判斷,造成代碼過長。
總結:這道題在寫代碼時一開始沒有想的很多,就是利用if對6種情況判斷,所以程序分成了三塊類似的代碼來判斷,造成代碼的過於冗長;而看來同學的代碼后,我才發現同樣是窮舉法,但是同學巧妙的運用函數與數組,在達到目的的同時代碼量不到我的三分之一。我同樣也會數組,但是我在思考時沒有想到使用它,因此,這也是我要向同學學習的地方,如何運用自己已經掌握的知識,而不是停留在最初級的寫法。
3.1.2
7-10 jmu-c-二進制轉10進制
同學代碼:
我的代碼:
兩段代碼的異同:
- 同:
- 兩段代碼都能實現題目要求,將二進制轉為十進制。
- 都將數字用字符型的數據進行輸入,來達到目的。
- 都使用了字符轉數據的計算
- 異
- 同學的代碼采用的時單個字符的存儲;而我采用的是字符串的方式進行存儲。
- 同學用來轉進制的方式是在while循環中進行判斷,合理時一邊讀取字符,一邊進行計算轉換;而我是在判斷輸入的二進制數合理時,對字符串的長度進行計算,最后利用循環計算。
總結:在這道題上,我和同學的想法大同小異,都想到了用字符型數據進行輸入,主要區別就在單個字符的輸入與字符串的輸入以及代碼的寫法。個人認為兩段代碼都有自己的長處,可以互相學習,多多討論。