[wizs] sort_array 的運用
一般在寫區域物件或 quest 上,比較少用到 sort_array,
常用到的地方在指令以及系統面。deep 升 adm 的考題裡可
以有這麼一題...
mapping data = ([
"laechan" : (["數學":50, "英文":65, "化學":80, ...]),
"nobu" : (["數學":60, "英文":85, "化學":30, ...]),
"int" : (["數學":99, "英文":99, "化學":99, ...]),
.
.
]);
(即 data["laechan"]["數學"]=50, 其它以此類推)
撰寫一程式,讓操作者可以選擇它所希望的排序方式,並包
含底下的顯示結果(default 設定為依名字第一字母排序)..
名字 數學 英文 化學 總分
========================================
int 99 99 99 297
laechan 50 65 80 195
nobu 60 85 30 175
========================================
1)依名字第一字母做排序顯示結果
2)依數學分數由大至小排序顯示結果
3)依英文分數由大至小排序顯示結果
4)依化學分數由大至小排序顯示結果
5)依總分由大至小排序顯示結果
6)離開
請選擇:
它的寫法很簡單,底下是程式段(省略部份宣告)...
string kind="names"; // 全域變數, 排序方式選擇(default 值為依名字排序)
// 針對名字做排序時用到的函數(名字自訂)
int sort_data_string(string s1,string s2)
{
return s1[0] < s2[0] ? 1 : s1[0] > s2[0] ? -1 : 0;
}
// 針對數值做排序時用到的函數(名字自訂)
int sort_data_value(string s1,string s2)
{
int a1,a2;
a1=(int)data[s1][kind];
a2=(int)data[s2][kind];
return a1 < a2 ? 1 : a1 > a2 ? -1 : 0;
}
// keys_data = keys(data), s = 選擇(default = "1")
int display_data(string str, mixed keys_data)
{
int s;
string tmp;
s=atoi(str);
foreach(str in keys_data)
if(!data[str]["總分"])
data[str]["總分"]=data[str]["數學"]+data[str]["英文"]+data[str]["化學"];
switch(s)
{
case 1:
keys_data=sort_array(keys_data,"sort_data_string",this_object());
break;
case 2:
kind="數學";
keys_data=sort_array(keys_data,"sort_data_value",this_object());
break;
case 3:
kind="英文";
keys_data=sort_array(keys_data,"sort_data_value",this_object());
break;
case 4:
kind="化學";
keys_data=sort_array(keys_data,"sort_data_value",this_object());
break;
case 5:
kind="總分";
keys_data=sort_array(keys_data,"sort_data_value",this_object());
break;
case 6:
write("see you.\n");
return 1;
break;
}
str="名字 數學 英文 化學 總分\n"+
"==============================================\n";
foreach(tmp in keys_data)
str+=sprintf("%-11s %3d %3d %3d %3d\n",tmp,
data[tmp]["數學"],data[tmp]["英文"],
data[tmp]["化學"],data[tmp]["總分"]);
str+=@LONG
1)依名字第一字母做排序顯示結果
2)依數學分數由大至小排序顯示結果
3)依英文分數由大至小排序顯示結果
4)依化學分數由大至小排序顯示結果
5)依總分由大至小排序顯示結果
6)離開
LONG
;
write(str+"請選擇: ");
input_to("display_data",0,keys_data,tmp);
return 1;
}
有看不懂的地方都可以問。adm 與 deep 的差別,就在於寫的
東西的性質上,deep 是不需要用到上面那些的。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.223.165
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
29
45
13
23
405
837