kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Informatik -- Lehrveranstaltung vom 10.06.2024

(EN google-translate)

(PL google-translate)

Schnittstellen

public interface Figur
{
    public abstract float berechneUmfang();   
}

public class Quadrat implements Figur
{
    float kante;
    public Quadrat(float kante)
    {
        this.kante = kante;
    }
    public float berechneUmfang()
    {
        return 4.0*kante;
    }
}

public class Kreis implements Figur
{
    float radius;
    public Kreis(float radius)
    {
        this.radius = radius;
    }
    public float berechneUmfang()
    {
        return 2.0*PI*radius;
    }
}
public void setup()
{
     Figur[] figur = new Figur[3];
     figur[0] = new Quadrat(100.0);
     figur[1] = new Kreis(100.0);
     figur[2] = new Quadrat(10.0);     
     for(int i=0;i<figur.length;i++)
        println("figur["+i+"], Umfang:"+figur[i].berechneUmfang());
}

Code 0-1: Beispiel, vergl. Ausführungen im Unterricht.

Übungen zu verschiedenen Themenbereichen


Dazu am Ende lösen: Aufgabe 10.2 -- Schnittstellen, in 10_LV_03_06_2024


  1. C/C++, Einfache Datentypen
  2. C/C++, Fehlersuche
  3. C/C++, Ein- und Ausgabe
  4. C/C++, Arrays
  5. C/C++, Kontrollstrukturen
  6. C/C++, Funktionen
  7. C/C++, Algorithmen
  8. Java / Processing
  9. Java, Einfache Datentypen
  10. Java, Arrays
  11. Java, Klassen, Objekte, Konstruktormethoden
  12. Java, Kapselung, Modifikatoren und Zugriffsrechte
  13. Java, Vererbung
  14. Java, Polymorphismus
  15. Java, Anwendungsprogrammierung
  16. C/C++, Anwendungsprogrammierung

Aufgabe 11.1 C/C++, Einfache Datentypen

#include <iostream>
using namespace std;
int main(void)
{
    cout<<endl<<"Hello world!"<<endl<<endl;
    return 0;
}

Code 0-2: Hello World Programm in C/C++.

  • Ergänzen Sie in obigem Programm die Definition (Deklaration und Initialisierung) von fünf verschiedenen einfachen Datentypen.
  • Wie Sie die jeweilige Variable nennen und mit welchen Werten Sie die jeweilige Variable belegen, steht Ihnen frei.
  • Zusätzlich soll die Belegung jeder einzelnen Variable mittels cout im Terminal ausgegeben werden wenn das ergänzte Programm kompiliert und gestartet wird.
  • Kompilieren und Testen Sie das fertig gestellte Programm und suchen und beheben Sie ggf. Fehler.

Aufgabe 11.2 C/C++, Fehlersuche

#include <iostream>
using namespace std;
int Main(void)
{
    double messwerte()={1.0,2.4,3.8,4.0};
    double mittelwert = 0.0;
    for(int i=0,i<4,i++)
        mittelwert=mittelwert+messwerte[i];
    mittelwert=mittelwert/4.0
    cout>>"mittelwert=">>mittelwert>>endl;
    return 0;
}

Code 0-3: Fehlerhaftes Programm.

  • In obigem Quelltext aus einer der vorangehenden Übungen haben sich einige Fehler eingeschlichen.
  • Untersuchen Sie den Quelltext sorgfältig und korrigieren Sie die Ihnen auffallenden Fehler so lange, bis das fehlerfreie Kompilieren und Starten des Programms gelingt.

Aufgabe 11.3 C/C++, Ein- und Ausgabe

Schreiben Sie ein Programm, das folgenden Anforderungen genügt:

  • Der Benutzer soll in der Lage sein, eine Integer-Zahl einzugeben.
  • Für die eingegebene Zahl soll untersucht werden, ob diese ohne Rest durch zwei teilbar ist.
  • Über das Ergebnis dieser Untersuchung soll der Benutzer dann per Textausgabe informiert werden.

Aufgabe 11.4 C/C++, Arrays

#include <iostream>
using namespace std;
int main(void)
{
    int arr[26];
    char ascii[26];
    int anzahl = sizeof(arr)/sizeof(int);

    //....

    return 0;
}

