再加100分,请高人指点!! (150分)

Q

qingrj

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个程序中,要反复用到随机选取一些字符串,需要编一个过程来调用,但不知如何下手;
如第一次: 5个字符串(狮子,老虎,土狼,豺狗,猎豹)随机选一种;
第二次: 6个字符串(野牛,斑马,羚羊,角马,梅花鹿,野猪)随机选一种;
第三次: 2个字符串(晴天,雨天)随机选一种;
......
 
fuction randomselect:string;
var
i,j:integer;
randomselects:array[0..2,0..2]of string;
begin
randomize;
randomselects[0][0]:='tiger';
...
i:=random(3);j:=random(3);
result:=randomselects[j];
end;
 
谢谢!好象没有那么复杂,这些问题是彼此孤立的,如如第一次
a[3]:=random(4);
a[3]:=a[3]+1;
case a[3] of
1:aa[3]:='狮子';
2:aa[3]:='老虎';
3:aa[3]:='土狼';
4:aa[3]:='豺狗';
5:aa[3]:='猎豹';
end;
......
关键,我想让程序简洁一些!
 
var
S1: array [1..5] of string =
('狮子','老虎','土狼','豺狗','猎豹');
...
aa[3] := S1[Random(5) + 1];
 
简单!
1.建一个文本或数组,如
a[0]:='1,2,3,4,5';
a[1]:='12,33,223,2323,33';......
2.如果a不随机(你也可以做出随机的)则for
3.建list:=TstringList.create;
List.commontext:=a[x];
S:=List[random(List.count)];//就是随即数
我看你其他都清楚,就不罗嗦了。
 
var
AnimalNames:TStrings;
begin
AnimalNames:=TStringList.Create;
with AnimalNames do
begin
Add('狮子'');
......
end;
?????:=AnimalNames[Random(5)];
AnimalNames.Free;
......
end;
 
用TStringList和Random吧,这样最灵活而且简单:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function GetString(kk: TStringList): String;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
sl : TStringList;

implementation

{$R *.DFM}

function TForm1.GetString(kk : TStringList): String;
var
iCount : integer;
iRand : integer;
begin
iCount :=kk.count;
Randomize;
iRand :=Random(iCount);
Result :=intToStr(iRand)+' '+kk.Strings[iRand];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
sl :=TStringList.Create;
with sl do
begin
Clear;
Add('郭靖');
add('黄蓉');
add('杨过');
add('小龙女');
add('张无忌');
add('赵敏');
add('黄药师');
add('欧阳锋');
add('宁狐冲');
add('东方不败');
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
sl.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showMessage('现在您将与'+GetString(sl)+'比武');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if sl.indexof('欧阳锋')>=0 then sl.Delete(sl.indexof('欧阳锋'))
//淘汰欧阳锋
showMessage('现在您将与'+GetString(sl)+'比武');
if sl.indexof('洪七公')<0 then sl.Add('洪七公')
//您的对手又多了一位
showMessage('现在您将与'+GetString(sl)+'比武');
end;

end.
 
我对数组赋值不熟,但好象见过:如过程名是randomselect
第一个问题: 代入过程为randomselect(5,狮子,老虎,土狼,豺狗,猎豹);
第二个问题: 代入过程为randomselect(6,野牛,斑马,羚羊,角马,梅花鹿,野猪);
第三个问题: 代入过程为randomselect(2,晴天,雨天);
.......
只是过程不会写!!

 
再加100分求随机数的过程,给出答案者到加分帖子挂个号,以便送分!!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1648006
 
咳。再讲一遍
const a:array[0..2] of string =('狮子,老虎,土狼,豺狗,猎豹',
'野牛,斑马,羚羊,角马,梅花鹿,野猪',
'晴天,雨天');

function randomselect(s:string):string;
var List:TStringlist;
begin
result:='';
List:=TStringlist.Create;
List.commontext:= S;
result:= List[random(List.count)];
List.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var j:integer;
begin
//不用填数量,它自动判断 ,你也可以写到a中
randomselect('狮子,老虎,土狼,豺狗,猎豹');
randomselect('野牛,斑马,羚羊,角马,梅花鹿,野猪');
randomselect('晴天,雨天');
//或者
for j:=0 to high(a) do
randomselect(a[j]);
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function RandomSelect(Str: array of String): String;
begin
Result := Str[Random(High(Str)+1)];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
begin
Randomize;
for I := 1 to 10 do
Memo1.Lines.Add(RandomSelect(['1', '2', '3', '4']));
end;

end.
 
cococo:看着好象差不多,但编译出错如下:
[Error] Unit1.pas(78): Undeclared identifier: 'commontext'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
 
sorry!!!!!!!!!!!!!!!!!!!!!!!!1
应该是..... CommaText
 
to qingrj:
  完全按照你的思路编写的一个函数,哈哈,真是引无数英雄为分数折腰呀!

function TForm1.RandomSelectString(iCount: integer
SomeString : string): string;
var
sl : TStringList;
str : string;
iRand,i : integer;
begin
sl :=TStringList.create;
//根据iCount的值取出SomeString中的字符串
for i :=0 to iCount-1 do
begin
if i<iCount-1 then
str :=copy(someString,1,pos(',',SomeString)-1)
else
str :=SomeString;
sl.add(str);
if i<iCount-1 then
begin
system.delete(someString,1,pos(',',SomeString));
end;
end;
//利用随机数来求出随机字符串
iCount :=sl.count;
Randomize;
iRand :=Random(iCount);
Result :=sl.Strings[iRand];
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
showMessage(RandomSelectString(6,'1白猫,2黑猫,3野猫,4波斯猫,5黄鼠锒,6老虎'));
end;
 
已经回答了
 
cococo:
先把加分帖子的100分给你,我再分析其他帖子的内容.
 
谢谢,不过我的帖子最简洁,当然,你可以再扩充,这只是Demo
 
呵呵, 不是吧, 我的好像比你的简洁...[:D][:D]
 
小唐:你的函数最接近我的要求,不过,编译时怎么通不过(我以前遇过类似问题),你再看看!
[Error] Unit1.pas(86): Undeclared identifier: 'RandomSelectString'
[Error] Unit1.pas(86): ';' expected but '(' found
[Error] Unit1.pas(94): Undeclared identifier: 'iCount'
[Error] Unit1.pas(97): Undeclared identifier: 'someString'
[Error] Unit1.pas(97): Incompatible types
[Error] Unit1.pas(103): Incompatible types
[Error] Unit1.pas(103): Incompatible types
[Error] Unit1.pas(110): Undeclared identifier: 'Result'
[Error] Unit1.pas(292): Undeclared identifier: 'RandomSelectString'
[Error] Unit1.pas(295): 'END' expected but ')' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
884
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
734
import
I
顶部