• ベストアンサー

do-while文での無限ループ?

こんにちは。 いつもお世話になっております。 現在Perlを使用してプログラムを組んでいますが、無限ループになってしまうらしく、次の画面に遷移しません。 @selected2には最大10個までの要素が入ります。(要素数は都度違う) その要素の中から$carno以外の要素を1つ選びたいのですが、このプログラムだとうまく動きません。 do-whileを取るととりあえずは動くので、条件の所が間違っているようなのですが、どう考えても正しいような気がします。 do{ if($ransuu==0){ $ransuu=int rand(11); } for($k=1;$k<=$a;$k++){ if($selected2[$k]==$ransuu){ $second=$ransuu; } } }while($ransuu==$carno || $second!=$ransuu); アドバイスをよろしくお願いいたします。

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

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

$a って何だろうとかいろいろあるんだが・・・ @temp = grep {$_ != $carno} @selected2 ; $second = $temp[int rand(scalar @temp) + 1]; ってことでしょうか? @selected2の要素のうち,$carnoと一致しないものからなる 配列をつくり,その配列の任意の要素を取り出せばいいんですよね 質問のコードだと 1から10までの乱数$ransuuをとって, @seleted2の要素で$rasuuと一致するものを探す となってますが? 配列の要素とインデックスが混じってませんか? 余計なおせわかもしれないけど for($k=1;$k<=$a;$k++) は for $k (1..$a) の方がPerl的で見やすいでしょう 後置のdo-whileも避けた方がたぶんメンテナンスしやすいです. あとPerlでは$aと$bは特別な用途で使われることがあるから 避けた方がいろいろ無難です.

love_sen
質問者

お礼

kabaokabaさん どうもありがとうございます。 無事動きました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.4

