C言語で繰り返し文の中で0.01ずつ増やす方法

このQ&Aのポイント
  • C言語で繰り返し文の中で0.01ずつ増やす方法についてご教示ください。
  • 関数F(x)=x3+2x-1の値でx=0から5まで0.01刻みで増やし、出力させるプログラムの作成方法を教えてください。
  • i=0の時にはじめは-1のはずですが、なぜか11.28と表示される問題について、どう対処すれば良いかお知恵をお貸しください。
回答を見る
  • ベストアンサー

c言語で、繰り返し文の中で、0.01づつ増やすには?

c言語で、繰り返し文の中で、0.01づつ増やすには? c言語で、繰り返し文の中で、0.01づつ増やすにはどうすればよいのでしょうか? 関数F(x)=x3+2x-1 の値でx=0から5まで0.01刻みで増やし、出力させる プログラムを作成せよ。という問題です。 #include <stdio.h> int main() { double i; for(i=0;i<=5;i+=0.01){ printf("%lf",i*i*i+2*i-1); putchar('\n'); } return(0); } で、はじめにi=0なので、はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。これを0.1刻みで i+=0.1 とすると正常に作動するのですがどうでしょうか? お願いします。

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

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

ちなみに、 double i; で、 i = 0; と書いたとき、0 は確かに int ですが、double である i への代入で正常に「暗黙の型変換」が発生しますから、i = 0.0 とわざわざ書かなくても正常に代入されます。 あと、printf() における double に対する書式指指定子は、%lf ではなくて、%f です。(scanf() は、float は、%f, double は、%lf です) printf() のような、可変数引数の関数では、float は暗黙のうちに double に変換された後に渡されるので、printf() の場合、float も double もどちらも "%f" が正しい指定です。(ただし、C99 の規格では書いても許容されることになったらしい) 0.01 ずつ誤差無し(実際には誤差最小)で加算するのは、No.2 で回答されていますが、 #include <stdio.h> int main() { int i; for(i=0;i<=500;i++) { double x = i / 100.0; // こっちの 100.0 は、100 だと良くないことが起こります。100 だと int / int になるから。 printf("%f",x*x*x+2*x-1); putchar('\n'); } としてみたり、また、double であっても、数値として小数点以下がない場合は加算による誤差は発生しないので、 #include <stdio.h> int main() { double i; for(i=0;i<=500;i++) { double x = i / 100; printf("%f",x*x*x+2*x-1); putchar('\n'); } でも同じです。

その他の回答 (9)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.10

さて、forとwhileの等価性に関する話題が一段落したところで、本題への回答です。 >はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。 コマンドプロンプトか何かで実行していますか? 0.01きざみだと500行くらい出力しますよね。 結果をすべて表示するには画面バッファーの大きさが足りないのかも。 コマンドプロンプトのプロパティで、「画面バッファのサイズ」の「高さ」を増やしてみてください。 >0.1刻みで i+=0.1 とすると正常に作動する これは、出力行数が画面バッファーのサイズ内に収まっているからでありましょう。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.9

>・for文とwhile文は等価じゃないですよ~ そうではなくて、等価な場合とそうでない場合がある、というのが正しいです。 私自身、何が何でも等価だと主張する気はさらさらありません。 A; while (B) { /* 何かの文 */ C; } と、 for (A; B; C) { /* 何かの文 */ } とは、「何かの文」に continue; を含まなければ等価だ、ということです。理解できますか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

#6 では「今回の場合」と限定しているので, 「一般論として while と for が全く等価」という意味を持たせているわけじゃないと思いますよ>#7. 個人的には「for の代わりに while を使うこと」が的外れであるという #6 の見解に賛成. というか, 制御文の意味を考えれば, 本件に関してはむしろ「当然 for を使うべし」と判断します. 「for文のindexに小数点を利用するのは一般的でない」という点には賛成するものの (cf. #2), それは「整数を使え」と誘導すべきであり, 「じゃあ while」というのは筋がずれてる. C の場合 while は実は for のサブセットでしかないので, 理論上「for があれば while は不要」ということはできます. でも, while がないと for (;expression;) statement とせざるを得ず, 「expression が泣いてるように見える」ので嫌 :-)

  • hiropuri
  • ベストアンサー率55% (24/43)
回答No.7

