kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Informatik -- Lehrveranstaltung vom 03.06.2024

(EN google-translate)

(PL google-translate)

Themen

  1. Vererbung
  2. Interfaces
  3. Vorbesprechung dazu, das Räuber-Beute-Modell in den objektorientierten Simulator einzupflegen
  4. Übungen

1. Vererbung

Allgemeines: 30_Informatik3/06_Vererbung
Beispiel als UML-Klassendiagramm dargestellt: 30_Informatik3/06_Vererbung/01_MesswerteUML

Die nachfolgenden C++ - Beispiele werden im Unterricht als Java-Code umgesetzt werden.

public class Messwerte
{
     private int MAXANZAHL=10000;
     private double[] x = new double[MAXANZAHL]; //Ordinate
     private double[] y = new double[MAXANZAHL]; //Abszisse
     private int anzahl = 0;
     public void add(double xx, double yy)
     {
         x[anzahl]=xx;
         y[anzahl]=yy;
         anzahl++;
     }
     public double getX(int index)
     {
          if(index>=0 && index<anzahl)
          {
              return x[index];
          }
          else
          {
              println("UNGÜLTIGE ABFRAGE!");
              return 0.0;
          }    
     }
     public double getY(int index)
     {
          if(index>=0 && index<anzahl)
          {
              return y[index];
          }
          else
          {
              println("UNGÜLTIGE ABFRAGE!");
              return 0.0;
          }    
     }
}

Messwerte messungen1 = new Messwerte();
Messwerte messungen2 = new Messwerte();

public void setup()
{
    double x=-10.0;
    while(x<=10.0)
    {
         messungen1.add(x,x*x);
         messungen2.add(x,x*x*x);
         x+=1.0;
    }
    println("mess1: index0 x="+messungen1.getX(0)+" y="+messungen1.getY(0));
    println("mess2: index0 x="+messungen2.getX(0)+" y="+messungen2.getY(0));
}

public void draw()
{
}

Code 0-1: Messwerte001

public class Messwerte
{
     private int MAXANZAHL=10000;
     protected double[] x = new double[MAXANZAHL]; //Ordinate
     protected double[] y = new double[MAXANZAHL]; //Abszisse
     protected int anzahl = 0;
     public void add(double xx, double yy)
     {
         x[anzahl]=xx;
         y[anzahl]=yy;
         anzahl++;
     }
     public double getX(int index)
     {
          if(index>=0 && index<anzahl)
          {
              return x[index];
          }
          else
          {
              println("UNGÜLTIGE ABFRAGE!");
              return 0.0;
          }    
     }
     public double getY(int index)
     {
          if(index>=0 && index<anzahl)
          {
              return y[index];
          }
          else
          {
              println("UNGÜLTIGE ABFRAGE!");
              return 0.0;
          }    
     }
}

public class MesswerteShow extends Messwerte
{
     public void zeigeMesswerte()
     {
           println("Alle Messwerte:");
           for(int i=0;i<anzahl;i++)
           {
                println(x[i]+" | "+y[i]);
           }
     }
}

MesswerteShow messungen1 = new MesswerteShow();
MesswerteShow messungen2 = new MesswerteShow();

public void setup()
{
    double x=-10.0;
    while(x<=10.0)
    {
         messungen1.add(x,x*x);
         messungen2.add(x,x*x*x);
         x+=1.0;
    }
    println("Alle Messwerte von Messungen 1:");
    messungen1.zeigeMesswerte();
}

public void draw()
{
}

Code 0-2: Messwerte002 -- >Die Klasse MesswerteShow beerbt die Klasse Messwerte.

Basisklasse in C++: 30_Informatik3/06_Vererbung/02_MesswerteProgramm
Erbende Klasse in C++: 30_Informatik3/06_Vererbung/03_VererbungsProgramm
Von Library-Klasse erben:
import java.util.Random;

//Random zufall = new Random(0);

public class Zufall extends Random
{
     public Zufall(long seed)//meine meine eigene Konstruktormethode
     {
          super(seed);//greift auf den Konstruktor der Oberklasse zu.
     }
     
     //Liefert Zufallszahl zwischen [min,max] (inklusive)
     public int getInt(int min, int max)
     {
          return min + nextInt(max-min+1);
     }
}

