Modellierung und Simulation - Objektorientierte Programmierung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
| '''Autor:'''  || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]
| '''Autor:'''  || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]
|-
|-
| '''Termin:''' || 23.05.2025
| '''Termin:''' || 22.05.2026
|}
|}
= Lernziel =


=Aufgabe 9.1 Strukturen und Klassen=
Nach der Bearbeitung können die Studierenden:
Erstellen Sie den <code>struct person</code> mit den Datenfeldern:
* abstrakte Klassen in MATLAB<sup>®</sup> erstellen
* Strasse,
* Vererbung anwenden
* Hausnummer,
* private/protected Eigenschaften unterscheiden
* Postleitzahl,
* Polymorphismus praktisch einsetzen
* Ort,
* ein einfaches OOP-System strukturieren
* Geburtsdatum [Array aus 3 Zahlen].
= Aufgabenstellung =
Legen Sie 3 Personen an.
== Aufgabe 8.1 Abstrakte Klasse „Fahrzeug“ ==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
Erstelle eine abstrakte Klasse '''Fahrzeug'''.
| <strong>Musterlösung 9.1&thinsp;</strong>
 
=== Anforderungen ===
{| class="wikitable"
|-
| Eigenschaft: || <code>Geschwindigkeit</code> || nur innerhalb der Klasse zugänglich
|-
| Konstruktor: || <code>Fahrzeug()</code>|| setzt die Geschwindigkeit
|-
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus
|-
| Abstrakte Methode: || <code>info()</code> || liest die Informationen
|}
 
== Aufgabe 8.2 Klasse „Auto“ ==
Erstelle eine Klasse <code>Auto</code>, die von <code>Fahrzeug</code> erbt.
 
=== Anforderungen ===
{| class="wikitable"
|-
| Eigenschaft: || <code>Marke</code> ||
|-
| Konstruktor: || <code>Auto()</code>|| setzt Geschwindigkeit und Marke
|-
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus
|-
| Abstrakte Methode: || <code>info()</code> || liest die Informationen
|}
 
=== Beispielausgabe ===
*Auto: BMW
*Geschwindigkeit: 180&thinsp;km/h
 
== Aufgabe 8.3 Klasse <code>Fahrrad</code> ==
Erstelle eine Klasse <code>Fahrrad</code>, die ebenfalls von <code>Fahrzeug</code> erbt.
 
==== Anforderungen ====
{| class="wikitable"
|-
| Eigenschaft: || <code>Typ</code> || nur innerhalb der Klasse zugänglich, z.&thinsp;B. Mountainbike, Rennrad
|-
| Konstruktor: || <code>Fahrrad()</code>|| setzt Geschwindigkeit und Typ
|-
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus
|-
|-
| <source line lang="matlab" style="font-size:medium">person = struct( 'Name', 'Hannah', ...
| Abstrakte Methode: || <code>info()</code> || liest die Informationen
'Telnr', '0815', ...
'Strasse', 'Hamb. Str.', ...
'Hausnr', 75,...
'Postleitzahl',59555,...
'Ort','Lippstadt',...
'Geburtsdatum',[1,1,1920]  );
</source>
|}
|}


=Aufgabe 9.2 Strukturen und Klassen=
=== Beispielausgabe ===
Schreiben wir eine Funktion <code>getPerson</code> die nacheinander Daten für mehrere Personen einliest, diesmal nur mit den beiden Feldern <code>Name</code> und <code>Telnr</code>. In einer
*Fahrrad: Mountainbike
Schleife werden die Werte für diese Felder von der Tastatur eingelesen, und zwar nacheinander für das erste Element person(n), n = 1, bis zur übergebenen Maximalzahl
*Geschwindigkeit: 25&thinsp;km/h
num_pers, im Beispielaufruf gleich 3. Das so erzeugte struct-Array person wird von der Funktion zurückgegeben.