> No.6さん ご指摘ありがとうございます、甘んじて受けましょう(^^ それに反論する気はありませんが、質問者様が誤解しない ようにフォローだけはさせて下さい。 ・for文とwhile文は等価じゃないですよ~、今回の例では 結果が同じですが、動きとしては異なりますし、可読性も 変化します。forとwhileが等価であれば、そもそもwhile文は Cに不要=実装されないはずですから……。 ・「for文のindexに小数点を利用するのは一般的でない」と 明示した点を汲んでもらえると助かります。そこは許して もらえますか? 少なくとも自分の会社なら品質管理部から 戻されますし、そのように指導しています。個人の趣向でなく、 開発上のコーディング規約として定められているからです。 ……と、あまりしゃべっては質問者様の問題解決を邪魔して しまいそうなので。でも、「的外れ」という攻撃的な言葉、 QAサイトで使って欲しくなかったなぁ、重いっす(^^;

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

>#5さん 今回の場合、質問者さんのfor文と#5さんのwhile文は等価です。 よって、「for文を使って無理している」という 指摘は的はずれです。

  • hiropuri
  • ベストアンサー率55% (24/43)
回答No.5

・結果が不安な場合であれば、ファイルに吐き出して 確認した方が安心できます。今回のように、出力される データ数が多い場合は特に……です。 ・for文の条件部に少数を使うのは、文法的には間違えて いないのですが、一般的には避けたほうが無難かと。 「ああ、随分無理してるなぁ」という印象です。 「繰り返し文」との事ですので、for文限定という事じゃ ないですよね? 今回の件は、無理にfor文を使うよりも wihle文にした方が素直だと思いますよ。 double x = 0.0; while(x <= 5.00) { printf("%lf\n", (x*x*x)+(2*x)-1); x += 0.01; } 学校の問題であれば、単純にコレでOKですね。 ※カッコは不要ですがあえて付けています。単に可読性を上げる為です。

回答No.3

double i は実数ですが、i=0 の 0 は実数ではなく整数です。for (i=0.0; i<=5.0;i+=0.01) で試されてはいかがでしょう。 参考までに、よくある実数桁落ち誤差エラーを配慮した重み(+STEP/100.0)付きプログラム例 #include <stdio.h> #define formula(x) x*x*x+2*x-1 #define STEP 0.01 int main(void) { double x; for(x=0.0;x<=5.0+STEP/100.0;x+=STEP) printf("%lf(%.2f) ",formula(x), x); printf("\n"); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

余談だけど, 計算誤差を考慮すると「i+=0.01」を繰り返すのはあんまりよくない. インデックスとしてはなるべく整数を使うべし.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

こちらでは、正常に出力されましたが? 行数が多くて、最初の部分がスクロールアウトしてしまい表示できない、ということでは? この計算では全部で501行、11.28...は203行目にあります。 終了後のプロンプト表示とか考えたら、使ってる表示デバイス(なんかの端末ソフトなのか、IDEの出力ウィンドウなのか)が300行しか表示できないってことはないですか?

関連するQ&A

  • C言語の代入についての質問です

    C言語の代入についての質問です 下のプログラムを見て下さい #include<stdio.h> int x[2]; x[0] = x[1] = 1; int main(void) { for(int i = 0 ; i < 2 ; i++) printf("%d",x[i]); putchar('\n'); return 0 ; } このプログラムをコンパイラすると3行目の代入にエラーが出されます (当たり前ですがmainの中に3行目の代入文を入れると上手くいきます) まぁそれがなぜかというのが知りたいのですが、 それはC言語をつくった人が決めたことなのでしょうか? ちなみに異なる実行環境でやってみたらどれも駄目だったので これが上手くいくことはない?のだと思います そういうもんなのだったら、そういうものだと理解しますが もし理由を知っている方がいらっしゃったら教えて下さい

  • C言語初心者です。

    C言語初心者です。 1^2-2^2+3^3-4^2…+99^2-100^2の値を求めるプログラムを作成したいのですが上手くいきません。 どこが足りないのですか? #include <stdio.h> int main(void) { printf("%d", 1^2 - 2^2 + 3^2 - 4^2 … + 99^2 - 100^2); return (0); } よろしくお願いします。

  • C言語の問題です。よろしくお願いいたします。

    C言語の問題です.。10個の整数を入力し配列に保存した後、入力された数字の中に5の倍数が含まれているかを調べ、 含まれていた時には「5の倍数が含まれています」含まれていない時に「5の倍数が含まれていません」と表示させるプログラムを作りなさい。 自分なりに考えて作ったのですが、以下の通りでよろしいのでしょうか? #include <stdio.h> main() { int i; double c[10]; for (i = 0; i < 10; i++) { printf("整数を10個入力してください.(%d つ目) : ", i+1); scanf("%lf", &c[i]); } if(c[i] % 5 == 0){ printf("5の倍数が含まれています\n"); } else{ printf("5の倍数が含まれていません\n"); } 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; } 何がいけないのでしょうか? よろしくお願いします。

  • 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; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • C言語の関数に関する質問ですが

    C言語の初心者です。よろしくお願いいたします。 授業でこのような演習が出ました。 演習:実数x を入力したときの最大値を求めるプログラムを作れ. 実数x を入力すると,x; -x; x2; xの絶対値の平方根 の中で一番大きい値を答える プログラムを作れ(ファイル名はmax.c とする). 表示は以下のようにする. Input x: -0.5 【Enter】 Answer is 0.707107. #include<stdio.h> #include<math.h> double max(double a, double b){ if( a > b) return a; else return b; } int main(void) { double x,y; printf(\"Input x: \"); scanf(\"%lf\",&x); y = max (x,-x); y = max (y,x*x); y = max (y,sqrt(fabs(x))); printf(\"Answer is %f.\\n\",y); } このように書けばうまく実行できますが、関数の中に関数を使えないでしょうか。うまく言えないですが、たとえば、以下のように書いてみましたが、うまく実行できません。どう直したらいいでしょうか、お忙しい中教えていただけたらうれしいです。 #include <stdio.h> #include <math.h> int max(double a,double b) { if (a<b) return b; else return a;} int main(void) { double x,result; printf(\"Input x:\"); scanf(\"%lf\",&x); result=max(max(x,-x),max(pow(x,2),sqrt(fabs(x)))); printf(\"%.2f\",result); return 0; } よろしくお願いいたします!!

  • C言語の問題です!!

    C言語の問題です。次の問題でプログラムを作ってみたのですがどうでしょうか?もし小さな間違いであったら訂正をお願いします。全然違う場合はそのように回答してください。初心者なものでよろしくお願いします。 ・1~100までの整数値を画面に表示せよ. ただし,数値を10個表示するごとに改行すること. #include<stdio.h> int main(void){ int i,j; for(i=1;i<=100;i++){    for(j=1;j<=9;j++) printf("%3d",i+j); i=i+9; putchar("\n"); } return(0); }

  • C言語でまったくわからないところがあります。

    C言語でまったくわからないところがあります。 配列を格納して、その中の最小値をA[9]と入れ替える動作がしたいのですが、 #include<stdio.h> int main(void) { double A[10],min,tmp; int i; for(i=0;i<=9;i++) { printf("A[%d]=",i); scanf("%lf",&A[i]); } printf("\n"); min=A[0]; for(i=0;i<=9;i++) { if(A[i]<min) { min=A[i]; } } tmp=A[i]; A[i]=A[9]; A[9]=tmp; for(i=0;i<=9;i++) { printf("A[%d]=%.0lf\n",i,A[i]); } return 0; } これを実行すると、A[9]=最小値にはなるのですが、A[i]はそのまま入れ替わらないのです。 誰か、どのように直せばよいか、教えていただけないでしょうか。よろしくお願いします。

  • c言語で大きな値の階数を求めたいのですが

    c言語で関数を用いてn!を求めるプログラムを作ったのですが、 nの値が大きくなると0という値になってしまって正しい値が出てきません。 プログラムをどの様に修正したらきちんとnの値が大きくなっても 正しく値が表示されるでしょうか? ソースはこちらです。 #include <stdio.h> int func(int i); int func(int i){ if(i == 0) return 1; else return (i*func(i-1)); } void main(){ printf("%d",func(90)); /*90!を求める*/ } よろしくお願いします。

  • C言語でfor文を用いたプログラミングについてです。

    C言語のプログラミングの課題で以下のような表をfor文を用いて作るというものが出ました。 商品名 単価(円)個数(円) 計  A  50   20   ***  B  90   30   ***  C  30   80   ***        合計金額   *** A,B,C及びそれぞれの単価、個数の値はキーボードからの入力で、***は演算によりその結果を出力するようにします。つまり、商品名(1文字)と単価、そしてその個数をキーボードから入力すると、単価と個数をかけた値と、それら全ての合計が出力されるようなプログラムを作るということです。 私は以下のようなプログラムを作りました #include<stdio.h> int main(void) { int a,b,c,sum,allsum,i; printf("商品名 単価 個数 計\n"); for(i=1;i<=3;i++) { a=getchar(); scanf("%d %d",&b,&c);  sum=b*c; allsum +=sum; putchar(a); printf(" %d %d %d \n",b,c,sum); } printf("合計金額 %d\n",allsum); return 0; } しかしこれでは合計金額がちゃんと表示されなかったりしてうまくいきません。おそらくfor文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。

専門家に質問してみよう