【问题标题】:A Scientific Calculator in C using functions使用函数的 C 科学计算器
【发布时间】:2013-02-20 06:31:36
【问题描述】:

我编写了一个程序,它使用了大多数 math.h 库函数来创建一种科学计算器。但是,我没有得到想要的输出。我总是在输出结束时得到 0.000000。请帮我找出我的错误,谢谢。

#include <stdio.h>
#include <math.h>
#define PI 3.14159265
float sine(float  x);
float cosine(float x);
float tangent(float x);
float sineh(float x);
float cosineh(float x);
float tangenth(float x);
float logten(float x);
float squareroot(float x);
float exponent(float x);
float power(float x,float y);
int main()
{
    int x,y,n,answer;
    printf("What do you want to do?\n");
    printf("1.sin 2.cos 3. tan 4. sinh 5.cosh 6.tanh 7.1og10 8. square root. 9.exponent 10.power.");
    scanf ("%d",&n);
    if (n<9 && n>0)
    {
        printf("\n What is x? ");
        scanf("%f",&x);
        switch (n)
        {
            case 1: answer = sine(x);       break;
            case 2: answer = cosine(x);     break;
            case 3: answer = tangent(x);    break;
            case 4: answer = sineh(x);      break;
            case 5: answer = cosineh(x);    break;
            case 6: answer = tangenth(x);   break;
            case 7: answer = logten(x);     break;
            case 8: answer = squareroot(x); break;
            case 9: answer = exponent(x);   break;
        }
    }
    if (n==10)
    {
        printf("What is x and y?\n");
        scanf("%f%f",&x,&y);
        answer = power(x,y);
    }
    if (n>0 && n<11)
        printf("%f",answer);
    else
        printf("Wrong input.\n");
    return 0;
}
float sine(float x)
{
    return (sin (x*PI/180));
}
float cosine(float x)
{
    return (cos (x*PI/180));
}
float tangent(float x)
{
    return (tan(x*PI/180));
}
float sineh(float x)
{
    return (sinh(x));
}
float cosineh(float x)
{
    return (sinh(x));
}
float tangenth(float x)
{
    return (sinh(x));
}
float logten(float x)
{
    return (log10(x));
}
float squareroot(float x)
{
    return (sqrt(x));
}
float exponent(float x)
{
    return(exp(x));
}
float power(float x, float y)
{
    return (pow(x,y));
}

