0

摂氏を華氏に、またはその逆に変換するプログラムを作成しようとしています。私のプログラムはコンパイル中ですが、間違った結果になります。ポインタを変更して変更しようとしていますが、機能しません。誰かが私の問題を指摘してもらえますか?宣言とポインタにあるように見えますが、よくわかりません。ありがとうございます。

#include<stdio.h>

float f2c(float f);
float c2f(float c);

int main(void)
{
 float cel;
 float celcius;
 float fahren;
 float fah;
 char ch;
 float number;

scanf("%c %f", &ch, &number);

if(&ch == "-f"){
  f2c(number);
  celcius=f2c(number);
  printf("%f", celcius);
  }

 else{
  c2f(number);
  fahren = c2f(number);
  printf("%f", fahren);
  }

return 0;
}

float f2c(float f)
{
 float cel = (f - 32) * 5/9;
 return cel;
} 

float c2f(float c)
{
 float fah = (9 * c/5 + 32);
 return fah;
}
4

4 に答える 4

3

if(&ch == "-f")これが問題です。そのはず :

if(ch == 'f')

于 2012-07-05T12:01:38.370 に答える
1

charをC文字列と比較しています"-f"strcmpC文字列を比較するために使用します。

chここで必要な複数の文字に対してchar配列として宣言することもできます。なぜなら、今のように「-f」を1つの文字に格納することはできないからです。

変更点:

#include<stdio.h>

float f2c(float f);
float c2f(float c);

int main(void)
{
 float cel;
 float celcius;
 float fahren;
 float fah;
 char ch[25];
 float number;

scanf("%s %f", ch, &number);

if(strcmp(ch,"-f")==0){
  f2c(number);
  celcius=f2c(number);
  printf("%f", celcius);
  }

 else{
  c2f(number);
  fahren = c2f(number);
  printf("%f", fahren);
  }

return 0;
}

float f2c(float f)
{
 float cel = (f - 32) * 5/9.0;
 return cel;
} 

float c2f(float c)
{
 float fah = (9 * c/5.0 + 32);
 return fah;
}

これは基本的にはコードですが、入力をC文字列として読み取るように変更しました。

于 2012-07-05T12:01:26.847 に答える
1

他の答えに加えて:

同じ呼び出しを再度実行する直前に、変換関数を不必要に呼び出して結果を破棄していますが、戻り値は適切に処理されています。

if(&ch == "-f"){
  f2c(number);  /* This line does absolutely nothing! */
  celcius=f2c(number);
  printf("%f", celcius);
  }
于 2012-07-05T12:04:55.747 に答える
-1

整数演算では5/9が0であるため、整数演算ではなく浮動小数点演算を使用します。したがって、コードにこの変更を加えることができます(floatパラメーターは異常ですが)。

float f2c(float f)
{
 return  (f - 32.0) * 5.0/9.0;
} 

float c2f(float c)
{
 return 9.0 * c/5.0 + 32.0;
}

また、他の回答の1つが述べているように、条件(&ch == "-f")は決して真ではありません。

これは、エラーチェックを含む完全な実例です。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#include <assert.h>

static double f2c(double f)
{
 return (f - 32.0) * 5.0/9.0;
} 

static double c2f(double c)
{
 return 9.0 * c/5.0 + 32.0;
}

int main (int argc, char *argv[])
{
 int i;
 const char *label_f = "Fahrenheit";
 const char *label_c = "Celcius";
 const char *from, *to;
 double (*conversion)(double);

 from = label_c;
 to = label_f;
 conversion = c2f;

 for (i=1; i<argc; ++i)
   {
     if (0 == strcmp(argv[i], "-f"))
       {
         from = label_f;
         to = label_c;
         conversion = f2c;
       }
     else if (0 == strcmp(argv[i], "-c"))
       {
         from = label_c;
         to = label_f;
         conversion = c2f;
       }
     else
       {
         char *suffix = NULL;
         double temp_in;

         errno = 0;
         temp_in = strtod(argv[i], &suffix);

         if (ERANGE == errno)
           {
             if (HUGE_VAL == temp_in) 
               {
                 fprintf(stderr, "%s is too big", argv[i]);
                 return 1;
               }
             else
               {
                 assert(-HUGE_VAL == temp_in);
                 fprintf(stderr, "%s is too small", argv[i]);
                 return 1;
               }
           }
         else if (errno != 0 && (suffix == argv[i]))
           {
             /* no conversion was performed. */
             fprintf(stderr, "%s is not a number", argv[i]);
             return 1;
           }
         else if (*suffix) 
           {
             fprintf(stderr, "Expected a number but saw '%s'\n", argv[i]);
             return 1;
           }
         else
           {
             const double temp_out = (*conversion)(temp_in);
             printf("%f %s is %f %s.\n", temp_in, from, temp_out, to);
           }
       }
   }
 return 0;
}
于 2012-07-05T12:03:02.617 に答える