作者loveme00835 (最愛朴素妍)
看板C_and_CPP
標題Re: [問題] 程式的改寫
時間Thu Feb 10 17:01:22 2011
※ 引述《doggingg (doggingg)》之銘言:
: Please rewrite the code segment shown below in a "while" statement
: and a "for" statement in C++:
: total=0;
: do{
: cin>>grade;
: if(grade!=-1)
: total+=grade;
: }while(grade!=-1);
: 這題我的想法是: total=0;
: while(grade!=-1)
: {
: cin>>grade;
: total+=grade;
: }
: 不知道這樣有符合題目要求並且維持原意嗎?
先了解程式碼在做什麼, 寫出對應的 pseudocode
1.把總和初始化為0
2.輸入一個數字
3.假如輸入的數字不為 -1, 總和 = 總和 + 輸入的數字
4.重複 2~3 直到輸入的數字為 -1 為止
然後回來看你的程式碼:
total=0;
grade = 0; // 執行至此, 為了能讓程式至少有讀取數字的
// 動作一次, 你的 grade首先要用一個"非-1"
// 的整數來初始化才可以
while(grade!=-1)
{
cin>>grade;
if( grade != -1 ) // 假如輸入了一個 -1, total 的值將是 -1,
total+=grade;
// 然後迴圈結束, 這個結果是很怪異的, 你還
}
// 是需要 if 來避免這種情況發生
do-while 是至少執行一次的 while, 所以內容不用什麼改, 你要擔心的
就是"該怎麼讓他至少跑一次", 雖然 for 不適用於這種情況 (步進、對
某一範圍的物件作相同的事情), 不過題目要求還是得做
total = 0;
// 與步進無關的內容最好擺在外面
for( ; ; )
// 無限迴圏
{
cin >> grade;
// 輸入錯誤或是輸入-1就跳出迴圏
if( cin.good() ==
false || grade == -1 )
break;
total += grade;
}
記得養成時常檢查 IO 狀態的好習慣! 我不認為判斷 grade的值應該放
在迴圈的測試裡, 因為會造成重複的程式碼. 而且除非速度的考量, 我
也會比較傾向於一次輸入完把整數都放容器裡, 之後再對容器作操作,
這樣迴圈的任務也會單純很多.
--
◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█
T-ara版怎麼去
████◤
██
◢██◣█
██
████
██
s ~>
T-ara
█/███
██
██
██
█/█ ◢█
██
█/█ 歡迎您的光臨
████◤
██
██
██
██◤
███◤
██◤
恩靜、
智妍、
孝敏
█/███
██
█/█
█◤
██
█/██
██
素妍、
居麗、
寶藍
████◤
█◤
◥██◤ █◤
████◤
█◤
花英 ψmakigoto123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 doggingg:謝謝回答 02/10 18:46
推 abzxcx:小弟初到貴寶地,發現這邊好多強者 @@! 02/10 20:21