• ベストアンサー

If分の記述???

1~31までの数字のうち、重複しない5つの数字をランダムに選び出し、ページ表示させるプログラムを作っているのですが、どういう訳か、最初のIf分の箇所が構文エラーでひっかかるんです。 一体、記述がどう間違っているんでしょうか? PerlCGIはまだまだ初心者なので、どなたかHelpMe!(T_T) #! c:/perl/bin/perl #----------------------------------------数字生成 for ($i = 0; $i < 5; ++$i) { #重複確認フラグリセット $j = 0 while ($j = 1) { #数字を選ぶ $NUM = int(rand 31) + 1; #重複チェック #1個目確認処理なし if ($i == 0) { ++$j; } #2個目確認処理 elsif ($i == 1) { if ($Res[0] != $NUM) { ++$j; } } #3個目確認処理 elsif ($i == 2) { if ($Res[0] != $NUM and $Res[1] != $NUM) { ++$j; } } #4個目確認処理 elsif ($i == 3) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM) { ++$j; } } #5個目確認処理 elsif ($i == 4) { if ($Res[0] != $NUM and $Res[1] != $NUM and $Res[2] != $NUM and $Res[3] != $NUM) { ++$j; } } } #値代入 $Res[$i] = "$NUM"; } #---------------------------------------ページ出力 print qq(Content-type: text/html; charset=Shift_JIS\n\n); print qq(<HTML>\n); print qq(<Head><Title>Test</Title></Head>\n); print qq(<Body><Center><P>数字は...<BR><Big>\n); for ($i = 0; $i < 5; ++ $i) { print qq($Res[$i]<BR>\n); } print qq(</Big>です。</P><Center></Body></HTML>\n);

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

すみません、訂正をしておりながらさらにミスがありました。 >あのぅ、教えて頂いた記述でちゃんと動いているようなのですが、 ランダム数の範囲が広いので一見まともに見えるだけです($Res[0]としか比較してないので)。 rand 6 にして試せば、駄目なのが分かります。 >インクリメントする$って、$jの事でしょうか? $kです。ちょっと考えた限りでは、もう一個変数を使わないと全ての要素との比較が出来ないと思いました。真剣に考えれば、もっと旨い手があるかも。 >こんなに、シンプルなソースに出来るんですね!! >ついついif文でガリガリ作ってしまって、こっそり >「ややこしくなっちゃったな」って思ってました(^^ゞ 可読性が悪いといいながら、こちらも短いわりに結構ややこしいですけどね。 ただ、この手やり方はわりとよく使いますし、コメントでも入れとけば、何をやってるかは後からでもすぐ分かります。 で、責任とって修正版です。ミスやもっと簡単な方法があるかも知れないので、あとはご自身で、おっかけて、ノーテクと非難してください。(^^; for ($i = 0; $i < 5; ++$i) { $j = 0; #要素数 while ($j <= $i) { # ココ $NUM = int(rand 31) + 1; $flg = 1; for ($k = 0; $k <= $j; $k++) { # ココ print "$i:$j:$k\n"; # 表示して動きを確認 if ($Res[$k] == $NUM) { $flg = 0; last; # ココ 一致してたら残りの比較はヤメ } } if ($flg) { $Res[$i] = $NUM; ++$j; } } }

Kalen_F
質問者

お礼

有難うございますー!! 追っていくうちに、頭の中がだんだんグルグルしてきたのですが、頑張って仕上げていきます!(^^)

その他の回答 (4)

回答No.4

#3です。 御免なさい、どっかで $をインクリメントするルーチンを作ってください。

Kalen_F
質問者

お礼

こんなに、シンプルなソースに出来るんですね!! ついついif文でガリガリ作ってしまって、こっそり「ややこしくなっちゃったな」って思ってました(^^ゞ 有難うございます!!(^^)

Kalen_F
質問者

補足

あのぅ、教えて頂いた記述でちゃんと動いているようなのですが、インクリメントする$って、$jの事でしょうか?

回答No.3

#1,#2を合わせると動きます。 さらに余計なことですが、 5個だからまだいいけど、10個、20個必要になった場合大変ですよね。 そうなると可読性が良くないし、n個作れるように工夫した方が良いと思います。 方法はいろいろあるし、やっつけなのであまりよくありませえんが、↓こんな方法もあります。 for ($i = 0; $i < 5; ++$i) { $j = 0; while ($j < 5) { $NUM = int(rand 31) + 1; $flg = 1; $k = 0; if ($Res[$k] == $NUM) { $flg = 0; } if ($flg) { $Res[$i] = $NUM; ++$j; } } }

noname#151446
noname#151446
回答No.2

余計なことですが > while ($j = 1) 無限ループになってしまいます。。。

  • infinity
  • ベストアンサー率41% (123/295)
回答No.1

まだ全部は見てないですけど、 #重複確認フラグリセット $j = 0 ↑セミコロン忘れてますが、  これはここに入力する時に欠落?(^^;

Kalen_F
質問者

お礼

ついつい、忘れていたようです。 有難うございます(^^)

関連するQ&A

専門家に質問してみよう