• ベストアンサー

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);

  • CGI
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
回答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

  • 記述の意味がわかりません

    ソースの中で次のように書かれていました。 for($i=$start_num ;$i<=$start_num+($j>9?9:$j - 1); $i++){ $i<=$start_num+($j>9?9:$j - 1);の部分はどのような処理を意味しているのでしょうか? 教えてください。

    • ベストアンサー
    • PHP
  • 指定したファイルがあるかどうかの確認

    指定したファイルがフォルダ内にあるかどうかを調べるために以下のようにしました。 #フォルダ内の確認 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } #指定したファイルがあるかどうかの確認 for($i=1;$i<3;$i++){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if('$i.jpg' eq '$F'){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50></TD>\n"; print "<FONT COLOR=RED>★</FONT><BR>\n"; #$i=$i+1; } elsif('$i.jpg' ne '$F'){ print "$i.jpg $F<BR>\n"; }#if } #for $n } #for $i ですがすべて「違う」となってしまいます。 どこがダメなのでしょうか? ※perlです。

    • ベストアンサー
    • CGI
  • UPDATEの記述について

    お世話になります。 最近ようやく少しはPHPやMySQLに慣れてきたと思ったんですが・・・・ やはりまだまだで、UPDATE文で躓いています。 ---------------------------------------------------------- $up = "UPDATE DB名 SET check= '1',staff='$staff' where id='$idg' AND code='$codeg' AND shop='hoge'"; $rs = mysql_query($up); if($rs){ print "$idg $codeg $staff が検品処理実施<br>"; } else{ print "$idg $codeg $staff が書き込みNG\n<br>"; } ---------------------------------------------------------- 上記の記述はおかしいのでしょうか? 同じような記述で別のphpは動いているのですが・・。 何が原因かわからず悩んでいます。特に間違った記述をしてるとは 思えないのですが。 試しに変数を明示的にしてやってみても、やはりUPできないでした。 UPDATEの記述をする際、一番気をつけることは何でしょうか?? またどうすればうまくアップ出来るか・・・ よろしくお願いします。

    • ベストアンサー
    • PHP
  • if文で、上手く表示されない

    お世話になります。 PerlのBBSを改造中です。 きちんと勉強してはいませんが、なんとなく弄ることは出来るレベルです。 今、ifで、表示の変更をしているのですが、上手く行かなくて困っています。 お分かりになる方、 何らかの原因に心当たりのある方、 どうぞよろしくお願いします。 ★━━━━━━━━━━━━━━━━━━━━★ データを入れているdatファイル内、 $astrologyというのに、「*Leo*」というのが格納されています。 …で、 if(!$astrology){ print "入ってない\n";} else{ print "入ってる\n";} …と入れると、「*Leo*」というデータが入っているわけなので、 「入ってる」と、表示されます。 ですが、 if($astrology == "*Aries*") {print "おひつじ座 <br />$astrology \n";} elsif($astrology == "*Leo*") {print "しし座 <br />$astrology\n";} else{print "その他<br />$astrology\n";} ・・・と、書いてみると 「 おひつじ座 *Leo* 」 と表示されます。 「*Leo*」と表示されているので、呼び込めていない訳ではないと思うのですが…。 ★━━━━━━━━━━━━━━━━━━━━★ 何が原因かわからないので、ちょっとしたアドバイスでも構いません。 ご返答よろしくお願いします。

    • ベストアンサー
    • Perl
  • アスタリスクでダイヤ型を作る

    アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが 実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか? 実行例と私が作ったプログラムの実行データを画像に添付しました。 #include <stdio.h> int daiya( int i, int j, int Num ){ if( j<= i+Num && j<=-i+Num && j>= i-Num && j>=-i-Num ){ return 1; } } int main(){ int i, j, n; do{ puts("数字を入力:"); scanf( "%d", &n ); if(n<2||n>9){ printf("入力エラーです。もう一度入力して下さい\n"); } }while(n<2||n>9); for( j=-n/2; j<=n/2; j++ ){ for( i=-n/2; i<=n/2; i++ ){ if( daiya( i, j, n/2 ) == 1 ){ putchar('*'); } else { putchar(' '); } } putchar('\n'); } return 0; }

  • Double.parseDoubleの使い方

    Java初心者です。 以下のブログラムをコマンドライン引数が実数の場合に処理できるよう にしたいのですが、うまくいきません。どうしたらいいでしょうか? 申し訳ありませんが、ご回答、よろしくお願いいたします。 public class Narabikae { public static void main(String[] args) { int i = 0, j = 0, k = 0; double[] num = new int[args.length]; for(i = 0; i < args.length; i++) { double num[i] = Double.parseDouble(args[i]); } if (0 < args.length) { for(j = 0; j < args.length-1; j++) { for(i = j + 1; i < args.length; i++ ) { if(num[j] > num[i]) { k = num[j]; num[j] = num[i]; num[i] = k; } } } for(i = 0; i < args.length; i++) { System.out.print(num[i]); if (i != args.length-1) { System.out.print(" ⇒ "); } } } else { System.out.println("並び替えできません。"); } } }

    • ベストアンサー
    • Java
  • フリーCGI ラジオボタンの改行についてです。

    色々調べましたが、どうしても分からなかった為質問させて頂きます。 http://cgikon.com/search/detail.php3?cgi_id=308 こちらのフリーCGIをお借りして、アンケートを作成することになりました。 質問は、ほぼラジオボタンによる3択です。 デフォルトだと、ラジオボタンは横並びになっているのですが 質問内容が長過ぎるため、見づらくなってしまいます。 その為、ラジオボタンを添付画像のように改行したいと思っております。 おそらく、下記のどこかを変更すればいいとは思うのですが 分かりませんでした…。 # アンケート質問の表示 my($number) = 0; foreach (@question) { ($qtype,$qname,@column) = split(/\t/); next if($qname eq ""); $number++; $key = "Q".$number; print qq! <TR> <TD NOWRAP VALIGN="top"><B>【質問$number】</B></TD> <TD>$qname</TD> </TR> <TR> <TD> </TD> <TD> !; if($qtype =~ /LISTBOX/i) { print qq!<SELECT NAME="$key" SIZE=1>!; foreach (@column) { next if(!$_); print qq!<OPTION VALUE="$_">$_!; } print qq!</SELECT>!; } elsif($qtype =~ /RADIO/i) { foreach (@column) { next if(!$_); print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$_">$_!; } } elsif($qtype =~ /TEXTAREA/i) { print qq!<TEXTAREA NAME="$key" COLS=50 ROWS=5></TEXTAREA>!; } elsif($qtype =~ /TEXTBOX/i) { print qq!<INPUT TYPE="text" NAME="$key" VALUE="" SIZE=50>!; } print qq! </TD> </TR> !; } 配布元のサイト様が今月末で閉鎖される為 それに伴い、個別でカスタマイズなどの依頼対応も出来ない状態です。 申し訳ございませんが、どなたか詳しい方 ご教授頂ければ幸いです。どうか宜しくお願い致します

    • ベストアンサー
    • CGI
  • 重複しないランダム関数を教えて下さい!

    よろしくお願いします。 100個の数字から20個の数字を重複なしで抽出したいと思っております。 以下、悪戦苦闘して作成したphpなのですが、重複が目立ちます。 array_unique関数を使用してみたのですが、どうも上手く行かない上体です。 お分かりになる方、是非ご指導下さい。 <?php for ($i=0; $i<20; $i++) { $num = mt_rand(0,100); echo "$num"; echo "<br>\n"; } ?> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字の入り方について

    簡略化していますが、下記のようなプログラムを作成しました。 whileでループし、カウントをとって。 sql文を作成するプログラムです。 $i=0; $j=0; while(!feof($this->fp)){ if($i>=2){ $sql_insert .="INSERT INTO "; $sql_insert .= $sql_value[$i]; $sql_insert .=";"; } $this->num=$j-1; print("<BR>"); print($i); print($sql_insert); $i++;; } この場合、$iは2以上回らないはずなのですが、 print($sql_insertを出力すると、 INSERT INTO (値);INSERT INTO (何も値が入ってない); という結果になります。 if($i>=2)という場合は 2よりも大きい場合はこの処理内をとおるということですよね? 実際は$iは2までしか回っていないのに、何故$sql_insertは余計に表示されているのでしょうか?

    • ベストアンサー
    • PHP
  • FORMから指定したファイルのリネームについて

    こんにちは! Perlの初心者です。 以下のプログラムは FORMから指定したファイルのリネームをやろうと思い、 途中まで作ったものです。 しかし、実行するとFORMは出来ているのですが、 リネームは行なわれません… print "Content-type:text/html\n\n"; print qq(<html>\n); print qq(<body><h1>ファイル名登録</h1>\n); print qq(<form action="$ENV{'SCRIPT_NAME'}" method="POST">\n); print qq(変更前:<input type="FILE" name="$user1"><br>\n); print qq(変更後:<input type="FILE" name="$user2"><br>\n); print qq(<inupt type="subimt" value ="登録">\n); print qq(</form>\n); print qq(</body>\n); print qq(</html>\n); rename ($usesr1,$user2); exit; 多分、FORMで指定したファイル名($user1,$user2)が、 renameの関数まで届いて無いからだと思うのですが… ここまでやって完全にお手上げになってしまいました。 どうしたらリネーム出来るか、分かる方ご指導宜しくお願い致します。 動作環境は、Windows98 or MEで、Internet Explorerを使っています。

専門家に質問してみよう