Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
schule:klassen:2017:10b:kap8 [2018/01/04 12:50] – angelegt martinschule:klassen:2017:10b:kap8 [2021/12/29 10:40] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Kapitel 8: Felder (Arrays) ======
 +<WRAP center round info 60%>
 +**Merke** \\ 
 +Ein Feld (englisch: array) ist ein Speicherbereich, der viele gleichartige Objekte bzw. Werte enthält.
 +</WRAP>
 +{{ :schule:klassen:2017:10b:array_1.png?600 |}}
 +
 +<WRAP center round important 60%>
 +Vorsicht: Felder werden von 0 an durchnummeriert. Bei obigem Beispiel enthält das Feld also die vier Variablen ''noten[0]'', ''noten[1]'', ''noten[2]'' und ''noten[3]''.
 +</WRAP>
 +
 +
 +<code java>
 +    public ArrayTest(){
 +
 +        // Array deklarieren und Speicherplatz reservieren:
 +        int[] noten = new int[6];
 +
 +        // Werte der Elemente im Array setzen:
 +        noten[0] = 1;
 +        noten[1] = 2;
 +        noten[2] = 4;
 +        noten[3] = 3;
 +        noten[4] = 6;
 +        noten[5] = 5;
 +
 +        // Ausgabe des 3. Elements:
 +        System.out.println(noten[2]);
 +
 +        // Ändern des 3. Elements
 +        noten[2] = 3;
 +
 +        System.out.println(noten[2]);
 +
 +        // Ausgabe der Anzahl der Elemente:
 +        System.out.println(noten.length);
 +
 +        // Berechne den Mittelwert aller Noten
 +        int i = 0;
 +        double summe = 0;
 +
 +        while(i < noten.length){
 +
 +            summe = summe + noten[i];
 +
 +            i++;
 +        }
 +
 +        double mittelwert = summe/noten.length;
 +
 +        System.out.println("Mittelwert: " + mittelwert);
 +
 +    
 +    }
 +</code>
 +
 +=====Aufgaben=====
 +  - Lagere die Mittelwertberechnung in eine eigene Methode aus!
 +  - Schreibe eine Methode, die die beste Note im Feld ''noten'' ermittelt und zurückgibt!
 +===== Lösung =====
 +<code java>
 +    private double mittelwert(int[] notenliste){
 +        int i = 0;
 +        double summe = 0;
 +
 +        while(i < notenliste.length){
 +            summe = summe + notenliste[i];
 +            i++;
 +        }
 +
 +        return summe/notenliste.length;
 +
 +    }
 +
 +    private double besteNote(int[] notenliste){
 +
 +        int beste = 6;
 +
 +        for(int i = 0; i < notenliste.length; i++){
 +            if(notenliste[i] < beste){
 +                beste = notenliste[i];
 +            }
 +        }
 +
 +        return beste;
 +    }
 +</code>
 +
 +
 +===== Anwendung: Einfache Particle Engine =====
 +{{ :schule:klassen:2017:10b:particle_engine.png?600 |}}
 +
 +Hier die Klasse für die Partikel:
 +<code>
 +import sge.Kreis;
 +
 +public class Particle {
 +
 +    private Kreis k;
 +    private double vx, vy;  // Geschwindigkeit in x- bzw. y-Richtung
 +
 +    public Particle(double x, double y, double vx, double vy){
 +        this.vx = vx;
 +        this.vy = vy;
 +
 +        k = new Kreis(x, y, 7);
 +        k.setFuellfarbe("gelb");
 +        k.setFuellfarbeAlpha(200);  // leicht durchsichtig
 +    }
 +
 +    public void zeitschritt(){
 +        k.verschieben(vx, vy);
 +        vy += 0.04;
 +        if(vy > 0){
 +            k.setFuellfarbe("orange");
 +            k.setFuellfarbeAlpha(128);
 +        }
 +    }
 +
 +    public boolean istAußerhalbDesFensters(){
 +        return k.istAußerhalbDesFensters();
 +    }
 +
 +    public void vernichten() {
 +        k.vernichten();
 +    }
 +}
 +</code>
 +
 +Die Partikel werden von der Klasse ''ParticleEmitter'' erzeugt und im Feld ''particles'' abgelegt. Alle 10 ms wird die Position jedes Partikels neu berechnet. Falls der Partikel das Fenster verlässt, wird er vernichtet und, seine Objektreferenz aus dem Feld ''particles'' entfernt und dafür ein neuer Partikel erzeugt. \\ Hier die Klasse ''ParticleEmitter'':
 +
 +<code java>
 +import sge.Fenster;
 +import sge.Timer;
 +import sge.TimerListener;
 +
 +public class ParticleEmitter implements TimerListener {
 +
 +    // Wir speichern alle Partikel in einem Feld, damit wir
 +    // später alle 10 ms die Positionen aller Partikel neu berechnen 
 +    // und überflüssige Partikel entfernen können:
 +    private Particle[] particles = new Particle[200];
 +    
 +    // Objektreferenz aufs Fenster, damit wir dessen Größe ermitteln können
 +    private Fenster f;
 +
 +    public ParticleEmitter(){
 +
 +        f = new Fenster(); // Fenster öffnen
 +
 +        // Der Timer sorgt dafür, dass timerSignalVerarbeiten alle 10 ms aufgerufen wird:
 +        Timer timer = new Timer(this, 10);
 +        timer.start();
 +
 +    }
 +
 +    @Override
 +    public void timerSignalVerarbeiten() {
 +        
 +        // Falls es im Feld particles eine Leerstelle (Wert == null) gibt, erzeuge einen neuen 
 +        // Partikel und lege seine Objektreferenz dort ab.
 +        for(int i = 0; i < particles.length; i++){
 +            if(particles[i] == null){
 +                Particle particle = new Particle(f.getBreite()/2, f.getHoehe() - 20,
 +                        Math.random()*10.0 - 5, -5 - Math.random() * 5);
 +                particles[i] = particle;
 +                break;
 +            }
 +        }
 +        
 +        // Für alle Partikel im Feld particles: Ändere die Position und
 +        // entferne den Partikel, falls er sich aus dem Fenster herausbewegt hat:
 +        for(int i = 0; i < particles.length; i++){
 +
 +            if(particles[i] != null) {
 +                
 +                particles[i].zeitschritt();
 +                
 +                if(particles[i].istAußerhalbDesFensters()){
 +                    particles[i].vernichten();
 +                    particles[i] = null;
 +                }
 +
 +            }
 +
 +        }
 +
 +    }
 +}
 +</code>
 +
 +Hier noch der Code der Starterklasse:
 +<code>
 +public class ParticleEmitterStarter {
 +
 +    public static void main(String[] args) {
 +        new ParticleEmitter();
 +    }
 +
 +}
 +</code>
  
Drucken/exportieren
QR-Code
QR-Code schule:klassen:2017:10b:kap8 (erstellt für aktuelle Seite)