全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1203
推到 Plurk!
推到 Facebook!

請問有關For迴圈 比較的問題

尚未結案
nomaid
一般會員


發表:6
回覆:9
積分:3
註冊:2004-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-28 15:39:07 IP:210.59.xxx.xxx 未訂閱
不好意思 小弟又來打擾了.. 小弟想再請教各位前輩一個問題 就是 我現在能夠傳核取方塊的值到變數裡面 現在要讓他跟我自行輸入的六個值比較 可是比較出來一樣的點數 卻不是正確的 以下是我的程式碼 還請各位前輩能撥空再幫小弟看一下 哪裡有bug 麻煩各位前輩了!! 一.比較的程序 procedure atoc; var a,b :integer; begin def := 0; for b := 1 to 6 do for a := 1 to num do if aball[a] = ball[b] then Inc(def); end; 二.存取變數及秀出 procedure TForm1.Button3Click(Sender: TObject); begin num:=0; for i:= 1 to 6 do begin aedit:= TEdit(FindComponent('Edit' InttoStr(i))); ball[i]:= StrtoInt(aedit.text); end; for i := 1 to 49 do begin acheckbox:= TCheckBox(FindComponent('Checkbox' InttoStr(i))); if acheckbox.enabled=true then if acheckBox.Checked=true then begin aball[i]:= i; num:=num 1; end; end; atoc; showmessage('your choose have' inttostr(def) 'point'); end;
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-28 16:20:37 IP:218.15.xxx.xxx 未訂閱
引言: nomaid您好: 不知您有无测试过我给您的程式,那不是您所需吗?您自行输入6个数字至Edit1~Edit6中,然后对CheckBox1~CheckBox49这49个CheckBox进行勾选,对所勾选的序号(还是checkBox的caption,下有两种写法)与前您自行输入的6个数字,进行比较,得出相同的个数来;
Procedure atoc;
var  
  a,b :integer;
begin
  def := 0;
  for b :=1 to 6 do
    for a :=1 to 49 do  
    //for i:=1 to num do  //如果说您写成这样,不知您的意图究竟为何? 
    //??此处比较,怎么又从1~num呢,如果您选取了48,49的话,num的值是2
    //这样比较就是ball[1]~ball[6]和aball[1]~aball[2]比较,
    //而不是和aball[48]~aball[49]比较,与您的要求不符吧?
      if  ball[b]=aball[a] then Inc(def);
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo2.Lines.Clear;
num:=0;
for i:= 1 to 6 do
  begin
     aedit:= TEdit(FindComponent('Edit' InttoStr(i)));
     ball[i]:= StrtoInt(aedit.text);   //ball[i]的值是输入至Edit的值     
     Memo1.Lines.Add(format('ball[%d]=%d',[i,ball[i]])); //加多一个memo供查看值
  end;      for i := 1 to 49 do
  begin
    acheckbox:= TCheckBox(FindComponent('Checkbox' InttoStr(i)));
    if acheckbox.enabled=true then
      if acheckBox.Checked=true then
        begin
          aball[i]:= i; //注意您这里所获取的abll[i]的值,不是CheckBox里的值,而是您所选取CheckBox的序号
// aball[i]:=inttostr(acheckBox.Caption); //要想取CheckBox里的Caption,得这样子写
          Memo2.Lines.Add(format('aball[%d]=%d',[i,aball[i]]));//加多一个memo供查看值
          num:=num 1;   //选取的数目,没用处
        end;
  end;
showmessage('the checked number is' inttostr(num));//查看选取的数目,其实是没什么作用  
atoc; //对此两组数进行比较
showmessage('your choose have '  inttostr(def)  ' point');//显示相同的数
end;
note:注意查看两个Memo的内容,看是不是正确的,您所要的,试试看
<> ============================= 为什么经过多年以后,得失的过程如此冷漠 =============================
nomaid
一般會員


發表:6
回覆:9
積分:3
註冊:2004-11-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-28 17:06:14 IP:210.59.xxx.xxx 未訂閱
已將 程式碼一的內容修改成 for a:= 1 to num do // 將程式碼二的num值傳入這邊計算總共有幾個欄位值 所以希望能請您再幫我看一下其他地方是否有需要在修改的地方
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-28 17:36:46 IP:218.15.xxx.xxx 未訂閱
引言: 已將 程式碼一的內容修改成 for a:= 1 to num do // 將程式碼二的num值傳入這邊計算總共有幾個欄位值 所以希望能請您再幫我看一下其他地方是否有需要在修改的地方
其实我上面红色部分已经解释很清楚了 就那您选取了两个checkbox来说吧,假如您选取了CheckBox45和Checkbox49,则num的值应该等于2吧,那将其代入您的比较程式中,您可以看出 for b := 1 to 6 do for a := 1 to 2 do //这里Num=2 if aball[a] = ball[b] then Inc(def); 则您所做的比较是不是 ball[1]~ball[6]这6个数分别与 aball[1]~abll[2]这2个数进行比较 但其实真正的来说,应该是 ball[1]~ball[6]这6个数分别与 aball[45]~abll[49]这2个数进行比较 所以回传值是错的。 您可以看两个memo所得出来的结果就知道,并非是aball[1]和aball[2],而是aball[45]和aball[49],注意查看memo的值,不知这样子说,会不会明白点 所以用num是错误的,具体您可以认真了解程式和各项的作用,仔细对比下,就会明白 <> ============================= 为什么经过多年以后,得失的过程如此冷漠 =============================
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-28 18:21:49 IP:203.67.xxx.xxx 未訂閱
因為樂透的發行,對於相關程式的需求或者說感到興趣 的情況,在許多論壇都有人提起,以下是我個人對於這類 程式比較喜歡的做法,它具有較好的彈性,提供你做為參考. 你可以另開專案試試看.
 
