• ベストアンサー

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

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

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
noname#77845
noname#77845
回答No.1

判らないのは、「Do~While」文ではなく、演算子や変数ではないのですか? ++$i; は、$iをインクリメント(+1)しています。 $s += $i; は、別の書き方をすると $s = $s + $i; になります。 $iをインクリメントしていきその値を$sに足し込んでいるので、最初のループでは $s=$s+1; ($s=0+1); で$sには1が代入されます。 二回目のループでは $s=$s+2; ($s=1+2); で$sには3が代入されます。 これを$iが10未満の間続けるのが「Do~While」文のところです。

kjfcaoi
質問者

お礼

ありがとうございます。 そういえば、イマイチ$s += $i;のことがわかっていませんでした。 本にも$s = $s + $i;と書いていたのですが・・・・何となくよくわかりませんでした。何となく理解したつもりではいたのですが、本当は何もわかっていなかったんですね。ループだから2回目は1回目の続きになっていると思って良いのですね。

その他の回答 (2)

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.3

こんにちは。  …さて、このプログラムで変数「$s」に数値が足し込まれていく理由ですが、 じゃあ、実際に我々がコンピュータになったつもりで、変数の値を追いかけてみることにしましょうか(以下、文字が見やすいように全角文字で書いていきます)。  このプログラムは、 ++$i; … 変数「$i」の値に1を加え、それを新たに「$i」の値とする。 $s+=$i; … 変数「$s」の値に変数「$i」の値を加え、それを新たに「$s」の値とする。 という手続きを、9回繰り返すというものですよね。そうすると ------------------------------------------------------------------------------          左側の実行文を実行した結果、 実行文      $iの値は   $sの値は (1回目) ++$i;      1 $s+=$i;           1(0+1) (2回目) ++$i;      2 $s+=$i;           3(2+1) (3回目) ++$i;      3 $s+=$i;           6(3+3) (4回目) ++$i;      4 $s+=$i;          10(6+4) (5回目) ++$i;      5 $s+=$i;          15(10+5) (6回目) ++$i;      6 $s+=$i;          21(15+6) (7回目) ++$i;      7 $s+=$i;          28(21+7) (8回目) ++$i;      8 $s+=$i;          36(28+8) (9回目) ++$i;      9 $s+=$i;          45(36+9) ------------------------------------------------------------------------------ という感じになります。あくまでも ご参考までに。

kjfcaoi
質問者

お礼

長々と書いてくださってありがとうございます。 やはり$s+=$i;の解釈がまったくできていなかったです。ありがとうございました。

  • Redpython
  • ベストアンサー率56% (9/16)
回答No.2

こんにちは。 わたくしも edomin2004 殿のコメントと同じで、なぜ結果が足されていくのかが分からないのならば、do while 文の理解ではないでしょう。 edomin2004 殿のアドバイスをお読みになった後に、わたくしのコメントをお読み下さい。 <while 文の処理順序> while (判断) { 処理; } この場合、常に ”判断”にパスしているのなら、下記のような順序で動きます。 判断 1回目 処理 1回目 判断 2回目 処理 2回目 …… <do while 文の処理順序> do { 処理; } while (判断); この場合、常に ”判断”にパスしているのなら、下記のような順序で動きます。 処理 1回目 判断 1回目 処理 2回目 判断 2回目 …… つまり、while 文とは、まず ”判断”を行い、それに通過したら ”処理”に進めます。 一方、do while 文は、まず ”処理”を行い、次に ”判断”をしてもらうという訳です。

kjfcaoi
質問者

お礼

う~ん、その部分はOK!なんですよ。 やはり足されることに納得いかなかったんです。 回答ありがとうございました。

関連するQ&A

  • 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文について

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

  • 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でも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。

  • 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'); }

  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • java while文です。教えてください(__)

    public class mondai2{ //プログラム開始 public static void main(String args[]){ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int i; int ans=0; int seikai=0; for(i=0;i<5;i++){ try{ { Random ran = new Random(); int num1 = ran.nextInt(8)+1; int num2 = ran.nextInt(8)+1; ans = num1*num2; System.out.print("問題"+(i+1)+":"); System.out.print(num1 + "×" +num2 + "="); String s =in.readLine(); seikai = Integer.parseInt(s); if(seikai==ans){ System.out.println("正解"); }else{ System.out.println("不正解"); } } }catch(IOException e){ System.out.println("エラー"); } } } } このプログラムをwhile文か、do while文にして正解が出るまで問題が出続けるようにしたいんですけど、まったくわからなくて困っています>< 教えてください(+o+)

    • ベストアンサー
    • Java
  • sendmailの$bodyの中にwhile文

    php 初心者です sendmailでメール配信文を作っています。 配信はできたのですが、発信者の「発信しました」通知メールに 配信リストを掲載して送信したいと思っています。 そこでmb_send_mailの$bodyの中にwhile文を書こうと思って下記のように書いてみたのですが 当然ながら動きません。 下記のように$body = <<<EOM  EOM;の中にwhile文を書けるのでしょうか? 書けるとしたらどのように書いたら宜しいのでしょうか? またはどのようにしたらwhile文で取得する配信リストをメールの中に入れることができますか? ご教授よろしくお願い致します。 $body = <<<EOM while ($i = mysql_fetch_array( $result)) { echo $i['name']; ;} EOM;

    • ベストアンサー
    • PHP
  • 【シェル】while文の変数定義について

    OS:Solaris10 sh:Bシェル お世話になります。 シェルの冒頭で定義した変数をwhile文の中で読み込ませたいです。 現状のシェルは下記の通りです。 ---- #!/bin/sh # *** 変数定義 *** AAA1=Spring BBB1=Summer AAA2=Autumn BBB2=Winter # *** メイン処理 *** i=1 while [ $i -le 2 ]; do AAA=AAA$i BBB=BBB$i echo ${AAA} echo ${BBB} i=`expr $i + 1` done ---- しかし、出力される結果は下記のようになってしまいます。 AAA1 BBB1 AAA2 BBB2 これを冒頭の「*** 変数定義 ***」で定義した値を読み込ませ、下記のような出力結果を得たいです。 Spring Summer Autumn Winter どうかご教授ください。

専門家に質問してみよう