6.2 Zeiger und Funktionen
|
Bild 6.2-1: UML Klassendiagramm für das Schwerpunktprogramm
|
#include <iostream>
#define MAXRECHTECK 100;
using namespace std;
class Vektor
{
public:
double x;
double y;
Vektor()
{
x = 0.0;
y = 0.0;
}
Vektor(double inx, double iny)
{
x = inx;
y = iny;
}
void malSkalar(double skalar)
{
x*=skalar;
y*=skalar;
}
void plusVektor(Vektor* vek)
{
x+=vek->x;
y+=vek->y;
}
void minusVektor(Vektor* vek)
{
x-=vek->x;
y-=vek->y;
}
};
class Rechteck
{
public:
Rechteck()
{
}
Rechteck(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
{
ort1.x = x1;
ort1.y = y1;
ort2.x = x2;
ort2.y = y2;
ort3.x = x3;
ort3.y = y3;
ort4.x = x4;
ort4.y = y4;
}
Vektor* getSchwerpunkt()
{
Vektor* ergebnis = new Vektor();
ergebnis->plusVektor(&ort1);
ergebnis->plusVektor(&ort3);
ergebnis->malSkalar(0.5);
return ergebnis;
}
double getFlaeche()
{
Vektor ergebnis;
ergebnis.plusVektor(&ort3);
ergebnis.minusVektor(&ort1);
return ergebnis.x*ergebnis.y;
}
private:
Vektor ort1,ort2,ort3,ort4;
double flaeche;
};
class Werkstueck
{
private:
int anzahl;
Rechteck* re[100];
public:
Werkstueck()
{
anzahl = 0;
}
void addRechteck(Rechteck* r)
{
re[anzahl] = r;
anzahl++;
}
Vektor getSchwerpunkt()
{
Vektor sp;
Vektor* merker;
double nenner;
for(int i=0;i<anzahl;i++)
{
merker = re[i]->getSchwerpunkt();
merker->malSkalar(re[i]->getFlaeche());
sp.plusVektor(merker);
nenner+=re[i]->getFlaeche();
}
sp.malSkalar(1.0/nenner);
return sp;
}
};
int main(void)
{
Werkstueck meinWerkstueck;
Rechteck r1(0.0,2.0,4.0,2.0,4.0,5.0,0.0,5.0);
Rechteck r2(2.0,0.0,4.0,0.0,4.0,2.0,2.0,2.0);
Rechteck r3(4.0,2.0,7.0,2.0,7.0,3.0,4.0,3.0);
Rechteck r4(4.0,3.0,6.0,3.0,6.0,7.0,4.0,7.0);
Rechteck r5(4.0,7.0,7.0,7.0,7.0,8.0,4.0,8.0);
meinWerkstueck.addRechteck(&r1);
meinWerkstueck.addRechteck(&r2);
meinWerkstueck.addRechteck(&r3);
meinWerkstueck.addRechteck(&r4);
meinWerkstueck.addRechteck(&r5);
Vektor schwerpunkt = meinWerkstueck.getSchwerpunkt();
cout<<"Der Schwerpunkt des Werkstuecks liegt bei xs="<<schwerpunkt.x<<" ys="<<schwerpunkt.y<<endl;
return 1;
}
Code 6.2-1: Schwerpunktberechnung unter Verwendung von Zeigern auf Objekte.