Code 0-4: Arrays.

  • Obiges Programm gilt es an der mit //.... markierten Stelle zu vervollständigen:
  • Zu jeder der nachfolgend beschriebenen Teilaufgaben soll eine eigene for-Schleife verwendet werden.
  • An den 26 Plätzen von ascii sollen die Buchstaben A bis Z in ihrer natürlichen Reihenfolge gespeichert werden.
  • Dazu korrespondierend soll in arr der jeweilige ASCII-Code des zugehörigen Zeichens als Integer-Wert gespeichert werden.
  • Am Ende des Programms soll eine Tabelle ausgegeben werden, die beide Arrays durchgeht und zeilenweise im Terminal immer neben einen Buchstaben aus ascii den zugehörigen ASCII-Code aus arr ausgibt.
#include <iostream>
using namespace std;
int main(void)
{
    int arr[26];
    char ascii[26];
    int anzahl = sizeof(arr)/sizeof(int);

    for(int i=0;i<anzahl;i++)
    {
         ascii[i]  =  (char)(i+(int)'A');
    }
    for(int i=0;i<anzahl;i++)
    {
         arr[i]  =  (i+(int)'A');
    }
    for(int i=0;i<anzahl;i++)
    {
         cout<<ascii[i]<<" | "<<arr[i]<<endl;
    }

    return 0;
}

Code 0-5: Musterlösung zu 11.4

Aufgabe 11.5 C/C++, Kontrollstrukturen

#include <iostream>
using namespace std;
int main(void)
{
    for(int i=0;i<10;i++)
    {
        if(i%2==0)
            cout<<"A"<<endl;
        else if(i%3==0)
            cout<<"B"<<endl;
        else if(i%5==0)
            cout<<"C"<<endl;
        else
            cout<<"D"<<endl;
    }
    return 0;
}

Code 0-6: Programm zum Thema Kontrollstrukturen.

  • Gehen Sie den Ablauf des obigen Programms in Gedanken durch und notieren Sie die zu erwartende Ausgabe.
  • Kompilieren und starten Sie dann das Programm und vergleichen das Ergebnis mit Ihrer Vorhersage.

Aufgabe 11.6 C/C++, Funktionen

  • Bei nachfolgendem Programm ist eine Funktion zu implementieren.
  • Erschlißen Sie sich aus dem Aufruf und dem Namen der Funktion, wie sie aussehen muss und fügen Sie sie dann über der main-Funktion ein.
#include <iostream>
using namespace std;

//Hier die fehlende Funktion implementieren.

int main(void)
{

    for(int x=10;x<=15;x++)
    {
        for(int y=2;y<=3;y++)
        {
            if(xohneRestTeilbarDurchy(x,y)==true)
            {
                cout<<x<<" ist ohne Rest durch "<<y<<" teilbar."<<endl;                 
            }
            else
            {
                cout<<x<<" ist NICHT ohne Rest durch "<<y<<" teilbar."<<endl;                 
            }
        }
    }
    return 0;
}

Code 0-7: Programm, in der noch eine Funktion fehlt.

10 ist ohne Rest durch 2 teilbar.
10 ist NICHT ohne Rest durch 3 teilbar.
11 ist NICHT ohne Rest durch 2 teilbar.
11 ist NICHT ohne Rest durch 3 teilbar.
12 ist ohne Rest durch 2 teilbar.
12 ist ohne Rest durch 3 teilbar.
13 ist NICHT ohne Rest durch 2 teilbar.
13 ist NICHT ohne Rest durch 3 teilbar.
14 ist ohne Rest durch 2 teilbar.
14 ist NICHT ohne Rest durch 3 teilbar.
15 ist NICHT ohne Rest durch 2 teilbar.
15 ist ohne Rest durch 3 teilbar.

Code 0-8: Dies ist die Ausgabe, die das Programm produziert, wenn die Funktion richtig implementiert wurde.

#include <iostream>
using namespace std;

//Hier die fehlende Funktion implementieren.
bool xohneRestTeilbarDurchy(int a, int b)
{
    if(a%b==0)
       return true;
    else
       return false;
}

int main(void)
{

    for(int x=10;x<=15;x++)
    {
        for(int y=2;y<=3;y++)
        {
            if(xohneRestTeilbarDurchy(x,y)==true)
            {
                cout<<x<<" ist ohne Rest durch "<<y<<" teilbar."<<endl;                 
            }
            else
            {
                cout<<x<<" ist NICHT ohne Rest durch "<<y<<" teilbar."<<endl;                 
            }
        }
    }
    return 0;
}

