プロが教えるわが家の防犯対策術!

摂氏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));
}

A 回答 (4件)

以下のようにして下さい。


#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)
となる。
以上です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/19 22:55

No3 tatsu99 さんに補足です。



printf() は、float でも double でも、%f です。
%lf が定義されているのは scanf() だけで、printf() では動作が未定義だったはず。

ただし、たいていのコンパイラでは無難に動作してくれるようです。
# scanf() に引っ張られて printf() でも %lf としてしまう人が多いから
# なんでしょうか。。。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/19 22:56

これ、コンパイルできますか?


パッと見てコンパイルできないと思いますが。

理由
関数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;が適切でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/19 22:53

質問にあるプログラムを拝見した所


「プログラムで何をさせたいのか判っていない」
と思います。

まずは
「プログラムで何をさせたいのか、日本語で記述してみる」
というのを試して下さい。

例えば、最初は
1.華氏の下限を実数型変数F3に取り込む
2.華氏の上限を実数型変数F4に取り込む
3.(以下略)
のように記述します。

次に、記述した日本語をCの命令や関数に一対一で対応するくらいまで細分化して記述し直します。例えば
1.華氏の下限を実数型変数F3に取り込む
    ↓
1-1.「華氏の下限:」と画面表示する
1-2.キーボードから実数型変数F3に実数を取り込む
のように、命令語や関数1つに対応するくらいまで細かくします。

Cでコーディングするのはそれが出来てからの話で、コーディングするのはまだ時期尚早と思われます。

いきなりプログラム言語そのままで書き始めても、絶対にうまく行きません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/19 22:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!