== Aufgabe 8.4 Hauptprogramm (Polymorphismus) ==
Erstelle ein Skript <code>main.m</code>.
=== Aufgaben ===
* Erzeuge:
*1 Auto
*1 Fahrrad
*Speichere beide in einer Liste/einem Array
*Rufe für jedes Objekt die Methode <code>info()</code> auf
== Aufgabe 8.5 Zusatzaufgabe  ==
=== Aufgabe 8.5.1 Klasse „E-Bike“ ===
Erweitere das System um eine Klasse '''E-Bike''':
Zusätzliche Eigenschaft:
*Akkukapazität
*überschreibt: <code>info()</code>
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.2&thinsp;</strong>
| <strong>Musterlösung <code>EBike.m</code>&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
%
classdef EBike < Fahrzeug
function pers = getPerson( anz )
 
  for( n = 1:anz )    % Einleseschleife: von 1 bis anz
    properties
    name  = input( 'Name: ', 's' );   % als Text
        Akkukapazitaet
    telnr = input( 'Tel.-Nr.: ' );     % als Zahl
    end
    str  = input( 'Strasse: ', 's' );    % als Text
 
    hnr  = input( 'Haus.-Nr.: ' );     % als Zahl
    methods
    plz  = input( 'PLZ: ' );    % als Zahl
 
    ort  = input( 'Ort: ', 's' );   % als Text
        function obj = EBike(v, akku)
    % neues n-tes Objekt von Person
 
    pers(n) = Person( name, telnr, str, hnr, plz, ort );  
            obj@Fahrzeug(v);
  end
 
            obj.Akkukapazitaet = akku;
        end
 
        function info(obj)
 
            fprintf("E-Bike\n");
            fprintf("Geschwindigkeit: %.1f km/h\n", ...
                obj.Geschwindigkeit);
 
            fprintf("Akkukapazitaet: %.1f Wh\n", ...
                obj.Akkukapazitaet);
        end
    end
end
end
</source>
</syntaxhighlight>
|}
|}


=Aufgabe 9.4 Strukturen und Klassen=
=== Aufgabe 8.5.2 Kapselung erweitern ===
SchreibenPassen Sie auch die Funktionen <code>printPerson</code>, welche die Übergabeklasse <code>Person</code> im Command Window ausgibt.
*Setze ''Geschwindigkeit'' auf '''private'''
*Erstelle Methode: <code>setGeschwindigkeit(v)</code>
* Validierung: Geschwindigkeit darf nicht negativ sein
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.3&thinsp;</strong>
| <strong>Musterlösung <code>Fahrzeug.m</code>&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
%
classdef (Abstract) Fahrzeug
function printPerson( pers )
 
  anz = length( pers );           % Zahl der Personen
    properties (Access = private)
  fprintf( '\nMeine Freunde : \n' );   % Überschrift
        Geschwindigkeit
  fprintf(   '---------------\n' );
    end
  for( n = 1:anz )               % Ausgabeschleife
 
    pers(n).print;
    methods
  end  
        function obj = Fahrzeug(v)
            obj = obj.setGeschwindigkeit(v);
        end
 
        function obj = setGeschwindigkeit(obj, v)
            if v < 0
                error("Geschwindigkeit darf nicht negativ sein.");
            end
            obj.Geschwindigkeit = v;
        end
 
        function v = getGeschwindigkeit(obj)
            v = obj.Geschwindigkeit;
        end
    end
 
    methods (Abstract)
        info(obj)
    end
end
end
</syntaxhighlight>
|}
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung <code>main.m</code>&thinsp;</strong>
|-
|
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
clc;clear;
a = Auto(180, "BMW");
f = Fahrrad(25, "Mountainbike");
e = EBike(30, 750);


</source>
fahrzeuge = [a, f, e];
 
for k = 1:length(fahrzeuge)
 
    fahrzeuge(k).info();
 
    fprintf("\n");
end
</syntaxhighlight>
|}
|}


=Aufgabe 9.4 Strukturen und Klassen=
= Lernzielkontrolle =
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Warum ist die Klasse <code>Fahrzeug</code> abstrakt?&thinsp;</strong>
|-
| Die Klasse Fahrzeug ist abstrakt, weil sie kein konkretes Objekt beschreibt, sondern nur eine allgemeine Vorlage darstellt.
|-
|
*Ein <code>Fahrzeug</code> an sich existiert nicht in der Realität als eindeutiges Objekt.
*Es dient nur als gemeinsame Struktur für spezialisierte Klassen wie Auto oder Fahrrad.
*Die abstrakte Methode <code>info()</code> erzwingt, dass jede Unterklasse ihre eigene Umsetzung liefert.
|}


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.3&thinsp;</strong>
| <strong>Wo wird Vererbung im Code sichtbar?&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">
| Vererbung wird in der Klassendeklaration sichtbar:
</source>
|-
|<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
classdef Auto < Fahrzeug
classdef Fahrrad < Fahrzeug
</syntaxhighlight>.
|-
|Das bedeutet:
* Auto und Fahrrad erben Eigenschaften und Methoden von Fahrzeug
* z.&thinsp;B. <code>Geschwindigkeit</code> und <code>getGeschwindigkeit()</code>
|-
|
Zusätzlich sichtbar im Konstruktor:
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
obj@Fahrzeug(v)
</syntaxhighlight>
 
