无法弄清楚为什么这不起作用

时间:2014-11-09 22:15:18

标签: c++

我是一名学生学习c ++而我必须在本周制作二次方程式求解器。我应该只使用主代码块中的函数来获取输出。 这就是我到目前为止所做的:

#include <iostream>
#include <cmath>
using namespace std;
double a, b, c, x1, x2;
char choice, response, mychar;
double disc = (b*b - 4 * a*c);

void GetCoefficients(double a, double b, double c)
{
    cout << "Enter the coefficients of your quadratic equation (a, b, c): ";
    cin >> a, b, c;
}

bool ComputeRoots(double a, double b, double c, double x1, double x2)
{

    if (disc > 0)
    {
        x1 = (-b + sqrt((b*b) - 4 * a*c)) / 2 * a;
        x2 = (-b - sqrt((b*b) - 4 * a*c)) / 2 * a;
        return true;
    }
    if(disc == 0)
    {
        x1 = x2 = (-1 * b) / (2 * a);
        return true;
    }
    else 
    {
        cout << "'a' cannot be zero. That is not a quadratic equation.";
        return false;
    }
}

char PromptToContinue()
{
    char mychar;
    cout << "Would you like to solve another quadratic equation (Y, N): ";
    cin >> mychar;
    return mychar;
}

void PrintRoots(double x1, double x2)
{
    if (disc > 0)
    {
        cout << "The roots are: " << x1 << ", " << x2;
    }

    if (disc == 0)
    {
        cout << "The single root is: " << x1;
    }
}

void main()
{

    do
    {
        GetCoefficients(a, b, c);
        if (ComputeRoots(a, b, c, x1, x2))
        {
            PrintRoots(x1, x2);
        }
        choice = PromptToContinue();
    } while (choice != 'n' || 'N');
    system("pause");
}

我确定我的代码存在多个问题,但我已经盯着这几个小时,并且不知道为什么它不起作用。任何见解都会很棒。

我应该得到的示例输出是这个(冒号后面的值是用户输入):

  

输入二次方程(a,b,c)的系数:2 3 4
  根源很复杂。

     

您想要求解另一个二次方程(Y,N):y
  输入二次方程(a,b,c)的系数:1 2 1

     

单根是:-1

     

您想要求解另一个二次方程(Y,N):y
  输入二次方程(a,b,c)的系数:0 5 6

     

&#39;一个&#39;不能为零。那不是二次方程式。

     

您想要求解另一个二次方程(Y,N):y
  输入二次方程(a,b,c)的系数:5 25 5

     

根源是:-0.208712,-4.79129

     

您想要求解另一个二次方程(Y,N):n
  按任意键继续 。 。

我得到的输出是:

Enter the coefficients of your quadratic equation (a, b, c): 2 3 4
The single root is: 0Would you like to solve another quadratic equation (Y, N):
Enter the coefficients of your quadratic equation (a, b, c): The single root is:
 0Would you like to solve another quadratic equation (Y, N):

4 个答案:

答案 0 :(得分:4)

一个显而易见的问题是void GetCoefficients(double, double, double)的参数是按值传递的,当您显然希望它们通过引用传递 时。按原样,你将它们复制到你的功能中,将用户输入读入这些副本,然后在返回时将它们全部丢弃。

修改void main()不正确,main应该有int main(int, char**)int main()类型。

while (choice != 'n' || 'N');没有做到你期望的事情:它检查choice是否与'n'不同,然后用文字做一个布尔 'N'。由于'N'非零,因此条件始终为真。正确的语法是(choice != 'n' && choice != 'N')

你的程序整体形状也很奇怪,但我想它会变得更好。例如,您只使用全局变量,应尽可能避免使用。 void PrintRoots()很有趣,因为它的参数列表需要一半的参数,并从全局变量中获取另一半参数。

答案 1 :(得分:2)

cin >> a, b, c;

是错误的,并没有按照您的想法行事(请阅读comma operator)。

你可能想要

cin >> a >> b >> c;

至少

编译所有警告&amp;调试信息(g++ -Wall -Wextra -g)。然后使用调试器gdb),例如一步一步地运行你的程序。

更一般地说,阅读更多关于您正在使用的函数和运算符的文档(在C ++上)(例如this

答案 2 :(得分:1)

此代码:

double a, b, c, x1, x2;
double disc = (b*b - 4 * a*c);

disc设置为零。在C ++中,表达式是在遇到表达式时使用变量的值计算的。此行设置一个公式,该公式将在您稍后在程序中使用disc时用于计算disc

(注意:由于double a, b, c, x1, x2;是全局的,因此这些值会初始化为0.0,因此disc的计算最终也会以0.0结束。

例如,你继续做:

bool ComputeRoots(double a, double b, double c, double x1, double x2)
{
    if (disc > 0)

然而disc仍为零,因为如前所述,您在程序开头将其设置为零,并且您还没有更改它。

要设置一种情况,其中值是根据其他输入值计算的,您需要编写函数,例如:

double disc(double a, double b, double c) { return b*b - 4*a*c; }

答案 3 :(得分:0)

可能你对使用局部变量和全局变量感到困惑。这里你已经将所有变量都指定为全局变量,因此你不需要在函数参数中传递变量(请记住,使用许多全局变量是一个糟糕的编程练习)。你的代码有很多语义问题

#include <iostream>
#include <cmath>
using namespace std;
double a, b, c, x1, x2;
char choice, response, mychar;
double disc = (b*b - 4 * a*c); // here only declare disc like `double disc;`  create a function for calculating disc like
/* void caldisc()
{
disc = (b*b - 4 * a*c);
} call this caldisc() in main after GetCoefficients()*/

    void GetCoefficients(double a, double b, double c) // passing parameters double a, double b, double c means your creating local copy of a b and c and getting input in it not in global a b c
    {
        cout << "Enter the coefficients of your quadratic equation (a, b, c): ";
        cin >> a, b, c;   // use cin>>a>>b>>c;
    }

    bool ComputeRoots(double a, double b, double c, double x1, double x2) // dont pass parameters here and use directly it in main() like ComputeRoots();
    {

        if (disc > 0)
        {
            x1 = (-b + sqrt((b*b) - 4 * a*c)) / 2 * a;
            x2 = (-b - sqrt((b*b) - 4 * a*c)) / 2 * a;
            return true;
        }
        if(disc == 0)
        {
            x1 = x2 = (-1 * b) / (2 * a);
            return true;
        }
        else 
        {
            cout << "'a' cannot be zero. That is not a quadratic equation.";  // this block will get executed when disc<0 regardless of a. ZeroCheck of a should be done in upper blocks.
            return false;
        }
    }

    char PromptToContinue()
    {
        char mychar;       // here you're creating local copy of mychar and returning it in last line.Thus local copy of mychar will return garbage. remove this line
        cout << "Would you like to solve another quadratic equation (Y, N): ";
        cin >> mychar;
        return mychar; // remove this change function return type as void
    }

    void PrintRoots(double x1, double x2) // no need to pass x1 and x2 change function call in main too.
    {
        if (disc > 0)
        {
            cout << "The roots are: " << x1 << ", " << x2;
        }

        if (disc == 0)
        {
            cout << "The single root is: " << x1;
        }
    }

现在主要不要使用选择。使用mychar检查do-while条件!='N'//表示如果传递N以外的其他内容将执行循环