kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Informatik -- Lehrveranstaltung vom 06.05.2024

(EN google-translate)

(PL google-translate)

  • Wegen der anstehenden Nachklausur, findet heute die Vorlesung statt.
  • Es werden zwei umfangreiche neue Themen begonnen, zu denen dann viel geübt werden kann:

Hauptthemen

  1. Algorithmen (C/C++)
  2. Objektorientierte Programmierung (Java)

Einzelthemen

  1. Besprechung einer möglichen Lösung zu Aufgbe 5.5
  2. Nachbesprechung weiterer Übungsaufgaben nach Wunsch.
  3. Algorithmen: Sieb des Erastosthenes und Bubble-Sort
  4. Objektorientierte Programmierung: Widerstand und mathematischer Vektor

1. Besprechung einer möglichen Lösung zu Aufgbe 5.5

public void setup()
{
     size(200,100);
     frameRate(60);
}

int x = 25;
int xspeed = 1;

public void draw()
{
     background(0,0,255);
     fill(255,0,0);
     noStroke();
     ellipse(x,height/2,50,50);
     
     
     if (x <= 25)
         {
         xspeed = 1;
         } 
         
         
      else if (x >= width -25)
         { 
         xspeed = -1;
         }
        
     x += xspeed;
     
}

Code 0-1: Studentische Lösung zum hin- und her wandernden Ball.

2. Nachbesprechung weiterer Übungsaufgaben nach Wunsch

3. Algorithmen: Sieb des Erastothenes und Bubble-Sort

Theorie, siehe:

10_Informatik1/05_Softwareentwicklung/02_Algorithmen

4. Objektorientierte Programmierung: Widerstand und mathematischer Vektor

Theorie, siehe:

10_Informatik1/05_Softwareentwicklung/03_Objektorientierung

Ältere Einführungen, siehe auch hier:

30_Informatik3/01_Vom_struct_zur_Klasse/06_Objektabstraktion
ÜBUNGEN ZU ALGORITHMEN (C/C++)
Aufgabe 6.1

Die Standardabweichung ist definiert als Wurzel aus der Summe der Quadrate der Differenzen zwischen jedem Messwert und dem Mittelwert geteilt durch die Wurzel aus deren Anzahl n, vergleiche nachfolgende Formel.

Definition der Standardabweichung (Quelle Wikipedia).

Bild 0-1: Definition der Standardabweichung (Quelle Wikipedia).

a) Schreiben Sie einen Algorithmus, der den Mittelwert (Summe der werte geteilt durch deren Anzahl) zu folgenden Messwerten bestimmt und ausgibt: {0.0,1.3,2.0,2.7,4.0,5.0,6.0,6.3,8.0,8.7}.

b) Schreiben Sie einen Algorithmus, der die Standardabweichung zu den Messwerten aus a) bestimmt und ausgibt. Nutzen Sie dazu den Algorithmus aus a) aus.

c) Versuchen Sie die Algorithmen aus a) und b) in Funktionen auszulagern, die dann mit dem Array der in a) gegebenen Messwerte aufgerufen werden. ACHTUNG: Die Funktionen sollen die Zahlenwerte Mittelwert, bzw. Standardabweichung berechnen. Die Ausgabe der berechneten Werte hingegen soll im Hauptprogramm erfolgen.

Aufgabe 6.2

Ein ähnluch einfach zu beschreibender Sortieralgorithmus, der aber auch ähnlich ineffizient ist wie Bubble-Sort ist der nachfolgend beschriebene:

  1. Wähle die kleinste Zahl q aus der Folge der zu sortierenden Zahlen (Quelle), die noch nicht durchgestrichen wurde und hänge sie an eine neu zu bildende Folge (Ziel) an.
  2. Streiche die zuletzt gewählte Zahl q in der Quelle durch.
  3. Wiederhole 1. und 2. so lange, bis in der Quelle alle Zahlen durchgestrichen sind.

a) Vollziehen Sie diesen Algorithmus anhand dieser Folge ganzer Zahlen auf einem Blatt Papier nach: {3,1,7,2,8,3,6,5,9,1}.

b) Schreiben Sie gemäß der hier gegebenen Algorithmus-Beschreibung ein Hauptprogramm in C/C++, das die in a) gegebenen Zahlen sortiert.

