• ベストアンサー

for文

#include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

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

  • ベストアンサー
  • yoh_tkhs
  • ベストアンサー率24% (8/33)
回答No.2

構文的にはどちらでもよいです。 時と場合によって使い分けるのがよいと思います。 特別に理由が無い場合は、私は0から始まる方に固定するようにしています。(特殊な場合を除く) 0スタートと1スタートが混在した長いプログラムを書くと、デバックの時に「ここは1から始まって…ここは0からで…」という具合で苦労するからです。 サンプルのソースくらいなら大丈夫ですが、アプリケーションになるくらいのソースだと、forループはかなりの数が出てきます。forの中にforが入ることも多々出てきます。 プログラムは、メモリの操作、配列など、0からスタートした方がよいものが多いので、なるべく0からはじめるようにしています。 ご参考までに。

hirohiro8888
質問者

お礼

アドバイスありがとうございます。時と場合に判断して、できるだけ私も統一して使っていきたいと思いました。

その他の回答 (3)

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.4

結果的にはどちらも同じです。 ですが、プログラムはできる限り明示的にまたシンプルに書くことをお勧めします。 つまり今回の場合ですと、ループの回数は num までなので、for文のループ条件は i < num または i <= num のどちらでも構わないと思います。 ただループ中で使用するのが printf の行のみなので、ここでわざわざ i + 1 にしたりするのはわかりづらいと考えます。 そうすると for文は、  for( i = 1; i <= num; i++ ) の方がより明示的かな、と思います。 これがループ中で配列を使ったりすると、i が 1 から始まると配列を使う箇所で i - 1 をしないといけなくなったりして都合が悪いので 0 から始めたりしますね。

hirohiro8888
質問者

お礼

判断して明示的に表せる方を使っていきたいです。ありがとうございました。

回答No.3

動作としてはどっちでもいいです。 しかし,これは数値処理の作法というか思想にかかわる話です。 最初の例は0 base、二つ目の例は1 baseと呼ばれる「数え方」で,たとえば10回という数を 「0から始まって9まで1ごとに数えた数」 と考えるか, 「1から始まって10まで1ごとに数えた数」 と考えるかの違いです。 一般にソフトウェアの世界では,低級な処理(よりハードウェアに近い処理)では0baseが使われます。これは,256種類の数を表現するために0baseでは8bit(8本の電線)があれば表現できるのに対して1baseをハードウェアで表現するためには1本余分に必要であるというところから来ています。 C言語は一般に高級言語(ハードウェアに依存しない言語)と呼ばれていますから,パソコンで使われているようなコンパイラではどちらをとっても差異はありません。もしかしたらコンパイラはまったく同じコードを出力するかもしれません。 しかし,将来組み込みマイコンやマイクロコードなどのハードウェアと密接に連携するソフトウェアを設計する可能性があるなら,自分の「思想」として,「どちらでもいい場合には0baseを採る」と決めてしまうと後で楽です。もちろん,1baseを「思想」とするのもいいでしょう。 よく言われることですが,ソフトウェアのコーディングでは「昨日の自分は最も理解しがたい他人」ですから。

hirohiro8888
質問者

お礼

専門的におしえていただきありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

プログラマ本人がわかっていればどっちでもいいと思いますが、 i がNoとして使われていて、Noは1から始まるということですから そういう意味で言えば for(i=1; i<=num; i++){ の方が素直であり、意味と数値が一致するので良いと思います。

hirohiro8888
質問者

お礼

ありがとうございます。

関連するQ&A

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • for文

    整数を読み込んで、その値を0までカウントダウンしながら表示するプログラム作りたいのですが、 while文ではできたのですが、for文ではうまくいきません。 どこが間違っているのでしょうか? OS:Windows XP C++Builder X パーソナル #include <stdio.h> int main(void) { int i; int num; printf("整数を入力してください:"); scanf("%d", &num); for(i = num; i <= 0; --i) { printf("%d", i); } return 0; } 宜しくお願いします。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • ループ

    #include<stdio.h> int main(void) { int i=1,sum=0; int num=1; while(num>0) { printf("整数を入力してください。(マイナスの値で終了)\n"); scanf("%d",&num); printf("%dが入力されました。(%d番目の繰り返しです)\n",num,i); sum+=i; printf("1から%dまでをたすと%dです。\n",i,sum); i++; } printf("繰り返しが終わりました。\n"); printf("加算値は%dです。\n",sum); printf("%d回繰り返しました。\n",i); return 0; } このプログラムで101以上の数値は加算しないようにするにはどうすればいいですか。

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。 (自分の解答) #include <stdio.h> int main(void) { int num1,num2; int sum=0; do { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 < num2) printf("整数1>整数2としてください\n"); } while (num1 < num2); printf("%d以上%d以下の全整数の和は",num2,num1); for (num2;num2 <= num1;num2++) { sum=sum+num2; } printf("%dです。",sum); return 0; } これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか? 回答お願いします。

  • for文の継続条件について

    ----------------------------------------- #include<stdio.h> int main(void) { int i; printf("正の整数を入力してください: "); scanf("%d",&i); for( ; i ; i- -){ printf("%d ",i); } printf("\n"); return 0; } ----------------------------------------- 以上のプログラムで、継続条件の部分を入力した整数にし、例えば「5」を入力すると、 5 4 3 2 1 と表示されます。 例えば、「0<i」といった継続条件ならば、以上のような実行結果になるのはわかるのですが、何故「for( ; i ; i- -)」の「i」という継続条件だけで0より大きい値までを表示してくれるのか分かりません。 何故このようになるのか教えていただけると嬉しいです。

  • while文の作成について

    キーボードに整数を打ち込み、0を打ち込むと終了し、その合計を出すプログラムを以下のように作りました。 #include<stadio.h> int main(void){ int num=0 int sum=0 printf("整数を入力"\n"); do{ scanf("%d",&num); sum +=num; }while(num); printf("合計は%dです。\n",sum); returen 0; } 次に負の値が入力されるまで整数を読み込み続け、その合計をを求めるプログラムを作りたいのですが、whileのところを }while(num>=0); としてみたのですが、うまくいきません。また分かり易くするため、入力した整数の個数も表示できるようにしたいです。どうすればよいでしょうか。詳しい方、教えてください。

  • for文

    for文なのですが、 scanfで得た、 iを for文のi--で、一づつへらしてますが、 0でfor文がおわりますが 0で終わりの記述がない気がするんですが、 どうしてでしょか? int main(void) {    int i;    printf("正の整数を入力してください。\n");    scanf("%d",&i);    for( ; i ; i--)    printf("qが入力されました。\n");    return 0; }

  • 初心者です。

    ループで、どうしてもわからないので、質問します。   1234567890123456789012345 と、いうように表示したいのですが、以下のソースでは、表示されません。教えてください。  ※ 読み込まれた整数値の個数は25とした場合です。 #include <stdio.h> int main(void) { int i = 0; int num; printf("整数を入力してください。:"); scanf("%d",&num); for (i = 0; i < num; i++){ printf("%d", i); if ( i <= 10 ){ i = 0; } } putchar('\n'); return(0); }

専門家に質問してみよう