• ベストアンサー

objective-cの多重ループbreak

objective-cの多重forループの内側でbreakすると外のforまで抜けるようです。 では、内側のforだけ抜けて外側のforの中に戻るにはどう書けばいいのでしょうか? あと、この件について、c言語とobjective-cの文法の違いについて教えていただけるとうれしいです。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

プログラムの流れを見るなら、一行ずつではなく、ある程度の機能でわけて考えるといいでしょう。 for (int i=0; i<4; i++) {  //乱数を発生  for (int j=i-1; j>=0; j--) {   if (重複があったら) {    i--;    break; // →ループを抜け(a)へ   }  } // →ループを抜けた先(a)  //イメージファイル名を作る } こうすれば、「イメージファイル名を作る」のは、重複があっても毎回実行されていることがわかりやすいと思います。 あとは、デバッガでのステップ実行とか、printf使うとかで、実行の流れと変数の中身を確認すればいいでしょう。 余談。 このシャフル、(疑似)乱数列によっては無限ループになる可能性もあります。 http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95#.E7.9F.AD.E6.89.80 そうでなくとも、何回もループする可能性があり、非効率的です。 「シャフル アルゴリズム」で検索するといろいろと出てます。 randomNumberに順番に記録されているのですから、「乱数を作りながらファイル名も作る」のではなく、乱数発生とファイル名作成を別のループにするのがよいでしょう。

その他の回答 (3)

回答No.3

breakしたときに、提示されたソースの > //イメージファイル名を作る > NSNumber *imageNumber = [NSNumber numberWithInt:randomNumber[i]]; > NSString *imageNumberString = [imageNumber stringValue]; > NSString *imageFileName = [@"image" stringByAppendingString:imageNumberString]; > selectedImageFile[i] = [imageFileName stringByAppendingString:@".jpg"]; の部分を処理するかどうかという話なら、処理するでしょう。 処理せずにループを続行したいなら、continueを使うなどする必要がありますから。 無駄な処理をしていると思うのであれば、回避するようにコードを書けばいいのです。 このソースを記述した人は、大したことじゃないと思ったか、そこまで考えが及ばなかっただけです。

baaaaaaaaan
質問者

補足

>このソースを記述した人は、大したことじゃないと思ったか、そこまで考えが及ばなかっただけです。 ソース自体は教本といえど十分なものはないと認識しています。が今回は、ソースの説明文の記述までも語弊があったのが災いしたようですね。 今回の例だと、 randomNumber[0] =2 1.selectedImageFile[0]に image2.jpg ● randomNumber[1] =2(重複) 2.selectedImageFile[0]に image2.jpg(1つ前までやり直す) randomNumber[1] =3 3.selectedImageFile[1]に image3.jpg ● randomNumber[2] =0 4.selectedImageFile[2]に image0.jpg ● randomNumber[3] =2(重複) 5.selectedImageFile[2]に image0.jpg(1つ前までやり直す) randomNumber[3] =1 6.selectedImageFile[3]に image1.jpg ● のようになり、重複が発生しようとすると、一つ前のi、つまりi-1の処理を、前回i-1を処理した通りに再度処理するところから始めるということですね。 ありがとうございました。すっきりしました。

回答No.2

> もしbreakが1個外へ抜けると仮定すると、内のforを抜ける→下の文に移る で1個前のiの処理がやり直されてしまうことになり、本の記述とくいちがう。 i--でiが1つ前に戻る ↓ breakで内側のforを抜ける ↓ 外側のforの最後まで行くのでfor文に記述されたi++が実行される ↓ 外側のfor内の処理が行われる なので、ループ変数iに細工をして、同じiに対する処理を繰り返させているものです。なので、「1個前のiの処理がやり直されてしまうことになり」ではありません。

baaaaaaaaan
質問者

補足

>breakで内側のforを抜ける >↓ >外側のforの最後まで行くので 確認したいのですが、breakの直後は//イメージファイル名を作る//イメージを表示をスルーするということですか? つまり、 ・for文が1つだけしかないプログラムの場合、単にそのforをストップし、抜けて直下の文へ移るだけ。 ・for文が2重のプログラムの場合、内のbreakで内のforをストップし、抜けた後、『内のfor直下にある文は外のforの最終行まですべてスキップし』、外のfor文を続ける。 でよろしいでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

え? いくらなんでもそんな仕様にはしないと思うけど.... どんなプログラムで試したんでしょうか?

baaaaaaaaan
質問者

補足

srand(time(nil)); NSString *selectedImageFile[4]; int randomNumber[4]; for (int i=0; i<4; i++) { //乱数を発生 randomNumber[i] = rand() % 4; for (int j=i-1; j>=0; j--) { if (randomNumber[j]==randomNumber[i]) { i--; break; } } //イメージファイル名を作る NSNumber *imageNumber = [NSNumber numberWithInt:randomNumber[i]]; NSString *imageNumberString = [imageNumber stringValue]; NSString *imageFileName = [@"image" stringByAppendingString:imageNumberString]; selectedImageFile[i] = [imageFileName stringByAppendingString:@".jpg"]; //イメージを表示 //ImageView0.image = [UIImage imageNamed:selectedImageFile[i]]; } //イメージを表示 ImageView0.image = [UIImage imageNamed:selectedImageFile[0]]; ImageView1.image = [UIImage imageNamed:selectedImageFile[1]]; ImageView2.image = [UIImage imageNamed:selectedImageFile[2]]; ImageView3.image = [UIImage imageNamed:selectedImageFile[3]]; 以上が該当部分のソースです。画像ソースが4つあってそれがかぶらないように処理をするプログラムだそうです。 i=0だと内のforは偽、i=1~3で内のforに入りますがそこのifが真だとi--されてその時点の乱数(i番目の乱数)を取得し直されると本に書かれています。 これを私が今想像している内容は、 もしbreakが1個外へ抜けると仮定すると、内のforを抜ける→下の文に移る で1個前のiの処理がやり直されてしまうことになり、本の記述とくいちがう。 もしbreakが2個外へ抜けると仮定すると、外のforを抜ける→下の文に移る で画像を4つ表示できなくなる。 …わからなくなってきました。 もしbreakが1個外へ抜けてその抜けた先がfor文の中の場合、for文をやり直す? …混乱しています。 いただいた回答をみるとどこか私の勘違いの可能性もありそうですね。 ifが真だった場合のbreakの行の後の挙動を教えてください。

関連するQ&A

  • 多重ループの抜けだし方

    for文などの2重ループや3重ループの抜け出し方を教えてください。 breakは最も内側のループしか抜け出せないんですよね?

  • 多重ループの抜け方

    例えば2重ループで、内側のループと外側のループも抜けたいとき、 while(true){  boolean flag = false;  …  while(true){   if(/* ある条件を満たした時 */) {    flag = true;    break;   }  }  if(flag){ break; } } としているのですが、このループが3段、4段になるときもこのような方法しかないのでしょうか?C言語のgotoみたいなことはできないですよね・・? (goto自体使わない方がいいと言われていますが・・)

    • ベストアンサー
    • Java
  • Objective-Cで、while中にbreakを挟みたい

    Objective-Cで、while中にbreakを挟みたい 現在、自分はIphoneのプログラミングをしています。 一定時間ないに処理が終わらなかったらループを抜けるというような、プログラムを書こうとしているのでが、アルゴリズムがうまくおもいつきません。 ソースコードで説明させていただくと while(1) {   write(1, data, 10);   if(writeから一定時間、応答の処理がなかったら)   {      break;   } } このような処理を書きたいのですが、うまいアルゴリズムが思いつきません。 曖昧な質問ですが、何かいい方法はないでしょうか?回答をお待ちしております。

  • Objective-C習得について質問です。

    現在、情報系の専門学校に在籍しています。 ですが、私の学校は俗にいう名前だけ学校です、授業が基本的なことの繰り返しです。 授業ではJavaの文法の基礎を1年以上も繰り返しているため、Javaがあまり好きではありません。 個人的に、C言語を勉強し、最近Iphoneに機種変更したこともあり、iPhoneアプリ開発に挑戦しようと、Objective-Cを習得したいと考えています。 C言語→Objective-Cの流れで大丈夫でしょうか? それとも、C言語→C++→Objective-Cの流れの方がわかりやすいのでしょうか? また、持っているパソコンがWindowsなため、Macパソコン購入までの間、開発環境はUbuntuを仮想環境に入れてやろうと思っていますが、Eclipseのようなソフトはありますか? よろしくお願いします。

  • objective-cの変数結合について

    毎度お世話になります。 objective-cでのループ処理を利用したオブジェクトと変数の結合方法が分からなくて質問する事にしました。 私の検索方法が悪いのか見つからなかったので・・ phpでループを利用した変数の結合をする場合だと、 for($i = 0; $i < 2; $i++){ echo "com".$i; } でcom0とcom1の表現が問題なくいけますが、 objective-cではどのようになるのでしょうか。 初級的な質問で申し訳ないのですが、どうかよろしくお願いします。

  • XCodeでObjective-Cを使ってプログラミングしたい(初心者です)

    Macでプログラミングを始めました。でもすごく初心者です。 『XCode2 入門』という本で (http://www.amazon.co.jp/exec/obidos/ASIN/4839918805/250-8186511-3142616)、 XCodeの基本的な使い方を勉強しました。 が、(予想はしていたのですが)私はObjective-Cが分からないので、 ここから先に進めません。 Cについてはほんのちょこっとだけ知っていて、 forやwhileループは分かりますが、配列やポインタは…分かる、かな?ってぐらいです。 Objective-CもCが根っこにあると聞きますから、 Cの勉強がもっと必要なのかな?と思っていたのですが、 Objective-CはCとはぜんぜん違う、なんて話もあったり。 わたしはこれから、どういう勉強をしていくべきなのでしょう? また、それにあたっておすすめの本かウェブサイトを教えてください。 長くてすみません…。 OSはMacOS X 10.4、XCode 2.0でObjective-Cを使っています。 プログラミング経験はHyperCardだけです(←これなら得意)。

  • C言語における3重ループの定義についての質問です

    多重ループの定義について for文の中にfor文がある場合、多重ループになることはわかったんですが、 3重ループ以上の場合は for文の中にfor文があり、さらにその中にfor文がある時ですか? 例 for( ){ for( ){ for( ){ } } } それとも、for文が重なっている時のfor文の合計数ですか? (例えばfor文の中に別々のfor文が2つある場合) 例 for( ){ for() { } for( ){ } } 上手く説明できないんですが、よろしくお願いします

  • [Objective-c] NSlogとループ

    Objective-cの勉強を始めたばかりです。 ループ処理内のNSlogについて質問させてください。 下の方にあるソースコードにて実行すると、 何回かに1回なのですがループが最後まで回らずNSlogにて 最後まで出力されない。 ( 変数aの値は32です のように途中までしか出力されない、  一番最後までループすれば 変数aの値は1024です が出力されて  ループを抜けるはずです。) MacOSX10.7.4 Core i5 2.2GHz Xcode 4.3.2 そこで下記複数質問があります。 1.内部でどんなエラーが起こっているのでしょうか?  (メモリー確保・解放ができていない?   前回処理が完了する前に次の処理を実行しようとしている?) 2.下部ソースのコメントアウトにインターバル(sleepForTimeInterval)を  もうける処理がありますが、これをコメントはずして実行すると、  何度実行しても最後まで出力されるようになりました。  このような処理を入れるのが当たり前なのでしょうか? #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int a=1; for(;a<1000;a=a*2) { // [NSThread sleepForTimeInterval:0.005]; NSLog(@"変数aの値は%dです\n",a); } } return 0; } 以上、よろしくお願いいたします。

  • 入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか??

    入れ子ループで、外側のループ変数$_を、内側のループ内から使えるか?? ループ変数を指定しない場合、自動的に$_が使われますが、例えば、 BIG: for(0..9) { SML: for(0..9) { expr } } のようなステートメントを書いた場合、SMLループ内でBIGのループ変数$_を参照する手だてはあるのでしょうか? イメージ的には、 $BIG::_ とやれば、出来そうだと思ったのですがダメでした^^; ださいコードでスミマセン m(__)m;;

    • ベストアンサー
    • Perl
  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

専門家に質問してみよう