kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Informatik -- Lehrveranstaltung vom 29.05.2024

(EN google-translate)

(PL google-translate)

Themen

  1. Geschichtliches zu Java
  2. Einfache Datentypen in Java
  3. Arrays in Java
  4. Übergabe von Arrays in Java und C/C++
  5. Polymorphismus
  6. Sichtbarkeit von Variablen und Overloading
  7. Räuber-Beute-Modell simulieren

Geschichtliches zu Java

36_Java

Einfache Datentypen in Java

36_Java/01_GettingStarted

Arrays in Java


int[] arr;             //nur Deklaration, noch kein Speicher reserviert.
int[] arr=new int[10]; //Definition, 10 Array-Elemente erzeugt und mit Null belegt.
int[] arr={2,5,3,8,1}; //Definition, 5 Array-Elemente mit speziellen Werten.
new int[] {1,2,3};     //Array als anonymes Objekt: es hat keine Referenz, unter der es angesprochen werden kann. 
                       //Macht Sinn bei unmittelbarer Übergabe an eine Funktion.

int[][] mat;              //Array von einem Integer-Array deklariert.
int[][] mat=new int[2][]; //Erste Dimension hat zwei Elemente, deren Speicherbereich aber noch nicht reserviert ist.
mat[0] = new int[10];     //Erzeugen der Unter-Arrays.
mat[1] = new int[] {1,2,3};

Code 0-1: Varianten zur Erzeugung.

public void setup()
{
     int x = 10;
     println("Hallo");
     int[] arr = new int[10];
     
     for(int i=0;i<arr.length;i++)
         arr[i] = (i+1)*(i+1);
     
     for(int i=0;i<arr.length;i++)
         println("arr["+i+"]="+arr[i]);
}

public void draw()
{
}

Code 0-2: Beispiele zum Exportieren eines Sketches als Java-Code und Verwendung eindimensionaler Arrays.

int[][] mat;
int[][] mat2 = {{1,2},{3,4}};//hier geht das ohne new
int[][] mat3;
public void setup()
{     
     mat = new int[2][2];
//     mat2 = {{1,2},{3,4}};
     mat3 = new int[][] {{1,2},{3,4}};
     mat3 = new int[][] {{3,4},{5,5}};
     mat[0][0]=1;
     mat[0][1]=2;
     mat[1][0]=3;
     mat[1][1]=4;
     
     /*
         |1 2|
         |3 4|
     */
     
     int[][] mat4=new int[2][];
     mat4[0] = new int[] {1,2,3,4,5};
     mat4[1] = new int[] {4,5};
}

public void draw()
{
}

Code 0-3: Beispiele zu zweidimensionalen Arrays aus dem Unterricht.

Übergabe von Arrays in Java und C/C++

  • Einfache Datentypen existieren nach Übergabe an eine Funktion dort als Kopie.
  • Arrays werden als Referenz übergeben.
public void show(String name, int[] x)
{
    println("Array "+name+": ");
    for(int i=0;i<x.length;i++)
       println(name+"["+i+"]="+x[i]);
    x[0]=10000;
    name="huhu";
}

public void setup()
{   
    String n="arr";
    int[] arr = {1,2};
    show(n,arr);
    show(n,arr);
    println("n="+n);
}

public void draw()
{
}

Code 0-4: Beispiel: name wird als "Call by Value" übergeben, x als "Call by Reference".

public void show(String name, int[] xx)
{
    int[] x = xx.clone(); 
    
    println("Array "+name+": ");
    for(int i=0;i<x.length;i++)
       println(name+"["+i+"]="+x[i]);
    x[0]=10000;
    name="huhu";
}

public void setup()
{   
    String n="arr";
    int[] arr = {1,2};
    show(n,arr);
    show(n,arr);
    println("n="+n);
}

public void draw()
{
}

Code 0-5: Kopie eines Arrays in Funktion mit .clone() erzeugen, um Korrumpieren der Daten zu vermeiden.

#include <iostream>
using namespace std;

