奇怪的输出?用户定义的类(C ++)

时间:2016-05-07 21:33:32

标签: c++ class output

我必须使用以下属性创建一个sphere类:

  

编写一个具有以下属性的类Sphere:

     

私人属性:(1)中心的X,Y,Z坐标(2)   半径

     

访问者和mutator方法   •设置并获取X,Y和Z.   坐标
  •设置并获得半径
  •获取体积和表面   区域如果是球体。

     

对于球体,
  体积=4πr3/ 3
  表面积=4πr2
  写一个主要的   用于测试球体类的程序。

我之前从未上过课。我想我做得对。但是,我的Volume和Surface Surface的输出非常奇怪。以下是我的程序和输出。

PROGRAM

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>

using namespace std;

class Sphere {
private:
    float X;
    float Y;
    float Z;
    float R;
    float Volume;
    float SurfaceArea;
public:
    float DefineCoordinates(float x, float y, float z);
    void DefineRadius(float radius);
    double GetVolume()
    {
        return (((4 * M_PI*pow(R, 3))) / 3);
    }
    double GetSurfaceArea()
    {
        return (4 * M_PI*pow(R, 2));
    }
    float GetX();
    float GetY();
    float GetZ();


};

float Sphere::GetX() {
    return X;
}

float Sphere::GetY() {
    return Y;
}

float Sphere::GetZ() {
    return Z;
}

float Sphere::DefineCoordinates(float x, float y, float z) {
    X = x;
    Y = y;
    Z = z;
    return 0;
}

void Sphere::DefineRadius(float radius) {
    R = radius;
}


int main() {
    float inputr, radius, x, y, z;
    Sphere sphere;
    double Volume = sphere.GetVolume();
    double SurfaceArea = sphere.GetSurfaceArea();
    char open = '(';
    char close = ')';
    char comma = ',';
    cout << "Please input the center of the sphere in the fashion (X,Y,Z) and press enter: ";
    cin >> open >> x >> comma >> y >> comma >> z >> close;
    cout << "Please define the radius of the sphere: ";
    cin >> inputr;
    sphere.DefineCoordinates(x, y, z);
    sphere.DefineRadius(inputr);
    cout << "This sphere has a center of (" << sphere.GetX() << ", " << sphere.GetY() << ", " << sphere.GetZ() << ")." << endl;
    cout << "This sphere has a radius of " << inputr << "." << endl;
    cout << "This computes to a volume of " << Volume << " units cubed, and a surface area of " << SurfaceArea << "." << endl;
}

输出 无论我输入什么作为半径,我都会得到:

  

这计算的体积为-5.18547e + 24个单位立方体和一个表面   面积1.4488e +17。

我做错了什么?此外,任何其他清理我的课程的建议都会有所帮助!

4 个答案:

答案 0 :(得分:1)

您过早调用GetVolume()方法。在实际从用户获取半径后调用它。

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<ul class="nav nav-tabs" role="tablist">
      
     <li role="presentation">
      <a href="#home" aria-controls="home" role="tab" data-toggle="tab"><span><i class="fa fa-envelope-o" aria-hidden="true"></i>
       Some text</span></a>
     </li>
     <li role="presentation" class="active">
      <a href="#profile" aria-controls="profile" role="tab" data-toggle="tab"><span><i class="fa fa-search" aria-hidden="true"></i>
       Some Text</span></a>
     </li>
     <li role="presentation">
      <a href="#messages" aria-controls="messages" role="tab" data-toggle="tab"><span><i class="fa fa-comment" aria-hidden="true"></i>Some Text</span></a>
     </li> 
   </ul>

与上述类似。

答案 1 :(得分:1)

简单, 在定义半径之前,您可以读取体积和曲面。

答案 2 :(得分:1)

您的问题是,在您阅读输入之前,您正在调用GetVolume()GetSurfaceArea()函数。您的计算基于未初始化的值。

您应该在调用DefineCoordinates()DefineRadius()

之后移动函数调用

你的主要应该与此类似:

int main() {
    float inputr, radius, x, y, z;
    Sphere sphere;
    char open = '(';
    char close = ')';
    char comma = ',';
    cout << "Please input the center of the sphere in the fashion (X,Y,Z) and press enter: ";
    cin >> open >> x >> comma >> y >> comma >> z >> close;
    cout << "Please define the radius of the sphere: ";
    cin >> inputr;
    sphere.DefineCoordinates(x, y, z);
    sphere.DefineRadius(inputr);
    double Volume = sphere.GetVolume();
    double SurfaceArea = sphere.GetSurfaceArea();
    cout << "This sphere has a center of (" << sphere.GetX() << ", " << sphere.GetY() << ", " << sphere.GetZ() << ")." << endl;
    cout << "This sphere has a radius of " << inputr << "." << endl;
    cout << "This computes to a volume of " << Volume << " units cubed, and a surface area of " << SurfaceArea << "." << endl;
}

答案 3 :(得分:0)

http://127.0.0.1:8000/triplists/ 有一个默认构造函数,它不会初始化SphereXY成员。在构造之后,您尝试从这些不确定的值计算体积和表面。

换句话说,

Z

没有定义数学关系(似乎你认为它确实如此),这是必要的。该卷将计算一次(用于double Volume = sphere.GetVolume(); 的初始化),并且其值不会随您更改Volume的属性而更改。在您调用sphereSphere::DefineCoordinates之后>进行此计算

或者,不可能构造这样一个无效的Sphere::DefineRadius对象。了解如何使用构造函数,并不时使用一些Sphere限定符。

为了完整性,constSphere::Volume是什么?为什么Spehre::SurfaceArea会返回Sphere::DefineCoordinates(始终为float),为什么我的回答不在顶部?