Zurück

Objektorientierte Programmierung

Übungen

Zur IDE-Software Code::Blocks (für C++) finden Sie bei Bedarf ein Online-User-Manual unter codeblocks.org/user-manual. Zur (u.a. Java-)IDE Eclipse finden Sie ein Tutorial zum Beispiel unter java-tutorial.org.

Übung 1-0

Hello, world! auch als Hülle für das Apple iPhone! Schreiben Sie bitte zum allerersten EInstieg das klassische Hello, world!-Programm in C++ und in Java. (Diesen spannenden Code gibt (oder gab) es übrigens auch als Schutzhülle für Smartphones, wie nebenstehend gezeigt. Quelle: www.redbubble.com/ de/ people/ rapplatt/ works/ 9123349-hello-world-c?p=iphone-case.)
Zugegeben: in Code Blocks wird Ihnen das entsprechende C++-Programm bereits beim Starten eines neuen C++-Projektes angeboten. Wenn Ihnen das also daher zu langweilig ist, schauen Sie sich stattdessen ein Video an, das Ihnen (in etwa 12 Minuten) erklärt, wie Sie mit Microsoft Visual Studio© diese Aufgabe lösen können.
Oder gehen Sie direkt zu Aufgabe 1-1.

Übung 1-1

Teil 1: C++
Schreiben Sie bitte zwei Funktionen ausgabe() mit den Prototypen

     void ausgabe(char c);

bzw.

     void ausgabe(char *s);

die dafür sorgen, dass entsprechend ein einzelnes Zeichen oder aber eine ganze Zeichenkette schön durch Sterne eingerahmt auf den Bildschirm ausgegeben wird.
So soll

     ausgabe('A'); 

dafür sorgen, dass folgende Ausgabe auf dem Bildschirm erscheint:

     *****
     * A *
     *****

Analog soll

     ausgabe("Autobahnraststaette");

für die nachstehende Bildschirmausgabe sorgen:

     ***********************
     * Autobahnraststaette *            
     ***********************

Teil 2: Java

Schreiben Sie entsprechend in einer Java-Klasse Demo bitte die beiden oben beschriebenen Methoden ausgabe() mit den Parametertypen char bzw. String.

Übung 1-2

Erweitern Sie Ihre Lösung(en) aus Aufgabe 1-1 bitte um die folgende dritte Version von ausgabe() mit dem nachfolgend genannten C++-Prototypen bzw. in Java der Parameterliste String, char.

     void ausgabe(char *s, char zeichen);

wobei die Arbeitsweise analog wie zuvor sein soll, nur dass statt des Sterns als Einrahmungszeichen das in der Variablen zeichen übergebene Zeichen verwendet werden soll.
Beispiel: Der Aufruf

     ausgabe("Autobahnraststaette",'+');

führt zu folgender Ausgabe.

     +++++++++++++++++++++++
     + Autobahnraststaette +            
     +++++++++++++++++++++++

Der Funktionsaufruf

     ausgabe("Autobahnraststaette",'?');

dagegen führt zur folgenden Ausgabe.

     ???????????????????????
     ? Autobahnraststaette ?            
     ???????????????????????
            

Zusatzaufgabe: Können Sie nach Implementation dieser Erweiterung Ihr C++- bzw. Java-Programm wieder vereinfachen? Haben Sie eine Idee?

Übung 1-3

