作者laechan (小太保)
站内mud_sanc
标题[wizs] sort_array 的运用
时间Mon Mar 31 09:11:11 2008
一般在写区域物件或 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