void show(const char name[], int x[], int anzahl)
{
  
    cout<<"Array "<<name<<": "<<endl;
    for(int i=0;i<anzahl;i++)
       cout<<name<<"["<<i<<"]="<<x[i]<<endl;
    x[0]=10000;
    name="huhu";
  
}

int main(void)
{
    cout<<endl<<"Hello world!"<<endl<<endl;

    int arr[] = {2,4,8,16};
    int anz = sizeof(arr)/sizeof(int);
    show("arr",arr,anz);
    show("arr",arr,anz);

    return 0;
}

Code 0-6: Pendent in C/C++ zu obigem Java-Programm.

Polymorphismus

public void show(String name, int[] x)
{
    println("Array "+name+": ");
    for(int i=0;i<x.length;i++)
       println(name+"["+i+"]="+x[i]);
    x[0]=10000;
    name="huhu";
}
public void show(String name, int[] x, int koordx, int koordy)
{
    String s = "Array "+name+": 
";
    for(int i=0;i<x.length;i++)
       s+=name+"["+i+"]="+x[i]+"
";
    text(s,koordx,koordy);   
}
public void setup()
{   
    String n="arr";
    int[] arr = {1,2};
    show(n,arr);
    show(n,arr);
    println("n="+n);
    size(640,480);
    fill(255,0,0);
    background(0);
    textSize(80);
    show(n,arr,100,100);
}

public void draw()
{
     
}

Code 0-7: Beispiel zu Polymorphismus: zwei unterschiedlich arbeitende show-Methoden.

  • Funktionen sind in Java über ihren Namen und ihre Übergabeparameter eindeutig identifiziert.

Sichtbarkeit von Variablen und Überlagerung


{
  int x=3;
  int z=9;
  //y hier nicht sichtbar
    {
       //x hier sichtbar!
       int y=4;
       int z=10;
       //Das z mit der Belegung 9 wurde hier durch die Neudefinition verborgen.
    }
  //y hier nicht sichtbar
}

Code 0-8: Sichtbarkeit.

Räuber-Beute-Modell simulieren

$ \left[\begin{array}{cc}\dot B \\ \dot R\end{array}\right]=\left[\begin{array}{cc}B-0.01 \cdot B \cdot R \\ -R+0.01 \cdot B \cdot R\end{array}\right] $

Formel 0-1: Räuber-Beute-Modell mit konkreten Parametern.



Anfangsbedingungen werden gewählt zu: B0=100, R0=10 mit Teitschrittweite dt=0.01Jahre.


Integrator integrator;

public void setup()
{
     size(640,480);
     frameRate(50);
     
     integrator = new Integrator(new Modell());
}

double x=1.0;
double v=0.0;
double dt=0.02;
double[] y = new double[] {x,v};

public void draw()
{
    background(255);
    double[] yneu = integrator.step(y,dt);
    
    fill(255,0,0);
    ellipse(width/2,height/2.0f+(float)yneu[0]*200.0f,50,50);
    
    y[0]=yneu[0];
    y[1]=yneu[1];
}

Code 0-9: Hauptprogramm.

public class Modell
{
     public double[] berechneSteigung(double[] y)
     {
         double x = y[0];
         double v = y[1];
         
         double steigung_x = v;
         double steigung_v = -x-0.3*v;
         
         double[] steigung = {steigung_x, steigung_v};
         
         return steigung;
     }
}

Code 0-10: Klasse Modell.

public class Integrator
{
    Modell modell;
    
    public Integrator(Modell modell)
    {
        this.modell = modell;
    }
    
    public double[] step(double[] y, double dt)
    {
        double[] steigung = modell.berechneSteigung(y);

        double[] yneu = new double[steigung.length];
        
        for(int i=0;i<yneu.length;i++)
            yneu[i] = y[i] + steigung[i]*dt;
            
        return yneu;    
    }
}

Code 0-11: Klasse Integrator.

Download des Processing-Projektes Schwinger101.zip.