【问题讨论】:

    标签: c logic calculator


    【解决方案1】:

    您已将这四个变量声明为整数:

    int x,y,n,answer;
    

    n 是唯一一个您实际上将其视为整数的。将xyanswer 声明为float

    int n;
    float x, y, answer;
    

    【讨论】:

      【解决方案2】:
      #include <stdio.h>
      #include <math.h>
      #include<conio.h>
      #define PI 3.14159265
      
      float sine(float x)
      {
      return (sin (x*PI/180));
      }
      float cosine(float x)
       {
      return (cos (x*PI/180));
      }
      float tangent(float x)
      {
      return (tan(x));
      }
      float sineh(float x)
      {
      return (sinh(x));
      }
      float cosineh(float x)
      {
      return (sinh(x));
      }
       float tangenth(float x)
       {
      return (sinh(x));
      }
       float logten(float x)
      {
      return (log10(x));
      }
       float squareroot(float x)
       {
      return (sqrt(x));
      }
      float exponent(float x)
         {
        return(exp(x));
      }
      float power(float x, float y)
      {
      return (pow(x,y));
      }
       int main(void)
        {
        int n;
          float x,y,answer;
         printf("What do you want to do?\n");
        printf("1.sin 2.cos 3. tan 4. sinh 5.cosh 6.tanh 7.1og10 8. square root. 
      
        9.exponent   10.power.");
          scanf ("%d",&n);
          if (n<9 && n>0)
          {
          printf("\n What is x? ");
          scanf("%f",&x);
          switch (n)
          {
              case 1: answer = sine(x);       break;
              case 2: answer = cosine(x);     break;
              case 3: answer = tangent(x);    break;
              case 4: answer = sineh(x);      break;
              case 5: answer = cosineh(x);    break;
              case 6: answer = tangenth(x);   break;
              case 7: answer = logten(x);     break;
              case 8: answer = squareroot(x); break;
              case 9: answer = exponent(x);   break;
          }
      }
      if (n==10)
      {
          printf("What is x and y?\n");
          scanf("%f%f",&x,&y);
          answer = power(x,y);
      }
      if (n>0 && n<11)
          printf("%f",answer);
      else
          printf("Wrong input.\n");
          getch();
      return 0;
      }
      

      【讨论】:

        【解决方案3】:

        如果我启用 -Wall 和 -Wconversion,我会看到以下警告,如果您解决了这些警告,将会解决您的问题:

        foo.c:23:14: warning: format specifies type 'float *' but the argument has type 'int *' [-Wformat]
                        scanf("%f",&x);
                               ~~  ^~
                               %d
        foo.c:26:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 1: answer = sine(x);       break;
                                               ~ ^~~~~~~
        foo.c:27:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 2: answer = cosine(x);     break;
                                               ~ ^~~~~~~~~
        foo.c:28:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 3: answer = tangent(x);    break;
                                               ~ ^~~~~~~~~~
        foo.c:29:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 4: answer = sineh(x);      break;
                                               ~ ^~~~~~~~
        foo.c:30:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 5: answer = cosineh(x);    break;
                                               ~ ^~~~~~~~~~
        foo.c:31:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 6: answer = tangenth(x);   break;
                                               ~ ^~~~~~~~~~~
        foo.c:32:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 7: answer = logten(x);     break;
                                               ~ ^~~~~~~~~
        foo.c:33:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 8: answer = squareroot(x); break;
                                               ~ ^~~~~~~~~~~~~
        foo.c:34:21: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                                case 9: answer = exponent(x);   break;
                                               ~ ^~~~~~~~~~~
        foo.c:40:16: warning: format specifies type 'float *' but the argument has type 'int *' [-Wformat]
                        scanf("%f%f",&x,&y);
                               ~~    ^~
                               %d
        foo.c:40:19: warning: format specifies type 'float *' but the argument has type 'int *' [-Wformat]
                        scanf("%f%f",&x,&y);
                                 ~~     ^~
                                 %d
        foo.c:41:12: warning: implicit conversion turns floating-point number into integer: 'float' to 'int' [-Wconversion]
                        answer = power(x,y);
                               ~ ^~~~~~~~~~
        foo.c:44:15: warning: format specifies type 'double' but the argument has type 'int' [-Wformat]
                        printf("%f",answer);
                                ~~  ^~~~~~
                                %d
        foo.c:51:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (sin (x*PI/180));
                ~~~~~~  ^~~~~~~~~~~~~~
        foo.c:55:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (cos (x*PI/180));
                ~~~~~~  ^~~~~~~~~~~~~~
        foo.c:59:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (tan(x*PI/180));
                ~~~~~~  ^~~~~~~~~~~~~
        foo.c:63:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (sinh(x));
                ~~~~~~  ^~~~~~~
        foo.c:67:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (sinh(x));
                ~~~~~~  ^~~~~~~
        foo.c:71:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (sinh(x));
                ~~~~~~  ^~~~~~~
        foo.c:75:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (log10(x));
                ~~~~~~  ^~~~~~~~
        foo.c:79:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (sqrt(x));
                ~~~~~~  ^~~~~~~
        foo.c:83:9: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return(exp(x));
                ~~~~~~ ^~~~~~
        foo.c:87:10: warning: implicit conversion loses floating-point precision: 'double' to 'float' [-Wconversion]
                return (pow(x,y));
                ~~~~~~  ^~~~~~~~
        24 warnings generated.
        

        【讨论】:

          【解决方案4】:

          您将x 和其他变量声明为int。尝试声明为float

          【讨论】:

            【解决方案5】:

            问题是格式说明符错误。在scanf 语句中将所有%f 更改为%d

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-12-26
              • 2013-01-29
              • 2017-11-05
              • 2011-03-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多