標題:
資料結構 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
#include<bits/stdc++.h>//引入所有常用標頭檔,簡化撰寫(但在大型專案中不建議使用)。
using namespace std;
ifstream ifs;
string str;
vector<string> v;
int n;
/*
#include<bits/stdc++.h>:引入所有常用標頭檔,簡化撰寫(但在大型專案中不建議使用)。
ifstream ifs:用來讀取 read.csv 的輸入檔案串流。
vector<string> v:用來儲存每一筆角色資料(整行以字串形式儲存)。
int n:用來儲存使用者輸入要顯示的前 n 名。
*/
bool compare(string s1, string s2)
{
int idx1=s1.rfind(','), idx2=s2.rfind(',');
int t1=stoi(s1.substr(idx1+1)), t2=stoi(s2.substr(idx2+1));
return t1>t2;
}
/*
rfind(','):找到最後一個逗號的位置,因為 Score 是每行資料的最後一欄。
substr(idx+1):從最後一個逗號後面擷取出分數字串。
stoi():將分數字串轉換成整數。
return t1 > t2:定義排序為「分數高者在前」。
*/
int main()
{
ifs.open("read.csv");
ifs>>str;
while(ifs>>str)
v.push_back(str);
*/
開啟 read.csv。
第一行假設是標題行(略過)。
接下來每一行都讀進 v 向量中(格式是整行字串)。
*/
cin>>n;
if(n>v.size())
cout<<"Exceeds data upper limit"<<endl;
//若 n 大於資料筆數,輸出「Exceeds data upper limit」。
else
{
sort(v.begin(), v.end(), compare);
for(int i=0; i<n; i++)
{
v[i].replace(v[i].find(","),1," | ");
v[i].replace(v[i].find(","),1," | ");
v[i].replace(v[i].find(","),1," | ");
cout<<i+1<<" | "<<v[i]<<endl;
}
}
/*
使用 sort() 函數,依照分數由高至低排序。
使用三次 replace() 把每一行的逗號換成 |,分隔成四個欄位:
Id | Name | Level | Score
輸出時加上 Rank(從 1 開始)。
*/
return 0;
}
複製代碼
--------------------------
---------------------
作者:
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