• ベストアンサー

C言語のforとwhileについて・・・

C言語で「While 文を使って、1から100までの和を求めて表示するプログラムを作る」ことをやってみました。↓ ですが、forではできたのですが、whileでは動きませんでした。 whileで作る時は、forのどの部分を変えれば出来るんでしょうか? 解説できましたら、お願いします。。 #include <stdio.h> int main(void) { int i,wa; wa=0; for(i=1; i<=100; i++) { wa=wa+i; } printf("和=%d\n",wa); }

  • choobn
  • お礼率62% (121/194)

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.6

がると申します。 んと… while(i=1; i<=100; i++) だと、コンパイルでエラーになりません? for(i=1; i<=100; i++) { /* 処理 */ } をwhileで書くと、概ね i = 1; while(i <= 100) { /* 処理 */ i++; } という感じになります(厳密には、インクリメントのタイミングが微妙なのですが)。 インクリメントのタイミングを図るのであれば i = 1; while(i++ <= 100) { /* 処理 */ } という方法もありますね。 i ++ と ++ i との差異をきちんと認識しないと難しいですが。 まずは、whileの文法をきちんと書籍で確認されることをお勧めいたします。

choobn
質問者

お礼

参考になりました。 まだやり始めなので、これからまた勉強しようと思います。

その他の回答 (8)

  • bnosuke-x
  • ベストアンサー率39% (43/110)
回答No.9

ちょうどついこの間、for と while と do - whileを人様に教える機会がありました。 その内容を書きます。 まずwhileを教え、forについては、 for( a ; b  ; c ){   x } whileと同じなんだけど、 ループに入る前に a を1回だけ実行。 ループの中身 x を実行したあと、毎回 c を実行。 b の条件が成り立っている間ずっと繰り返す(これはwhileと一緒)。 と教えました。 そういう風に教わりませんでした? ちゃんと勉強しましょうよ。

choobn
質問者

お礼

まだやり始めたばかりです。 これからまた勉強しようと思います。

  • Agamemnon
  • ベストアンサー率20% (25/125)
回答No.8

>forの部分をwhileに変えただけで、やりました。 なんでそんな発想になっちゃうんですかね? 言語のリファレンスくらい読みましょうよ? for を単純に while に変えても文法が違うのだから 動きませんよ。 for と while を入れ替えても同じ動きをするなら 別々の命令で定義する必要がないでしょ?

choobn
質問者

お礼

文法違うから、どうやったら動くのか質問しているのに、回答になっていないですね。 forとwhileでどう変わるか聞いているんです。

noname#22058
noname#22058
回答No.7

for (i = 1; i <= 100; i++) { /* 何かの処理 */ } という処理は、 i = 1; while (i <= 100) { /* 何かの処理 */ i++; } という処理と、完全に等価です。

choobn
質問者

お礼

ありがとうございました。

noname#22222
noname#22222
回答No.5

スーツのデザイナーですのでC言語は判りません。 そこで、Javascript を例にした一文を紹介します。 質問者の疑問には、答えているかと思います。 まあ、「プログラミング言語C」のパクリに過ぎません。 素人でも、この本は読んでいますよ! 質問者も一読を!  「表の各行は同じ計算式で計算されるから、出力行ごとに1回繰り返すループを使うのがよい。これが次の while 文の目的である。    while ( fahr <= upper) {     ・・・    }  この while ループは次のように働く。まず、カッコ内の条件をテストする。これが真(fahr が upper 以下)であれば、ループの本体が実行される。次に条件が再チェックされ、真であれば、ループ本体が再び実行される。このテストが偽となると、ループは終わりとなりそこで終わりである。」(「プログラミング言語C」12頁)    <script type="text/javascript">     <!--      //      // Javascript: f=0,20,・・・300に対して、摂氏-華氏対応表を出力する      //      var lower = 0;   /* 温度表の下限 */      var upper = 300;  /* 上限 */      var step = 20;   /* きざみ */      fahr = lower;      document.writeln("<pre>");      while ( fahr <= upper) {       celsius = (fahr - 32) * 5/9;       document.write(fahr + "\t" + celsius + "\n");       fahr = fahr + step;      }      document.write("</pre>");     //-->    </script> 「周知のように、プログラムを書くにはいろいろなやり方がある。温度変換プログラムを別の形に書いてみよう。   <script type="text/javascript">     <!--      document.writeln("</pre>");      document.write("\n");      for ( fahr = 0; fahr <= 300; fahr = fahr + 20)       document.write(fahr + "\t" + (5.0 / 9.0) * (fahr ? 32) + "\n");      document.write("</pre>");     -->    </script>  これでも同じ答えが出るが、プログラムは違って見える。大きく改めた点は、変数の多くを除いたことで、fahr を残し、しかもそれを int にしている。上限・下限ときざみの大きさは、for 文の定数としてのみ書いた。この for はそれ自体が新しい構文である。」  「さて、for 自体はループであり、while の一般化になっている。これを前に出てきた while と比較すると、その役割は明白であろう。for にはセミコロンで区切られた三つの部分がある。最初の    fahr = 0 は、ループ本体に入る前に一度だけ実行される。第二の    fahr <= 300 という部分は、ループを制御するテストすなわち条件である。この条件を評価して、これが真であれば、ループの本体が実行される。次に、再初期化のステップ    fahr = fahr + 20 が実行され、先の条件が再び評価される。このループは条件が偽となれば、終りとなる。while と同様に、このループの本体は、一つの文であってもよいし、大カッコにはさまれた一群の文であってもよい。また、初期化と再初期化の部分は、一つの式なら何でも許される」。(「プログラミング言語C」16~17頁)

choobn
質問者

