摂氏の値を計算するプログラム

このQ&Aのポイント
  • 摂氏と華氏の関係式を使って、摂氏の値を求めるプログラムを作成しました。
  • 関数の部分がうまく動作していないようです。どこを修正すればいいか教えてください。
  • 摂氏と華氏の変換を行うプログラムですが、まだ完全な結果が出力されていません。
回答を見る
  • ベストアンサー

摂氏の値を計算するプログラム・・?

摂氏Cと華氏Fの間には C=5/9(F-32)という関係式があり、華氏の上限、下限、きざみを入力して摂氏の値を求めるプログラムを関数を使って作りたいのですが、自分で作ってみたところ関数の部分がよくわかりません。printf("摂氏 華氏\n");までは画面上に出力されます。そのあとの結果が出ないのです。以下に自分で書いたものを書きますので、どこをどう直したらいいか教えてください!お願いします!! #include<stdio.h> double functionC(double F,double F1,double F2,double l) { double temp; for(F=F1; F<=F2; F++){ F = F+l; temp = 5/9*(F-32); } return(temp); } main(void) { double C,F3,F4,i,j; printf("摂氏の値を計算します\n 華氏の下限、上限、きざみを入力してください\n"); printf("華氏の下限:\n"); scanf("%f", &F3); printf("華氏の上限:\n"); scanf("%f", &F4); printf("きざみ:\n"); scanf("%f", &i); printf("摂氏 華氏\n"); for(j=F3; j<=F4; j++) printf("%f %f\n", functionC(j,F3,F4)); }

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

以下のようにして下さい。 #include<stdio.h> /* F:華氏(input)*/ /* 戻り値:摂氏*/ double functionC(double F) { return (5.0/9.0*(F-32.0)); } main(void) { double C,F3,F4,i,j; printf("摂氏の値を計算します\n 華氏の下限、上限、きざみを入力してください\n"); printf("華氏の下限:\n"); scanf("%lf", &F3); printf("華氏の上限:\n"); scanf("%lf", &F4); printf("きざみ:\n"); scanf("%lf", &i); printf("摂氏 華氏\n"); /* 以下は入力値の確認*/ printf ("F3 =%f F4=%f i=%f\n",F3,F4,i); for(j=F3; j<=F4; j+= i) printf("%lf %lf\n",functionC(j),j); } ------------------------------- 要点は 1.double型は %lfで操作する 2.double型と組み合わせる定数は5.0の用に小数点を 付ける。 3.関数 functionCは、入力は華氏 戻り値が摂氏 の関数となる。 4.華氏の下限から上限まで、刻み幅単位でのループは for(j=F3; j<=F4; j+= i) となる。 以上です。

yellowtail-ayari
質問者

お礼

ありがとうございました! わからない部分がほとんど明らかになりとても助かりました。 lfにすることもやったはずなのに忘れていたり・・ すごく参考になりました!

その他の回答 (3)

  • ency
  • ベストアンサー率39% (93/238)
回答No.4

No3 tatsu99 さんに補足です。 printf() は、float でも double でも、%f です。 %lf が定義されているのは scanf() だけで、printf() では動作が未定義だったはず。 ただし、たいていのコンパイラでは無難に動作してくれるようです。 # scanf() に引っ張られて printf() でも %lf としてしまう人が多いから # なんでしょうか。。。

yellowtail-ayari
質問者

お礼

私はたしかint型とdouble型の区別をするためにdouble型内では%lfとしたほうが自分が間違えにくいと教わりました。ありがとうございました。

回答No.2

これ、コンパイルできますか? パッと見てコンパイルできないと思いますが。 理由 関数functionC()の定義の引数の数(4)と呼び出しの引数の数(3)が合わない。 関数functionC()でしていることと表示がバラバラです。 tempで「最後に計算した結果のみ」を返しているので、最後の値だけが表示されるのでしょうか。 printf("%f %f\n", functionC(j,F3,F4)); の変数表示%fが2ヶ所出てきますが、表示される引数はfunctionC(j,F3,F4)の1つです。 for(j=F3; j<=F4; j++)文のjに対して、刻み量iの関係がまったくありません。 ここら辺をチェックしてみましょう。 **** 参考 **** ※1 関数functionC()中のローカル変数とmain()中のローカル変数は互いに独立なので、F, F1, F2, F3, F4の変数名の付け方に違和感を覚えます。 C → cels F → fahr のような変数名が好まれます。大文字の変数名はほとんど使いません。 ※2 for(j=F3; j<=F4; j++) 変数jは倍精度実数ですが、その変数にインクリメント演算をするのは(正しく動きますが)おかしいです。 インクリメント・デクリメント演算子は整数に用いるべきです。 実数の場合は、j+=1.0;が適切でしょう。

yellowtail-ayari
質問者

お礼

ありがとうございます。 コンパイルはできたので余計にエラーがわかりませんでした。参考になる部分が多くありました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

質問にあるプログラムを拝見した所 「プログラムで何をさせたいのか判っていない」 と思います。 まずは 「プログラムで何をさせたいのか、日本語で記述してみる」 というのを試して下さい。 例えば、最初は 1.華氏の下限を実数型変数F3に取り込む 2.華氏の上限を実数型変数F4に取り込む 3.(以下略) のように記述します。 次に、記述した日本語をCの命令や関数に一対一で対応するくらいまで細分化して記述し直します。例えば 1.華氏の下限を実数型変数F3に取り込む     ↓ 1-1.「華氏の下限:」と画面表示する 1-2.キーボードから実数型変数F3に実数を取り込む のように、命令語や関数1つに対応するくらいまで細かくします。 Cでコーディングするのはそれが出来てからの話で、コーディングするのはまだ時期尚早と思われます。 いきなりプログラム言語そのままで書き始めても、絶対にうまく行きません。

