幸运观众是如此诞生的
技术与开发
电视中的幸运观众是如何抽取的?其实抽取幸运观众的软件是利用随机函数制作的,该软件的用途还可以扩展,可以改造成抽奖软件,年终将至,它可以在公司员工抽奖活动中派上用场。
周末在家的时候,我喜欢看“同一首歌”、“武林风”、“天地英雄”之类的休闲节目。最近我对节目中的抽取幸运观众产生了兴趣,研究了一下抽取的原理。我首先想到的就是,抽取的原理应该是用了随机函数,跟我以前开发过的彩票辅助软件原理是相同的,很多高级语言都支持随机函数,例如VB、C、Delphi等,所以开发的语言选择性比较大。
其次,我考虑的是短信平台的问题。从观众发的短信中提取手机号码,然后显示出来,这肯定要用到数据库。再次,此类软件还可以改造一下。目前临年终也不远了,各种年终宴会也会举行,员工抽奖也可以用此类软件。
在活动开始前,我们把参与活动的人员的手机号码或者座位号录入数据库中,然后在活动过程中分时间段抽奖。有些活动有外单位的贵宾参与,就要特殊考虑了,总得给贵宾面子吧,让他们也中奖一下。
我的构想是在程序中作弊,设定当第四次或者第五次产生幸运儿时,不再使用随机函数,而强制指定贵宾的手机号码或者座位号。下面,我先教大家开发抽奖软件的基本功能(软件下载地址:http://www.shudoo.com/bzsoft),改造的工作就靠大家根据实际情况考虑了。
开发思路
在Access中建立一张表,用来存储幸运观众的手机号码及ID,然后在程序中添加一个录入手机号码的功能(增加一条记录,ID加1),通过窗体录入一定量的手机号码后并存储到数据库中,之后在程序中添加产生幸运观众的功能。
产生幸运观众是用随机函数产生一个数字,用这个数字去和表中记录的ID对比,如果记录中ID和随机数一致,则取出此条记录的手机号码显示在窗体上,最后根据这个手机号码查询出其归属地并显示出来。
开发步骤
第一步:建立手机号码数据库
观众发送手机短信后,手机号码就被写入数据库(我们这里手动输入手机号码),这就需要建立数据库保存手机号码。启动Access,建立表Person_phone,在表下面建立两个字段phone、ID。
第二步:录入手机号码
启动Delphi7,新建一个项目,建立类似图1这样的界面。使用Insert语句将手机号码录入数据库。为了避免录入重复的手机号码,在数据库的表中把字段phone设置为主键,或者将欲录入的手机号和数据库中的手机号进行比较,如果有雷同则给出提示,并中止录入。

小提示:Edit输入框中只能输入1~10的数字,限制输入为数字有多种方法,比如使用函数TryStrToInt、通过判断字符(chChar)是否为数字型等。
第三步:抽取幸运观众
点击“开始产生”按钮,所有数据库中的手机号码均在显示框中不停滚动,为了保护幸运观众不被电话骚扰,不显示手机号码中间四位。点击“停止”按钮,产生幸运手机号码,分析手机号码的前七位(图2),就可以得出手机用户的归属地(省市)——手机号码对应地址的数据库可以从网上下载。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

while stop do//全局变量stop为真时就不停地执行(滚动效果)
begin
randomize;//播下随机种子
tmpID:=random(ID+1);//这里ID的值为表字段ID的最后一条记录的值
ADODataSet_W.First;
for i:=0 to ADODataSet_W.RecordCount-1 do//随机产生的ID与数据库中ID相等时,把对应的手机号码取出来送给变量tmpphone
Edit1.Text:=tmpphone;//Edit显示变量tmpphone的值,也就是手机号码
Application.ProcessMessages;//这句话产生了滚动效果
stop:=false;//滚动停止
phone:=copy(Trim(Edit1.Text),1,7);//取出手机号码的前七位用于判断手机用户的归属地
tmpphone:=copy(Trim(Edit1.Text),8,4);//取出手机号码的最后四位
tmp1:=copy(Trim(Edit1.Text),1,3);// 取出手机号码的前三位
tmp2:=tmp1+'****'+tmpphone;//显示如"139****6803"
Edit1.Hint:=Edit1.Text;//提示文本显示完整的手机号码
SQL.Add('select * from sj where 号码B<='+phone +' and 号码E>='+phone);
Open;
if RecordCount>0 then
begin
area:= '恭喜'+FieldByName('地区').AsString+ FieldByName('城市').AsString+'手机尾号是'+tmpphone+'的朋友';
Label1.Caption:=area;//显示"恭喜……"提示
每次节目做完后需要把所有的记录清除,为下一次节目做好准备,清空所有数据可以使用ADOConnection1.Execute('delete from Person_phone')语句。
小编救急
pcw-chendx@vip.sina.com
在讲解手机编程时,小编建立了很多开发QQ群,有许多读者朋友在里面交流,其中谈论得较多的是开发过程中碰到的各种问题。为此,小编特意开辟了一个救急板块,无论你开发哪种程序,无论你碰到什么问题,我们都可以给你提供帮助。来信请发到pcw-chendx@vip.sina.com。
关键词:斗地主洗牌
读者来信:QQ斗地主开始前,系统将洗牌,也就是将54张扑克牌打乱,我比较好奇,它是怎么弄的?
小编:其实所谓的洗牌只不过是一种特殊的算法。我们把54张扑克牌想象为54个不同的人,然后这54个人分别坐在编号为1~54的座位中。第一轮,随机调换2个人的位置,就像小学生换座位一样;第二轮,再随机调换2个人的位置……经过多轮随机调换位置后,扑克牌的顺序就被打乱了,执行的轮数(循环次数)越多,打乱得越彻底。
for(i=1;i<=500;i++)
{
temp1=random(27)+1;
temp2=random(27)+1;
a[1]= puke [temp1];
puke[temp1]= puke [temp[2];
puke [temp2]=a[1];
}
关键词:自动导入表记录
开发QQ群:在MSSQL中,我的表tb_splitcutplan自动接收来自ORACLE的数据记录,接收之后,我需要把这张表的所有记录立即写入l2_splitcutplan表中,并删除表tb_splitcutplan的所有记录,请问有什么方法可以做到?
小编:在表tb_splitcutplan中增加一个触发器,写入下面代码就可以了。
CREATE TRIGGER triu_cutplan ON [dbo].TB_SPLITCUTPLAN
FOR INSERT, UPDATE
AS
declare @test char;
select @test=acceptplan from test;
if @test = '1'
begin
insert into l2_splitcutplan select * from tb_splitcutplan
end
delete from tb_splitcutplan
关键词:禁止另存为
开发QQ群:看了今年第40期的“小编救急”,其中有一个禁止另存为的技巧,该技巧的确有效,但我不想要那个iframe内嵌网页——要运行JavaScript才能达到禁止另存为的目的。工商银行登录页面也有禁止另存为的限制,它又是怎么做的?
小编:禁止另存为的方法有很多,我们给的是效果最好的,工商银行也用的是同样的代码,不过它进行了额外的处理。它先设计了一个框架,在框架里调用代码。
关键词:邮箱地址
读者来信:怎么判断邮箱地址是否有效? 没什么要求,ASP或者是JavaScript都可以。
小编:可以用JavaScript的split函数进行字符串分割,然后将分割后的代码分别进行验证,比较麻烦,网上也有相关代码,最简单的是使用正则表达式进行判断,如在JavaScript代码中加入function isEmail(str){ var reg=/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;return true else return false; },然后用isEmail()进行判断即可。
关键词:Access7
读者来信:我装了Windows2008、IIS7、Access7,现在问题是怎样用SQL语句连接Access7的数据库?
小编:将Provider=Microsoft.Jet.OLEDB.4.0;修改成12.0,详细语句如下:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\web\database\myAccess2007file.accdb;Persist Security Info=False。
关键词:统计访问者
开发QQ群:我想知道,如何统计网页的访问者数量,其他的我都搞定了,但“你是第X位访问者”这个我还没有弄明白怎么实现。
小编:需要借助数据库实现,下载一段计数器的代码,然后在同一个文件夹下建立一个txtcounter.txt的文本文件,在里面填上数字,随便什么都行,就从填入的这个数据开始计数。
<%
CountFile=Server.MapPath("txtcounter.txt")
Set FileObject=Server.CreateObject("Scripting.FileSystemObject")
Set Out=FileObject.OpenTextFile(CountFile,1,FALSE,FALSE)
counter=Out.ReadLine
Out.Close
SET FileObject=Server.CreateObject("Scripting.FileSystemObject")
Set Out=FileObject.CreateTextFile(CountFile,TRUE,FALSE)
Application.lock
counter= counter + 1
Out.WriteLine(counter)
Application.unlock
Response.Write"document.write("&counter&")"
Out.Close
%>