计算器程序总是输出0 - 我做错了什么?

时间:2014-12-05 08:30:41

标签: c++ calculator

我正在尝试创建一个计算器作为我的第一个C ++程序。我之前使用全局变量让它工作但是在我的课程中不允许这样做,所以我尝试采用不同的方法。

我现在正在编写的程序,但在实际使用该程序时,它总是将答案输出为0.

这是我的代码:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

void calculate(float a, float b, char op);

int main() {

    float answer;
    float a, b;
    char op;
    char replay;
    do{
        cout<<"Choose your operation: +, -, /, *, ^, %" <<endl;
        cin>>op;
        cout<<"Input your first number:"<<endl;
        cin>>a;
        cout<<"Input your second number:"<<endl;
        cin>>b;
        calculate(a, b, op);    
        cout<<"The answer is:"<<answer<<endl;
        cout<<"Calculate again? Y = Yes, N = No"<<endl;
        cin>>replay;
    } while ((replay == 'y' || replay == 'Y')); 
    cout<<"Thanks for using the calculator, bye!"<<endl;
    return 0;   
}

void calculate(float a, float b, char op)
{
    float answer;
    switch(op)
    {
        case '-':
            answer = a - b;
            break;
        case '+':
            answer = a + b;
            break;
        case '*':
            answer = a * b;
            break;
        case '/':
            answer = a / b;
            break;
        case '^':
            answer = pow(a, b);
            break; 
        case '%':
            answer = fmod(a, b);
            break; 
        default:
            cout<<"You did something wrong!"<<endl; 
            break;
    }

}

6 个答案:

答案 0 :(得分:2)

您不会calculate函数返回答案。相反,您只需在answer函数中打印(未初始化的)局部变量main,即undefined behavior,因为未初始化(非静态)局部变量具有不确定的值。

仅仅因为在两个名为相同的函数中有两个局部变量并不意味着它们是相同的变量。局部变量只是 local 到它定义的函数。你需要更改calculate函数以实际返回answer并使用返回的main函数中的值。

答案 1 :(得分:2)

您有两个完全单独的 answer变量,一个在main()中设置为任意值,另一个在calculate()中设置但从不在功能之外看到。

如果您更改calculate()以返回float并实际返回 answer

float calculate(float a, float b, char op) {
    :
    return answer;
}

然后从main()

调用它
answer = calculate(a, b, op);

然后应该允许你传回结果。


另外,除非你有大量的浮点值数组,否则通常最好使用double而不是float - 前者给你大幅增加的范围和精确度将比后者更加“准确”(在外行的意义上)。

答案 2 :(得分:2)

你在main和calculate方法中声明了“float answer”。 你应该声明

float calculate(float a, float b, char op)

return answer;

来自计算方法。 主要是:

answer = calculate(a, b, op);

答案 3 :(得分:1)

如上所述,你不返回任何东西,并且在计算内部和主要内部的答案完全不同。你只需要改变几行

// Have a return type of float
float calculate(float a, float b, char op)

// Return the calculation. Do the same for the other cases
return a - b; 

// Assign what is returned from calculate to answer so you can output it later.
answer = calculate(a, b, op);

答案 4 :(得分:1)

这是我在初学者身上看到的常见基本错误。

您需要返回您的计算值并存储它。如果没有,你的功能就像&#34;没有做任何事情&#34;。 (虽然它确实计算了,但你没有存储计算的输出)。

您当前的功能标题是:

void calculate(float a, float b, char op)

函数名称前面的void是指函数的返回类型。无效意味着don't return anything。但是你需要返回计算出的值并存储它,所以它不能无效。

将其更改为

float calculate(float a, float b, char op)

现在,如果您将其更改为float。您的计算函数现在可以返回类型为float的计算答案,因此您可以立即在计算函数中编写此语句:return answer(其中answer是浮点值)

要解决您的问题,您可以这样做:

int main()
{
    answer = calculate(a, b, op); //Save the answer and use it later on
}

double calculate(double a, double b, char op) //I prefer double over float
{
    //Your implementation
    return answer;  //answer of type double 
}

当然,随着你更深入地进入C ++。有几种方法可以解决这个问题。即使返回类型为calculate(),您的void函数仍然有效。这样,您可以在函数中传递答案的reference。因此,任何更改都将直接更改主变量范围内的answer

答案 5 :(得分:0)

在函数内声明变量时,该变量的值是 local 到该函数。这意味着您无法在该功能之外引用它。在别处创建另一个具有相同名称的变量不会将它们链接在一起。

要从calculate函数中获取值,您需要将其返回,如下所示:

int main()
{
  // ...

  float answer = calculate(a,b,op);
  cout<<"The answer is:"<<answer<<endl;

  // ...
}

float calculate(a,b,op)
{
  float answer;

  // ...

  return answer;
}