C言語での関数forについて

このQ&Aのポイント
  • C言語の基本的なことで躓いてしまって自分でいくら考えてみても、わかりません・・。よければ教えて頂けないでしょうか。
  • 上のプログラムを実行すると”正解は5でした”と出るのは分かります。しかし”countは今4です”までしか出ないのが何故だか分かりません。ここは5ではないんでしょうか?
  • 私は何か根本的なことが分かってないのでしょうか・・。教えてください。
回答を見る
  • ベストアンサー

C言語での関数forについて

C言語の基本的なことで躓いてしまって 自分でいくら考えてみても、わかりません・・。 よければ教えて頂けないでしょうか。 ----- { int count; for (count = 0; count < 5; count++) { printf("countは今%dです\n", count ); } if (count == 4) { printf("正解は4でした\n"); } else if (count == 5) { printf("正解は5でした\n"); } else { printf("正解は4でも5でもありませんでした\n"); } } ---------- 上のプログラムを実行すると”正解は5でした”と出るのは分かります。 しかし”countは今4です”までしか出ないのが何故だか分かりません。 ここは5ではないんでしょうか? 私は何か根本的なことが分かってないのでしょうか・・。 教えてください。

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

  • ベストアンサー
  • korei
  • ベストアンサー率30% (22/72)
回答No.5

こんにちは。 C言語のマニュアルで、forのところを読まれたら、わかると思いますが。 上記にかかれているプログラムのfor文の処理される順番は (1)countに0をいれる (2)count < 5 の条件文を満たしているかチェックする(今はcountは0) (3)条件文を満たしているのでprint文を実行する(countは今0です を表示) (4)countに1をたす(countは1となる) (5)count < 5 の条件文を満たしているかチェックする(今はcountは1) (6)条件文を満たしているのでprint文を実行する(countは今1です を表示) (7)countに1をたす(countは2となる)    ・    ・  繰り返し行う    ・    ・ ・countに1をたす(countは4となる) ・count < 5 の条件文を満たしているかチェックする(今はcountは4) ・条件文を満たしているのでprint文を実行する(countは今4です を表示) ・countに1をたす(countは5となる) ・count < 5 の条件文を満たしているかチェックする(今はcountは5) ・条件文を満たしていないので、forループを抜ける。 次の処理を実行する。    ・    ・ なので、for文を抜けた時点でcountは5になっています。 なので、「正解は5でした」と表示されます。 しかし、for文内の処理が実行されるのは、count<5の間なので、 「countは今4です」までしかでないのです。 あと、forは関数ではありません。ループ文です。 まずは、基本を身に付けるようにがんばって勉強してくださいね。

yuki7505
質問者

お礼

ありがとうございます!すごくわかりやすかったです。 あの,条件文を満たしていたら、countに1を足し、print文を実行する。 という順番にならないのは何故ですか (count = 0; count < 5; count++)と先にかいてあって、その後にprint文がきてるので 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが なぜcount++はprint文の後に来ないのでしょうか・・

その他の回答 (6)

noname#151056
noname#151056
回答No.7

> (count = 0; count &lt; 5; count++)と先にかいてあって、その後にprint文がきてるので > 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが > なぜcount++はprint文の後に来ないのでしょうか・・ まず while 文によるループが基本であると考えてください。 つまり、ある条件が成り立っている間、処理をし続けると いうのが普通のパターンです。 もっと極端な話をすれば、while 文があれば、for 文は必要 ないのです。全ての for 文は、while 文で書き換えること ができますから。 では、なぜ for 文があるかというと、やはりカウンタを使 ったループを使いたい場合が多いからではないでしょうか。 「ある回数だけループさせたい」という場合、毎回 while 文でカウンタ変数を使って書いていると、カウンタ変数を カウントアップする個所を同じように毎回ループ内に書か なければいけません。 それより for 文を使えば、カウンタ変数のカウントアップ という、ループ内処理には関係ない命令をループ内に書かな くても済みますよね。 for ループは while ループの特殊な形だと思えばよいと思 います。

yuki7505
質問者

お礼

ありがとうございます。なんだか難しいです。

  • korei
  • ベストアンサー率30% (22/72)
回答No.6