>$second = $temp[int rand(scalar @temp) + 1]; うわ,まちがった(^^;; $second = $temp[int rand(scalar @temp)]; ですね.

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

その書き換えは, おそらく全然本質じゃないと思う. ところで, 最初の if 文はどういう意味なの?

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

厳密な条件じゃないけど, $ransuu が 0 でなくかつ @selected2 の中に入っていないと無限ループになる可能性があります.

love_sen
質問者

補足

Tacosanさん 早速のご回答ありがとうございます。 以下のように書き換えましたら無限ループはなくなりました。 while($ransuu==0 && ($ransuu==$carno || $second!=$ransuu)) ですが、思うように動きません。 $ransuu==$carno でも $second!=$ransuu でもdo-while文から抜けてしまい、@selected2の要素以外や$carnoの値も$secondに入ってしまいます。 何かおかしいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • while文と無限ループの違い

    はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

  • java eclipse do-while文

    計算問題のプログラムです。No…0を選択したときにwhile文から抜け出したいです。 抜け出せない原因と解決方法(プログラム)を教えていただけるとありがたいです。 package lesson5; import java.util.Random; import java.util.Scanner; public class MentalArithmetic { static Scanner stdIn = new Scanner(System.in); static boolean confirmRetry(){ int cont; do{ System.out.print("もう一度?<Yes・・・1/No・・・0> : "); cont = stdIn.nextInt(); }while (cont != 0 && cont != 1); return cont ==1; } static void mondai1(){ Random rand = new Random(); do{ int p = rand.nextInt(900) + 100; int q = rand.nextInt(900) + 100; int r = rand.nextInt(900) + 100; while(true){ System.out.println(p + "+" + q + "+" + r + " = " ); int k = stdIn.nextInt(); // if(k == p + q + r) // break; System.out.println("違いますよ!!"); } }while (confirmRetry()); } public static void main(String[] args) { System.out.println("暗算力トレーニング!!"); while (true) { mondai1(); } } }

  • do while

    do whileの文で do{… }while(c!=1 && c!=2 && c!=3); つまり1,2,3以外の数字を入力した場合はループするようにしました。…は無限ループしないようにしています。実際1,2,3以外の数字を入力しても無限ループしません。しかし、数字以外の文字を入れてしまうと、無限ループします。%dがいけないのでしょうか?初心者ですので分かりやすくよろしくお願いします。多分これだけじゃ情報不足だと思うので、足りない情報があれば言ってください。すぐに書き込みます。

  • perlのdo-while文で抜け出せない 

    perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが   eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら   while(1)にしてlastで抜けるようにすると   code2ではeで抜け出すことができるように   なりましたが、   do~while(1)にしたcode3では、  「Can't "last" outside a loop block at …」C   というエラーが発生します。   code2とcode3はwhileがdo~whileになって   条件を見る位置がループの始めか終わりの   違いだけなのに、なぜ、code2ではOKで、   code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) {  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)

    • ベストアンサー
    • Perl
  • Do whileでExitせず、ループの最初に戻る方法

    よろしくお願いします。 環境 Excel 2003 Do whileのループ内で、Exitのような記述方法で、ループの最初に戻る方法はありますでしょうか? イメージは以下のような形です。 Sub hoge() r = 0 rr = 5 Do While r < 6 'ここに戻る If r = 3 Then 'ここでDo while の最初に戻る End If Loop End Sub よろしくお願いいたします。

  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • クイックソートにおける、while文の無限ループの可能性と配列数を越えるケースについて

    以下は河西朝雄氏:著の 「C言語によるはじめてのアルゴリズム入門」 からのコードを、値をアレンジしてみたものです。 #include <stdio.h> void quick(int *,int,int); #define N 5 void main(void) { static int a[] = {5,3,1,4,2}; int k; quick(a,0,N-1); for(k=0;k<N;k++) printf("%4d",a[k]); } void quick(int a[],int left,int right) { int s,t,i,j; if(left<right){ s=a[left]; i=left; j=right+1; while(1){ while(a[++i]<s); while(a[--j]>s); if(i>=j) break; t=a[i];a[i]=a[j];a[j]=t; } a[left]=a[j];a[j]=s; quick(a,left,j-1); quick(a,j+1,right); } } (昇順で並べる場合に)今回のように 「軸として設定する先頭要素が、最大の数値」だった時、インデックスiを用いて軸の要素以上の数値を 探索していくことにした際、While文の「while(a[++i]<s);」のところは「下手をしたら無限ループ的に、延々と走査していくことになる可能性もアリなのでは…?」と思えるのですが…? ボーランド社フリーコンパイラにて 実行し、数値を表示させ確認してみたところ 当方環境下にての最初のiの探索のところは 「a[i]=6566949 iの値=5」となりまして、 この「i=5の箇所はナル文字の箇所のはず…?」と思い、 何故このような扱いとなるのか、わかりません。 ちなみに、配列として渡す引数の中身を 先頭を最小値、降順に並ぶように コードを変えてもやってみましたところ、 最初のiのところは 「a[i]=-2037199742 iの値=7」となりまして、 完全に配列のインデックスとして用意したものを 越えてしまい…何か、釈然としない感じなのです…。 よろしくお願い致します。

  • 無限ループに陥ります

    プログラム中の以下の部分で無限ループに陥ってしまいます while(*a != EOF){ *a = fgetc(fi); if(*a == 32){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } } fiに読み込んでいるファイルの末尾はこんな感じです。 50 49 0 34 34 34 34 34 34 34 34 34 34 34 34 50 49 0 68 68 68 51 51 50 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 [EOF] どなたか分かる方お願いします。

  • jspで無限ループ

    jspやサーブレット、或いはaspのプログラムの中で無限ループになった場合、例えば while(true){ ・ ・ ・ } のように。 そのプロセスはどうなるのでしょうか? ブラウザを閉じた瞬間に止まるのでしょうか?

    • ベストアンサー
    • Java
  • while doについて

    九九の表で、forの2重のプログラムは作成できたのですが、whileとdo~whileを使って書き直すやり方がわからないのです。 どうか教えてください。お願いします。 #include <stdio.h> main() { int i,j; for(j = 1; j <= 9; j++){ for(i = 1; i <= 9; i++) printf("%3d", j*i); printf("\n"); } }