• ベストアンサー

プログラミングに関する質問

つい最近、Cの勉強を始めたばかりの初心者です。本を見ながら、自分で簡単なプログラムを作成、実行させている段階ですが、以下のプログラムを実行すると、出力される値が n2 = 0 となります。 自分の解釈が未熟でお恥ずかしいのですが、私の理解では、while (i++ < n2) の部分が、iが0から+1づつ足されていって、9 < n2(10) までなり、n2 -= i; が n2 = n2 - i で n2 = 10 - 9 で1となり、n2 = 1 となると思っていました。 お手数お掛けしますが、どなたか、素人の私にもわかるように専門用語も少なめでご説明頂けないでしょうか。   #include <stdio.h> int main(void) { int i, n2; i = 0; n2 = 10; while (i++ < n2) n2 -= i; printf("n2 = %d\n", n2); return 0; }

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

  • ベストアンサー
回答No.2

while文の前で iの値は0 n2の値は10 while文の最初の実行は while(0<10)となり成立 従ってiの値が1足されて iの値は1 n2-=iが実行されてn2の値は9 2回目のwhile文は while(1<9)で成立 従ってiの値が1足されて iの値は2 n2-=iが実行されてn2の値は7 3回目のwhile文は while(2<7)で成立 従ってiの値が1足されて iの値は3 n2-=iが実行されてn2の値は4 4回目のwhile文は while(3<4)で成立 従ってiの値が1足されて iの値は4 n2-=iが実行されてn2の値は0 5回目のwhile文は while(4<0)で不成立 従ってループを終了し n2の値は0 以上です。

buta3_2009
質問者

お礼

丁寧な回答ありがとうございます。よくわかりました。

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

その他の回答 (3)

noname#144013
noname#144013
回答No.4

こんにちは。 『百聞は一見に如かず』です。 ソースに、値検証用のprintf文を入れてみて、実際の実行中の変数の値を 出力するようにしてみたら如何でしょう? 以下は、そのサンプルソースです。 ■検証用ソース 注)インデント等のため全角スペースを入れています。 ========================= #include <stdio.h> int main(void) {   int i, n2;   i = 0;   n2 = 10;   printf( "== Check Start ==\n" );   printf( "Check-1: i=%2d, n2=%2d, [Before: Loop]\n", i, n2 );   while (i++ < n2)   {     printf( "Check-2: i=%2d, n2=%2d, [in Loop: Before: n2 -= i]\n", i, n2 );     n2 -= i;     printf( "Check-3: i=%2d, n2=%2d, [in Loop: After : n2 -= i]\n", i, n2 );   }   printf( "Check-4: i=%2d, n2=%2d, [After : Loop]\n", i, n2 );   printf( "== Check End ==\n" );   printf("n2 = %d\n", n2);   return 0; } ========================= <上記サンプルの実行結果> == Check Start == Check-1: i= 0, n2=10, [Before: Loop] Check-2: i= 1, n2=10, [in Loop: Before: n2 -= i] Check-3: i= 1, n2= 9, [in Loop: After : n2 -= i] Check-2: i= 2, n2= 9, [in Loop: Before: n2 -= i] Check-3: i= 2, n2= 7, [in Loop: After : n2 -= i] Check-2: i= 3, n2= 7, [in Loop: Before: n2 -= i] Check-3: i= 3, n2= 4, [in Loop: After : n2 -= i] Check-2: i= 4, n2= 4, [in Loop: Before: n2 -= i] Check-3: i= 4, n2= 0, [in Loop: After : n2 -= i] Check-4: i= 5, n2= 0, [After : Loop] == Check End == n2 = 0 ↑これを見て考えてみて下さい。 以上です。

buta3_2009
質問者

お礼

ありがとうございます。大変参考になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • BearCave
  • ベストアンサー率20% (189/909)
回答No.3

No.1です。 質問を読み返してみて、質問者さんが勘違いしている点が分かりましたので、再度回答します。 while (i++ < n2) n2 -= i; この部分は2つの独立した文ではなく、2行目はwhileの中の文です。以下と同じ意味です。 while (i++ < n2) {  n2 -= i; } 質問者さんはwhileが終了してから次の「n2 -= i;」へと進むと勘違いされているようですので。そうしたい場合、記述はこうなります。 while (i++ < n2); n2 -= i; ちなみにこの場合のプログラムは、「i」が10になった時点で「10 < 10」でFalseとなりループは終了します。でも「++」が「i」の前ではなく後ろに付いているので、条件を先にチェックしてから値が増えることになり、ループ終了時には「i」は11になります。よって「-1」がn2の最終値になります。

buta3_2009
質問者

お礼

ご指摘の通り、勘違いしていました。ありがとうございます。

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

whileの条件である「i」と「n2」は、両方とも常に値が変化しているので注意が必要です。各ループで両方の値がどのように変化しているのかを書いてみれば、一目瞭然だと思います。 初期値:i=0、n2=10 1ループ目:i=1、n2=9 2ループ目:i=2、n2=7 3ループ目:i=3、n2=4 4ループ目:i=4、n2=0 「i」が増えると「n2」から引かれる数も大きくなる点がポイントです。4ループが終わった時点で「i < n2」の条件がFalseとなるので、ループが終了します。よってn2の最終値は0です。

buta3_2009
質問者

お礼