koreiです。補足しますね。 for文は、 for(初期化;条件文;式){}  と記述します。 実行の順番が、 (1)初期化(最初の";"で区切られたところまで) (2)条件文(";~;"まで) (3){}の中 (4)式(最後の";"以降) (5)条件文(";~;"まで) (6){}の中 (7)式(最後の";"以降) ・・・ と決まっています。 即ち、 for(最初だけ;実行(1);実行(3)){    実行(2) } となり、実行(1)~実行(3)の順番で、条件文(実行(1))が満たされている間、 ループする訳です。 なので、上記のプログラムでは、count++を実行してから、print文の実行にはならない訳ですね。 初級向けのC言語のマニュアルのfor文のところを見てみましょう。 もっと、わかりやすく載っていると思いますよ。 では、勉強をがんばってください。

yuki7505
質問者

お礼

ありがとうございます。そういう順番だとして覚えてしまえばいいんですね。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

「関数for」と言う段階で“根本的なことが分かってない”が証明されています。 forは“関数”ではありません。 また、C言語に“命令”という概念はありません。 forは“制御文を示すキーワード”です。 forループを分解するとこういうカンジです。 for (i = 0 ; i < 5 ; i++) {   printf("%d", i) ; } printf("終わり") ; これは 1.iに0をいれる 2.iが5より小さければ3以降、違ったら6以降を実行 3.printf("%d", i)関数の実行 4.iをカウントアップする 5.2に戻る 6.printf("終わり")関数の実行 whileループに書きなおすと i = 0 ; while (i < 5) {   printf("%d", i) ;   i++ ; } printf("終わり") ; iが5の時にループ内を通らない理由はわかると思います。

yuki7505
質問者

お礼

ありがとうございます

  • MYLINE
  • ベストアンサー率40% (10/25)
回答No.3

KOH_daさんの回答ですが、 「2周目以降の判定の直前に行なわれます。」と書いてありますが、 1つの構文で、たとえばループの構文で1周目は処理しない、2周目以降は処理するという風に違う処理をする事は有りません。 ですから、 「for命令のcount++の処理は1周目、2周目、・・・の最後に処理されます。」 という風に理解する方がよろしいと思います。

yuki7505
質問者

お礼

ありがとうございます

  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.2

for命令はループに入る前に判定を行ないます。 またcount++というのは、2周目以降の判定の直前に行なわれます。 だから、countが5になった時にはループ内を通らずに、 処理を抜けてうため「countは4です」とは表示されません。 判定を最後に行ないたい場合は、do~whileという命令を使うか、 無限ループを作り、if(条件)break;というのを、 ループの最後の方に入れることが多いです。

yuki7505
質問者

お礼

ありがとうございます

  • route156
  • ベストアンサー率85% (93/109)
回答No.1

 for 文を while 文に書き換えてみるとわかりやすいと思います。  次の while 文は、ご質問の for 文と同じ動作をします。count++ が実行されるタイミングに注意してみてください。 count = 0; while (count < 5) {  printf("count は今 %d です\n", count);  count++; }  例えば、今 count が 4 であるとします。  printf で“count は今 4 です”と表示されます。  count++ で count が 5 になります。  しかし、次に while で (count < 5) の条件を満たさないので、printf や count++ は実行されずに while ループを抜けます。  “count は今 5 です”と表示されないのはこのためです。  ループを抜けたとき count は 5 になっていますから、“正解は 5 でした”と表示されます。  count++ は (count < 5) の評価の直前に実行されると考えてください。

yuki7505
質問者

お礼

ありがとうございます