//Zufall zufall = new Zufall(0);
Zufall zufall = new Zufall(System.currentTimeMillis());

public void setup()
{
    for(int i=0;i<20;i++)
      print(zufall.nextInt(10)+" "); // liefert 0..9 zufällig, gleichverteilt
    println();  
    for(int i=0;i<20;i++)
      print(zufall.getInt(5,10)+" "); // liefert Werte zwischen 5 und 10 inklusive
}

Code 0-3: Von Library-Klasse erben, Beispiel Random.

2. Interfaces

Interfaces (Schnittstellen), ein Beispiel zur Einführung: 30_Informatik3/15_Rasterlayout/02_interfaces

3. Vorbesprechung dazu, das Räuber-Beute-Modell in den objektorientierten Simulator einzupflegen

Siehe Aufgabe 8.2 (Day by day, vorletzte LV)

4. Übungen

Aufgabe 8.2 (Day by day, vorletzte LV)

Aufgabe 10.0

  • Nehmen Sie sich das Programm mit den Klassen Messwerte und MesswerteShow vor.
  • Ergänzen Sie in MesswerteShow eine Methode zeichneKurve(), die die Kurve zu y=f(x) grafisch im Fenster darstellt.
  • Verwenden Sie hierzu den Processing-Befehl line(x1,y1,x2,y2), die zwei Punkte [x1,y1] und [x2,y2] durch eine gerade Linie verbindet.
  • zeichneKurve() soll die Kurve zu den Messwerten ideal in das Fenster einpassen.

Aufgabe 10.1

public class Matrix
{
     private double[][] mat = new double[2][2];
     public double get(int zeile, int spalte)
     {
           return mat[zeile][spalte];
     }
     public void set(int zeile, int spalte, double wert)
     {
           mat[zeile][spalte]=wert;
     }     
}

public class Mat extends Matrix
{
     public void show()
     {
         //....
     }
     
     public void transpose()
     {
         //....
     }
}

public void setup()
{
}

Code 0-4: Vererbung001

  • Übertragen Sie obigen unvollständigen Code in einen Sketch.
  • Vervollständigen Sie show() ... damit soll der Inhalt eines Matrix-Objektes im Terminal angezeigt werden.
  • Vervollständigen Sie transpose() ...Diese Methode soll aus der Matrix ihre Transponierte machen (Zeilen mit Spalten vertauscht).
  • Testen Sie die Basisklasse und die erbende Klasse Mat in der setup-Methode, indem Sie dort Objekte beider Klassen erzeugen und deren Objektmethoden nutzen.
LÖSUNG:
public class Matrix
{
     protected double[][] mat = new double[2][2];
     public double get(int zeile, int spalte)
     {
           return mat[zeile][spalte];
     }
     public void set(int zeile, int spalte, double wert)
     {
           mat[zeile][spalte]=wert;
     }     
}

public class Mat extends Matrix
{
     public void show()
     {
           println(mat[0][0]+" | "+mat[0][1]);        
           println(mat[1][0]+" | "+mat[1][1]);        
     }
     
     public void transpose()
     {
           double help = mat[0][1]; 
           mat[0][1]=mat[1][0];
           mat[1][0]=help;
     }
}

Mat m1 = new Mat();
Mat m2 = new Mat();

public void setup()
{
     m1.set(0,0,1.0);
     m1.set(0,1,2.0);
     m1.set(1,0,3.0);
     m1.set(1,1,4.0);
     
     m2.set(0,0,10.0);
     m2.set(0,1,20.0);
     m2.set(1,0,30.0);
     m2.set(1,1,40.0);
     
     m1.show();
     m1.transpose();
     m1.show();
     println("2. Matrix:");
     m2.show();
}

Code 0-5: Lösung.

Aufgabe 10.2 -- Schnittstellen

public interface Figur
{
    public abstract void draw(float x, float y, float d);
}

public class Quadrat implements Figur
{
     int ROT, GRUEN, BLAU;
     public Quadrat(int ROT, int GRUEN, int BLAU)
     {
          //...
     }
  
     public void draw(float x, float y, float d)
     {
          //...
     }
}

public class Kreis implements Figur
{
     int ROT, GRUEN, BLAU;
     public Kreis(int ROT, int GRUEN, int BLAU)
     {
          //...
     }
     
     public void draw(float x, float y, float d)
     {
          //...
     }
}


