作者jacky1989 ()
標題Re: [問題] 數字交換&印出低於平均值學生
時間Sat Sep 10 01:30:01 2016
我想大家都非常的厲害,但是對於新手,我個人是建議
少用函式庫,寫程式會比較有感覺,等比較厲害了,再來用一些好用的函式庫也不遲
先講問題1.
概論上沒錯,是要比較數字然後互換
我run一次程式的流程給你看,你應該就會知道自己錯在哪裡了
input data:8 6 5 7 9
stage 1:
i=0, j=0
if(arr[0]>arr[1]) //if(8>6)這行會互換
結果:6 8 5 7 9
stage 2:
i=0, j=1
if(8>5)
結果:6 5 8 7 9 //看出問題在哪裡了嗎?
你每次都只有兩兩比較,但是如果今天一種狀況
6 5 1 8 9 //input data
5 6 1 8 9 //stage 1 比較沒錯
5
1 6 8 9 //stage 2 這比較就錯了,因為第一跟第二個數字比較後
不代表第一個數字不會比後面的數字大還是小,所以你應該是
固定一個數字
然後全部比較過,並兩兩互換,這樣保證第一個數字才會是最小或是最大的
----------------------------------------------------------------------
問題2:
養成良好習慣,每次手動輸入資料前,先加入一行fflush(stdin)
這意思是,清除標準輸入裝置的緩衝區,因為你無法確定緩衝區是不是有其他資料
如果沒資料還好,有資料一起進去你就掰了
然後我把你的code放進去跑是對的阿
你是不是輸入錯誤了??
建議先把score由標準輸入改掉,改成這樣
int score[5]={68,79,80,97,65}; //分數不會有小數點.....所以用整數存就夠了
這是為了避免手動輸入錯誤的問題,導致debug麻煩,當然如果寫到一個程度了
就可以像你的方法,直接用標準輸入裝置來輸入
----------------------------------------------------------------------
以上兩個問題,有問題歡迎再提出來討論
如果不懂的也可以問,單純交流也可以
我很喜歡寫程式,所以如果我會的,我就會說
但是如果不會就得請教版上其他高手了
----------------------------------------------------------------------
※ 引述《garnettooo (絕代風華賈奈特)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: c++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: no
: 問題(Question):
: 1.輸入五個數字並將其由大排到小
: 2.列印出學生的平均成績標準差&低於平均的學生
: 餵入的資料(Input):
: 1.8 6 5 7 9
: 2.68 79 80 97 65
: 預期的正確結果(Expected Output):
: 1.5 6 7 8 9
: 2.學生1低於平均,學生5低於平均
: 錯誤結果(Wrong Output):
: 1.5 5 5 7 9
: 2.無法印出
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: 1.http://codepad.org/Yio1mXUo
: 2.http://codepad.org/AlHeaucC
: 補充說明(Supplement):
: 小弟是程式新手,在練習時遇到這些問題,在程式運算結束後要印出結果時無法印出
: 正確結果,我知道這些問題可能很白痴,但我想了很久知道還是不太知道問題出
: 在程式的哪裡,希望各位大神能點出問題所在,感謝!
※ 引述《garnettooo (絕代風華賈奈特)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: c++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: no
: 問題(Question):
: 1.輸入五個數字並將其由大排到小
: 2.列印出學生的平均成績標準差&低於平均的學生
: 餵入的資料(Input):
: 1.8 6 5 7 9
: 2.68 79 80 97 65
: 預期的正確結果(Expected Output):
: 1.5 6 7 8 9
: 2.學生1低於平均,學生5低於平均
: 錯誤結果(Wrong Output):
: 1.5 5 5 7 9
: 2.無法印出
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: 1.http://codepad.org/Yio1mXUo
: 2.http://codepad.org/AlHeaucC
: 補充說明(Supplement):
: 小弟是程式新手,在練習時遇到這些問題,在程式運算結束後要印出結果時無法印出
: 正確結果,我知道這些問題可能很白痴,但我想了很久知道還是不太知道問題出
: 在程式的哪裡,希望各位大神能點出問題所在,感謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.187.94
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1473442203.A.99D.html
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 01:55:20
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 01:55:53
推 LPH66: 推過很多次了, 不要斆 fflush(stdin) 09/10 01:59
→ LPH66: 教 09/10 01:59
→ LPH66: 要清除就用一個迴圈 getchar 到 '\n' 為止即可 09/10 02:00
咦?是喔....我一直以來都使用fflush在清除,是否能請教大神
用getchar要怎麼清除緩衝區呢?
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:03:17
→ LPH66: 如果是像原 PO 這個 C++ 的 stream 輸入那就改成 cin.get() 09/10 02:01
→ LPH66: 再者, 原 PO 的排序不是錯在這裡, 是他的交換沒寫好 09/10 02:02
→ LPH66: 兩層迴圈的比較交換排序有兩種, 你這種跟他這種 09/10 02:03
→ LPH66: 你這種叫選擇排序, 他那種叫泡沫排序 09/10 02:03
果然是大神.....小弟獻醜了.....><
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:04:53
→ LPH66: fflush(stdin) 的問題是 fflush 在 input 序列的作用未定義 09/10 02:06
→ LPH66: 清除法就我說的 while 迴圈 getchar() 到讀到 '\n' 為止 09/10 02:07
→ LPH66: 因為之所以會"留有字元在輸入裡"幾乎都是前一行沒讀完 09/10 02:08
→ LPH66: 那就只要把前一行給讀完就好, 而一行結束就是 '\n' 09/10 02:09
所以是這樣寫嗎?
char t;
while(1){
t=getchar();
if(t=='\n')
break;
}
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:11:31
推 LPH66: 差不多, 然後這一小段可以寫成一個小函式要用時直接呼叫 09/10 02:12
謝大神指點,(已筆記
※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:13:55
推 Qbsuran: rewind(stdin); 09/10 13:41
推 firejox: scanf("%*[^\n]"); getchar(); 09/13 13:53