2016-05-07 5 views
0

Ich habe eine Kugel Klasse mit den folgenden Eigenschaften zu schaffen:Seltsame Ausgaben? Benutzerdefinierte Klassen (C++)

eine Klasse Sphere Schreiben mit den folgenden Eigenschaften:

Privat Attribute: (1) X, Y, Z Koordinaten der Mitte (2) Radius

Accessor und Mutator Methoden
• Set und die X erhalten, Y- und Z-Koordinaten
• Set und den Radiuserhalten • Holen Sie sich das Volumen und die Fläche Bereich, wenn eine Kugel.

Für eine Kugel,
Volumen = 4πr3/3
Fläche = 4πr2
ein Haupt Programm Schreiben Sie die Kugel-Klasse zu testen.

Ich habe noch nie zuvor mit Klassen gearbeitet. Ich denke, ich habe das richtig gemacht. Meine Ausgabe für mein Volume und meine Oberfläche kommt jedoch wirklich komisch aus. Unten ist mein Programm und meine Ausgabe.

PROGRAMM

#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; 
} 

OUTPUT Egal, was ich Eingabe als Radius, werde ich bekommen:

Diese berechnet auf ein Volumen von -5.18547e + 24 Einheiten in Würfel geschnitten, und eine Fläche Fläche von 1,4488e + 17.

Was mache ich falsch ?? Auch andere Ratschläge zum Aufräumen meiner Klasse wären hilfreich!

+0

Sie berechnen/rufen 'Volume' und' SurfaceArea' vor Koordinaten und R werden initialisiert. –

Antwort

1

Sie rufen die Methode GetVolume() zu früh auf. Nennen Sie es, nachdem Sie den Radius tatsächlich vom Benutzer genommen haben.

int main() { 
float inputr, radius, x, y, z; 
Sphere sphere; 
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); 
double Volume = sphere.GetVolume(); 
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; 
} 

Wie oben.

+0

Es funktioniert! Vielen Dank! –

0

Sphere hat einen Default-Konstruktor, der nicht die X, Y und Z Mitglieder nicht initialisiert werden. Direkt nach der Konstruktion versuchen Sie, aus diesen unbestimmten Werten das Volumen und die Oberfläche zu berechnen.

Mit anderen Worten,

double Volume = sphere.GetVolume(); 

definiert keine mathematische Beziehung (es scheint, denken Sie, es tut), dann ist es ein Muss. Das Volumen wird einmal berechnet (wird für die Initialisierung von Volume verwendet) und sein Wert ändert sich nicht, wenn Sie die Attribute sphere ändern. Führen Sie diese Berechnung nach aus, die Sie Sphere::DefineCoordinates und Sphere::DefineRadius aufgerufen haben.


Oder machen es unmöglich, eine solche ungültige Sphere Objekt zu konstruieren. Erfahren Sie, wie Sie Konstruktoren verwenden, und verwenden Sie von Zeit zu Zeit einige const Qualifier.

Der Vollständigkeit halber, was sind Sphere::Volume und Spehre::SurfaceArea für?Warum gibt Sphere::DefineCoordinates eine float zurück (immer 0) und warum ist meine Antwort nicht an der Spitze?

+0

Wie behebe ich das? Ich bin mir nicht sicher ob ich das verstehe. –

1

Einfach, Sie lesen das Volumen und die Oberfläche, bevor Sie den Radius definieren.

1

Ihr Problem ist, dass Sie die Funktionen GetVolume() und GetSurfaceArea() aufrufen, bevor Sie die Eingabe lesen. Ihre Berechnungen basieren auf nicht initialisierten Werten.

Sie sollten die Funktionen bewegen Anrufe nach den Aufrufen von DefineCoordinates() und DefineRadius()

Ihr Haupt so aussehen sollte:

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; 
}