看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 最近在練習設計一個成績管理系統,目前卡在成績及名次的排序問題, 問題在於完成排序後,原本的編號就會亂掉, 像是: 原本 a[5] = { 5 , 2 , 1 , 4 , 3 } b[5] = { 10, 50, 80, 20, 40} 排序a[]後就會變成 a[5] = { 1 , 2 , 3 , 4 , 5 } 但是b[]的順序還是一樣 不知道該怎麼說,表達的不太好,請見諒QQ 餵入的資料(Input): 預期的正確結果(Expected Output): score: 10 50 80 20 40 rank: 5 2 1 4 3 成績80排名1 成績50排名2 成績40排名3 成績20排名4 成績10排名5 錯誤結果(Wrong Output): score: 10 50 80 20 40 rank: 5 2 1 4 3 成績10排名1 成績50排名2 成績80排名3 成績20排名4 成績40排名5 程式碼(Code):(請善用置底文網頁, 記得排版) #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; int main( void ) { int sum[5] = { 10, 50, 80, 20, 40 }; int i, j, k=0; int rank[5] ={0}; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(sum[i] <= sum[j]) { rank[i]++; } } } cout << "score:\n"; for(i=0;i<5;i++) { cout << sum[i] << '\n'; } cout << "rank:\n"; for(i=0;i<5;i++) { cout << rank[i] << "\n"; } cout << '\n'; for ( i = 0 ; i < 5 ; i++ ){ if( rank[i] = k+1 ){ cout << "成績" << sum[i] << "排名" << rank[i] <<'\n'; k++; }} system("pause"); return 0; } (Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.113.127.195 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 16:37)
diabloevagto:你不用管rank,直接排序成績就好 06/25 16:37
忘了說明,這個程式只是用來測試排序過後的資料有沒有同步0.0 主要程式裡面有多種成績,所以需要名次來排序, 目前正卡在排序過後的資料不同步。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 16:52) ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 16:52)
TsinTa:if( rank[i] = k+1 ) <-這行是? 06/25 17:04
karaokstar:樓上抓到bug了, 而且如果改成 if (rank[i] == k+1) 06/25 17:09
karaokstar:有可能不會全部印出來 06/25 17:09
TsinTa:改成那樣肯定還是錯XD 06/25 17:09
TsinTa:if( rank[i] = k+1 ){ 改成for( ;rank[k] != i+1;k++ );{ 06/25 17:20
TsinTa:cout成績那行的i改成k 06/25 17:21
TsinTa:最後把下一行的k++改成k=0就搞定了 06/25 17:22
TsinTa:看得懂嗎@@" 我試過這樣改就ok了..... 06/25 17:24
diabloevagto:你就用vector<pair<int,int>>,sort可以自定義條件 06/25 18:49
剛剛弄好了,可以執行,結果也正確,就把它整合到主程式裡, 不過又出現另一個問題QQ,程式可以執行,但跑到switch case那邊, 輸入選擇後,程式就馬上關閉。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 20:36) 主程式碼http://ideone.com/tMS2kV ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 20:39)
TsinTa:return main(); <-這是啥@@" 06/25 20:42
TsinTa:switch case不是迴圈,不能讓你重新輸入。 06/25 20:46
我也不太清楚..同學教我弄得=_= switch case我不太會用,不知道能不能直接指定副程式。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 20:52)
TsinTa:我猜你的程式當在data[i].Rank,i根本沒給值.... 06/25 20:55
TsinTa:看到"同學教我弄得"這句話,感覺有點.......@@" 06/25 20:58
TsinTa:程式如果不是你的,那我告訴你錯的地方,有意義嗎XD 06/25 21:00
程式是我自己的,我switch case那邊比較不懂,所以請教同學=_= data[i].Rank的i值我記得有設1。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 21:13)
TsinTa:switch case可以放副程式,不過拿main作遞迴,我第一次看到 06/25 21:14
TsinTa:int i, k, j = 0 ; data[i].Rank=Rank(...);<-這沒設吧? 06/25 21:16
TsinTa:還有你的Rank函式只傳回一個整數,應該回傳陣列才對吧? 06/25 21:21
我修改了一下,先暫時不用名次去排序QQ,先只用成績排序, 這樣應該就沒有i的值沒設定到,然後我測試了一下,switch case那邊, 好像是不管輸入什麼都會跳到define(不合法輸入值?)然後程式就關閉了。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 21:36)
TsinTa:你了解case 1:和case '1':哪裡不一樣嗎? 06/25 22:02
TsinTa:還有,用成績排序,i就會設定到?你確定? 06/25 22:02
我把switch case改成if else之後測試,只要選擇要排序的功能就會出錯, 問題好像是k值沒有初始化?請問要怎麼修改才能夠初始化k值。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 22:59)
TsinTa:好傻眼的問題,你知道什麼叫做初始化嗎? 06/25 23:05
TsinTa:int i,k,j=0;<-j完全沒用到,你初始為0,k有用到卻置之不理 06/25 23:14
http://ideone.com/DgCkEt 我嘗試把k初始為0,但是只要成績資料輸入完,就會出現錯誤。 還有之前一直忘記問for( ;rank[k] != i+1;k++ )第一個分號之前不用放東西嗎0.0? 這句我看不太懂說。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 23:23)
drumstick:for(); 後面有分號 是不是empty statement? 06/26 00:11
TsinTa:那一個for只是為了要找到正確的k值而已... 06/26 05:09
TsinTa:while(rank[k]!=i+1) k++; 如果看不懂就換這個吧@@" 06/26 05:17
TsinTa:我試跑過你的程式,輸入資料完沒錯,是錯在排序... 06/26 05:44
TsinTa:http://codepad.org/OqMTndYt 06/26 11:28