関連するQ&A

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • コンパイル失敗と表示されましたがどこが間違っているでしょうか?

    インターネット上のC言語入門講座で例題どうりにコンパイラーに入力したつもりなのですが[コンパイルに失敗しました。]と表示されてしまいどこが間違っているのか分かりません。詳しい方教えてください。 #include<stdio.h> void main() { int count; for (count = 0; count < 5; count++) { printf("countは今%dです\n", count); } if(count == 4){ printf("正解は4でした\n"); }else if(count == 5) { printf("正解は5でした\n"); }else { printf("4でも5でもありませんでした\n"); } }

  • C言語

    forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。 #include<stdio.h> int main(void) { char moji; int i,sum; printf("正の整数を1から順に加算します。n\"); printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n"); moji=getchar(); if(moji==y) { for(i=2;sum>=1001;i++) { この部分がわかりません; printf("加算値は%dです。¥n",sum); } }else if(moji=='n'){ printf("終了します。\n"); }else{ printf("YまたはNを入力してください。\n"); } return 0; }

  • C言語について

    問題文が表示され、その解答を数字で入力すると正解の場合は「大正解」、不正解の場合は「はずれ」と表示されるプログラムなのですが、?部分がどうしても分りません・・・ 正しいと思えば0、間違ってると思うなら1と入力するプログラムです。 どなたかご教授いただけるとありがたいです>< main() { int i,k; i=0; while(i<5){ printf("次の文章が正しければ0、間違っていれば1を入力してください。\n"); printf("%s",q[i]); scanf("%d",&k); if(a[?]==?) {printf("大正解\n");} else {printf("はずれ\n");} i????; } printf("おしまい\n"); }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語でのじゃんけん

    こんちには。 C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、 エラーメッセージが出てしまいうまくいきません。 どこがおかしいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k; printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n"); for(k=k; k<=10; k++) { srand(time(NULL)); j=rand()%3+1; scanf("%d",&i); if(i==1&&j==1) printf("私はグーなので、あいこです¥n"); else if(i==1&&j==2) printf("私はチョキなので、あなたの勝ちです¥n"); else if(i==1&&j==3) printf("私はパーなので、あなたの負けです¥n"); else if(i==2&&j==1) printf("私はグーなので、あなたの負けです¥n"); else if(i=2&&j==2) printf("私はチョキなので、あいこです¥n"); else if(i==2&&j==3) printf("私はパーなので、あなたの勝ちです¥n"); else if(i==3&&j==1) printf("私はグーなので、あなたの勝ちです¥n"); else if(i==3&&j==2) printf("私はチョキなので、あなたの負けです¥n"); else if(i==3&&j==3) printf("私はパーなので、あいこです¥n"); else printf("1か2か3を入力してください¥n"); } } OS mountain lionで利用中ですが、 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」 と表示されたまま、うまく動作しません。 教えてください。

    • ベストアンサー
    • Mac
  • C言語について

    以下のプログラムについてです。 test.txtというファイルを読み込み、その中の異なる単語の数を求めるプログラムです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<stddef.h> #define NMAX 80 #define LMAX 5000 void count(FILE*, int); void all_words(FILE *); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x, count, l, t=0,k=0; char name[LMAX][NMAX], word1[NMAX], word2[NMAX]; char *tp, *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); exit(1); } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); exit(1); } for(count=0;count<LMAX;count++){ if(fgets(name[count],NMAX,fp)==NULL)break; p++; } for(count=0;count<p;count++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(name[count][x]); } tp=word1; while((tp2=strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`') t=1; tp2++; } strcpy(word2,tp2); k=l=strlen(word2)-1; if(word2[k]==('\'' & l)) word2[l]='\0'; if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(fp2); return 0; } void all_words(FILE* fp2){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); exit(1); } for(;;){ if(fgets(word3, NMAX,fp2)==NULL) break; n++; } fclose(fp2); count(fp2,n); } void count(FILE* fp2, int n){ int count, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp,*yp; if(m==NULL){ return ; } if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); exit(1); } for(count=0,xp=m; count<n;count++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); count=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; count++; } else{ count=1; } } printf("KIDN OF WORD:%d\n",n-y); if(m){ free(m); m=NULL; printf("%p\n",m); } fclose(fp2); } このプログラムを実行するとメモリリークになってしまいます どうしたら良いでしょうか?

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

  • 続・C言語について

    http://okwave.jp/qa5241461.html 先ほど、このような質問をして、いただいた回答を参考に下記のようなプログラムを作ってみたのですが、実行結果は、数値の入力と最後の"\n"しか反映していません…。 このプログラムのどの部分がマズイのか、お教えいただけたら幸いです。 よろしくお願いいたします。 #include <stdio.h> void draw_even(int, int); void draw_odd(int, int); int main(void) { int kazu; int gyou=1; printf("数字2~9を入力してください:"); scanf("%d", &kazu); while(kazu < 2 || kazu >9) { printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &kazu); } while(gyou <= kazu) { if(kazu = 2*(kazu/2)) { gyou = kazu+1; draw_even(kazu, gyou); } else { gyou = kazu; draw_odd(kazu, gyou); } gyou++; } } void draw_even(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { if(keta!=(gyou+1)/2) { printf("*"); } else { printf(" "); } } } printf("\n"); } void draw_odd(int kazu, int gyou) { int keta = 1; if(kazu!=(gyou+1)/2) { while(keta==kazu && keta==(gyou+1)/2 && keta==gyou-(kazu-1)) { printf("*"); } } else { for(keta=1; keta<=gyou; keta++) { printf("*"); } } printf("\n"); }