c) Schreiben Sie wie in 6.1 auch zu dem Sortieralgorithmus eine Funktion, in der das Sortieren statt im Hauptprogramm erfolgen kann.

ÜBUNGEN ZU OBJEKTORIENTIERTER PROGRAMMIERUNG (Java/Processing)
Aufgabe 6.3

Analysieren und testen Sie nachfolgendes Programm:

import java.util.Random;
Random zufall = new Random(0);

public class Ball
{
     int R,G,B,T;
     float x,y;
     float d;
     public Ball(float xx, float yy)
     {
          x = xx;
          y = yy;
          R = zufall.nextInt(255);
          G = zufall.nextInt(255);
          B = zufall.nextInt(255);
          T = 127+zufall.nextInt(128);
          d=height/10.0f;
     }
     
     public void draw()
     {
          noStroke();
          fill(R,G,B,T);
          ellipse(x,y,d,d);
     }
}

Ball[] ball;

public void setup()
{
     ball = new Ball[100];
     for(int i=0;i<ball.length;i++)
        ball[i] = new Ball(width*zufall.nextFloat(),height*zufall.nextFloat());
     size(400,400);
}

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

Code 0-2: Ball001

Das Programm erzeugt folgende Ausgabe:

Von Ball001 erzeugtes Fenster.

Bild 0-2: Von Ball001 erzeugtes Fenster.

Kopieren Sie den entsprechenden Processing-Sketch in Ball002 und ändern Sie den Quelltext so ab, dass nun folgendes Fenster generiert wird:

Von Ball002 erzeugtes Fenster.

Bild 0-3: Von Ball002 erzeugtes Fenster.

Aufgabe 6.4

Es soll eine Klasse mit dem Namen "Widerstand" geschrieben werden:

  • Die Klasse soll ein Attribut wert vom Typ Integer besitzen, in dem der Widerstandswert in Ohm des jewiligen Objekts gespeichert wird.
  • Sie soll eine Methode draw(float x, float y) besitzen, die die Widerstandsobjekte grafisch an den Koordinaten [x,y] darstellen kann.
  • Es soll sich bei der grafischen Darstellung um ein graues Rechteck handeln, auf dem die drei farbigen Streifen, die den Widerstandswert kodieren zu sehen sind.
  • Es soll eine Konstruktormethode Widerstand(int w) geben, mit der der Widerstandswert beim Erzeugen eines Objektes festgelegt wird.

a) Analysieren Sie als Vorbereitung zu dieser Übungsaufgabe und zur Orientierung noch einmal das Beispiel mit der Klasse Vektor hier:

10_Informatik1/05_Softwareentwicklung/03_Objektorientierung

b) Erzeugen Sie nun ein neues Projekt, beispielsweise mit dem namen Widerstand001 und entwickeln die geforderte Klasse.

c) Testen Sie nun die Klasse, indem Sie drei Objekte mit den Widerstandswerten 470Ohm, 220000Ohm und 100Ohm erzeugen und jeweils im Fenster mittels draw(...) darstellen.

Themen beim Unterricht am Montag, 13.05.

In der heutigen Unterrichtseinheit wird zunächst einige Theorie zu Objektorientierter Programmierung besprochen. Im Anschluss werden die Aufgaben 6.1 und 6.3 besprochen. In dem abschließenden Übungsteil geht es dann um die Aufgaben 6.2 und 6.4.

  1. Besprechung der Übungsaufgabe 6.3 als Einstiegsbeispiel für die Weiterführung der Objektorientierten Programmierung
  2. Vertiefung: Klasse - Objekt - Konstruktormethode
  3. Unified Modeling Language (UML) zur Darstellung Objektorientierter Programmstrukturen
  4. OOP Paradigma Kapselung
  5. OOP Paradigma Wiederverwendbarkeit
  6. OOP Paradigma Vererbung
  7. Besprechung der Übungsaufgabe 6.1
  8. ÜBUNG (6.2 und 6.4)

1. Besprechung der Übungsaufgabe 6.3 als Einstiegsbeispiel für die Weiterführung der Objektorientierten Programmierung

import java.util.Random;
Random zufall = new Random(0);

public class Ball
{
     int R,G,B,T;
     float x,y;
     float d;
     public Ball(float xx, float yy)
     {
          x = xx;
          y = yy;
          R = zufall.nextInt(255);
          G = zufall.nextInt(255);
          B = zufall.nextInt(255);
          T = 127+zufall.nextInt(128);
          d=height/10.0f;
     }
    