Code 0-9: Musterlösung 11.6

Aufgabe 11.7 C/C++, Algorithmen

#include <iostream>
using namespace std;

int iTePermutation(int stellen, int i)
{
    int platz[stellen];
    for(int k=0;k<stellen;k++)
        platz[k]=0;
    int s = stellen;
    for(int k=0;k<stellen;k++)
    {
        int index = i%s;
        int u=0;
        for(int p=0;p<stellen;p++)
        {
            if(platz[p]==0 && u==index)
            {
                platz[p]=k+1;
                break;
            }
            if(platz[p]==0)
                u++;
        }
        i/=s;
        s--;
    }

    int ergebnis = platz[0];
    for(int k=1;k<stellen;k++)
    {
        ergebnis*=10;
        ergebnis+=platz[k];
    }
    return ergebnis;
}

int main(void)
{
    for(int i=0;i<6;i++)
    {
        cout<<iTePermutation(3,i)<<endl;
    }

    return 0;
}

Code 0-10: Permutationen.

  • Obiges Programm ist so wie es ist lauffähig.
  • Es soll dazu dienen, Permutationen (mögliche Reihenfolgen) von Dingen zu bestimmen, die alle voneinander verschieden sind.
  • So, wie die Funktion hier aufgerufen wird, liefert es alle Permutationen von drei Dingen. Prüfen Sie, ob das korrekt ist.
  • Ändern Sie das Programm so, dass es alle Permutationen von fünf Dingen liefert.
  • Versuchen Sie die Funktion zu verstehen.
  • Können auch alle Permutationen von 10 Dingen damit bestimmt werden?
  • Ergänzen Sie eine zweite Funktion, die berechnet, wieviele Permutationen es bei N voneinander verschiedenen Dingen gibt.
#include <iostream>
using namespace std;

int iTePermutation(int stellen, int i)
{
    int platz[stellen];
    for(int k=0;k<stellen;k++)
        platz[k]=0;
    int s = stellen;
    for(int k=0;k<stellen;k++)
    {
        int index = i%s;
        int u=0;
        for(int p=0;p<stellen;p++)
        {
            if(platz[p]==0 && u==index)
            {
                platz[p]=k+1;
                break;
            }
            if(platz[p]==0)
                u++;
        }
        i/=s;
        s--;
    }

    int ergebnis = platz[0];
    for(int k=1;k<stellen;k++)
    {
        ergebnis*=10;
        ergebnis+=platz[k];
    }
    return ergebnis;
}

int fakultaet(int n)
{
    int ergebnis = 1;
    for(int p=2;p<=n;p++)
    {
        // 2*3*...n
        ergebnis = ergebnis*p;
    }
    return ergebnis;
}

int main(void)
{
    //int n = 5*4*3*2*1;
    int n = fakultaet(5);
    for(int i=0;i<n;i++)
    {
        cout<<i<<".: "<<iTePermutation(5,i)<<endl;
    }

    return 0;
}

Code 0-11: Musterlösung zu 11.7

Aufgabe 11.8 Java / Processing

Nachfolgendes Programm erzeugt mittels der entsprechenden Library ein pdf-Dokument, das als Screenshot weiter unten angezeigt wird:

import processing.pdf.*;

size(600, 600);

beginRecord(PDF, "line.pdf"); 

background(255);
stroke(0, 20);
strokeWeight(20.0);
line(200, 0, 400, height);

endRecord();

Code 0-12: OneFrame001

Screenshot zu line.pdf.

Bild 0-1: Screenshot zu line.pdf.

Schreiben Sie das Programm so um, dass es eine pdf Datei mit Namen ball.pdf erzeugt, die nachfolgenden Inhalt hat (gleiche Größe wie zuvor):

Screenshot zu ball.pdf.

Bild 0-2: Screenshot zu ball.pdf.

Aufgabe 11.9 Java, Einfache Datentypen

public void setup()
{
//     for(int i=0;i<65536;i++) //ALLE sichtbaren UNICODE-Zeichen 
     for(int i=0;i<1000;i++)
     {
          char c = (char)i;
          if(!Character.isWhitespace(c))
          {
               print(c);
          }
     }
}

