[問題] 名次排序

看板C_and_CPP作者 (三閭大夫)時間12年前 (2013/06/25 16:29), 編輯推噓1(1026)
留言27則, 4人參與, 最新討論串1/1
開發平台(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)

06/25 16:37, , 1F
你不用管rank,直接排序成績就好
06/25 16:37, 1F
忘了說明,這個程式只是用來測試排序過後的資料有沒有同步0.0 主要程式裡面有多種成績,所以需要名次來排序, 目前正卡在排序過後的資料不同步。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 16:52) ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 16:52)

06/25 17:04, , 2F
if( rank[i] = k+1 ) <-這行是?
06/25 17:04, 2F

06/25 17:09, , 3F
樓上抓到bug了, 而且如果改成 if (rank[i] == k+1)
06/25 17:09, 3F

06/25 17:09, , 4F
有可能不會全部印出來
06/25 17:09, 4F

06/25 17:09, , 5F
改成那樣肯定還是錯XD
06/25 17:09, 5F

06/25 17:20, , 6F
if( rank[i] = k+1 ){ 改成for( ;rank[k] != i+1;k++ );{
06/25 17:20, 6F

06/25 17:21, , 7F
cout成績那行的i改成k
06/25 17:21, 7F

06/25 17:22, , 8F
最後把下一行的k++改成k=0就搞定了
06/25 17:22, 8F

06/25 17:24, , 9F
看得懂嗎@@" 我試過這樣改就ok了.....
06/25 17:24, 9F

06/25 18:49, , 10F
你就用vector<pair<int,int>>,sort可以自定義條件
06/25 18:49, 10F
剛剛弄好了,可以執行,結果也正確,就把它整合到主程式裡, 不過又出現另一個問題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)

06/25 20:42, , 11F
return main(); <-這是啥@@"
06/25 20:42, 11F

06/25 20:46, , 12F
switch case不是迴圈,不能讓你重新輸入。
06/25 20:46, 12F
我也不太清楚..同學教我弄得=_= switch case我不太會用,不知道能不能直接指定副程式。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 20:52)

06/25 20:55, , 13F
我猜你的程式當在data[i].Rank,i根本沒給值....
06/25 20:55, 13F

06/25 20:58, , 14F
看到"同學教我弄得"這句話,感覺有點.......@@"
06/25 20:58, 14F

06/25 21:00, , 15F
程式如果不是你的,那我告訴你錯的地方,有意義嗎XD
06/25 21:00, 15F
程式是我自己的,我switch case那邊比較不懂,所以請教同學=_= data[i].Rank的i值我記得有設1。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 21:13)

06/25 21:14, , 16F
switch case可以放副程式,不過拿main作遞迴,我第一次看到
06/25 21:14, 16F

06/25 21:16, , 17F
int i, k, j = 0 ; data[i].Rank=Rank(...);<-這沒設吧?
06/25 21:16, 17F

06/25 21:21, , 18F
還有你的Rank函式只傳回一個整數,應該回傳陣列才對吧?
06/25 21:21, 18F
我修改了一下,先暫時不用名次去排序QQ,先只用成績排序, 這樣應該就沒有i的值沒設定到,然後我測試了一下,switch case那邊, 好像是不管輸入什麼都會跳到define(不合法輸入值?)然後程式就關閉了。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 21:36)

06/25 22:02, , 19F
你了解case 1:和case '1':哪裡不一樣嗎?
06/25 22:02, 19F

06/25 22:02, , 20F
還有,用成績排序,i就會設定到?你確定?
06/25 22:02, 20F
我把switch case改成if else之後測試,只要選擇要排序的功能就會出錯, 問題好像是k值沒有初始化?請問要怎麼修改才能夠初始化k值。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 22:59)

06/25 23:05, , 21F
好傻眼的問題,你知道什麼叫做初始化嗎?
06/25 23:05, 21F

06/25 23:14, , 22F
int i,k,j=0;<-j完全沒用到,你初始為0,k有用到卻置之不理
06/25 23:14, 22F
http://ideone.com/DgCkEt 我嘗試把k初始為0,但是只要成績資料輸入完,就會出現錯誤。 還有之前一直忘記問for( ;rank[k] != i+1;k++ )第一個分號之前不用放東西嗎0.0? 這句我看不太懂說。 ※ 編輯: sofksjmf 來自: 120.113.127.195 (06/25 23:23)

06/26 00:11, , 23F
for(); 後面有分號 是不是empty statement?
06/26 00:11, 23F

06/26 05:09, , 24F
那一個for只是為了要找到正確的k值而已...
06/26 05:09, 24F

06/26 05:17, , 25F
while(rank[k]!=i+1) k++; 如果看不懂就換這個吧@@"
06/26 05:17, 25F

06/26 05:44, , 26F
我試跑過你的程式,輸入資料完沒錯,是錯在排序...
06/26 05:44, 26F

06/26 11:28, , 27F
文章代碼(AID): #1HoLJjrN (C_and_CPP)