|}
|}
=Aufgabe 9.5 Strukturen und Klassen=


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.5&thinsp;</strong>
| <strong>Was bedeutet Polymorphismus im Hauptprogramm?&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann.
</source>
|-
|
Im Hauptprogramm:
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
fahrzeuge = [auto, fahrrad];
 
for k = 1:length(fahrzeuge)
    fahrzeuge(k).info();
end
</syntaxhighlight>
|-
|
Es wird immer die Methode info() aufgerufen<br>
* <code>Auto.info()</code> gibt Auto-spezifische Informationen aus
* <code>Fahrrad.info()</code> gibt Fahrrad-spezifische Informationen aus
Gleicher Aufruf – unterschiedliches Verhalten
|}
|}
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Warum ist Kapselung sinnvoll?&thinsp;</strong>
|-
| Kapselung schützt interne Daten und kontrolliert den Zugriff auf Objekteigenschaften.
|-
|
Beispiel:
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
properties (Access = private)
    Geschwindigkeit
end
</syntaxhighlight>
|-
|
Vorteile:
* Daten können nicht unkontrolliert verändert werden
* Validierung ist möglich (z.&thinsp;B. keine negative Geschwindigkeit)
* interne Implementierung bleibt verborgen
* externe Nutzung erfolgt nur über definierte Methoden
|}
----
----
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe25]]
→ [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br>
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe26]]

Aktuelle Version vom 28. Mai 2026, 12:22 Uhr

Autor: Prof. Dr.-Ing. Schneider
Termin: 22.05.2026

Lernziel

Nach der Bearbeitung können die Studierenden:

  • abstrakte Klassen in MATLAB® erstellen
  • Vererbung anwenden
  • private/protected Eigenschaften unterscheiden
  • Polymorphismus praktisch einsetzen
  • ein einfaches OOP-System strukturieren

Aufgabenstellung

Aufgabe 8.1 Abstrakte Klasse „Fahrzeug“

Erstelle eine abstrakte Klasse Fahrzeug.

Anforderungen

Eigenschaft: Geschwindigkeit nur innerhalb der Klasse zugänglich
Konstruktor: Fahrzeug() setzt die Geschwindigkeit
Methode: getGeschwindigkeit() liest die Geschwindigkeit aus
Abstrakte Methode: info() liest die Informationen

Aufgabe 8.2 Klasse „Auto“

Erstelle eine Klasse Auto, die von Fahrzeug erbt.

Anforderungen

Eigenschaft: Marke
Konstruktor: Auto() setzt Geschwindigkeit und Marke
Methode: getGeschwindigkeit() liest die Geschwindigkeit aus
Abstrakte Methode: info() liest die Informationen

Beispielausgabe

  • Auto: BMW
  • Geschwindigkeit: 180 km/h

Aufgabe 8.3 Klasse Fahrrad

Erstelle eine Klasse Fahrrad, die ebenfalls von Fahrzeug erbt.

Anforderungen

Eigenschaft: Typ nur innerhalb der Klasse zugänglich, z. B. Mountainbike, Rennrad
Konstruktor: Fahrrad() setzt Geschwindigkeit und Typ
Methode: getGeschwindigkeit() liest die Geschwindigkeit aus
Abstrakte Methode: info() liest die Informationen

Beispielausgabe

  • Fahrrad: Mountainbike
  • Geschwindigkeit: 25 km/h

Aufgabe 8.4 Hauptprogramm (Polymorphismus)

Erstelle ein Skript main.m.

Aufgaben

  • Erzeuge:
  • 1 Auto
  • 1 Fahrrad
  • Speichere beide in einer Liste/einem Array
  • Rufe für jedes Objekt die Methode info() auf

Aufgabe 8.5 Zusatzaufgabe

Aufgabe 8.5.1 Klasse „E-Bike“

Erweitere das System um eine Klasse E-Bike:

Zusätzliche Eigenschaft:

  • Akkukapazität
  • überschreibt: info()

Aufgabe 8.5.2 Kapselung erweitern

  • Setze Geschwindigkeit auf private
  • Erstelle Methode: setGeschwindigkeit(v)
  • Validierung: Geschwindigkeit darf nicht negativ sein

Lernzielkontrolle



MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26