Mavriqi_Aufgabe1_17.03.2020

Dependencies:   mbed

Committer:
besam
Date:
Tue Apr 21 22:40:44 2020 +0000
Revision:
3:e201d92a3120
Parent:
1:e180d991bb83
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
besam 1:e180d991bb83 1 /******************************************************************************
besam 1:e180d991bb83 2 Format der Dateinamen: Mavriqi_Besa_2_Vererbung
besam 1:e180d991bb83 3 C++ Kurs BULME 19/20 SM
besam 1:e180d991bb83 4 Datei 04
besam 1:e180d991bb83 5
besam 1:e180d991bb83 6 - Vererbung einer Basisklasse an abgeleitete Klassen
besam 1:e180d991bb83 7
besam 1:e180d991bb83 8 Eine Klasse kann als die Basis für die Entwicklung einer neuen Klasse verwendet
besam 1:e180d991bb83 9 werden, ohne dass ihr Code geändert werden muss. Dazu wird die neue Klasse
besam 1:e180d991bb83 10 definiert, indem angegeben wird, dass sie eine abgeleitete Klasse der
besam 1:e180d991bb83 11 Basisklasse ist.
besam 1:e180d991bb83 12
besam 1:e180d991bb83 13 Während es in der letzten Lektion um den Aspekt der Kapselung gegangen ist,
besam 1:e180d991bb83 14 geht es hier um den Aspekt der Vererbung.
besam 1:e180d991bb83 15
besam 1:e180d991bb83 16 *******************************************************************************/
besam 1:e180d991bb83 17 #include <stdio.h>
besam 1:e180d991bb83 18 #include <math.h>
besam 1:e180d991bb83 19
besam 1:e180d991bb83 20
besam 1:e180d991bb83 21 enum eckig { ja, nein };
besam 1:e180d991bb83 22
besam 1:e180d991bb83 23 class Form // Basisklasse
besam 1:e180d991bb83 24 {
besam 1:e180d991bb83 25 // In der Basisklasse werden alle gemeinsamen Variablen
besam 1:e180d991bb83 26 protected:
besam 1:e180d991bb83 27 eckig m_hat_ecken;
besam 1:e180d991bb83 28 float m_umfang;
besam 1:e180d991bb83 29 float m_flaeche;
besam 1:e180d991bb83 30
besam 1:e180d991bb83 31 public: // sowie auch alle gemeinsamen Methoden deklariert
besam 1:e180d991bb83 32 float leseUmfang() { return m_umfang; }
besam 1:e180d991bb83 33 float leseFlaeche() { return m_flaeche; }
besam 1:e180d991bb83 34
besam 1:e180d991bb83 35 Form(eckig hat_ecken);
besam 1:e180d991bb83 36 };
besam 1:e180d991bb83 37
besam 1:e180d991bb83 38 Form::Form(eckig ecken) { // im Konstruktor werden gem. Variablen initialisiert
besam 1:e180d991bb83 39 m_hat_ecken = ecken;
besam 1:e180d991bb83 40 m_umfang = 0;
besam 1:e180d991bb83 41 m_flaeche = 0;
besam 1:e180d991bb83 42 };
besam 1:e180d991bb83 43 // Hier wird eine von Form abgeleitete Klasse Kreis deklariert
besam 1:e180d991bb83 44 class Kreis : public Form {
besam 1:e180d991bb83 45
besam 1:e180d991bb83 46 protected: // Zugriffschutz protected bedeutet, dass abgeleitete
besam 1:e180d991bb83 47 // Klassen ebenfalls zugreifen können.
besam 1:e180d991bb83 48 float m_radius;
besam 1:e180d991bb83 49
besam 1:e180d991bb83 50 public:
besam 1:e180d991bb83 51 float leseUmfang();
besam 1:e180d991bb83 52 float leseFlaeche(); //Aufgabe 2.1 - Ergänzen Sie die Klasse Kreis um die Methode float leseFlaeche();
besam 1:e180d991bb83 53
besam 1:e180d991bb83 54 //Konstruktor hat den gleichen Name wie die Klasse
besam 1:e180d991bb83 55 Kreis(float radius); // Neuer Konstruktor erfordert nur den radius
besam 1:e180d991bb83 56 };
besam 1:e180d991bb83 57
besam 1:e180d991bb83 58 Kreis::Kreis(float radius) : Form(nein) {
besam 1:e180d991bb83 59 // Im Konstruktor werden gleich die Membervariablen initialisiert
besam 1:e180d991bb83 60
besam 1:e180d991bb83 61 // Über den radius werden Umfang und Fläche berechnet.
besam 1:e180d991bb83 62 m_umfang = 2 * radius * M_PI; // Die Konstante M_PI ist in math.h definiert
besam 1:e180d991bb83 63 m_flaeche = radius * radius * M_PI;
besam 1:e180d991bb83 64 };
besam 1:e180d991bb83 65
besam 1:e180d991bb83 66 float Kreis::leseUmfang() {
besam 1:e180d991bb83 67 // hier ist keine Änderung der Funktion nötig,
besam 1:e180d991bb83 68 // daher wird die Funktion der Basisklasse aufger.
besam 1:e180d991bb83 69 return m_umfang;
besam 1:e180d991bb83 70 }
besam 1:e180d991bb83 71
besam 1:e180d991bb83 72 float Kreis::leseFlaeche() { //hier ist auch keine Änderungder Funktion nötig
besam 1:e180d991bb83 73 return m_flaeche;
besam 1:e180d991bb83 74 }
besam 1:e180d991bb83 75
besam 1:e180d991bb83 76 /*2. Leiten Sie von der Basisklasse Form die Klasse Rechteck ab
besam 1:e180d991bb83 77 Überlegen Sie sich welche Parameter der Konstruktur für die Klasse
besam 1:e180d991bb83 78 Rechteck benötigt. Implementieren sie neben dem Konstruktor auch alle
besam 1:e180d991bb83 79 Methoden der Basisklasse, sodass korrekte Werte berechnet werden.*/
besam 1:e180d991bb83 80
besam 1:e180d991bb83 81 // Hier wird eine von Form abgeleitete Klasse Rechteck deklariert
besam 1:e180d991bb83 82 class Rechteck : public Form
besam 1:e180d991bb83 83 {
besam 1:e180d991bb83 84 protected:
besam 1:e180d991bb83 85 float a_laenge; //Rechteck hat die Länge a und Länge b
besam 1:e180d991bb83 86 float b_laenge;
besam 1:e180d991bb83 87
besam 1:e180d991bb83 88 public:
besam 1:e180d991bb83 89 float leseUmfang(); //Die Methode wurde von Klasse Form abgeleitet
besam 1:e180d991bb83 90 float leseFlaeche(); //Die Methode wurde von Klasse Form abgeleitet
besam 1:e180d991bb83 91
besam 1:e180d991bb83 92 //Konstruktor hat den gleichen Name wie die Klasse
besam 1:e180d991bb83 93 Rechteck (float a_laenge,float b_laenge); //Der neuer Konstruktor erfordert die beiden Längen
besam 1:e180d991bb83 94
besam 1:e180d991bb83 95 };
besam 1:e180d991bb83 96 //Der Präfix Rechteck:: regelt die Zugehörigkeit der KLasse Rechteck
besam 1:e180d991bb83 97 Rechteck::Rechteck (float a_laenge, float b_laenge): Form(ja)
besam 1:e180d991bb83 98 {
besam 1:e180d991bb83 99 m_umfang = (2 * a_laenge) +(2 * b_laenge); //Formel für Umfang U=2a*2b
besam 1:e180d991bb83 100 m_flaeche = a_laenge * b_laenge; //Formel für Fläche A=a*a
besam 1:e180d991bb83 101 };
besam 1:e180d991bb83 102 // Da wird die Funktion der Basisklasse aufger.
besam 1:e180d991bb83 103 float Rechteck::leseUmfang() { return m_umfang; }
besam 1:e180d991bb83 104
besam 1:e180d991bb83 105 // Da wird die Funktion der Basisklasse aufger.
besam 1:e180d991bb83 106 float Rechteck::leseFlaeche() { return m_flaeche;}
besam 1:e180d991bb83 107
besam 1:e180d991bb83 108
besam 1:e180d991bb83 109
besam 1:e180d991bb83 110 /*
besam 1:e180d991bb83 111 3. Optional: Leiten Sie von der Klasse Rechteck die Klasse Quadrat ab.
besam 1:e180d991bb83 112 Implementieren Sie Konstruktor und alle Methoden in der Form, dass
besam 1:e180d991bb83 113 die Implementierungen der Klasse Rechteck genutzt werden.
besam 1:e180d991bb83 114 Quadrat soll eine Subklasse von Rechteck sein.*/
besam 1:e180d991bb83 115
besam 1:e180d991bb83 116 // Hier wird eine von Rechteck abgeleitete Klasse Quadrat deklariert
besam 1:e180d991bb83 117 class Quadrat : public Form
besam 1:e180d991bb83 118 {
besam 1:e180d991bb83 119 protected:
besam 1:e180d991bb83 120 float a_laenge;
besam 1:e180d991bb83 121
besam 1:e180d991bb83 122 public:
besam 1:e180d991bb83 123 float leseUmfang();
besam 1:e180d991bb83 124 float leseFlaeche();
besam 1:e180d991bb83 125
besam 1:e180d991bb83 126 Quadrat (float a_laenge); //Der Konstruktor erfordert nur eine Parameter,die Länge a
besam 1:e180d991bb83 127 };
besam 1:e180d991bb83 128
besam 1:e180d991bb83 129 Quadrat::Quadrat(float a_laenge) : Form(ja){
besam 1:e180d991bb83 130 m_umfang = a_laenge * 4;
besam 1:e180d991bb83 131 m_flaeche = a_laenge* a_laenge;
besam 1:e180d991bb83 132 };
besam 1:e180d991bb83 133 // Da wird die Funktion der Basisklasse aufger.
besam 1:e180d991bb83 134 float Quadrat::leseUmfang() { return m_umfang; }
besam 1:e180d991bb83 135
besam 1:e180d991bb83 136 // Da wird die Funktion der Basisklasse aufger.
besam 1:e180d991bb83 137 float Quadrat::leseFlaeche() { return m_flaeche;}
besam 1:e180d991bb83 138
besam 1:e180d991bb83 139
besam 1:e180d991bb83 140 int main()
besam 1:e180d991bb83 141 {
besam 1:e180d991bb83 142 printf("Wir arbeiten nun mit abgeleiteten Klassen!\n");
besam 1:e180d991bb83 143 printf("Es wird ein Objekt kr der Klasse Kreis erzeugt!\n");
besam 1:e180d991bb83 144 printf("Eswird ein Objekt re der Klasse Rechteck erzeugt!\n");
besam 1:e180d991bb83 145 printf("Es wird ein Objekt qu der Klasse Quadrat erzeugt!\n");
besam 1:e180d991bb83 146
besam 1:e180d991bb83 147 Kreis kr(1.0); //Da wird zur Klasse Kreis zugegriffen,und hier wird dem Radium ein Wert zugewiesen
besam 1:e180d991bb83 148 Rechteck re(1.0,2.0);//Klasse Rechteckt,der Lange a und b werden Werte zugewiesen
besam 1:e180d991bb83 149 Quadrat qu(2.0); //Klasse Quadrat, der Länge a wird ein Wert zugewiesen
besam 1:e180d991bb83 150
besam 1:e180d991bb83 151 float um_kr = kr.leseUmfang(); //Den Wert der Umfang aus der Klasse Kreis auslesen
besam 1:e180d991bb83 152 float fl_kr = kr.leseFlaeche(); //Den Wert der Fläche aus der Klasse Kreis auslesen
besam 1:e180d991bb83 153 float um_re = re.leseUmfang(); //Den Wert der Umfang aus der Klasse Rechteck auslesen
besam 1:e180d991bb83 154 float fl_re = re.leseFlaeche(); //Den Wert der Fläche aus der Klasse Rechteck auslesen
besam 1:e180d991bb83 155 float um_qu = qu.leseUmfang(); //Den Wert der Umfang aus der Klasse Quadrat auslesen
besam 1:e180d991bb83 156 float fl_qu = qu.leseFlaeche(); //Den Wert der Fläche aus der Klasse Quadrat auslesen
besam 1:e180d991bb83 157
besam 1:e180d991bb83 158 // Und nun die Werte ausgeben
besam 1:e180d991bb83 159 printf("Der Umfang des Kreis ist: %f\n", um_kr);
besam 1:e180d991bb83 160 printf("Der Flaeche des Kreis ist: %f\n", fl_kr);
besam 1:e180d991bb83 161 printf("Der Umfang des Rechteck ist: %f\n", um_re);
besam 1:e180d991bb83 162 printf("Der Flaeche des Rechteck ist: %f\n", fl_re);
besam 1:e180d991bb83 163 printf("Der Umfang des Quadrat ist: %f\n", um_qu);
besam 1:e180d991bb83 164 printf("Der Flaeche des Quadrat ist: %f\n", fl_qu);
besam 1:e180d991bb83 165
besam 1:e180d991bb83 166
besam 1:e180d991bb83 167 return 0;
besam 1:e180d991bb83 168 }
besam 1:e180d991bb83 169
besam 1:e180d991bb83 170
besam 1:e180d991bb83 171
besam 1:e180d991bb83 172