お礼

ありがとうございました。

  • crew21
  • ベストアンサー率26% (58/222)
回答No.4

ていうかまず自分の書いたプログラム載せろや。 最低限の礼儀だろ。

choobn
質問者

お礼

あなたの礼儀もなっていないですね。 ちゃんと最後まで回答してください。

choobn
質問者

補足

forの部分をwhileに変えただけで、やりました。 int main(void) { int i,wa; wa=0; while(i=1; i<=100; i++) { wa=wa+i; } printf("和=%d\n",wa); }

  • aoi1923
  • ベストアンサー率31% (6/19)
回答No.3

i=1; while(i <= 100) { wa+=i++; } ってとこかな あんまスマートじゃないとおもう わざわざwhileを使う必要ないね

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

iの初期値設定 while(iの比較条件){ 加算 iのカウントアップ } http://www1.cts.ne.jp/~clab/hsample/Flow/Flow03.html

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

答えを書くのは簡単ですが、 とりあえず、あなたの作成した「動かないwhile()を使ったソース」 を見せていただけませんか? そちらで指摘する方がよいでしょう。

choobn
質問者

補足

forの部分をwhileに変えただけで、やりました。 int main(void) { int i,wa; wa=0; while(i=1; i<=100; i++) { wa=wa+i; } printf("和=%d\n",wa); }

関連するQ&A

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • while文について、c言語です。

    ぼくはプログラム始めたばかりです。ミスを見つけられた方、ご指導お願いします。 正整数nを入力して、nの階乗をもとめるプログラムを作りたいのですが、実行結果がいつも1になります。どこがおかしいか教えてください。以下のプログラムです。 #include <stdio.h> int main(void) { int i, n, s; printf("n = ?"); scanf("%lf", &n); s = 1; i = 1; while(i <= n) { s = s * i; i = i + 1; } printf("s = %3d\n", s); return 0; }

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • while doについて

    九九の表で、forの2重のプログラムは作成できたのですが、whileとdo~whileを使って書き直すやり方がわからないのです。 どうか教えてください。お願いします。 #include <stdio.h> main() { int i,j; for(j = 1; j <= 9; j++){ for(i = 1; i <= 9; i++) printf("%3d", j*i); printf("\n"); } }

  • while for の使い方?

    for文 を使って,キーボードから1以上10以下の整数を入力した後,その整数から30までの和を求めて画面に表示するプログラム prog5.c を作って下さい.ただし,while文を使って,キーボードから入力された整数が1以上10以下になるようにしてから,for文を実行すること. という問題で、次のように書いたら、エラーが発生しました。解説お願いします。 #include<stdio.h> main() { int i, n, sum=0; scanf("%d",&i); while(1<=i<= 10){ for(n=i, n<=30, n++){ sum+=sum+n; } } } エラー prog5.c: In function ‘main’: prog5.c:13: error: expected ‘;’ before ‘)’ token prog5.c:13: error: expected expression before ‘)’ token   

  • C言語のwhile文はネストできますか?

    「*」を使用して、n列、m行の四角を表示させるプログラムを考えました。 --------------------------------------------------------------------------------------------- #include<stdio.h> int main(void) { int i=0,j=0,n,m; printf("n入力:"); scanf("%d",&n); printf("\nm入力:"); scanf("%d",&m); printf("\n"); while(i<m){ while(j<n){ printf("*"); j++; } printf("\n"); i++; } return 0; } --------------------------------------------------------------------------------------------- しかし、1行分しか表示されません。 n=2、m=2の場合 ----------------- n入力: m入力: ** ----------------- としか表示されません。 whileのネストが悪いのでしょうか? それとも、初歩的なミスがあるのでしょうか?

  • C言語について。

    今、C言語に関する問題をやっているんですが、いまいちわかりません。 その問題というのは↓ ≪問題5 (繰り返し) 例題をもとに、次のような九九の表を出力するプログラムを作成しなさい。  1 2 3 4  5  6  7  8  9  2 4 6 8 10 12 14 16 18  ~(略)                                               ≫ という問題です。それで、その例題というのは↓ ≪例題4 (for文、do while文)  次のプログラムは、入力された整数を一辺とする正方形を出力するプログラムである。動作確認をしなさい。  4       (←入力)  ****  (←出力)  ****  ****  **** /* 正方形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9);     for( i = 1 ; i <= hen ; i++)     {         for( j = 1 ; j <= hen ; j++)           printf("*");         putchar('\n');    } }  ≫ ≪例題5 (for文、do while文) 次のプログラムは、入力された整数を一辺とする二等辺三角形を出力するプログラムである。動作確認しなさい。  4      (←入力)  *     (←出力)  **  ***  **** /* 二等辺三角形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9 );     for( i = 1 ; i <= hen ; i++ )     {            for( j = 1 ; j <= i ; j++ )              printf("*");          putchar('\n');     } }  ≫ 以上の二つが例題です。 わかりづらかったらすみませんm(_ _)m わかる方(問題5を)教えてくださるとありがたいです。

  • C言語の質問(for文について) 超初心者です。

    for 文を用いて下記のように表示されるプログラムを書いています -100 -99 -98 -97 ・ ・ ・ 0 1 2 ・ ・ ・ 99 100 要するに-100から100まで1ずつ変化させて表示させるプログラムです。このプログラムを下記のように書きましたが、実行すると77から100までしか表示されません。どうしてでしょうか? #include <stdio.h> void main(void) { int i; for(i=-100;i<=100;i++) { printf("%d\n",i); } } for文の解釈として、i=-100は-100から、i<=100は100まで、i++は1づつ足していくという風に考えてますが、間違いなのでしょうか?

専門家に質問してみよう