public void draw()
{

Code 0-13: }

  • Obiges Programm gibt einen Teil der sichtbaren Unicode-Zeichen aus.
  • Hierzu wird bei jedem Zeichen geprüft, ob es sichtbar, resp. kein Whitespace ist.
  • Dazu existiert in der so genannten Wrapper-Classe Character eine statische Methode boolean isWhitespace(char c).
  • Schreiben Sie das Programm so um, dass in einem Fenster mit 900x600 Pixeln zeilenweise möglichst viele der sichtbaren Zeichen dargestellt werden.
  • Ihr Text soll dabei eine Punktgröße 12 haben, was mittels textSize(12); festgelegt werden kann.

Aufgabe 11.10 Java, Arrays

  • Testen und analysieren Sie folgendes "Malprogramm".
  • Hinweis: Solange der linke Mausknopf gedrückt ist, wird der aus der Mausbewegung resultierende Linienzug gezeichnet.
float[][] punkte = new float[10000][2];
int anzahl=0;

public void setup()
{
     size(640,480);
     frameRate(30);
}

public void draw()
{
     background(255);
     stroke(0);
     for(int i=0;i<anzahl-1;i++)
         line(punkte[i][0],punkte[i][1],punkte[i+1][0],punkte[i+1][1]);
     
}

public void mouseDragged()
{
     if(anzahl==0 || (mouseX!=punkte[anzahl][0] || mouseY!=punkte[anzahl][1]))
     {
          punkte[anzahl][0] = mouseX;
          punkte[anzahl][1] = mouseY;
          anzahl++;
     }
}

Code 0-14: Malprogramm.

  • Bei dem Programm gibt es das Problem, dass keine neue Figur begonnen werden kann,
  • d.h. alle Punkte werden miteinander verbunden, auch wenn man zwischendurch den Mausknopf loslässt.
  • Suchen Sie nach einer Lösung, das zu ändern.

Aufgabe 11.11 Java, Klassen, Objekte, Konstruktormethoden

public class Planet
{
     float R; //Umlaufradius in Pixeln
     float r; //Radius Planet in Pixeln
     float dphi; //Änderung des Winkels pro Frame in Grad
     float phi0; //Startwinkel in Grad
     float phi;  //Aktueller Winkel in Grad
     
     public Planet(float R, float r, float dphi, float phi0)
     {
          this.R=R;
          this.r=r;
          this.dphi=dphi;
          this.phi0=phi0;
          this.phi=phi0;
     }
     
     public void draw()
     {
         
     }
     
     public void step()
     {
         phi+=dphi;
     }     
}

Planet[] p = new Planet[3]; 

public void setup()
{
    p[0] = new Planet(200,30,9,0);
    p[1] = new Planet(300,40,6,45);
    p[2] = new Planet(400,50,3,90);
    size(700,700);
    frameRate(30);
}

public void draw()
{
    background(0);
    for(int i=0;i<p.length;i++)
    {
         p[i].draw();
         p[i].step();
    }
}

Code 0-15: Planetarium

  • Mit oben stehendem Programm soll eine Art Planetarium realisiert werden:
  • Drei Planeten sollen um ein Zentrum kreisen.
  • Analysieren und vervollständigen Sie das Programm.
  • Fügen Sie ins Zentrum eine "Sonne" hinzu.
public class Planet
{
     float R; //Umlaufradius in Pixeln
     float r; //Radius Planet in Pixeln
     float dphi; //Änderung des Winkels pro Frame in Grad
     float phi0; //Startwinkel in Grad
     float phi;  //Aktueller Winkel in Grad
     
     public Planet(float R, float r, float dphi, float phi0)
     {
          this.R=R;
          this.r=r;
          this.dphi=PI*dphi/180.0;
          this.phi0=PI*phi0/180.0;
          this.phi=phi0;
     }
     
     public void draw()
     {
          float xx = width/2 + R*cos(phi);         
          float yy = height/2 - R*sin(phi);
          fill(255);
          ellipse(xx,yy,2.0*r,2.0*r);
     }
     
     public void step()
     {
         phi+=dphi;
     }     
}

Planet[] p = new Planet[3]; 

public void setup()
{
    p[0] = new Planet(200,30,9,0);
    p[1] = new Planet(300,40,6,45);
    p[2] = new Planet(400,50,3,90);
    size(700,700);
    frameRate(30);
}

