如何產生配對 |
答題得分者是:Chance36
|
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言: 大家好: 因為要產生實驗的資料,所以想請問一下,如何產生下列的配對 ex: 輸入1 2 3 4 5,便會產生12 13 14 15 23 24 23 34 35 123 124 125 234 235 345 的配對結果,我遇到的問題是我可以產生>>< face="Verdana, Arial, Helvetica"> 1. for i:=low(Ary) to High(Ary)do for j:=i 1 to High(Ary)do for k:=j 1 to High(Ary) do begin data:=Ary[i] Ary[j] Ary[k] end; 2. user TList? var List,p:TList begin List:=TList.Create; for i:=Low(Ary) to High(Ary)do begin p:=TList.Create; List.Add(p); for j:=i 1 to High(Ary)do begin data=Ary[i] Ary[j]; p.add(data) end; end; //List to Array! List.Free; end; |
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
对于jest大大的第二种方法做了一下修改,经测试通过,看看是不是你想要的:
procedure TForm1.Button1Click(Sender: TObject);
var
List,p:TList;
data:^string;
i,k,j,t,l:integer ;
Ary:array[1..7] of integer;
s:string;
begin
List:=TList.Create;
for i:=1 to 7 do
Ary[i]:=i; //试例为'1234567'
for l:=2 to High(Ary) do begin
for i:=Low(Ary) to High(Ary)-2 do begin
p:=TList.Create;
List.Add(p);
t:=l-2;
s:=inttoStr(Ary[i]);
k:=i+1;
while t<>0 do begin
s:=s+inttostr(Ary[k]);
dec(t);
k:=k+1;
end;
for j:=k to High(Ary)do begin
new(data);
data^:=s+inttostr(Ary[j]);
p.add(data); end;
end;
end;
//List to Array!
for i:=0 to list.Count-1 do begin
p:=list.Items[i];
for j:=0 to p.Count-1 do begin
data:=p[j];
showMessage(data^);
end;
end;
List.Free; end;< >< >
|
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
有一个错误要改一下:红字标处
procedure TForm1.Button1Click(Sender: TObject);
var
List,p:TList;
data:^string;
i,k,j,t,l:integer ;
Ary:array[1..7] of integer;
s:string;
begin
List:=TList.Create;
for i:=1 to 7 do
Ary[i]:=i; //试例为'1234567'
for l:=2 to High(Ary) do begin //l为长度控制
for i:=Low(Ary) to High(Ary)-2 do begin //应为High(Ary)-1
p:=TList.Create;
List.Add(p);
t:=l-2;
s:=inttoStr(Ary[i]);
k:=i+1;
while t<>0 do begin
s:=s+inttostr(Ary[k]);
dec(t);
k:=k+1;
end;
for j:=k to High(Ary)do begin
new(data);
data^:=s+inttostr(Ary[j]);
p.add(data); end;
end;
end;
//List to Array!每个list为一定长度下所产生的配对表
for i:=0 to list.Count-1 do begin
p:=list.Items[i];
for j:=0 to p.Count-1 do begin
data:=p[j];
showMessage(data^);
end;
end;
List.Free; end;
|
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
procedure TForm1.Button1Click(Sender: TObject);
var
List,p:TList;<-----------------我並不了解Tlist可以解釋一下嗎,謝謝
data:^string;
i,k,j,t,l:integer ;
Ary:array[1..7] of integer;<---------------如果這裡我需要依使用者的輸
入而改變,應該如何做呢???
s:string;
begin
List:=TList.Create;
for i:=1 to 7 do
Ary[i]:=i; //试例为'1234567'
for l:=2 to High(Ary) do begin //l为长度控制
for i:=Low(Ary) to High(Ary)-2 do begin //应为High(Ary)-1
p:=TList.Create;
List.Add(p);
t:=l-2;
s:=inttoStr(Ary[i]);
k:=i+1;
while t<>0 do begin
s:=s+inttostr(Ary[k]);
dec(t);
k:=k+1;
end;
for j:=k to High(Ary)do begin
new(data);
data^:=s+inttostr(Ary[j]);
p.add(data); end;
end;
end;
//List to Array!每个list为一定长度下所产生的配对表
for i:=0 to list.Count-1 do begin
p:=list.Items[i];
for j:=0 to p.Count-1 do begin
data:=p[j];
showMessage(data^);
end;
end;
List.Free; end;
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言: procedure TForm1.Button1Click(Sender: TObject); var List,p:TList;<-----------------我並不了解Tlist可以解釋一下嗎,謝謝 data:^string; i,k,j,t,l:integer ; Ary:array[1..7] of integer;<---------------如果這裡我需要依使用者的輸 入而改變,應該如何做呢??? s:string; begin List:=TList.Create; for i:=1 to 7 do Ary[i]:=i; //试例为'1234567' for l:=2 to High(Ary) do begin //l为长度控制 for i:=Low(Ary) to High(Ary)-2 do begin //应为High(Ary)-1 p:=TList.Create; List.Add(p); t:=l-2; s:=inttoStr(Ary[i]); k:=i 1; while t<>0 do begin s:=s inttostr(Ary[k]); dec(t); k:=k 1; end; for j:=k to High(Ary)do begin new(data); data^:=s inttostr(Ary[j]); p.add(data); end; end; end; //List to Array!每个list为一定长度下所产生的配对表 for i:=0 to list.Count-1 do begin p:=list.Items[i]; for j:=0 to p.Count-1 do begin data:=p[j]; showMessage(data^); end; end; List.Free; end;1.TList stores an array of pointers. 類似TStrings類別,但它存放是屬於pointers型態 2.將上面寫成一個帶陣列的函數 procedure CreateAry(Ary:Array of Integer); |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
引言: [quote] procedure TForm1.Button1Click(Sender: TObject); var List,p:TList;<-----------------我並不了解Tlist可以解釋一下嗎,謝謝 data:^string; i,k,j,t,l:integer ; Ary:array[1..7] of integer;<---------------如果這裡我需要依使用者的輸 入而改變,應該如何做呢??? s:string; begin List:=TList.Create; for i:=1 to 7 do Ary[i]:=i; //试例为'1234567' for l:=2 to High(Ary) do begin //l为长度控制 for i:=Low(Ary) to High(Ary)-2 do begin //应为High(Ary)-1 p:=TList.Create; List.Add(p); t:=l-2; s:=inttoStr(Ary[i]); k:=i 1; while t<>0 do begin s:=s inttostr(Ary[k]); dec(t); k:=k 1; end; for j:=k to High(Ary)do begin new(data); data^:=s inttostr(Ary[j]); p.add(data); end; end; end; //List to Array!每个list为一定长度下所产生的配对表 for i:=0 to list.Count-1 do begin p:=list.Items[i]; for j:=0 to p.Count-1 do begin data:=p[j]; showMessage(data^); end; end; List.Free; end;1.TList stores an array of pointers. 類似TStrings類別,但它存放是屬於pointers型態 2.將上面寫成一個帶陣列的函數 procedure CreateAry(Ary:Array of Integer); 不好意思,可以說明得更詳細一點嗎???? |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
1.TList能說是一個指標型態的動態陣列,用法請參考DELPHI HELP
2.我意是說將Ary當成參數傳遞
procedure Test(Ary:Array of Integer); begin //這個是已經完成的程式碼 end; procedure BtnClick(Sender:TObject); //將TMemo當成資料輸入的話 var A:Array of Integer; begin SetLength(A,Memo1.Lines.Count); for i:=0 to Memo1.Lines.Count-1 do A[i]:=StrToIntDef(Memo1.Lines[i],0); Test(A); //這就能呼叫你所要的程序了!! end; |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
引言: 1.TList能說是一個指標型態的動態陣列,用法請參考DELPHI HELP 2.我意是說將Ary當成參數傳遞procedure Test(Ary:Array of Integer); begin //這個是已經完成的程式碼 end; procedure BtnClick(Sender:TObject); //將TMemo當成資料輸入的話 var A:Array of Integer; begin SetLength(A,Memo1.Lines.Count); for i:=0 to Memo1.Lines.Count-1 do A[i]:=StrToIntDef(Memo1.Lines[i],0); Test(A); //這就能呼叫你所要的程序了!! end;謝謝你的回答,我了解了 |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
引言:引言: 1.TList能說是一個指標型態的動態陣列,用法請參考DELPHI HELP 2.我意是說將Ary當成參數傳遞不號意思 我試著讓配對能產生1 2 3 4 5 6 7但是最多卻只能產生 12 13 14 15 16 17以後的配對??procedure Test(Ary:Array of Integer); begin //這個是已經完成的程式碼 end; procedure BtnClick(Sender:TObject); //將TMemo當成資料輸入的話 var A:Array of Integer; begin SetLength(A,Memo1.Lines.Count); for i:=0 to Memo1.Lines.Count-1 do A[i]:=StrToIntDef(Memo1.Lines[i],0); Test(A); //這就能呼叫你所要的程序了!! end;謝謝你的回答,我了解了 |
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
引言:引言:引言: 1.TList能說是一個指標型態的動態陣列,用法請參考DELPHI HELP 2.我意是說將Ary當成參數傳遞不號意思 我試著讓配對能產生1 2 3 4 5 6 7但是最多卻只能產生 12 13 14 15 16 17以後的配對??->什么意思呢?是产生不了12 13 14 15 16 17 嘛?还是只能产生12 13 14 15 16 17?产生配对的长度控制参数为l,检查一下那里看看。procedure Test(Ary:Array of Integer); begin //這個是已經完成的程式碼 end; procedure BtnClick(Sender:TObject); //將TMemo當成資料輸入的話 var A:Array of Integer; begin SetLength(A,Memo1.Lines.Count); for i:=0 to Memo1.Lines.Count-1 do A[i]:=StrToIntDef(Memo1.Lines[i],0); Test(A); //這就能呼叫你所要的程序了!! end;謝謝你的回答,我了解了 |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
1.TList能說是一個指標型態的動態陣列,用法請參考DELPHI HELP
2.我意是說將Ary當成參數傳遞
procedure Test(Ary:Array of Integer); begin //這個是已經完成的程式碼 end; procedure BtnClick(Sender:TObject); //將TMemo當成資料輸入的話 var A:Array of Integer; begin SetLength(A,Memo1.Lines.Count); for i:=0 to Memo1.Lines.Count-1 do A[i]:=StrToIntDef(Memo1.Lines[i],0); Test(A); //這就能呼叫你所要的程序了!! end;謝謝你的回答,我了解了 不號意思 我試著讓配對能產生1 2 3 4 5 6 7但是最多卻只能產生 12 13 14 15 16 17以後的配對??->什么意思呢?是产生不了12 13 14 15 16 17 嘛?还是只能产生12 13 14 15 16 17?产生配对的长度控制参数为l,检查一下那里看看。 我是只要產生 1 2 3 4 5 6 7的這組配對 [/quote] 發表人 - cherng32 於 2004/03/26 05:51:07 |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
您好:
我的問題是 我是只要再加入產生 1 2 3 4 5 6 7 的這組配對 而我發現
程式中是直接作長度2的配對 ex: 12 13 14 15 謝謝 if t=0 then
begin
for j:=1 to High(Ary)do begin
new(data)
data^:=inttostr(Ary[j]) //產生12配對
p.add(data)
end
else t<>0
begin
s:=s inttostr(Ary[k]);
dec(t)
k:=k 1
for j:=k to High(Ary)do begin
new(data)
data^:=s inttostr(Ary[j]) //產生12配對
p.add(data)
end
不知道這樣做是不是就可以加入1 2 3 4 5 6 7的配對 發表人 - cherng32 於 2004/03/26 05:46:46
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言: 您好: 我的問題是 我是只要再加入產生 1 2 3 4 5 6 7 的這組配對 而我發現 程式中是直接作長度2的配對 ex: 12 13 14 15 謝謝 if t=0 then begin for j:=1 to High(Ary)do begin new(data) data^:=inttostr(Ary[j]) //產生12配對 p.add(data) end else t<>0 begin s:=s inttostr(Ary[k]); dec(t) k:=k 1 for j:=k to High(Ary)do begin new(data) data^:=s inttostr(Ary[j]) //產生12配對 p.add(data) end 不知道這樣做是不是就可以加入1 2 3 4 5 6 7的配對 發表人 - cherng32 於 2004/03/26 05:46:46不知你所要的配對是為何? 長度2配對? for i:=Low(Ary) to High(Ary)-1 do for j:=i 1 to High(Ary) do List.add(Ary[i] Ary[j]); 長度3配對? for i:=Low(Ary) to High(Ary)-2 do for j:=i 1 to High(Ary)-1 do for k:=j 1 to High(Ary) do List.add(Ary[i] Ary[j] Ary[k]); 還是??... |
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
|
Amanda_Chen
一般會員 發表:25 回覆:82 積分:21 註冊:2003-12-28 發送簡訊給我 |
|
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言: 原程式应该是2至所要数列长度的所有配对都会产生的呀。 >>< face="Verdana, Arial, Helvetica"> 範例:這是用堆疊堆出來的範例,看是不是這個?!procedure ExList(List:TStrings;Ary:Array of String); procedure fExList(Str:String;Index,Len:Integer); var i:Integer; begin for i:=Index to High(Ary)-Len do begin if Len=0 then List.Add(Str Ary[i]) else begin fExList(Str Ary[i],i 1,Len-1); end; end; end; var i:Integer; begin for i:= 1 to Length(Ary) do fExList('',0,i); end; |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
cherng32 你好
這個問題我也是想了好久,終於OK了,以下程式片段供你參考,Form上放個TMemo供顯示用。 Type ChArray= Array Of char ; procedure TForm1.BitBtn2Click(Sender: TObject); //陣列排列組合(A:參與排列的陣列;n:組合個數;Strs;結果斗字串列) Procedure aAsm(a:ChArray;n:Integer;strs : TStrings) ; Var c : Array Of Integer ; //控制用陣列 i , j, k: Integer ; t: Integer ; // 參與排列的總個數 IsOver : Boolean; Procedure WriteData; Var k:Integer; Str : String ; Begin Str := ''; For k:=0 To n-1 Do Begin Str := Str '-' a[c[k]] ; End; Strs.Add(Str) ; End; Begin SetLength(c,n); For i:= low(c)To High(c) Do Begin c[i] := i ; End; t := Length(a)-1; If n > (t 1) Then Exit; // 無法排 IsOver := False; //結束旗標 While Not IsOver Do Begin WriteData; For i:=n-1 DownTo 0 Do Begin Inc(c[i]) ; If c[i]> (t-(n-i-1)) Then Begin // 沒有元素可排列了 If i = 0 Then Begin IsOver:= True; Break; End; c[i] := 0; End Else Begin For j:= i 1 To n-1 Do Begin If c[j] <= c[j-1] Then Begin c[j] := c[j-1] 1; End; End; Break; End; End; End; End; Var a: ChArray; i: Integer ; begin SetLength(a,7); a[0] := '1'; a[1] := '2'; a[2] := '3'; a[3] := '4'; a[4] := '5'; a[5] := '6'; a[6] := '7'; Memo2.Lines.Clear; // 從 1 至 7個數的排列組合 For i:= 1 To Length(a) Do Begin Memo2.Lines.Add(IntToStr(i) ' 個元素加入排列'); aAsm(a,i,Memo2.Lines) ; End; end; |
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
|
cherng32
一般會員 發表:26 回覆:24 積分:10 註冊:2002-09-18 發送簡訊給我 |
心得分享,看了一晚,終於弄懂了,Chance36大大,真的好厲害 Type
ChArray= Array Of char ;(將char改成string就可以讓排列的數字超過10以上,如果用char只能到9) procedure TForm1.BitBtn2Click(Sender: TObject);
//陣列排列組合(A:參與排列的陣列;n:組合個數;Strs;結果斗字串列)
Procedure aAsm(a:ChArray;n:Integer;strs : TStrings) ;
Var
c : Array Of Integer ; //控制用陣列
i , j, k: Integer ;
t: Integer ; // 參與排列的總個數
IsOver : Boolean;
Procedure WriteData;
Var
k:Integer;
Str : String ;
Begin
Str := '';
For k:=0 To n-1 Do Begin
Str := Str '-' a[c[k]] ;
End;
Strs.Add(Str) ;
End;
Begin
SetLength(c,n);
For i:= low(c)To High(c) Do Begin
c[i] := i ;
End;
t := Length(a)-1;
If n > (t 1) Then Exit; // 無法排
IsOver := False; //結束旗標
While Not IsOver Do Begin
WriteData;
For i:=n-1 DownTo 0 Do Begin
Inc(c[i]) ;表示Inc(c[i])=c[i] 1,這一行是關鍵ㄛ,不然會推不出來 If c[i]> (t-(n-i-1)) Then Begin // 沒有元素可排列了
If i = 0 Then Begin
IsOver:= True;
Break;<----------回到While Not IsOver Do Begin作判斷>
><--------這裡會不斷的累加>
>回到 >>
>下一個目標,可以依使用者的輸入產生,一起加油ㄛ< >>
發表人 - > 發表人 -
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |