2012-07-05 162 views
0

我正试图编写一个程序,将celcius转换为华氏,反之亦然。我的程序正在编译,但它给了我错误的结果。我一直试图通过改变指针来改变它,但它不会工作。任何人都可以请指出我是什么问题?在我看来,这是在声明和指针,但我不知道。谢谢!函数和指针

#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; 
} 
+2

您应该使用调试器一行一行地浏览您的程序;这将使您能够检查它正在做出什么决定,以及中间变量的值是什么。或者,您可以添加大量的打印语句以实现类似的效果。 – 2012-07-05 12:01:52

回答

-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; 
} 

另外,作为其他的答案中的一个状态,病情(&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; 
} 
+0

谢谢,这是更好的方法! – 2012-07-05 12:12:52

+1

奇怪,这是被拒绝,但没有人打扰解释为什么。 – 2012-07-05 19:31:54

1

您正在比较char和C字符串"-f"。使用strcmp来比较C字符串。

您也可以将ch作为char数组声明为您需要的多个字符。因为,你不能像现在这样在一个char中存储“-f”。

有了变化:

#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-字符串。

+0

正好,谢谢!我只是想用signle f而不是 – 2012-07-05 12:13:33

3

if(&ch == "-f")这是问题所在。 它应该是:

if(ch == 'f')

+0

谢谢,正好 – 2012-07-05 12:12:30

1

除了其他答案:

你正在做不必要的调用转换功能和扔掉的结果,只是重复做相同的调用之前,但有返回值的正确处理:

if(&ch == "-f"){ 
    f2c(number); /* This line does absolutely nothing! */ 
    celcius=f2c(number); 
    printf("%f", celcius); 
    }