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

看板C_and_CPP作者時間7年前 (2016/09/10 01:30), 7年前編輯推噓4(4010)
留言14則, 3人參與, 最新討論串2/2 (看更多)
我想大家都非常的厲害,但是對於新手,我個人是建議 少用函式庫,寫程式會比較有感覺,等比較厲害了,再來用一些好用的函式庫也不遲 先講問題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

09/10 01:59, , 1F
推過很多次了, 不要斆 fflush(stdin)
09/10 01:59, 1F

09/10 01:59, , 2F
09/10 01:59, 2F

09/10 02:00, , 3F
要清除就用一個迴圈 getchar 到 '\n' 為止即可
09/10 02:00, 3F
咦?是喔....我一直以來都使用fflush在清除,是否能請教大神 用getchar要怎麼清除緩衝區呢? ※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:03:17

09/10 02:01, , 4F
如果是像原 PO 這個 C++ 的 stream 輸入那就改成 cin.get()
09/10 02:01, 4F

09/10 02:02, , 5F
再者, 原 PO 的排序不是錯在這裡, 是他的交換沒寫好
09/10 02:02, 5F

09/10 02:03, , 6F
兩層迴圈的比較交換排序有兩種, 你這種跟他這種
09/10 02:03, 6F

09/10 02:03, , 7F
你這種叫選擇排序, 他那種叫泡沫排序
09/10 02:03, 7F
果然是大神.....小弟獻醜了.....>< ※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:04:53

09/10 02:06, , 8F
fflush(stdin) 的問題是 fflush 在 input 序列的作用未定義
09/10 02:06, 8F

09/10 02:07, , 9F
清除法就我說的 while 迴圈 getchar() 到讀到 '\n' 為止
09/10 02:07, 9F

09/10 02:08, , 10F
因為之所以會"留有字元在輸入裡"幾乎都是前一行沒讀完
09/10 02:08, 10F

09/10 02:09, , 11F
那就只要把前一行給讀完就好, 而一行結束就是 '\n'
09/10 02:09, 11F
所以是這樣寫嗎? char t; while(1){ t=getchar(); if(t=='\n') break; } ※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:11:31

09/10 02:12, , 12F
差不多, 然後這一小段可以寫成一個小函式要用時直接呼叫
09/10 02:12, 12F
謝大神指點,(已筆記 ※ 編輯: jacky1989 (111.250.187.94), 09/10/2016 02:13:55

09/10 13:41, , 13F
rewind(stdin);
09/10 13:41, 13F

09/13 13:53, , 14F
scanf("%*[^\n]"); getchar();
09/13 13:53, 14F
文章代碼(AID): #1Nql6RcT (C_and_CPP)
文章代碼(AID): #1Nql6RcT (C_and_CPP)