猜數字→產生1000~9999所有可能不重複的四位數字(如1234,9876) |
答題得分者是:Fishman
|
hilda_a
一般會員 發表:2 回覆:1 積分:0 註冊:2007-03-22 發送簡訊給我 |
各位大大好,以下是我的程式碼,請大大們幫忙,哪個地方寫錯了?
謝謝願意點進來看的大大,感激不盡! Q1:最後listbox1要加入的xnum的值是9999沒錯,那是xnum[a]的問題嗎? Q2:這有用到副程式,我的能力不強,寫錯請幫忙我指出哪個地方,謝謝。我知道已經有許多發問者問過猜數字之類的問題,但~都無法解決我的疑問。 const cdim=4; //全域變數 procedure checknum (xnum:array of integer;var xresult:integer); var xcheck,b:integer; begin xresult:=1; b:=0; for xcheck:=(cdim-1) downto 0 do begin if (xcheck = xnum[b]) then b:=b 1; end; if (b=0)and(xcheck>=1) then xresult:=0; end; procedure TForm1.btnaresultClick(Sender: TObject); var a,xtmp,b,xresult:integer; xnum:array[0..(cdim-1)] of integer; begin listbox1.items.Clear; for a:=1 to 9999 do begin xtmp:=a; for b:=(cdim-1) downto 0 do begin //拆解xtmp xnum[b]:=xtmp mod 10; xtmp:=xtmp div 10; end; checknum(xnum,xresult); end; if (xresult=1) then listbox1.Items.Add(inttostr(xnum[a])); end; 感謝fatmoon1大大的回覆 很抱歉我沒有明確地告知該程式目的 。 程式解釋:產生1000~9999數字,並由千ˋ百ˋ十ˋ個位數逐一檢查是否有重複及有0的數字。 Q1.:xnum:array[0..(cdim-1)] of integer;這裡我是想把1234逐一拆解成1,2,3,4放進陣列 ,然後檢查是否有重複和有0的數字。 因為檢查兩位數字比四位數字方便多了,想說..如果可產生( 12,13,14,...97,98 ),那程式就對啦!所以我曾把全域變數cdim=4更改為cdim=2,將for a:=1 to 9999 do更改為for a:=1 to 99 do,結果每次顯示的數字都不一樣,這是為什麼呢 ?
------
拉薩一隻狗 |
fatmoon1
初階會員 發表:3 回覆:29 積分:36 註冊:2004-05-24 發送簡訊給我 |
我不太清楚 你程式是要達成那些功能
我只以目前程式來說 if (xresult=1) then listbox1.Items.Add(inttostr(xnum[a])); 這一行我在編譯執行後 都會出錯 不像你提供的程式 第一次按按鍵會出錯 第二次之後 ListBox1 的第一行就都是 5177426 依這一行來說 xnum 這個陣列 你只宣告 xnum:array[0..(cdim-1)] of integer; 所以 xnum 是 array[0..3] of integer 的陣列沒錯吧 可是 最後 a 的值 卻是 10000 所以 xnum[a] => xnum[10000] 這就是不合理的地方了 因為 xnum 最大 只到 xnum[3] 而已
------
才疏學淺 |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
1.1~9中任意取一個數字
2.刪除取出數字 3.剩餘數字中再隨機取出一個數字 4.重複步驟2~3至取得所需長度 <textarea class="vb" rows="10" cols="60" name="code"> procedure TForm1.Button1Click(Sender: TObject); const Len = 4; var Tmp : TStrings; I,X : Integer; Answer: String; begin Randomize(); Answer := ''; Tmp := TStringList.Create; Tmp.Clear; try for i := 1 to 9 do begin Tmp.Add(IntToStr(i)); end; Answer := ''; For i := 0 to Len - 1 do begin X := Random(Tmp.Count); Answer := Answer Tmp.Strings[x]; Tmp.Delete(x); end; finally Tmp.Free; end; showmessage(answer); end; </textarea> Fishman
------
Fishman |
hilda_a
一般會員 發表:2 回覆:1 積分:0 註冊:2007-03-22 發送簡訊給我 |
很感謝Fishman大大的回覆
但...我不怎麼想放棄自己的程式碼...= = 後來我有找到了我checknum的bug <textarea class="delphi" rows="10" cols="60" name="code">const cdim=4; //全域變數 procedure TForm1.checknum (xnum:array of integer;var xresult:integer); var i,j,xcheck:integer; begin for i:=0 to 9 do begin xcheck:=0; for j:= 0 to (cdim-1) do if (i = xnum[j]) then xcheck:=xcheck 1; if (xcheck > 1) then xresult:=1; if (i = 0) and (xcheck >= 1) then xresult:=1; end; end; procedure TForm1.btncheck3Click(Sender: TObject); var a,xtmp,b,xresult:integer; xnum:array[0..(cdim-1)] of integer; begin listbox1.items.Clear; for a:=1 to 9999 do begin xtmp:=a; for b:=(cdim-1) downto 0 do begin xnum[b]:=xtmp mod 10; xtmp:=xtmp div 10; end; xresult:=0; checknum(xnum,xresult); if (xresult=0) then listbox1.Items.Add(inttostr(a)); end; end; </textarea> 再次感謝fatmoon1及Fishman大大的回覆呀
------
拉薩一隻狗 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |