M
maomao.yan
Unregistered / Unconfirmed
GUEST, unregistred user!
小弟最近帮一个朋友做了一个电信用户网费的统计的小程序,
从一个文本文件中读入一批用户的数据,其行格式如下
用户所在地 用户所在局向代号 用户电话号码 用户该月网费
只要用到用户所在地和月网费这两项数据,统计一个地区总有多少用户,
每月网费在50元以上和50元以下和需要从电信退费的用户数,该地区所有用户总的
上网费用。
在写这个小程序时,因为考虑到该文本文件有时候很大,因此读入后载入一个RichEdit
控件,结果在遍历整个文件时发现这个程序的执行速度比起使用Memo控件来相差十几倍,
事实在,在2000操作系统下,Memo能读入的文本文件的大小已经没有64KB的限制了,所以
如果大家想进行类似操作的话,强烈推荐使用Memo控件,速度优势太明显了。以下是我的
数据处理源程序,希望能对大家有用
.....
temp = Memo2->Lines->Strings[0];
int pos=temp.Pos(char(0x09));
//定位这一行数据中第一个空格的位置
lastname = temp.SubString(1,pos-1);
//取出从第一个字符开始到第一个空格之间的字符,即为用户所在地区
for(int i=0;i<Memo2->Lines->Count;i++)
{
temp = Memo2->Lines->Strings;
int pos=temp.Pos(char(0x09));
name = temp.SubString(1,pos-1);
//第一段:用户地区
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第一段后剩下的字符串
pos=temp.Pos(char(0x09));
//第二段:
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第二段后剩下的字符串
pos=temp.Pos(char(0x09));
//第三段:
price = temp.SubString(pos+1,temp.Length()-pos);
money=StrToFloat(price);
if(name==lastname)
{
totle+=1;
//若用户地区和前一条记录的地区相同,则先不输出
money>=50.0?num_big++money>0.0?num_small++:num_back++);
totle_money+=money;
StatusBar1->SimpleText="正在处理 "+lastname+" 地区用户......";
}
else
{
//否则,该地区已经统计完毕,输出最后结果。
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
num_big=0;num_small=0;num_back=0;
totle_money=money;
totle=1;
money>=50.0?num_big++money>0.0?num_small++:num_back++);
lastname=name;
}
}
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
//最后一个地区直接输出结果
StatusBar1->SimpleText="全部数据处理完毕";
......
欢迎大家提出宝贵意见,使我能对这段代码进行优化。
从一个文本文件中读入一批用户的数据,其行格式如下
用户所在地 用户所在局向代号 用户电话号码 用户该月网费
只要用到用户所在地和月网费这两项数据,统计一个地区总有多少用户,
每月网费在50元以上和50元以下和需要从电信退费的用户数,该地区所有用户总的
上网费用。
在写这个小程序时,因为考虑到该文本文件有时候很大,因此读入后载入一个RichEdit
控件,结果在遍历整个文件时发现这个程序的执行速度比起使用Memo控件来相差十几倍,
事实在,在2000操作系统下,Memo能读入的文本文件的大小已经没有64KB的限制了,所以
如果大家想进行类似操作的话,强烈推荐使用Memo控件,速度优势太明显了。以下是我的
数据处理源程序,希望能对大家有用
.....
temp = Memo2->Lines->Strings[0];
int pos=temp.Pos(char(0x09));
//定位这一行数据中第一个空格的位置
lastname = temp.SubString(1,pos-1);
//取出从第一个字符开始到第一个空格之间的字符,即为用户所在地区
for(int i=0;i<Memo2->Lines->Count;i++)
{
temp = Memo2->Lines->Strings;
int pos=temp.Pos(char(0x09));
name = temp.SubString(1,pos-1);
//第一段:用户地区
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第一段后剩下的字符串
pos=temp.Pos(char(0x09));
//第二段:
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第二段后剩下的字符串
pos=temp.Pos(char(0x09));
//第三段:
price = temp.SubString(pos+1,temp.Length()-pos);
money=StrToFloat(price);
if(name==lastname)
{
totle+=1;
//若用户地区和前一条记录的地区相同,则先不输出
money>=50.0?num_big++money>0.0?num_small++:num_back++);
totle_money+=money;
StatusBar1->SimpleText="正在处理 "+lastname+" 地区用户......";
}
else
{
//否则,该地区已经统计完毕,输出最后结果。
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
num_big=0;num_small=0;num_back=0;
totle_money=money;
totle=1;
money>=50.0?num_big++money>0.0?num_small++:num_back++);
lastname=name;
}
}
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
//最后一个地区直接输出结果
StatusBar1->SimpleText="全部数据处理完毕";
......
欢迎大家提出宝贵意见,使我能对这段代码进行优化。