q1:java-felder

Felder

Die folgende Tabelle zeigt den fiktiven Ausfall der zentralen Informatikarbeit in der Jahrgangsstufe Q1 der MSO:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
13 8 6 8 10 16 11 9 9 13 12 10 7 6 5 2
Wie könnte man einen solchen Notenspiegel in JAVA realisieren? Sicher könnte man 16 Variablen vom Typ int deklarieren wie anzahlDer0, anzahlDer1, usw. - doch würden die Pro-gramme dadurch äußerst unhandlich. Um die Tabelle einzugeben bräuchte man 16 Eingabe-befehle, für die Ausgabe nochmals 16 Befehle. Es wäre sinnvoll, wenn man „nummerierte“ Variablen hätte. Man kann das sehr gut mit einer Straße vergleichen:

Die Straße hat einen Namen, der sie identifiziert. Jedes Haus hat eine Nummer, die eigentlichen Daten sind die Hausbewohner (in der Grafik sind es Zeichen). Die Häuser müssen alle gleich sein, in der Sprache der Informatik bedeutet das, dass alle Feldelemente denselben Datentyp haben.

Eine solche Datenstruktur nennt man „Feld“. In JAVA würde man ein Feld wie folgt definieren:

 long[] notenspiegel = new long[16]; 

Dabei bedeutet long[], dass ein Feld von long-Zahlen erzeugt wird, d.h. die Hausbewohner sind long-Zahlen. notenspiegel ist der Name des Feldes, d.h. der Straßenname. new bedeutet das Erzeugen einer Instanz der Klasse long[] und der Konstruktor heißt long[16]. Die Syntax ist nicht absolut kompatibel zur Erzeugung von Objekten selbstdefinierter Klassen, wie wir später noch genauer sehen werden. Die 16 in long[16] bedeutet, dass es 16 Feld¬elemente, d.h. Häuser gibt. Die Nummerierung der Häuser beginnt im Gegensatz zu unserer Straßen¬grafik immer mit 0, d.h. wir haben hier Haus¬nummern von 0 bis 15, die man etwas pro¬fessioneller als Feldindizes bezeichnet.

Der Zugriff im Programm auf Feldelemente erfolgt einfach durch Feldname[Feldindex] oder in unserer naiven Sprache Straßenname[Hausnummer]. Will man z.B. auf die Zahl der Schüler mit 11 Punkten ausgegeben lassen, so geht das mit dem Befehl notenspiegel[11].

Das folgende Beispiel erzeugt ein solches Notenspiegelfeld. Wie die meisten Schüler schon immer geahnt haben, entstehen die Noten durch Würfeln. Die Oberstufenpunkte gelingen dabei wie folgt: Man würfelt mit einem Würfel 3-mal, addiert die Augenzahlen und zieht zum Schluss 3 ab. Den Würfel simuliert man durch

 int auge1 = (int)(Math.random()*6) + 1;

Math.random() ist eine vordefinierte Klassenmethode der Bibliothek Math, der man nichts über¬geben muss (deshalb () ) und die eine Kommazahl zwischen 0 und 1 (ohne die Grenzen) zurück¬liefert. Diese Kommazahl wird mit 6 multipliziert, damit hat man eine Kommazahl zwischen 0 und 6. Durch das Typwandeln mit (int) wird der Kommaanteil abgeschnitten und es entstehen daraus die Ganzzahlen 0, 1, 2, 3, 4, 5. Addiert man 1, hat man genau einen Würfel simuliert.

Das Programm wurde durch die Verwendung selbstgeschriebener Methoden strukturiert.

  // Definition des Feldes
  public long[] notenspiegel = new long[16] ;
  // Methode für Erzeugen einer Wuerfelzahl
  public int wuerfel()
  {
    int zufall = (int) (Math.random()*6) + 1 ;
    return zufall ;
  }
  // Methode 1 für das Erzeugen einer Zufallspunktzahl
  public int punktz1()
  {
    return wuerfel() + wuerfel() + wuerfel() - 3 ;
  }
  // Methode 2 für das Erzeugen einer Zufallspunktzahl
  public int punktz2()
  {
    return (int)(Math.random()*16) ;
  }
  // Methode alle Feldelemente auf 0 setzen
  public void feld0 ()
  {
    for (int i = 0 ; i <= 15 ; i++)
    {
      notenspiegel[i] = 0 ;
    }
  }
 
  // Methode für das Erzeugen des Ausfalls
  public void ausfall(long notzahl)
  {
    feld0() ;
    for (int i = 1 ; i <= notzahl ; i++)
    {
      int punkte = punktz1() ; 
        // Jetzt kommt die zentrale Zeile, die man wirklich verstanden 
  // haben muss!!
        // Die erzeugte Note gibt den Feldindex, d.h. die Hausnummer
        // an. Dann wird das entsprechende Feldelement um 1 erhöht. Am
        // Beispiel: Stand bisher als Anzahl der Schüler mit 5 Punkten,
        // d.h. in notenspiegel[5] eine 13 zu Buche und erscheint jetzt 
        // erneut die Note 5, dann muss notenspiegel[note], d.h. 
        // notenspiegel[5] um 1 auf 14 erhöht werden. Im Haus mit der 
        // Nummer 5 wohnt jetzt eine 14 anstelle einer 13.
      notenspiegel[punkte]++ ;
    }
  }
  // Methode für den Durchschnitt
  public double schnitt()
  {
    long anzahl = 0 ;
    long summe = 0 ;
    for (int i = 0 ; i <= 15 ; i++)
    {
      anzahl = anzahl + notenspiegel[i] ;
      summe = summe + i*notenspiegel[i] ;
    }
    return ((double)summe/anzahl) ;
  }
  // Methode für die Standardabweichung
  public double stabw()
  {
    long anzahl = 0 ;
    double summe = 0 ;
    double mw = schnitt() ;
    for (int i = 0 ; i <= 15 ; i++)
    {
      anzahl = anzahl + notenspiegel[i] ;
      summe = summe + (i-mw)*(i-mw)*notenspiegel[i] ;
    }
    return Math.sqrt(summe*1.0/anzahl) ;
  }
 
