Modellierung und Simulation - Objektorientierte Programmierung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „{| class="wikitable" |- | '''Autor:''' || Prof. Dr.-Ing. Schneider |- | '''Termin:''' || 23.05.2025 |} =Aufgabe 9.1= Schreiben Sie eine Matlab GUI mit der ein schräger Wurf simuliert wird. Die physikalische Theorie finden Sie hier: [https://www.leifiphysik.de/mechanik/waagerechter-und-schraeger-wurf/grundwissen/schraeger-wurf-nach-oben-ohne-anfangshoehe leifiphysik: Schräger Wurf nach oben ohne Anfangshöhe] Die GUI s…“
 
Keine Bearbeitungszusammenfassung
 
(41 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=
Nach der Bearbeitung können die Studierenden:
Schreiben Sie eine Matlab GUI mit der ein schräger Wurf simuliert wird.  
* abstrakte Klassen in MATLAB<sup>®</sup> 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 ===
{| 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
|-
| Abstrakte Methode: || <code>info()</code> || liest die Informationen
|}
 
=== Beispielausgabe ===
*Fahrrad: Mountainbike
*Geschwindigkeit: 25&thinsp;km/h
 
== 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"
| <strong>Musterlösung <code>EBike.m</code>&thinsp;</strong>
|-
|
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
classdef EBike < Fahrzeug
 
    properties
        Akkukapazitaet
    end
 
    methods
 
        function obj = EBike(v, akku)
 
            obj@Fahrzeug(v);
 
            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
</syntaxhighlight>
|}
 
=== Aufgabe 8.5.2 Kapselung erweitern ===
*Setze ''Geschwindigkeit'' auf '''private'''
*Erstelle Methode: <code>setGeschwindigkeit(v)</code>
* Validierung: Geschwindigkeit darf nicht negativ sein
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung <code>Fahrzeug.m</code>&thinsp;</strong>
|-
|
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
classdef (Abstract) Fahrzeug
 
    properties (Access = private)
        Geschwindigkeit
    end
 
    methods
        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
</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);
 
fahrzeuge = [a, f, e];
 
for k = 1:length(fahrzeuge)
 
    fahrzeuge(k).info();
 
    fprintf("\n");
end
</syntaxhighlight>
|}
 
= 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"
| <strong>Wo wird Vererbung im Code sichtbar?&thinsp;</strong>
|-
| Vererbung wird in der Klassendeklaration sichtbar:
|-
|<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>
 
|}
 
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Was bedeutet Polymorphismus im Hauptprogramm?&thinsp;</strong>
|-
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann.
|-
|
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
|}


Die physikalische Theorie finden Sie hier: [https://www.leifiphysik.de/mechanik/waagerechter-und-schraeger-wurf/grundwissen/schraeger-wurf-nach-oben-ohne-anfangshoehe leifiphysik: Schräger Wurf nach oben ohne Anfangshöhe]


Die GUI soll gemäß Abb. 1 über die Parameter
* Winkel in °,
* Abschussgeschwindigkeit <math>v_0</math> in m/s,
konfigurierbar sein.


----
----
→ 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