抽奖程序怎么做啊,高手提供个思路吧(100分)(100分)

  • 主题发起人 主题发起人 ssh78
  • 开始时间 开始时间
S

ssh78

Unregistered / Unconfirmed
GUEST, unregistred user!
抽奖程序需求:1 要求程序能从一定数量的身份证号码中随机无放回的逐次抽取50%出来,
即从中随机抽取一个后,再从剩下的部分随机再抽取一个,依此类推,逐次抽取,直至数
量为总数的50%.
2  如果顾客总人数为单数,则“50%”定义为“获奖顾客数量是总人数加1后的50%”。
3  中奖的号码依次显示,最后生成获奖名单,自动保存。并可直接查询获奖顾客的详细
资料,包括姓名,身份证号码,订单号,所购商品和金额,按顾客姓氏生成表格资料。
 
你自己都已经做出流程了,还要提供什么思路???
 
用链表来做,结点进行编号,随机生成一个链表总数范围内的数
至于如何查找就看数据结构的书了,其他的资料都可以放到链表
的结点里。
 
to LuJuhe:
我就是想问怎么实现呀,我写的是人家的要求阿
 
to 张无忌:
没有别的思路么?我还不会用链表呀
 
你的所有身份证号码估计是记录在数据库表中的。
那样就更加好处理了,使用游标,使用fetch relative n,n是生成的随机数,注意检测不能取已选的就可以了
 
那就用ebeggar的办法,用数据库来处理,这样要容易很多.
 
我写的抽奖系统,欢迎下载!
http://www.qianer.com/software/Award/index.asp
 
中奖数量=0;
获取身份证的结果集,得到recordcount;
计算中奖总数;
while 中奖数量<中奖总数 do begin
用“是否中奖=True”过滤结果集;
生成随机数(1 到 dataset.recordcount之间);
移动到那一行;
标记是否中奖为True;
inc(中奖数量);
重新过滤;
end;
 
是的,反正用表的话,方法很多,如果记录数很大,当然使用游标,在SP内完成就可以了,如果记录相对较少,放到RecordSet中也好。
 
身份证号码放在数据库中,用 SELECT 取出放到数据集 DataSet1 中,用随机函数生成
1 到 DataSet1.RecordCount 间的随机数,将该记录从 DataSet1 中删除,复制到
另一个数据集 DataSet2 中,如此反复总身份证数的 50% 次即可,好处是不用判断是否
已抽过,因为抽过的身份证号已移到数据集 DataSet2 中了。最后按 DataSet2 中的身
份证号到其他表中取姓名、订单号、所购商品和金额等。
 
我想这样实现:
有一个抽奖人员表person,有一个获奖表gain,一个顾客资料表information
1 person 表里有一个字段zj纪录是否被选中,选中为1,没选中为0,初始纪录都为0,
选中后修改成1
2 用random函数取顾客的流水号,选中了就加到gain表里


请问怎样获取顾客的流水号?流水号这个字段是否要在person表里建,还是数据库系统自
动给?怎样把对应流水号的客户纪录添加到gain表里?
 
xmhch,怎样把身份证号码select出来赋到dataset1中?又怎么复制、删除?
我太笨了,是用:insert into dataset2 select * from dataset1么?
可是我找不到TDataset组件,它在哪一页呀?
 
找不到TDataset组件呀,怎么办?临时表可以么?
 
怎么没人理我了,很急呀
 
我所说的TDataSet组件实际上指TQuery,TTable,TClientDataSet等控件,它们都是继承自
TDataSet类的控件,在 Data Access 页。
在Form上放一个TDataBase控件指向你的数据库,放两个TQuery控件Query1和Query2,
var
i, num: Integer;
begin
Query1.SQL.Clear;
Query1.SQL.Add('SELECT 身份证号 FROM person');
Query1.Open;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT 身份证号 FROM personn WHERE 1 = 2');
Query2.Open;
//循环总身份证数的50%次
Randomize; //初始化随机数;
for i := 1 to int(Query1.RecordCount / 2) do
begin
num := random(Query1.RecordCount); //生成随机数;
Query1.Recno := num; //定位到随机数所指的身份证记录;
//复制到Query2中;
Query2.Append;
Query2.Filed[0].AsString := Query1.Filed[0].AsString;
Query2.Post;
Query1.Delete; //从Query1中删除;
end;
end;
最后数据集Query2中的记录就是被抽中的身份证号记录;
 
将所有身份证放入一个临时表中,用ebeggar所说的“使用游标,使用fetch relative n,
n是生成的随机数,”然后再在临时表中删除抽取出来的记录,这样就不会重复了
 
xmhch,我还想问问
为什么你的那段中
var
i, num: Integer;
begin
Query1.SQL.Clear;
Query1.SQL.Add('SELECT 身份证号 FROM person');
Query1.Open;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT 身份证号 FROM personn WHERE 1 = 2');
Query2.Open;
要对query2加入记录呢?是否可以省略?where 1=2是什么意思?

 
不会吧,给了分就不理我了:(
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部