完成随机产生并打印学生密码的功能:
用Delphi或ASP编写程序,完成随机产生并打印学生密码的功能:
1、 输入界面:
输入开始学号段和结束学号段,按确定按钮后即成生和学号一一对应的密码,并显示出来。学号输入框内只允许输入数字,且开始学号要小于结束学号。
2、 密码生成规则:
随机生成8位密码,密码的规则为大写字母和阿拉伯数字一次排列,如A1B2C3D4的形式。为便于辨认,密码中不得出现数字0、1和字母O、I。
3、 密码生成后存入表xsmm中,字段为stuno(学号)和password(密码)。
4、 打印出学生密码。我编的生成密码并且将学号和密码存入xsmm(table1)中,但是运行不出来,麻烦各位老师指导。procedure TForm2.SpeedButton2Click(Sender: TObject);
var
mm:string;             //密码
book1:=tbook;  //定义书签变量function getchar():string;        //产生字母的子函数
var
i:integer;
t:char;
begin
i:=randomize[(26:integer)]:integer;
while i=8 or (i=14) do
i:=randomize[(26:integer)]:integer;
i:=i+65;
t:=chr(i);
getchar:=t;
end;function getnum():string;        //产生数字的子函数
var
i:integer;
begin
i:=randomize[(10:integer)]:integer;
while i=0 or (i=1) then
i:=randomize[(10:integer)]:integer;
getnum:=inttostr(i);
end;begin
book1:=table1.getbook;
table1.First;
for i=s1 to s2 do
begin
mm=concat(getchar(),getnum(),getchar(),getnum(),getchar(),getnum(),getchar(),getnum());
table1.fieldbyname('学号').value:=i;
table1.fieldbyname('密码').value:=mm;
table1.Next;
end;
table1.gotobook(book1);
table1.FreeBook(book1);
end.

