線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2500
推到 Plurk!
推到 Facebook!

如何產生配對

答題得分者是:Chance36
cherng32
一般會員


發表:26
回覆:24
積分:10
註冊:2002-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-19 02:03:55 IP:140.127.xxx.xxx 未訂閱
大家好:    因為要產生實驗的資料,所以想請問一下,如何產生下列的配對 ex: 輸入1 2 3 4 5,便會產生12 13 14 15 23 24 23 34 35 123 124 125 234 235 345 的配對結果,我遇到的問題是我可以產生
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-20 00:07:39 IP:211.74.xxx.xxx 未訂閱
引言: 大家好: 因為要產生實驗的資料,所以想請問一下,如何產生下列的配對 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-20 15:47:18 IP:61.165.xxx.xxx 未訂閱
对于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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-20 16:13:03 IP:61.165.xxx.xxx 未訂閱
有一个错误要改一下:红字标处 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-22 02:40:55 IP:140.127.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-22 18:35:54 IP:210.66.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-23 01:28:54 IP:140.127.xxx.xxx 未訂閱
引言: [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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-24 23:26:58 IP:61.60.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-25 04:33:29 IP:140.127.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-25 05:34:26 IP:140.127.xxx.xxx 未訂閱
引言:
引言: 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以後的配對??
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-03-25 10:04:13 IP:61.165.xxx.xxx 未訂閱
引言:
引言:
引言: 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,检查一下那里看看。
cherng32
一般會員


發表:26
回覆:24
積分:10
註冊:2002-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-03-26 04:35:47 IP:140.127.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-03-26 04:48:49 IP:140.127.xxx.xxx 未訂閱
您好: 我的問題是 我是只要再加入產生 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-03-26 13:17:18 IP:203.67.xxx.xxx 未訂閱
引言: 您好: 我的問題是 我是只要再加入產生 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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-03-26 13:38:00 IP:61.165.xxx.xxx 未訂閱
偶已经完全糊涂啦!到底要的是什么配对?举个例子吧。
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-03-26 13:45:17 IP:61.165.xxx.xxx 未訂閱
原程式应该是2至所要数列长度的所有配对都会产生的呀。
cherng32
一般會員


發表:26
回覆:24
積分:10
註冊:2002-09-18

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-03-26 15:35:58 IP:140.127.xxx.xxx 未訂閱
原程式应该是2至所要数列长度的所有配对都会产生的呀。 我所要產生的配對是 如果輸入 >
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-03-26 15:40:23 IP:203.67.xxx.xxx 未訂閱
引言: 原程式应该是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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-03-27 19:14:11 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-03-27 20:08:31 IP:140.127.xxx.xxx 未訂閱
謝謝你的回答,產生的結果正是我要的,目前我正在試著將程式改成可以依使用者輸入來產生,如果有新的結果,再貼上來和大家分享,在一次的謝謝所有曾經幫助過我的人,因為有你們,所以程式設計變的有趣 謝謝
cherng32
一般會員


發表:26
回覆:24
積分:10
註冊:2002-09-18

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-03-28 02:19:46 IP:140.127.xxx.xxx 未訂閱
心得分享,看了一晚,終於弄懂了,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

發送簡訊給我
#22 引用回覆 回覆 發表時間:2006-11-04 13:48:51 IP:220.134.xxx.xxx 訂閱
不知道前輩是否可以提供程式範例!我看了您的程式,寫想到我的程式中,但一直產生錯誤!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2024-04-25 6:43:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!