unit LottoMain;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst;    type

  TLotto = 1..49; 
  TLottoSet = set of TLotto;      TfrmLotto = class(TForm)
    CheckListBox1: TCheckListBox;
    Label1: TLabel;
    btnClear1: TButton;
    btnClear2: TButton;
    CheckListBox2: TCheckListBox;
    Label2: TLabel;
    btnUnion: TButton;
    Label3: TLabel;
    btnIntersect: TButton;
    btnSubtract: TButton;
    procedure btnClear1Click(Sender: TObject);
    procedure btnClear2Click(Sender: TObject);
    procedure CheckListBox1ClickCheck(Sender: TObject);
    procedure CheckListBox2ClickCheck(Sender: TObject);
    procedure btnUnionClick(Sender: TObject);
    procedure btnIntersectClick(Sender: TObject);
    procedure btnSubtractClick(Sender: TObject);
  private
    LS1, LS2: TLottoSet;
  public
    function DisplayLottoSet(LS: TLottoSet): string;
  end;      function LottoSetToStr(LS: TLottoSet): string;
  function CountOf(LS: TLottoSet): Integer;    var
  frmLotto: TfrmLotto;    implementation    {$R *.dfm}    function LottoSetToStr(LS: TLottoSet): string;
var
  L: TLotto;
begin
  Result := '';
  for L := Low(L) to High(L) do
    if L in LS then
      Result := Result + Format('%2.2d,', [L]);      if Result = '' then Result := '[]'
  else
  begin
    Result := '[' + Result;
    Result[Length(Result)] := ']';
  end;
end;    function CountOf(LS: TLottoSet): Integer;
var
  L: TLotto;
begin
  Result := 0;
  for L := Low(L) to High(L) do
    if L in LS then Inc(Result);
end;    function TfrmLotto.DisplayLottoSet(LS: TLottoSet): string;
begin
  Result := IntToStr(CountOf(LS)) + LottoSetToStr(LS);
end;    procedure TfrmLotto.btnClear1Click(Sender: TObject);
var
  I: Integer;
begin
  with CheckListBox1 do
    for I := 0 to Items.Count-1 do
      Checked[I] := False;
  LS1 := [];
  Label1.Caption := DisplayLottoSet(LS1);
end;    procedure TfrmLotto.btnClear2Click(Sender: TObject);
var
  I: Integer;
begin
  with CheckListBox2 do
    for I := 0 to Items.Count-1 do
      Checked[I] := False;
  LS2 := [];
  Label2.Caption := DisplayLottoSet(LS2);
end;    procedure TfrmLotto.CheckListBox1ClickCheck(Sender: TObject);
var
  L: TLotto;
  C: Boolean;
begin
  with CheckListBox1 do
    if ItemIndex > -1 then
    begin
      C := Checked[ItemIndex];
      L := ItemIndex + 1;
      if C then
              LS1 := LS1 + [L]
      else LS1 := LS1 - [L];
      Label1.Caption := DisplayLottoSet(LS1);
    end;
end;    procedure TfrmLotto.CheckListBox2ClickCheck(Sender: TObject);
var
  L: TLotto;
  C: Boolean;
begin
  with CheckListBox2 do
    if ItemIndex > -1 then
    begin
      C := Checked[ItemIndex];
      L := ItemIndex + 1;
      if C then
              LS2 := LS2 + [L]
      else LS2 := LS2 - [L];
      Label2.Caption := DisplayLottoSet(LS2);
    end;
end;    procedure TfrmLotto.btnUnionClick(Sender: TObject);
begin//聯集
  Label3.Caption := DisplayLottoSet(LS1+LS2);
end;    procedure TfrmLotto.btnIntersectClick(Sender: TObject);
begin//交集
  Label3.Caption := DisplayLottoSet(LS1*LS2);
end;    procedure TfrmLotto.btnSubtractClick(Sender: TObject);
begin//差異
  Label3.Caption := DisplayLottoSet(LS1-LS2);
end;    end.    
另外可以參考這一篇 也許對你有幫助 http://forum.vclxx.org/topic.php?TOPIC_ID=13388&FORUM_ID=3&CAT_ID=2&Topic_Title=%BC%D6%B3z%C0H%BE%F7%BF%EF%B8%B9%AA%BA%B0%DD%C3D&Forum_Title=Misc
系統時間:2024-06-27 0:52:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!