Board logo

標題: 資料結構 301 遊戲排行榜 [打印本頁]

作者: may    時間: 2025-3-28 12:16     標題: 資料結構 301 遊戲排行榜

資料結構 301 遊戲排行榜
最新一次更新時間:2024-05-08 10:37:06

1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

2. 設計說明:
(1) 小林想要在多人線上角色扮演遊戲(MMORPG)中加入一個排行榜介面的功能,這個排行榜要能依遊戲積分(Score)由高到低進行排序。

(2) 請讀取角色資料 read.csv 檔案,角色資料欄位說明如下:

Id:角色的不重複ID
Name:角色的英文名稱
Level:角色的等級
Score:角色的遊戲積分
請依遊戲積分「由高到低」排序,最後輸出指定數量的排名列表(若有相同積分情況,則依原始輸入順序呈現即可)。

提示:read.csv 檔案內容為簡易CSV檔,文字內容為純英文數字、半形逗號,不包含跳脫字元,亦無使用雙引號,每一列皆可單純使用半形逗號(,)做欄位分隔。

提示:可使用快速排序(Quick Sort)或合併排序(Merge Sort)來實作排序邏輯。

3. 輸入輸出:
輸入說明
一個正整數 n。

輸出說明
遊戲積分「由高到低」的 n 筆角色排行列表,依序包含 Rank、Id、Name、Level 與 Score。

若 n 超過資料總量,則不顯示任何角色資料,直接輸出「Exceeds data upper limit」。

註:

Rank 為排名流水號,從 1 開始。
資料間使用半形空白與垂直線「 | 」間隔。
範例輸入1
3
範例輸出1
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
範例輸入2
5
範例輸出2
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
4 | 759 | Chloe | 58 | 2675
5 | 265 | Scarlett | 17 | 1973
作者: may    時間: 2025-4-17 23:12

回復 1# may
  1. #include<bits/stdc++.h>//引入所有常用標頭檔,簡化撰寫(但在大型專案中不建議使用)。

  2. using namespace std;
  3. ifstream ifs;
  4. string str;
  5. vector<string> v;
  6. int n;
  7. /*
  8. #include<bits/stdc++.h>:引入所有常用標頭檔,簡化撰寫(但在大型專案中不建議使用)。
  9. ifstream ifs:用來讀取 read.csv 的輸入檔案串流。
  10. vector<string> v:用來儲存每一筆角色資料(整行以字串形式儲存)。
  11. int n:用來儲存使用者輸入要顯示的前 n 名。
  12. */

  13. bool compare(string s1, string s2)
  14. {
  15.     int idx1=s1.rfind(','), idx2=s2.rfind(',');
  16.     int t1=stoi(s1.substr(idx1+1)), t2=stoi(s2.substr(idx2+1));
  17.     return t1>t2;
  18. }
  19. /*
  20. rfind(','):找到最後一個逗號的位置,因為 Score 是每行資料的最後一欄。
  21. substr(idx+1):從最後一個逗號後面擷取出分數字串。
  22. stoi():將分數字串轉換成整數。
  23. return t1 > t2:定義排序為「分數高者在前」。
  24. */
  25. int main()
  26. {
  27.     ifs.open("read.csv");
  28.     ifs>>str;
  29.     while(ifs>>str)
  30.         v.push_back(str);
  31. */
  32. 開啟 read.csv。
  33. 第一行假設是標題行(略過)。
  34. 接下來每一行都讀進 v 向量中(格式是整行字串)。
  35. */
  36.     cin>>n;
  37.     if(n>v.size())
  38.         cout<<"Exceeds data upper limit"<<endl;
  39. //若 n 大於資料筆數,輸出「Exceeds data upper limit」。
  40.     else
  41.     {
  42.         sort(v.begin(), v.end(), compare);
  43.         for(int i=0; i<n; i++)
  44.         {
  45.             v[i].replace(v[i].find(","),1," | ");
  46.             v[i].replace(v[i].find(","),1," | ");
  47.             v[i].replace(v[i].find(","),1," | ");
  48.             cout<<i+1<<" | "<<v[i]<<endl;
  49.         }
  50.     }
  51. /*
  52. 使用 sort() 函數,依照分數由高至低排序。
  53. 使用三次 replace() 把每一行的逗號換成 |,分隔成四個欄位:
  54. Id | Name | Level | Score
  55. 輸出時加上 Rank(從 1 開始)。
  56. */
  57.     return 0;
  58. }
複製代碼
--------------------------


---------------------
作者: may    時間: 2025-4-17 23:17

回復 2# may
測資 00
輸入:
3
輸出:
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
測資01
輸入:
5
輸出:
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
4 | 759 | Chloe | 58 | 2675
5 | 265 | Scarlett | 17 | 1973
測資 02
輸入:
8
輸出:
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
4 | 759 | Chloe | 58 | 2675
5 | 265 | Scarlett | 17 | 1973
6 | 261 | Luna | 73 | 1720
7 | 286 | Lincoln | 53 | 1602
8 | 541 | Harper | 75 | 1817
測資03
輸入:
4
輸出:
1 | 209 | Iris | 88 | 6048
2 | 789 | William | 91 | 5567
3 | 461 | Noah | 89 | 3045
4 | 759 | Chloe | 58 | 2675

測資04
輸入:
34
(超出資料量) 輸出:

Exceeds data upper limit




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://www.istak.org.tw/seed/) Powered by Discuz! 7.2