简单函数的问题
Trouble with simple functions
我正在编写代码来调用与力、质量和加速度方程有关的函数。函数被正确调用,但输入未按应有的方式相乘。我对第一个函数的输出是一个非常小的数字,第一个函数的输出始终为 0。
这是我的代码。任何反馈都会非常有帮助。谢谢
#include <iostream>
#include <cstdlib>
using namespace std;
void displayMenu();
double force(double);
double secondForce(double,double);
int main(int argc, char** argv)
{
int menuOption;
displayMenu();
system("PAUSE");
return 0;
}
void displayMenu(void)
{
int menuOption;
double weight, accel;
cout << " Main Menu" << endl;
cout << "Enter 1 for Force calculation with acceleration = 9.8m/s^2.\n";
cout << "Enter 2 for Force calculation with user defined acceleration.\n";
cout << "Enter 3 to quit the program.\n";
cin >> menuOption;
if(menuOption==1)
{
cout << "Enter a mass.\n";
cin >> weight;
cout << "The force is ";
cout << force(weight);
cout << "N.";
}
else if(menuOption==2){
cout << "Enter a mass.\n";
cin >> weight;
cout << "Enter an acceleration.\n";
cin >> accel;
cout << "The force is ";
cout << secondForce(weight, accel);
cout << "N.";
}
}
double force(double weight)
{
double force, mass;
force=(mass*(9.8));
return force;
}
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration);
return secondForce;
}
问题是您在计算中使用了未定义的变量。请参阅下面我嵌入的评论:
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration); //what is the value of mass and acceleration here??
return secondForce;
}
附带说明:考虑在调试器(如 gdb)中单步执行代码,以便查看程序的执行情况。对于大型程序来说,试图通过它进行推理是非常困难的。在您的示例中,很容易发现有经验的程序员。
您正在将数据乘以垃圾值
double force(double weight)
{
double force, mass;
force=(mass*(9.8));
return force;
}
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration);
return secondForce;
}
这里的mass
和acceleration
的值是多少?这些变量未初始化。您必须先为它们分配一些值。
您在函数中使用了未初始化的变量。在你的程序中使用这些未初始化的变量是undefined behavior。
force=(mass*(9.8)); << mass has a garbage value
secondForce=(mass*acceleration); << mass and acceleration have a garbage value
我想你是想拥有
double force(double weight)
{
return weight * 9.8;
}
double secondForce(double secondMass, double secondAccel)
{
return secondMAss * secondAccel;
}
您应该启用编译器警告并注意它们。例如,即使在最低警告级别,MSVC 也是这样说的:
warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'acceleration' used
在 C++ 中,使用未初始化的变量从来都不是一个好主意。与其他语言不同,C++ 中的大多数变量 而不是 自动初始化为 0 值。当要访问变量中包含的值时,这会导致您的程序禁止未指定或未定义的行为。
安全正确。 初始化! 例如:
double force = 0.0;
double mass = 0.0;
请注意,该语言还允许您先初始化,然后赋值,然后使用变量。例如:
double force;
force = 0.0;
cout << force;
但这种风格很糟糕。当您可以一步完成所有事情时,为什么要保留一个未初始化的变量然后再分配一些东西呢?首先让变量未初始化也会阻止您将其设置为 const
.
确保所有变量的正确初始化将使您的程序的行为明确且一致。但是,您还会遇到其他问题,因为您乘以 0 mass
,结果总是 0,这肯定不是您想要的。但是,确定性行为是修复错误数学的良好起点。
我正在编写代码来调用与力、质量和加速度方程有关的函数。函数被正确调用,但输入未按应有的方式相乘。我对第一个函数的输出是一个非常小的数字,第一个函数的输出始终为 0。 这是我的代码。任何反馈都会非常有帮助。谢谢
#include <iostream>
#include <cstdlib>
using namespace std;
void displayMenu();
double force(double);
double secondForce(double,double);
int main(int argc, char** argv)
{
int menuOption;
displayMenu();
system("PAUSE");
return 0;
}
void displayMenu(void)
{
int menuOption;
double weight, accel;
cout << " Main Menu" << endl;
cout << "Enter 1 for Force calculation with acceleration = 9.8m/s^2.\n";
cout << "Enter 2 for Force calculation with user defined acceleration.\n";
cout << "Enter 3 to quit the program.\n";
cin >> menuOption;
if(menuOption==1)
{
cout << "Enter a mass.\n";
cin >> weight;
cout << "The force is ";
cout << force(weight);
cout << "N.";
}
else if(menuOption==2){
cout << "Enter a mass.\n";
cin >> weight;
cout << "Enter an acceleration.\n";
cin >> accel;
cout << "The force is ";
cout << secondForce(weight, accel);
cout << "N.";
}
}
double force(double weight)
{
double force, mass;
force=(mass*(9.8));
return force;
}
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration);
return secondForce;
}
问题是您在计算中使用了未定义的变量。请参阅下面我嵌入的评论:
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration); //what is the value of mass and acceleration here??
return secondForce;
}
附带说明:考虑在调试器(如 gdb)中单步执行代码,以便查看程序的执行情况。对于大型程序来说,试图通过它进行推理是非常困难的。在您的示例中,很容易发现有经验的程序员。
您正在将数据乘以垃圾值
double force(double weight)
{
double force, mass;
force=(mass*(9.8));
return force;
}
double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration);
return secondForce;
}
这里的mass
和acceleration
的值是多少?这些变量未初始化。您必须先为它们分配一些值。
您在函数中使用了未初始化的变量。在你的程序中使用这些未初始化的变量是undefined behavior。
force=(mass*(9.8)); << mass has a garbage value
secondForce=(mass*acceleration); << mass and acceleration have a garbage value
我想你是想拥有
double force(double weight)
{
return weight * 9.8;
}
double secondForce(double secondMass, double secondAccel)
{
return secondMAss * secondAccel;
}
您应该启用编译器警告并注意它们。例如,即使在最低警告级别,MSVC 也是这样说的:
warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'acceleration' used
在 C++ 中,使用未初始化的变量从来都不是一个好主意。与其他语言不同,C++ 中的大多数变量 而不是 自动初始化为 0 值。当要访问变量中包含的值时,这会导致您的程序禁止未指定或未定义的行为。
安全正确。 初始化! 例如:
double force = 0.0;
double mass = 0.0;
请注意,该语言还允许您先初始化,然后赋值,然后使用变量。例如:
double force;
force = 0.0;
cout << force;
但这种风格很糟糕。当您可以一步完成所有事情时,为什么要保留一个未初始化的变量然后再分配一些东西呢?首先让变量未初始化也会阻止您将其设置为 const
.
确保所有变量的正确初始化将使您的程序的行为明确且一致。但是,您还会遇到其他问题,因为您乘以 0 mass
,结果总是 0,这肯定不是您想要的。但是,确定性行为是修复错误数学的良好起点。