yellowtail-ayari
質問者

お礼

ありがとうございます。 日本語で一度解釈してみるようにします。

関連するQ&A

  • プログラム改良 求む

    こんにちは 以下の摂氏を華氏に変換するプログラミングを、摂氏が入力された場合はそのまま出力し、華氏が入力された場合は摂氏に変換してから出力するようなプログラミングに改良したいです。 #include <stdio.h> int main() { printf("摂氏を華氏に変換します。変換したい温度を摂氏で入力してください。\n"); double c, f; scanf("%lf",&c); f = (c * 9 / 5) + 32; printf("%lfºFです。", f);    return 0; }  今のところ、プログラムにどのように摂氏を華氏の違いを認識させればいいかがわかりません。分かりやすくコードを添えていただけるとさらに助かります。お願いします。

  • プログラムがうまくいきません。教えてください。

    プログラムがうまくいきません。教えてください。 #include <stdio.h> int main(void){ int a, b, c, d, f; printf("国語="); scanf("%d", &a); printf("算数="); scanf("%d", &b); printf("理科="); scanf("%d", &c); printf("社会="); scanf("%d", &d); f = ((a>90)?1:0)+((b>90)?1:0)+((c>90)?1:0)+((d>90)?1:0); printf("\n合計[%d],平均[%.2f]\n",(a+b+c+d),((double)(a+b+c+d)/4.0)); printf("国語[%d],[%.3f%%],[%d]\n",a,((double)a/1.5),((a>90)?1:0)); printf("算数[%d],[%.3f%%],[%d]\n",b,((double)b/1.5),((b>90)?1:0)); printf("理科[%d],[%.3f%%],[%d]\n",c,((double)c/1.5),((c>90)?1:0)); printf("社会[%d],[%.3f%%],[%d]\n",d,((double)d/1.5),((d>90)?1:0)); printf("総合判定[%d],\n", ((f>=3)?1:0)); return (0); } と入力したのですが、実行結果の国語から社会までの[]部分を上下揃えたいのですが揃いません。このプログラムにどのようなことを追加すれば揃えることができますか?教えてください!

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • C言語 関数化の仕方について

    こんにちは。プログラムの関数化の方法についてお願いがあり投稿いたしました。プログラムの関数化というものを行いたいのですが方法が分からないので、以下のプログラムを関数化していただきたいのです。 #include <stdio.h> int main() { printf("摂氏と華氏を相互変換します。変換したい温度を入力してください。\n"); printf("入力例:32F, 100C, etc.数値と単位の間に空白は不要です。\n"); double x, xc; char u; scanf("%lf%c",&x,&u); if (u=='C') { xc = (x * 9 / 5) + 32; printf("%lf degCは%lf degFです。\n", x, xc); } else if (u=='F') { xc = (x - 32) * 5 / 9; printf("%lf degFは%lf degCです。\n", x, xc); } else { printf("書式が誤っています。\n"); } return 0; } コードを添えていただけるとさらに分かりやすくて助かります。お手数ですがよろしくお願いいたします。

  • 実数型の変数に値を入力した計算結果がおかしくなる理由

    こんばんは。 以下のプログラムで値がおかしくなる理由、改善方法を教えて頂けませんでしょうか。 double a,b,c; scanf("%f",&a); scanf("%f",&b); c = a + b; printf("%f",c); これを実行すると、正しい値が出力されません。 int型で宣言し、整数表示の%dに変更すると問題なく値が出力されます。 また、予めdouble型で宣言した変数a,bに実数の初期値(8.5等)を格納しておくと正しい値が出力されます。 どなたかご回答よろしくお願い致します。

  • 学校の課題で2次方程式のプログラムを作ってみたのですが、足りない部分ががあるらしいのでお教えてください

    キーボードからある整数の値を入力して、2次方程式を解くというプログラムを作ったのですが、解の方程式のところでどこかが足りないらしいのですが教えてください。 #include<math.h> #include<stdio.h> int quadraticEquation(double a, double b, double c){ int x,y,l,k,j; double z; x=b*b; y=4*a*c; z=x-y; if(z>=0){ l=sqrt((double)z); } else printf("ERROR!!\n"); k=(-b)+l; j=k/2*a; return j; } int main(void){ int n1,n2,n3; printf("input three integer!\n"); printf("intger1:"); scanf("%d",&n1); printf("intger2:"); scanf("%d",&n2); printf("intger3:"); scanf("%d",&n3); printf("kotaeha %d %d desu\n",quadraticEquation(n1, n2, n3),quadraticEquation(n1, n2, n3)); return 0; } が自分が作ったプログラムです。 後、解が2つある場合の出力方法がこれであっているかどうかも教えてください。 よろしくお願いします。

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

  • C言語、円周率の値が0.000000?

    いつも大変お世話になりありがとうございます。 下記のコードを実行したところ、円周率の値が0.000000になりました。 どうしてでしょうか? アドバイスの程宜しくお願い申し上げます。 #include <stdio.h> int main(void) { double pi; printf("円周率の値はいくつですか?\n"); scanf("%1f", &pi); printf("円周率の値は%fです。\n", pi); return 0; } C:\MinGW>Sample9 円周率の値はいくつですか? 3.14 円周率の値は0.000000です。

専門家に質問してみよう