iもn2も両方とも値が変化するのですね。稚拙な質問にお付き合い頂いてありがとうございます。また、丁寧な回答も感謝です。

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

関連するQ&A

  • scanf文がうまくいかないのですが・・・

    下のようなプログラムを実行するとうまくいかないのですが、何故なのでしょう。 どうかお教えください。 #include<stdio.h> int main(void) { int i; char n; for(i = 0; i < 10; i++) { printf("nを入力してください>>>"); scanf("%c",&n); printf("%c\n",n); } return 0; }

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • 昇順に並べ替えるプログラム(続き)

    (C言語)実行例のような3つの整数を読み込み昇順に並べ替えるプログラムは途中までわかったのですがあとはどう修正・追加をすればいいのでしょうか? 実行例 1:45 2:43 3:38 昇順に並べ替えました。 1:38 2:43 3:45 途中までのプログラム #include<stdio.h> int main(void) { int n1,n2,n3; printf("1:"); scanf("%d",&n1); printf("2:"); scanf("%d",&n2); printf("3:"); scanf("%d",&n3); printf("昇順に並べ替えました。\n"); return 0; }

  • プログラミングで質問があります。

    プログラミングで質問があります。 実数値を入力して、その平均を出すプログラミングを作ったのですが、うまく行きません。 どこが間違っているのか教えてほしいです #include <stdio.h> int main (void) { float a=1,sum=0; int b=0,i; while(a!=0) { printf("整数値を一つ入力してください。"); scanf("%f",&a); if(a!=0) { b=b+1; } for(i=0;i<=b;i=i++) { sum=sum+a; } } printf("平均値は%fです\n",sum/b); } 実行して、10、10、10と入力すると、90になってしまいます(..;)

  • プログラミング

    C++で、五個の配列を確保し、それらを関数を使って逆順にしたいのですが、別の配列にコピーして逆順にしたいです。下記のプログラムを作ったのですが、どこがいけないのでしょうか? #include "stdafx.h" #include <stdio.h> void reverse (int z[],int w[]); int main(void) { int p[5]={1,2,3,4,5},u[5]; reverse(p,u); printf("逆順=%d\n",p); return 0; } void reverse(int z[],int w[]) { int i; for(i=0;i<=5;i++){ w[i]=z[i-1]; } }

  • プログラミングで質問です。言語はC++です。

    いま、 While文でループし、Enterキーを おすとループから抜けます。 そこで、上矢印キー↑を押すと マウスカーソルがそれに応じて動くようなプログラムを while文でループさせたいのですが やり方がわかりません。 途中まで書いてみたのですが動きません。 詳しく教えていただけると嬉しいです。 #include <stdio.h> #include <windows.h> #include <Windows.h> int main( void ) { printf("roop in\n"); POINT po; while(1){ po.x=0; po.y=0; if( GetAsyncKeyState(VK_RETURN)) break; if(GetAsyncKeyState(VK_UP)&0x8000 <0) po.x+=7; Sleep(500); } printf("roop out\n"); return 0; }

  • C言語の問題で困っています。

    C言語の問題で困っています。 誰か教えてください。 下の問題ですが、intがiだけでプログラムするにはどうしたら良いでしょうか? (a)から(d)に入るプログラムをすいませんが教えてください。 お願いします。 【問題】 1以上10以下の整数を昇順に区切って表示するプログラムです。 実行例 1 2 3 4 5 #include <stdio.h> int main (void) { int i; (A) while ((b)){ (c); (d); } printf("¥n"); return(0); }

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • プログラミングに関する問題が解けません;;

    1 「ファイルの入出力」 以下のプログラムはdata.txtのデータを読み込み,画面に出力するものです. 下記のプログラムの######を埋めて完成させよ. #include <stdio.h> #include <stdlib.h> int main(void){     char dummy[128], filename[128];     FILE *fp;     char x;   sprintf(filename,"data.txt");     fp=fopen(filename, "r");     if(#####(1)####) {        printf("ファイル%s が見つかりません\n",filename);        return(-1);      } while(#########(2)############){ putchar(x); } fclose(fp); return(0); } 2 構造体を用いたプログラム 名前と点数用のメンバを持つ構造体dataを宣言しなさい。 また、名前と点数を表示する関数hyoujiを完成させよ。 #include <stdio.h> (1) void hyouji(###(2)###, int no); int main(void){ struct data member[3] = {{"伊藤", 71},{"小林", 81},{"山田", 67},}; hyouji(member, 3); } void hyouji(####(3)####, int no){ int i; for(i=0; i<no; i++){ printf("%s:%d\n", ###(4)###); mem++; } } 3 「2次元配列を使った行列の四則演算」 次のプログラムは、2次元配列の和を求め結果を表示するためのものである. 関数 mat_tasu()の中身を完成させよ. ただし関数 mat_tasu()は引数を持たない関数とします. #include<stdio.h> int ma[2][2]={{1,2}, {3,4}}; int mb[2][2]={{5,6}, {7,8}}; int mc[2][2]; void mat_tasu(void); int main(void) { int i,j; mat_tasu(); for (i=0; i<2; i++){ for (j=0; j<2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } /* 行列の和の計算 */ void mat_tasu(void) {      (1) } 各問題の(1)や(2)みたいになってるところに当てはまるプログラミングを教えてください! 一問だけでもいいので分かる方いましたら、回答お願いいたします!