• ベストアンサー

do-while文について

参考書を読んでいて分からないところが有りました。 「配列aの値を先頭から見ていき、その値が-1になるま配列bにコピーしていく。そのとき-1という値もコピーする。という処理をするものです。-1という値もコピーするため、このループは最低1回は実行されることになります。 i=0; do{ b[i]=a[i]; }while(b[i++]!=-1); 」 この場合、a[0]が-1のときにはb[0]に-1がコピーされるかもしれませんが、そうでない場合は「そのとき-1という値もコピーする。」というのは出来ないと思うのですが、どなたかご教授宜しくお願いします。

noname#100914
noname#100914

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

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

質問のプログラムを文章で書くと、 (1)i=0を実行する。 (2)a[i]をb[i]にコピーする。 (3)b[i]が-1なら、i=i+1を実行してループを抜ける。 (4)そうでなければ、i=i+1を実行して(2)へ飛ぶ。 となりますね。 これでお分かりのように、コピーして判定してからiを増やしています。 だからTEXTのストッパー(-1)は、必ず(余分に)コピーされます。 このやり方は可変長のTEXTのコピーでよく使われます。 (コピー先にもストッパーをつけておくためです)

その他の回答 (2)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

while(b[i++]!=-1); i++と書くと、i の値が参照されたあと i += 1 が実行されるため、b[i] == -1 も問題なくコピーされます。 while (1) {  b[i] = a[i];  if (b[i] == -1) break;  i++; } と同義です。

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

参考書が悪いのか貴方の解釈が悪いのかどっちと言われると??な気もしますが 例題の処理は配列Aの内容を配列Bに代入するロジックよね? 但し終了条件はb[i++]!=-1の時ですからa[i]に-1が入っている所まで代入しますよ。 例えば a[]={1,10,3,-1,5} とする時bには b[0]=1 b[1]=10 b[2]=3 b[3]=-1 となります、b[3]に-1が入っていますよね? だから「そのとき-1という値もコピーする」という但し書きがかかれているのです。 おわかりになりましたか?

関連するQ&A

  • 【FORTRAN77】DO WHILE文 これで正しいの?

    まったくさわったことのないFORTRAN77の解読をさせられています。 次のような場合はどうなるのでしょうか? コンパイル・実行できる環境がないので、教えて下さい。 データ数5の実数型配列をA(5)とする。 マイナスのデータは必要ないので、データ数を、今の5つから、マイナスデータを引いた数字に変更したい。 (ここでは、データ数のみを変更するものとします) N = 5 A(1) = -3. A(2) = -5. A(3) = -1. A(4) = 5. A(5) = 3. の時、次の使い方は正しく動くの? DO WHILE (A(N) .LE. 0.) N = N - 1 END DO 最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 Nが4になる。 次のWHILEループ ・N = 4になったから、A(4)を見る? ・それともちゃんと順番にA(2)を見る? WHILEループが終わったら、ちゃんとN = 2になっている?

  • do - while文

    こんにちは、tomokooです。 下記の様にソースを書きました。 rsはResultSetです。 ---------------------------- while(条件A){   処理; rs.next(); } while(rs.next()){   処理; } ---------------------------- うまくプログラムは動いたのですが 結果を見て1行飛ばされることに気づきました。 だから ---------------------------- while(条件A){   処理; rs.next(); } do{   処理; }while(rs.next()}; ---------------------------- としたところ、処理の中の rs.getString(i); //iは初期化済み で落ちてしまいます。 whileでよくてdo-whileでだめなことってあるんですか? 結構困ってます。 ご存知の方はよろしくお願いします。

  • do while文の条件

    do while文の条件にprintfを使う場合、これはありなんでしょうか? 内容:0が入力されていたら、whileのprintfを実行してからdoに戻る。0以外ならprintfを実行しないで処理を抜ける。 int i; do { printf("0以外の数字を入力してください。\n"); scanf("%d",&i); }while(i == 0 && printf("まじめに入力してください。\n"));

  • do~while文がよくわかりません

    今参考書で勉強しているのですが、do~while文がよくわかりません 。コードは下記のようになります。どうして前の処理結果が足されていくのか理解できません。こんな馬鹿にどうかわかりやすくご教授していただけないでしょうか!? <?php $s = $i = 0; do{ ++$i; $s += $i; }while($i < 10); print "1 から $i までの和は $s"; ?>

    • ベストアンサー
    • PHP
  • do while

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

  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • 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とFor文の脱出処理について

    はじめまして。 VBについて素朴な質問なのですが For…Nextから抜けるにはExit for を使いDo…Loopから抜けるにはExit Doを使用しますが以下の場合はFor文の中でExit doを使用するのは可能なのでしょうか? Do while(条件) for i=1 to 12 if 条件 then exit do end if 処理1 next i 処理2 loop 本来ならfor文の中ではExit forを使用しますがfor文はDo while文 の中に含まれていますのでExit doでも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • BShell 動的配列のループ処理について

    動的に変数名を作成した配列について、ループ処理を行う場合、どうしたらいいでしょうか 以下のような処理を書いたのですが、駄目でした。 a=0 while [ ${a} -ne 10 ] do     eval $(printf TEST%02d $a)=(aaa bbb ccc) #TEST00 - TEST10の配列が作られる。     # TEST00 - TEST10の配列の中身にたいして処理を行いたい。。。     for (( I=0; I < ${#`eval $(printf TEST%02d $a)[@]`}; ++I )) # エラー     do         // ここで処理したい・・・     done done いいアイディアがありましたらご教授よろしくお願いいたします。