public void draw()
{
    background(0);
    for(int i=0;i<p.length;i++)
    {
         p[i].draw();
         p[i].step();
    }
}

Code 0-16: Teillösung.

Aufgabe 11.12 Java, Kapselung, Modifikatoren und Zugriffsrechte

  • In Aufgabe 11.11 wäre in der Klasse Planet eine Hilfsfunktion (Objektmethode) nützlich, die Grad in Rad umrechnet und nur von eigenen anderen Methoden aufgerufen werden kann.
  • Modifizieren Sie die Lösung aus 11.11 dementsprechend.

Aufgabe 11.13 Java, Vererbung

  • Schreiben Sie zu 11.11 eine Klasse FarbigerPlanet, die von der Klasse Planet erbt.
  • Der Konstruktor von FarbigerPlanet soll die Möglichkeit bieten, die Farbe des Planten festzulegen.
  • Indem eine eigene draw()-Methode in FarbigerPlanet geschrieben wird, kann draw() der Oberklasse überlagert werden und so auch wirklich eingefärbte Planeten dargestellt werden.
  • Setzen Sie diese Erweiterung um.

Aufgabe 11.14 Java, Polymorphismus

  • Es ist möglich in einer Klasse mehrere Konstruktoren bereit zu stellen, die alternativ benutzt werden können.
  • Sie heißen alle wie die Klasse, unterscheiden sich aber darin, wieviele und welche Parameter übergeben werden.
  • Wieder gehen wir zurück auf Aufgabe 11.11 und ergänzen hier in der Klasse Planet weitere Konstruktoren:
public class Planet
{
     float R; //Umlaufradius in Pixeln
     float r; //Radius Planet in Pixeln
     float dphi; //Änderung des Winkels pro Frame in Grad
     float phi0; //Startwinkel in Grad
     float phi;  //Aktueller Winkel in Grad
     
     public Planet(float R, float r, float dphi, float phi0)
     {
          this.R=R;
          this.r=r;
          this.dphi=dphi;
          this.phi0=phi0;
          this.phi=phi0;
     }
     
     public Planet(float R, float r)
     {
          this.R=R;
          this.r=r;
          this.dphi=1.0;
          this.phi0=0.0;
          this.phi=phi0;
     }
     
     public Planet()
     {
          this.R=400.0;
          this.r=30.0;
          this.dphi=1.0;
          this.phi0=0.0;
          this.phi=phi0;
     }
     
     public void draw()
     {
         
     }
     
     public void step()
     {
         phi+=dphi;
     }     
}

Code 0-17: Mehrere Konstruktoren in Planet.

  • Übernehmen Sie die neue Version der Klasse Planet in den Quelltext von Aufgabe 11.11.
  • Modifizieren Sie setup() von Aufgabe 11.11 so, dass alle drei Konstruktoren zur Anwendung kommen und testen das Programm.

Aufgabe 11.15 Java, Anwendungsprogrammierung

  • Erneut wird das Ergebnis von Aufgabe 11.11 vorgenommen.
  • In einer weiteren Modifikation des Programms sollen sich die Planeten nicht automatisch bewegen,
  • vielmehr wird die Anzahl der Schritte step() dessen Konstellation angezeigt wird, durch die x-Position der Maus im Fenster festgelegt: pro Pixel in x-Richtung ein dphi.
  • Auf diese Art und Weise lassen sich bestimmte Konstellationen direkt anwählen.
  • Zeigen Sie auf dem Fenster die aktuell angezeigte Step-Anzahl an. Diese könnte der Zeiteinheit eines Monats entsprechen.

Aufgabe 11.16 C/C++, Anwendungsprogrammierung

  • Nehmen Sie sich erneut das Permutationsprogramm bei Aufgabe 11.7 vor.
  • Satt Ziffern 1..9 sollen nun Zeichen permutiert werden, die als Referenz auf ein char-Array der Funktion iTePermutation übergeben werden.
  • Mit anderen Worten: Übergeben wird die Grundposition (0.Permutation) und nach Aufruf soll das Array sich in der i-ten Permutation befinden.
  • Der Kopf der Funktion sieht dann in folgender Weise verändert aus:
  • void iTePermutation(char meinPattern[],int stellen, int i)