Re: [問題] 數字交換&印出低於平均值學生

作者: jacky1989   2016-09-10 01:30:01
我想大家都非常的厲害,但是對於新手,我個人是建議
少用函式庫,寫程式會比較有感覺,等比較厲害了,再來用一些好用的函式庫也不遲
先講問題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 這比較就錯了,因為第一跟第二個數字比較後
不代表第一個數字不會比後面的數字大還是小,所以你應該是固定一個數字
然後全部比較過,並兩兩互換,這樣保證第一個數字才會是最小或是最大的
作者: LPH66 (-6.2598534e+18f)   2016-09-10 01:59:00
推過很多次了, 不要斆 fflush(stdin)教要清除就用一個迴圈 getchar 到 '\n' 為止即可如果是像原 PO 這個 C++ 的 stream 輸入那就改成 cin.get()再者, 原 PO 的排序不是錯在這裡, 是他的交換沒寫好兩層迴圈的比較交換排序有兩種, 你這種跟他這種你這種叫選擇排序, 他那種叫泡沫排序fflush(stdin) 的問題是 fflush 在 input 序列的作用未定義清除法就我說的 while 迴圈 getchar() 到讀到 '\n' 為止因為之所以會"留有字元在輸入裡"幾乎都是前一行沒讀完那就只要把前一行給讀完就好, 而一行結束就是 '\n'差不多, 然後這一小段可以寫成一個小函式要用時直接呼叫
作者: Qbsuran (Qbsuran)   2016-09-10 13:41:00
rewind(stdin);
作者: firejox (Tangent)   2016-09-13 13:53:00
scanf("%*[^\n]"); getchar();

Links booklink

Contact Us: admin [ a t ] ucptt.com