Figur[][] f = new Figur[10][10]; 

public void setup()
{
     size(400,400);
     for(int i=0;i<f.length;i++)
         for(int k=0;k<f[i].length;k++)
             if((i*f.length+k)%2==0)             
                f[i][k] = new Quadrat((i%2)*255,(k%2)*255,((i/2)%2)*255);
             else   
                f[i][k] = new Kreis((i%2)*255,(k%2)*255,((i/2)%2)*255);
}

public void draw()
{
     background(127);
     
     float d = height/(float)f.length;
     for(int i=0;i<f.length;i++)
         for(int k=0;k<f[i].length;k++)
             f[i][k].draw((float)k*d,(float)i*d,d);    
     
}

Code 0-6: Schnittstellen001

Screenshot zu Schnittstellen001.

Bild 0-1: Screenshot zu Schnittstellen001.

Vervollständigen Sie in dem Quelltext die mit //... gekennzeichneten Stellen, so, dass obiges Muster entsteht.

Informatik -- Lehrveranstaltung vom 05.06.2024

Inhalte, siehe oben.

Themen:

  • Theoretische Behandlung von Schnittstellen (Interfaces)
  • Gemeinsam das Räuber-Beute-Modell in das objektorientierte Simulationsprogramm einpflegen
  • ÜBUNG 10.2 zu Interfaces (s.o.)
"NOT-ÜBUNG" heute, wie soeben gemailt:
ja, es gab schon einmal früher ein Simulationsprogramm für das Räuber-Beute-Modell.
Aber jetzt, heute spielt sich alles hier ab:
http://www.kramann.info/10_Informatik1/01_day_by_day/08_LV_22_05_2024/index.php

Es gibt drei Simulationen des Schwingers:
Code 0-1
Code 0-3
Code 0-4 0-5 0-6 (gehören zusammen)

Aufgabe:
In jeder Variante soll das Schwingermodell durch das Räuber-Beute-Modell ersetzt werden und zum Laufen gebracht werden.
Zusatzaufgabe:
Sinnvolle Visualisierung als Balken, der Höhe sich dynamisch ändert in der dritten, objektorientierten Java-Variante.

Angaben zum Räuber-Beute-Modell, siehe Formel 0-3 und Daten darüber.


Code 0-7: Übung

#include <iostream>
using namespace std;
int main(void)
{
    double tmax=10.0;
    double dt=0.01;
    double t=0.0;
    double b0=100.0;
    double r0=10.0;
    double b=b0;
    double r=r0;
    
    int anzahl = 0;
    while(t<tmax)//Zählen, wieviele Datenelemente benötigt werden.
    {
        anzahl++;
        t+=dt;
    }

    double arrt[anzahl];
    double arrb[anzahl];
    double arrr[anzahl];

    t=0.0;

    for(int i=0;i<anzahl;i++)
    {
        arrt[i]=t;
        arrb[i]=b;
        arrr[i]=r;

        double bneu = b + (b-0.01*b*r)*dt;
        double rneu = r + (-r+0.01*b*r)*dt;

        b=bneu;
        r=rneu;

        t+=dt;
    }

    //Ausgabe für Scilab:
    cout<<"t=[";
    for(int i=0;i<anzahl;i++)
    {
        cout<<arrt[i];
        if(i<anzahl-1) cout<<",";
    }
    cout<<"];"<<endl;

    cout<<"B=[";
    for(int i=0;i<anzahl;i++)
    {
        cout<<arrb[i];
        if(i<anzahl-1) cout<<",";
    }
    cout<<"];"<<endl;

    cout<<"R=[";
    for(int i=0;i<anzahl;i++)
    {
        cout<<arrr[i];
        if(i<anzahl-1) cout<<",";
    }
    cout<<"];"<<endl;

    cout<<"plot(t,B,\'blu\',t,R,\'gre\');"<<endl;

    return 0;
}

Code 0-8: Lösung zum ersten Teil.

TERMINAL:
g++ -o beute0 beute0.cpp 
./beute0 > sci.sce

IN SCILAB (Beispiel, anpassen!)
cd /home/linux/PLANUNG_YSOSE2024/INFORMATIK1/beute/
exec sci.sce

Code 0-9: Schritte zur Umsetzung.

Schwinger101BEUTE.zip -- Lösung zum dritten Teil.