由于变量是局部变量而不是全局变量导致的运行时错误

Runtime error due to variables being local not global

以下代码要求用户选择一个形状,输入该形状的尺寸,并显示其体积。

当我 运行 代码时,我得到以下输出,显示结果不是数字 (NaN) :

我意识到这一定与我的变量是局部变量而不是全局变量这一事实有关,并且调用了以下函数:

choice = ReadInputShapeChoice();
readshapedimension(choice);
result = CalculateBasicVolume(choice);

没有传递所需的数据。试图解决这个问题并将变量放在正确的位置但无济于事,我是使用任何形式的编码语言的初学者,发现整个程序的创建相当具有挑战性。

我已经发布了一个类似的问题,但这个问题更详细,如果有人可以阐明我如何修改变量的位置以使程序正确 运行 我将非常感激.谢谢。

完整代码为:

#include <iostream>
using namespace std;

double height, width, length, radius, base_area, result;

 //Function prototypes

int ReadInputShapeChoice();
void readshapedimension(int choice);
float CalculateBasicVolume(int choice);
void PrintResult(int choice);

double rectangular_solid(double length1, double width1, double height1);
double cylinder(double radius2, double height2);
double cone(double radius3, double height3);
double sphere(double radius4);
double square_based_pyramid(double height5, double base_area5);

//function definitions
double rectangular_solid(double length1, double width1, double height1)
{
    double value;
    value = (length1 * width1 * height1);
    return value;
}
double cylinder(double radius2, double height2)
{
    double value;
    value = (3.14159 * (radius2 * radius2) * height2);
    return value;
}
double cone(double radius3, double height3)
{
    double value;
    value = ((3.14159 * (radius3 * radius3) * height3) / 3);
    return value;
}
double sphere(double radius4)
{
   double value;
   value = ((3.14159 * (radius4 * radius4 * radius4))*(4 / 3));
   return value;
}
double square_based_pyramid(double height5, double base_area5)
   {
   double value;
   value = ((height5 * base_area5) * (1 / 3));
   return value;
   }


int ReadInputShapeChoice()
{   int choice;
    cout << "Choose what shape you want to calculate" << endl;
    cout << "1 = Rectangular solid" << endl;
    cout << "2 = Cylinder" << endl;
    cout << "3 = Cone" << endl;
    cout << "4 = Sphere" << endl;
    cout << "5 = Square based pyramid" << endl;
    cin >> choice;
    return choice;
}

void readshapedimension(int choice)
{
    switch (choice)
    {
    case 1:
    {
        int length, width, height;
        cout << "You have chosen rectuangular solid" << endl;
        cout << "Enter the values for length width and height" << endl;
        cin >> length >> width >> height;
        break;
    }
    case 2:
    {
        int radius, height;
        cout << "You have chosen cylinder" << endl;
        cout << "Enter the values for radius and height" << endl;
        cin >> radius >> height;
        break;
    }
    case 3:
    {
        int radius, height;
        cout << "You have chosen cone" << endl;
        cout << "Enter the values for radius and height" << endl;
        cin >> radius >> height;
        break;
    }
    case 4:
    {
        int radius;
        cout << "You have chosen sphere" << endl;
        cout << "Enter the radius" << endl;
        cin >> radius;
        break;
    }
    case 5:
    {
        int height, base_area;
        cout << "You have chosen square based pyramid" << endl;
        cout << "Enter height and area of the base" << endl;
        cin >> height >> base_area;
        break;
    }
    }
}

float CalculateBasicVolume(int choice)
{
switch (choice)
{
    int result;
case 1:
{
    result = rectangular_solid(length, width, height);
    break;
}
case 2:
{
    result = cylinder(radius, height);
    break;
}
case 3:
{
    result = cone(radius, height);
    break;
}
case 4:
{
    result = sphere(radius);
    break;
}
case 5:
{
    result = square_based_pyramid(height, base_area);
    break;
}
    return result;
    }
}
void PrintResult(int choice)
{
    switch (choice)
    {
case 1:
{
    cout << "The volume of the rectangular solid is " << result << endl;
    break;
}
case 2:
{
    cout << "the volume of the cylinder is " << result << endl;
    break;
}
case 3:
{
    cout << "The volume of the cone is " << result << endl;
    break;
}
case 4:
{
    cout << "The volume of the sphere is " << result << endl;
    break;
}
case 5:
{
    cout << "the volume of the square based pyramid is " << result <<     endl;
    break;
}

}
}



int main() {
    int choice;
    choice = ReadInputShapeChoice();
    readshapedimension(choice);
    result = CalculateBasicVolume(choice);
    PrintResult(choice);

        return 0;
}}

您正在重新定义 result 变量。

在文件的顶部声明它;

double result;

但是你从来没有初始化它,而是稍后重新定义它,并将你想要打印的值放在这个新变量中;

float CalculateBasicVolume(int choice)
{
    switch (choice)
    {
        int result;

您稍后打印的变量是未初始化的 double 而不是实际包含圆锥体体积的 int。

您正在函数中重新声明;这会导致函数使用它们的局部值而不是全局值,例如,我已经注释掉了 reshapedimensions 函数中的重新声明:

// This is our global declaration
double height, width, length, radius, base_area, result;

void readshapedimension(int choice)
{
    switch (choice)
    {
    case 1:
    {
        // Take out our local declarations
        // Otherwise cin below will write to the local and these values
        // will subsequently be lost when the function exits
        //int length, width, height;
        cout << "You have chosen rectuangular solid" << endl;
        cout << "Enter the values for length width and height" << endl;
        cin >> length >> width >> height;
        break;
    }
    case 2:
    {
        //int radius, height;
        cout << "You have chosen cylinder" << endl;
        cout << "Enter the values for radius and height" << endl;
        cin >> radius >> height;
        break;
    }
    case 3:
    {
        //int radius, height;
        cout << "You have chosen cone" << endl;
        cout << "Enter the values for radius and height" << endl;
        cin >> radius >> height;
        break;
    }
    case 4:
    {
        //int radius;
        cout << "You have chosen sphere" << endl;
        cout << "Enter the radius" << endl;
        cin >> radius;
        break;
    }
    case 5:
    {
        //int height, base_area;
        cout << "You have chosen square based pyramid" << endl;
        cout << "Enter height and area of the base" << endl;
        cin >> height >> base_area;
        break;
    }
    }
}

但是,我注意到您在函数中使用 int,在全局声明中使用 double;如果这是故意的,您需要在某处包含转换并将结果存储回全局变量。

最好让您的全局名称保持唯一,这样您就不会将它们与本地名称混淆;常用技术是使用 ALLCAPS 或前缀,例如 glob_myvar.