     public void draw()
     {
          noStroke();
          fill(R,G,B,T);
          ellipse(x,y,d,d);
     }
}

Ball[] ball;

public void setup()
{
 int x,y;
 x=20;
 y=20;

    ball = new Ball[100];
  
    for (int e=0;e<100;e=e+10)
    {
      for(int i=e;i<e+10;i++)
      {
          ball[i] = new Ball(x,y);
          x=x+40;
      }
      x=20;
      y=y+40;       
    }
    size(400,400);
}

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

Code 0-3: Studentische Lösung

public void setup()
{
     ball = new Ball[100];
     for(int i=0;i<10;i++)
        for(int k=0;k<10;k++)
            ball[i*10+k] = new Ball(20.0f+(float)k*40.0f,20.0f+(float)i*40.0f);
     size(400,400);
}

Code 0-4: Variante zur doppelten Schleife

2. Vertiefung: Klasse - Objekt - Konstruktormethode

public class Vektor
{
     double x,y;
     public Vektor(double xx, double yy)
     {
          x = xx;
          y = yy;
     }
}

Vektor v; //Deklaration
Vektor[] varr = new Vektor[100]; //Deklaration und Arrayplätze vorbereiten

public void setup()
{
    v = new Vektor(3.0,4.0); //Initialisierung
    for(int i=0;i<10;i++)
        for(int k=0;k<10;k++)
            varr[i*10+k] = new Vektor((double)k*10.0,(double)i*10.0);
    println("v.x="+v.x);
    size(100,100);
}

public void draw()
{
    background(255);
    stroke(255,0,0);
    for(int i=0;i<10;i++)
        for(int k=0;k<10;k++)
           line(0.0,0.0,(float)varr[i*10+k].x,(float)varr[i*10+k].y);    
} 

Code 0-5: Vektorklasse ohne Objektmethode.

public class Vektor
{
     private double x,y;
     public Vektor(double xx, double yy)
     {
          x = xx;
          y = yy;
     }
     
     public void draw()
     {
          stroke(255,0,0);
          line(0.0,0.0,(float)x,(float)y); 
     }
}

Vektor v; //Deklaration
Vektor[] varr = new Vektor[100]; //Deklaration und Arrayplätze vorbereiten

public void setup()
{
    v = new Vektor(3.0,4.0); //Initialisierung
    for(int i=0;i<10;i++)
        for(int k=0;k<10;k++)
            varr[i*10+k] = new Vektor((double)k*10.0,(double)i*10.0);
    println("v.x="+v.x);
    size(100,100);
}

public void draw()
{
    background(255);
    stroke(255,0,0);
    for(int i=0;i<10;i++)
        for(int k=0;k<10;k++)
           varr[i*10+k].draw();
//           line(0.0,0.0,(float)varr[i*10+k].x,(float)varr[i*10+k].y);    
} 

Code 0-6: Variante mit Objektmethode draw().

3. Unified Modeling Language (UML) zur Darstellung Objektorientierter Programmstrukturen

30_Informatik3/02_UML/02_UML_Klassendiagramm

4. OOP Paradigma Kapselung

5. OOP Paradigma Wiederverwendbarkeit

6. OOP Paradigma Vererbung

7. Besprechung der Übungsaufgabe 6.1

#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{
    double S;
    double messwerte[]={0.0,1.3,2.0,2.7,4.0,5.0,6.0,6.3,8.0,8.7};
    double mittelwert = 0.0;
    double anzahl =sizeof (messwerte)/sizeof (double);
    for(int i=0;i<10;i++)
    {
        mittelwert=mittelwert+messwerte[i];
    }
    mittelwert=mittelwert/anzahl;
    cout<<"mittelwert="<<mittelwert<<endl;

    for(int i=0; i<anzahl;i++)
    {
        //Aufsummation der Quadrate der Differenzen zwischen Wert und Mittelwert
        S=S+ ((messwerte[i]-mittelwert)*(messwerte[i]-mittelwert));
    }
    S = S/anzahl; //Teilen durch die Anzahl n.
    S=sqrt(S); // Wurzel ziehen.
    cout<<"Standartabweichung:"<<S<<endl;
    return 0;
}

Code 0-7: Studentische Lösung.

8. ÜBUNG (6.2 und 6.4)