Schreiben Sie eine C++-spezifische Variante der einfachen Funktion tauschen(): es sollen zwei übergebene int-Variablen ausgetauscht werden.Verwenden Sie hierfür die Übergabe per Referenz, die in ANSI-C nicht zur Verfügung steht. [Falls Sie sich das Thema Referenzen elementar noch einmal im Video ansehen wollen, hier ist eines. (Laufzeit: 11'30)]

Ein korrekter Aufruf der Funktion tauschen() kann also etwa sein:

     int a=1, b=2;
     // ...
     tauschen(a,b);

Erweitern Sie Ihr Programm anschließend so, dass auch die Werte zweier float-Variablen x und y durch den Aufruf

     tauschen(x,y);

ausgetauscht werden können.

Schließlich erweitern Sie bitte Ihr Programm erneut so dass nun auch die Inhalte zweier float-Arrays data1 und data2 durch den Aufruf

     tauschen(data1,data2,10);

ausgetauscht werden können. Bei diesem Aufrufbeispiel sollen die Arrays natürlich jeweils zehn Elemente besitzen, wie nachstehender Programmauszug illustriert.

     float data1[10] = { 2.0, 3.3, 4.5 };
     float data2[10] = { 3.5, 4.5, 1.2, 5.7, 8.7, 1.2, 3.3, 4.4, 2.3, 0.0 };
     // ...
     tauschen(data1,data2,10);

Ergänzen Sie anschließend diese letzte Version um die korrespondierende Java-Variante static void tauschen(float[] data1, float[] data2) { ... }.

Zusatzfrage: weshalb können Sie die ersten beiden Funktionen so in Java nicht umsetzen?


Übung 1-4

Zwei kleine Methoden in Java

Schreiben Sie bitte (in einer Klasse Demo) die beiden Java-Methoden mini() und maxi(), die zu einem übergebenen Array von int-Werten (naheliegenderweise) das Minimum bzw. das Maximum der Werte im Array ermitteln und jeweils zurückliefern.

Nachstehend sehen Sie einen möglichen Programmauszug zur Illustration.

     int[] data = { 4, 8, 23, -17, 2, -6 };
     System.out.println("Minimum: " + mini(data) + ", Maximum: " + maxi(data));

Hinweis: ab bzw. seit Java 5 gibt es die foreach-Schleife, mit der die Werte eines Arrays implizit durchlaufen (iteriert) werden können.

// foreach-Schleife - ersetzt die u.a. klassische for-Schleife 
for (int wert : data)  // wert durchläuft im Sinne einer Kopie sukzessive die Werte des Arrays.
{                      // In dieser Form können die Original-Inhalte des Arrays nicht verändert werden!
}

// klassische for-Schleife
for (int i=0; i<data.length; i++)
{
}


Übung 1-5

Ein weiteres Beispiel für call by reference [nur C++]

Implementieren Sie bitte eine C++-Funktion minmax(), die zu einem übergebenen Array von int-Werten in ebenfalls übergebenen Variablen min bzw. max das Minimum bzw. das Maximum der Werte im Array abspeichert.

Nachstehend sehen Sie einen möglichen Programmauszug zur Illustration.

     int data[] = { 4, 8, 23, -17, 2, -6 };
     int anzahl = sizeof(data) / sizeof(data[0]);
     int min = 0, max = 0; 
     // ...
     minmax(data, anzahl, min, max);


Übung 1-6

Implementierung fehlenden Programmcodes

Das nachfolgende Beispielprogramm setzt auf einem früheren Struktur-Beispiel von C auf. Erweitert wurde die (nunmehr) Klasse um die (Deklaration der) Methoden und Konstruktoren. - Ergänzen Sie bitte den fehlenden Programmcode zunächst in C++. (Der Aufgabenteil zu Java folgt weiter unten.)
(Diese Aufgabe bitte bevorzugt dann bearbeiten, wenn in der Vorlesung zumindest elementar bereits auf Klassenbildung eingegangen wurde.)

/* C++ - Klasse Person */
#include <iostream>
#include <cstdlib>
using namespace std;

class Person
{
   private:
      int PersonNr;
      char Nachname[50];
      char Vorname[30];
      float Gehalt;
   public:
      Person(); // Default-Konstruktor
      Person(int, char*, char*, float); // Weiterer Konstruktor
      void setPersonNr(int);
      void setNachname(char*);
      void setVorname(char*);
      void setGehalt(float);
      void ausgabe();
}; // end class Person
int main()
{
   Person person1(111,"Meier","Alfons",999.99), person2;
   person2.setNachname("Kaiser");
   person2.setVorname("Anna");
   person2.setPersonNr(112);
   person2.setGehalt(1300.45);
   cout << "Person 1: ";
   person1.ausgabe();
   cout << "Person 2: ";
   person2.ausgabe();
   return EXIT_SUCCESS;

} // end main()
// end of file Person.cpp


Setzen Sie anschließend bitte die entsprechende Klasse Person mit den o.g. Methoden und Konstruktoren auch in Java um.

// Java - Klasse Person (Dateiname: Person.java) [Auszug]

public class Person
{
   private int PersonNr;
   private String Nachname;
   private String Vorname;
   private float Gehalt;
   
   public Person(){ }    // Default-Konstruktor
   public Person(int PersonNr, String Nachname, String Vorname, float Gehalt){ }  // Weiterer Konstruktor
   public void setPersonNr(int PersonNr) { } 
   public void setNachname(String Nachname){ } 
   public void setVorname(String Vorname){ } 
   public void setGehalt(float Gehalt ){ } 
   public void ausgabe(){ } 
  
    public static void main(String[] args)
    {
       System.out.println("Und nun die Java-Version...");
	   
       Person person1 = new Person(111,"Meier","Alfons",(float)999.99);
       Person person2 = new Person();
	   
       person2.setNachname("Kaiser");
       person2.setVorname("Anna");
       person2.setPersonNr(112);
       person2.setGehalt((float)1300.45);
	   
       System.out.println("Person 1: ");
       person1.ausgabe();
	   
       System.out.println("Person 2: ");
       person2.ausgabe();
      
    } // end main()

} // end class Person

// end of file Person.java
		


© 1999-2023 FHDW/Peter Baeumle-Courth. Document-Id: fhdwbap:opg:027906-3