C语言 使用函数的 C 语言科学计算器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15230880/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 05:34:34  来源:igfitidea点击:

A Scientific Calculator in C using functions

clogiccalculator

提问by Shail

I wrote a program which used most of the math.h library functions for creating a sort of scientific calculator. However, I am not getting the desired output. I always get 0.000000 in the end of the output. Please help me identify my mistake, Thank you.

我编写了一个程序,它使用大部分 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));
}

回答by LihO

You have declared these four variables as integers:

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

int x,y,n,answer;

but nis the only one that you actually treat as an integer. Declare x, yand answeras float:

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

int n;
float x, y, answer;

回答by Viva

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

回答by Bill Lynch

If I enable -Wall and -Wconversion, I see the following warnings, which, if you solved, would solve your problem:

如果我启用 -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.

回答by Forhad Ahmed

You declared xand other variables as int. Try declaring as floatinstead

您将x其他变量声明为int. 尝试宣告作为float代替

回答by s.suriya narasimman

The problem is that the format specifier is wrong. Change all %fto %din the scanfstatement.

问题是格式说明符是错误的。在语句中全部更改%f为。%dscanf