解决方案 »

  1.   

    function getchar():string;        //产生字母的子函数
    var
    i:integer;
    begin
      randomize;
      i:=random(26);
      while (i=8) or (i=14) do i:=random(26);
      i:=i+65;
      result:=chr(i);
    end;
      

  2.   

    function getnum():string;        //产生数字的子函数
    var
    i:integer;
    begin
     randomize;
     i:=random(7);
     i:=i+2;
     result:=inttostr(i);
    end;
      

  3.   

    mm=concat(getchar(),getnum(),getchar(),getnum(),getchar(),getnum(),getchar(),getnum());
    这个语句有没有问题啊?
      

  4.   

    书签变量的使用对吗?jinjazz(近身剪(N-P攻略))
      

  5.   

    回复人: fanfish(凉粉) ( ) 信誉:100  2004-11-05 11:26:00  得分: 0  
     
     
       mm=concat(getchar(),getnum(),getchar(),getnum(),getchar(),getnum(),getchar(),getnum());
    这个语句有没有问题啊?
     
    -----------------------------没有问题
      

  6.   

    回复人: fanfish(凉粉) ( ) 信誉:100  2004-11-05 11:28:00  得分: 0  
     
     
       书签变量的使用对吗?jinjazz(近身剪(N-P攻略))
     
    --------------------------也没有错!
      

  7.   

    begin
    table1.First;
    for i=s1 to s2 do
    begin
    table1.insert;
    mm=concat(getchar(),getnum(),getchar(),getnum(),getchar(),getnum(),getchar(),getnum());
    table1.fieldbyname('学号').value:=i;
    table1.fieldbyname('密码').value:=mm;
    end;
    table1.gotobook(book1);
    table1.FreeBook(book1);
    end.
      

  8.   

    回复人: fanfish(凉粉) ( ) 信誉:100  2004-11-06 14:02:00  得分: 0  
     
     
       不行,等到的所有密码都是一样的,这个循环不对啊,三友!------------------------那是你的产生密码的函数不具有随机性,你要我帮你修该这个函数吗?
      

  9.   

    呵呵,要是这样的话就太好了。那就劳烦你了。三友,我的qq是79653505。
    procedure TForm2.SpeedButton2Click(Sender: TObject);
    var
    k,t:integer;
    mm,x,y:string;
    s1:integer;           // 开始学号段
    s2:integer;           //结束学号段
    book1:tbook;  //定义书签变量
    function getchar():string;        //产生字母的子函数
    var
    i:integer;
    begin
       randomize;       //随机函数
      i:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;function getnum():string;        //产生数字的子函数
    var
    i:integer;
    begin
     randomize;
     i:=random(7);
     i:=i+2;
    getnum:=inttostr(i);            //整数转换成字符
    end;begin
    mm:='';
    table1.refresh;
    s1:=strtoint(edit1.text);
    s2:=strtoint(edit2.text);
    book1:=table1.getbook;
    table1.First;
    for k:=s1 to s2 do
    begin
    table1.insert;
    for t:=0 to 3 do
    begin
    x:=getchar();
    y:=getnum();
    mm:=concat(mm,x,y);
    end;
    table1.fieldbyname('学号').value:=k;
    table1.fieldbyname('密码').value:=mm;
    end;
    table1.gotobook(book1);
    table1.FreeBook(book1);end;
      

  10.   

    1:random()这个函数不能实现真正的随机.要想实现真正的必须让它执行一个随即的次数.
    这个随即的次数怎么产生,你可以用当前系统时间的,N=毫秒数+秒数*1000+分钟数*100000
    再执行 fro i:=1 to N do        
              random(26);
    你的函数就可以改为
    function getchar(N:integer):string;        //产生字母的子函数
    var
    i,j:integer;
    begin
       N=毫秒数+秒数*1000+分钟数*100000 ;(我在网吧,时间函数不记得)
       randomize;       //随机函数
        fro j:=1 to N do        
           I:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;2:当然你也可以用学号来实现随机:
    function getchar():string;        //产生字母的子函数
    var
    i,j,N:integer;
    begin
       N=毫秒数+秒数*1000+分钟数*100000 ;(我在网吧,时间函数不记得)
       randomize;       //随机函数
        fro j:=1 to N do        
           I:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;
    你的调用就要改一下:
    for t:=0 to 3 do
    begin
    x:=getchar(k+t);
    y:=getnum(k+t);
    mm:=concat(mm,x,y);
    end;
      

  11.   

    procedure TForm2.SpeedButton2Click(Sender: TObject);
    var
    k,t:integer;
    mm,x,y:string;
    s1:integer;           // 开始学号段
    s2:integer;           //结束学号段
    book1:tbook;  //定义书签变量
    function getchar():string;        //产生字母的子函数
    var
    i:integer;
    begin
       randomize;       //随机函数
      i:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;function getnum():string;        //产生数字的子函数
    var
    i:integer;
    begin
     randomize;
     i:=random(7);
     i:=i+2;
    getnum:=inttostr(i);            //整数转换成字符
    end;begintable1.refresh;
    s1:=strtoint(edit1.text);
    s2:=strtoint(edit2.text);
    book1:=table1.getbook;
    table1.First;
    for k:=s1 to s2 do
    begin
    mm:='';
    table1.insert;
    for t:=0 to 3 do
    begin
    x:=getchar();
    y:=getnum();
    mm:=concat(mm,x,y);
    end;
    table1.fieldbyname('学号').value:=k;
    table1.fieldbyname('密码').value:=mm;
    table1.post;
    end;
    table1.gotobook(book1);
    table1.FreeBook(book1);end;
      

  12.   

    不是不能生成随机数,是你的mm:='';这一行的位置不对,应该再添加了以后进行初始化。另外,没有提交数据,已经为你加上talbe1.post;。
      

  13.   

    procedure TForm2.SpeedButton2Click(Sender: TObject);
    var
    k,t:integer;
    mm,x,y:string;
    s1:integer;           // 开始学号段
    s2:integer;           //结束学号段
    book1:tbook;  //定义书签变量
    function getchar():string;        //产生字母的子函数
    var
    i:integer;
    begin
       randomize;       //随机函数
      i:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;function getnum():string;        //产生数字的子函数
    var
    i:integer;
    begin
     randomize;
     i:=random(7);
     i:=i+2;
    getnum:=inttostr(i);            //整数转换成字符
    end;begintable1.refresh;
    s1:=strtoint(edit1.text);
    s2:=strtoint(edit2.text);
    book1:=table1.getbook;
    table1.First;
    for k:=s1 to s2 do
    begin
    mm:='';//////注意这一行的位置
    table1.insert;
    for t:=0 to 3 do
    begin
    x:=getchar();
    y:=getnum();
    mm:=concat(mm,x,y);
    end;
    table1.fieldbyname('学号').value:=k;
    table1.fieldbyname('密码').value:=mm;
    table1.post;///////还须加上提交数据
    end;
    table1.gotobook(book1);
    table1.FreeBook(book1);end;
      

  14.   

    三友:
    时间函数。function   tdatetime
    返回分钟,秒钟和毫秒:procedure decodetime(time:tdatatime,var hour,min,sec,msec:word)
    是不是这样:N=msec+sec*1000+min*100000 要不要先把word形式的转换成int形式的?
    见笑了,谢谢
      

  15.   

    xfgncit98(xfgncit98) ,
    呵呵,谢谢!但是运行了之后,还是没有解决问题,所有学号的密码全部都是一样的。
      

  16.   

    另外,delphi清空数据库但是不删除数据库用什么命令?
      

  17.   

    上面有些笔误
    1:用系统时间实现随机
    function getchar():string;        //产生字母的子函数
    var
    i,j:integer;
    hour,min,sec,msec:word;
    begin
    decodetime(now,var hour,min,sec,msec:word);
       N=msec+sec*1000 ;
       randomize;       //随机函数
        fro j:=1 to N do        
           I:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;
    //调用
    for t:=0 to 3 do
    begin
    x:=getchar();
    y:=getnum();
    mm:=concat(mm,x,y);
    end;
    2:用学号来实现随机:
    function getchar(N:integer):string;        //产生字母的子函数
    var
    i,j:integer;
    begin
       N=毫秒数+秒数*1000+分钟数*100000 ;(我在网吧,时间函数不记得)
       randomize;       //随机函数
        fro j:=1 to N do        
           I:=random(26);
      while (i=8) or (i=14) do
      i:=random(26);
      i:=i+65;
      getchar:=chr(i);       //将asc码转换成字符
    end;//调用 
    for t:=0 to 3 do
    begin
    x:=getchar(k+t);
    y:=getnum(k+t);
    mm:=concat(mm,x,y);
    end;
      

  18.   

    回复人: fanfish(凉粉) ( ) 信誉:100  2004-11-06 17:35:00  得分: 0  
     
     
       另外,delphi清空数据库但是不删除数据库用什么命令?
      
    ____________________没有清空数据库的,只有清空数de 
    truncate table table_name
      

  19.   

    还有随机数,在使用random()之前,一定要先randomize,这样才行的。不然系统产生的随机数都是一样的。不过我在你前面帖子中,好象看到已经这样做了!再仔细看看!
      

  20.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
      book1: tbook;
    begin
      //
      book1:=adotable1.getbook;
      if StrToInt(Edit1.Text) > StrToInt(Edit2.Text) then Exit;
      for i := StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do
      try
        if ADOTable1.Locate('ID', i, []) then Exit;
        if ADOTable1.State in [dsInsert, dsEdit] then ADOTable1.Post;
        ADOTable1.Insert;
        ADOTable1.FieldByName('ID').AsInteger := i;
        ADOTable1.FieldByName('Pass').AsString := RandomPass;
        ADOTable1.Post;
      except
      end;
      adotable1.gotobook(book1);
      adotable1.FreeBook(book1);
    end;function TForm1.RandomPass: String;
    var
      i, j: Integer;
    begin
      //
      Result := '';
      for i := 0 to 3 do
      begin
        sleep(100);      //好象不sleep,密码就是一样的,可能是系统速度太快,来不及randomize
        randomize;
        j := random(26);
        while (j=8) or (j=14) do
        begin
          randomize;
          j :=random(26);
        end;
        Result := Result + chr(j + 65);
        
        randomize;
        j := random(10);
        while (j=0) or (j=1) do
        begin
          randomize;
          j :=random(10);
        end;
        Result := Result + IntToStr(j);
      end;
    end;
    帮你重新更改了一下代码,你看看!
    我这边是d5 + winxp,调试通过!主窗口里,只有一个dbgrid,两个edit,一个button
    数据库里有一个表Pass(ID,Pass),其中ID为主健。
      

  21.   

    回复人: fanfish(凉粉) ( ) 信誉:100  2004-11-07 00:08:00  得分: 0  
     
     
       谢谢!我试一下。
    另外呢,我想请问,
    我运行完一次,输入一组数据后,数据库里面相应的存入一组数据,再运行一次,我希望前面的记录全部晴空,这个该如何写程序啊?
    麻烦了!!-------------------------用ADOquery控件执行删除的脚本
    adoquery1.active:=false;
    adoquery1.sql.txt:='delete from your table'
    adoquery1.execute;
      

  22.   

    if ADOTable1.Locate('ID', i, []) then Exit;
        if ADOTable1.State in [dsInsert, dsEdit] then ADOTable1.Post;
    这个语句是什么意思?谢谢各位!
      

  23.   

    if ADOTable1.Locate('ID', i, []) then Exit;
    //如果能定位到ID=i的记录就退出.
        if ADOTable1.State in [dsInsert, dsEdit] then ADOTable1.Post;
    //如果ADOTable1对应的数据被修改了就提交保存.
      

  24.   

    With ADOQuery1 do 
    begin
      Close;
      SQL.Clear;
      SQL.Add('Delete from tablename');
      ExecSQL;
    end;
      

  25.   

    With ADOQuery1 do 
    begin
      Close;
      SQL.Clear;
      SQL.Add('Delete from tablename');
      ExecSQL;
    end;
    清空全部记录.