我是一名学生学习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):
答案 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以外的其他内容将执行循环