看板 C_and_CPP 關於我們 聯絡資訊
我想大家都非常的厲害,但是對於新手,我個人是建議 少用函式庫,寫程式會比較有感覺,等比較厲害了,再來用一些好用的函式庫也不遲 先講問題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