幸运观众是如此诞生的

技术与开发

电视中的幸运观众是如何抽取的?其实抽取幸运观众的软件是利用随机函数制作的,该软件的用途还可以扩展,可以改造成抽奖软件,年终将至,它可以在公司员工抽奖活动中派上用场。

周末在家的时候,我喜欢看“同一首歌”、“武林风”、“天地英雄”之类的休闲节目。最近我对节目中的抽取幸运观众产生了兴趣,研究了一下抽取的原理。我首先想到的就是,抽取的原理应该是用了随机函数,跟我以前开发过的彩票辅助软件原理是相同的,很多高级语言都支持随机函数,例如VB、C、Delphi等,所以开发的语言选择性比较大。

其次,我考虑的是短信平台的问题。从观众发的短信中提取手机号码,然后显示出来,这肯定要用到数据库。再次,此类软件还可以改造一下。目前临年终也不远了,各种年终宴会也会举行,员工抽奖也可以用此类软件。

在活动开始前,我们把参与活动的人员的手机号码或者座位号录入数据库中,然后在活动过程中分时间段抽奖。有些活动有外单位的贵宾参与,就要特殊考虑了,总得给贵宾面子吧,让他们也中奖一下。

我的构想是在程序中作弊,设定当第四次或者第五次产生幸运儿时,不再使用随机函数,而强制指定贵宾的手机号码或者座位号。下面,我先教大家开发抽奖软件的基本功能(软件下载地址:http://www.shudoo.com/bzsoft),改造的工作就靠大家根据实际情况考虑了。

开发思路

在Access中建立一张表,用来存储幸运观众的手机号码及ID,然后在程序中添加一个录入手机号码的功能(增加一条记录,ID加1),通过窗体录入一定量的手机号码后并存储到数据库中,之后在程序中添加产生幸运观众的功能。

产生幸运观众是用随机函数产生一个数字,用这个数字去和表中记录的ID对比,如果记录中ID和随机数一致,则取出此条记录的手机号码显示在窗体上,最后根据这个手机号码查询出其归属地并显示出来。

开发步骤

第一步:建立手机号码数据库

观众发送手机短信后,手机号码就被写入数据库(我们这里手动输入手机号码),这就需要建立数据库保存手机号码。启动Access,建立表Person_phone,在表下面建立两个字段phone、ID。

第二步:录入手机号码

启动Delphi7,新建一个项目,建立类似图1这样的界面。使用Insert语句将手机号码录入数据库。为了避免录入重复的手机号码,在数据库的表中把字段phone设置为主键,或者将欲录入的手机号和数据库中的手机号进行比较,如果有雷同则给出提示,并中止录入。

42-f10-1-1.jpg

小提示:Edit输入框中只能输入1~10的数字,限制输入为数字有多种方法,比如使用函数TryStrToInt、通过判断字符(chChar)是否为数字型等。

第三步:抽取幸运观众

点击“开始产生”按钮,所有数据库中的手机号码均在显示框中不停滚动,为了保护幸运观众不被电话骚扰,不显示手机号码中间四位。点击“停止”按钮,产生幸运手机号码,分析手机号码的前七位(图2),就可以得出手机用户的归属地(省市)——手机号码对应地址的数据库可以从网上下载。输入相关代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):

42-f10-1-2.jpg

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

%>