// Methode für die Notenspiegelausgabe
  public void notsp_aus()
  {
     jTextArea1.setText("") ;
     for (int i = 0 ; i <= 15 ; i++)
     {
       String ausgabe =
          String.valueOf(i)+"   "+String.valueOf(notenspiegel[i])+"\n";
       jTextArea1.append(ausgabe) ;
     }
  }
  public void jButton1_ActionPerformed(ActionEvent evt)
  {
    long anz = Long.parseLong(jTextField1.getText()) ;
    ausfall(anz) ;
    notsp_aus() ;
    jTextField2.setText(String.valueOf(schnitt())) ;
    jTextField3.setText(String.valueOf(stabw())) ;
  }

So sieht die grafische Oberfläche aus:

Aufgabe 1

Ändere das Notenspiegelprogramm so ab, dass die zufällige Note mit einer Funktion erzeugt wird und dass die zufällige Note einfach eine Zufallszahl zwischen 0 und 15 ist (nicht die Summe dreier Zufallszahlen). Erläutere, warum sich jetzt eine andere Verteilung ergibt. Überlege vorher, ob sich Mittelwert und Standardabweichung ändern. Lösungen

Aufgabe 2

  1. Gib die Definition für ein Feld an, das 30 große ganze Zahlen enthält.
  2. Wie lauten die Indizes(Hausnummern) der Feldelemente?
  3. Gib den Befehl an, der in das Feldelement mit Index 4 die Zahl 12345 einträgt.
  4. Gib die Befehlssequenz an, die alle Feldelemente auf 17 setzt.
  5. Gib die Befehlssequenz an, die alle Feldelemente auf den Bildschirm ausgibt.
  6. Gib die Befehlssequenz an, die alle Feldelemente mit vorangestelltem Index auf den Bildschirm ausgibt.
  7. Gib die Befehlssequenz an, die alle Feldelemente addiert und das Ergebnis in die Variable Summe speichert. Löse das Problem mit einer Methode Feldsum.
  8. Gib die Befehlssequenz an, die das 12. mit dem 24. Element tauscht (die Inhalte).Lösungen

Aufgabe 3

Erstelle ein Klasse, die als Attribut ein Feld besitzt, das 50 Wahrheitswerte enthält.

  • Welche Werte kann der Feldindex annehmen?
  • Wie lautet der Befehl, der dem Element mit Index 30 den Wert true zuweist.
  • Schreibe eine Methode, der jedem Feldelement den Wert false zuweist.
  • Schreibe eine Methode Zufall, die jedem Feldelement zufällig den Wert true oder false zuweist.
  • Schreibe eine Methode Ausgabe, die die 50 Wahrheitswerte zusammen mit dem Feldindex auf den Bildschirm schreibt.
  • Schreibe eine Methode Count, die zählt, wie oft im Feld der Wert true auftaucht und diesen Wert zurückgibt.
  • Schreibe ein Programm, das auf Knopfdruck das Feld Überlegeerzeugt und nacheinander die Methoden Zufall und
  • Ausgabe aufruft und dann die Anzahl der „trues“ im Feld auf den Bildschirm schreibt. Lösungen

Aufgabe 4

Erstelle ein Programm, das ein Feld mit 100 Double-Zahlen erzeugt, es zufällig mit Zahlen zwischen 0 und 10 füllt, das größte und das kleinste Element im Feld sucht und beide auf den Bildschirm ausgibt. Lösungen

  • /var/www/infowiki/data/pages/q1/java-felder.txt
  • Zuletzt geändert: 2017/07/11 07:06
  • von admin03