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

猜數字→產生1000~9999所有可能不重複的四位數字(如1234,9876)

答題得分者是:Fishman
hilda_a
一般會員


發表:2
回覆:1
積分:0
註冊:2007-03-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-23 17:39:49 IP:59.127.xxx.xxx 未訂閱
各位大大好,以下是我的程式碼,請大大們幫忙,哪個地方寫錯了?
謝謝願意點進來看的大大,感激不盡!

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,結果每次顯示的數字都不一樣,這是為什麼呢 ?
------
拉薩一隻狗
附加檔案:4603a065e607f_guess.rar
fatmoon1
初階會員


發表:3
回覆:29
積分:36
註冊:2004-05-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-24 21:24:21 IP:61.63.xxx.xxx 訂閱
我不太清楚 你程式是要達成那些功能
我只以目前程式來說
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-26 08:56:29 IP:59.124.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-29 22:41:50 IP:59.127.xxx.xxx 未訂閱
很感謝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大大的回覆呀

------
拉薩一隻狗
系統時間:2024-03-29 10:18:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!