Benutzer:Ernst Schreier/testbereich: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
KKeine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
KKeine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 45: Zeile 45:
</source>
</source>


=== Endlosschleife ===
{{Übung|
# Analysieren Sie die Methode zaehleBisZahlundRufe (int zahl), indem Sie folgende Dinge zunächst durchdenken und dann testen:
#* Was passiert, wenn Sie beim Methodenaufruf 1 als zahl übergeben.
#* Was passiert, wenn Sie beim Methodenaufruf negative Zahlen eingeben.
#* Was verändert sich, wenn die Zeile mit x++ über der System.out Zeile steht?
#* Wie können Sie in Zweierschritten zählen?
#* Warum wird „Ich komme“ nur ein mal ausgegeben?
# Verändern Sie die Methode so, dass ein Coutntdown heruntergezählt wird.
# Lassen Sie neben zahl auch die Variable schwrittweite übergeben. Sie soll bestimmen, in wie großen Schritten heraufgezählt werden soll (z.B. Schrittwete 3 ergibt: 1, 4, 7, 10...
}}


Eine Schleife, die (eigentlich) niemals endet und dabei den Computer völlig auslastet ist eine typische Ursache für Abstürze.


Die folgende Methode ist eine Endlosschleife, die unendlich lange ausgeführt würde, wenn niemand die Ausführung stoppen würde. Typischer Fehler: Es wird x als Bedingung abgefragt: (x<100) , aber es wird x nicht innerhalb der Schleife verändert.
{{Fortsetzung|
vorher=Algorithmik<br>Turtle-Grafik|vorherlink=Java/Turtle-Grafik|
weiter=GUI|weiterlink=Java/GUI|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
 
Das folgende Beispiel eignet sich, um eine verschachtelte [[Java/Algorithmik#Bedingte Anweisung|if..else-Verzweigung]] einzuführen. <!---Die folgende Klasse ist das Endergebnis der beim Bild­schirmfilm vorgestellten Klasse, die die pq-Formel be­rechnet.--->  Neben  „if..else“  benötigen  Sie  Kenntnisse  im Umgang mit [[Java/Erste Schritte#Konsolenausgabe|System.out.println]] und der Klasse Math, die in Java standardmäßig vorhanden ist.
 
Die Klasse '''Math''' ist das Matheobjekt mit allen Operationen für einfache numerische Berech­nungen.(...) Der Ergebnistyp fast aller Operationen ist <code>double</code>.
 
* <code>sqrt</code>: Wurzelziehen
* <code>pow</code>: Potenzen
 
double x = Math.sqrt( 2 ); doulbe y = Math.pow( 2,10 );  // 2^10 = 1024
 


<source lang="java">
<source lang="java">
    public void führeEndlosschleifeAus(){
public class Formelberechner
      int x; // Eine Zählvariable x
{
       x=1;   // Anfangswert für x
public String berechnePQFormel(double pP, double pQ){
       while (x <= 100) {  
    double diskriminante;
          System.out.println (x);      // schreibe x auf die Konsole
    diskriminante = (pP/2) * (pP/2) - pQ;
          // Typischer Fehler: x wird in der Schleife nicht erhöht.                   
    if (diskriminante >= 0) {
       }  
       double x1,x2;
      x1 = -(pP/2) + Math.sqrt (diskriminante);
      x2 = -(pP/2) - Math.sqrt (diskriminante);
       if (x1==x2){
        return "Das Ergebnis ist L={"+x2+"}";  
       }
      else {
        return "Die Ergebnisse sind L={"+x1+";"+x2+"}";
       }
    }
    else {
      return "Keine Lösung, die Diskriminate ist "+diskriminante;
     }
     }
}
</source>
{{Box|Arbeitshinweise|
<!---Schauen Sie sich zunächst den Bildschirmfilm zu dieser Klasse an.--->Beschreiben Sie, weshalb bei <code>berechnePQFormel()</code> innerhalb des ersten if-Anweisungs­blocks noch ein zweiter, verschachtelter if-Block auftritt. Erläutern Sie dabei die Klammersetzung der geschweiften Klammern.
# <code>bestimmeBetrag()</code> gibt den Betrag einer Zahl zurück (eine negative Zahl wird zu einer positiven. Analysieren Sie die Funktionsweise dieser Methode.
# Vergleichen Sie die beiden Varianten der quadrieren-Methoden. Beide führen zu demselben Ergebnis. Welche würden Sie bevorzugen?
# Implementieren Sie eine Methode <code>zieheWurzel(double pZahl)</code>, die entweder die Wurzelvon <code>pZahl</code> zurückgibt oder -1, falls <code>pZahl</code> negativ ist.(Hinweis: -1 ist natürlich mathematisch nicht richtig, aber so müssen Sie die Zahl, die Sie zurückgeben, nicht in einen String umwandeln.)}}
{{Fortsetzung|
vorher=Algorithmik<br>Turtle-Grafik|vorherlink=Java/Turtle-Grafik|
weiter=GUI|weiterlink=Java/GUI|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
== verbesserte Version ==
Hallo zusammen,
ich habe selbst ein solches Beispiel gebraucht und das aktive etwas umgebaut (Trennung von Berechnung und Texterstellung, Verwendung von StringBuilder zur Erstellung der Ergebnistexte). Die verschachtelte if Bedingung ist nun in der Funktion ergebnisText(...). Sieht noch jemand einen Fehler?
Danke und Gruss
--[[Benutzer:Axel g|Axel Gruenhagen]] 10:55, 30. Aug. 2009 (UTC)
<source lang="java">
public class FormelberechnerNeu {
    public String berechnePQFormel(double pP, double pQ) {
        double pPhalbe = pP / 2;       
        double diskriminante = Math.pow(pPhalbe,2) - pQ;
        double x1 = 0;
        double x2 = 0;
        if (diskriminante >= 0) {
            double sqrtDiskriminante = Math.sqrt(diskriminante);
            x1 = -(pPhalbe) + sqrtDiskriminante;
            x2 = -(pPhalbe) - sqrtDiskriminante;
        }
        return ergebnisText(x1, x2, diskriminante);
    }
    private String ergebnisText(double x1, double x2, double diskriminante) {
        StringBuilder ergebnisText = new StringBuilder();
        if (diskriminante >= 0) {
            if (x1 == x2) {
                ergebnisText.append("Das Ergebnis ist L={");
                ergebnisText.append(x2);               
            } else {
                ergebnisText.append("Die Ergebnisse sind L={");
                ergebnisText.append(x1);
                ergebnisText.append(";");
                ergebnisText.append(x2);
            }
            ergebnisText.append("}");
        } else {
            ergebnisText.append("Keine Lösung, die Diskriminante ist ");
            ergebnisText.append(diskriminante);
           
        }
        return ergebnisText.toString();
    }
}
</source>
</source>
}}


Bevor Sie die Methode ausprobieren, lesen Sie zunächst, wie man in [[BlueJ]] Programmausführungen stoppt:


==== Notunterbrechungen bei BlueJ ====
== Siehe auch ==
* [[PQ-Formel]]
* Mathematischer Hintergrund: [[Quadratische Funktionen]]


Mit Strg+Umschalt+R setzen Sie die Virtuelle Maschine zurück, was eine Beendigung der aktuell ausgeührten Methode bewirkt. Sie können auch auf der rot-weißen Ausführungsnanzeige mit der rechten Maustaste das Kontextmenu hervorholen und die Ausführung damit stoppen.


{{Übung|
# Analysieren Sie die Methode zaehleBisZahlundRufe (int zahl), indem Sie folgende Dinge zunächst durchdenken und dann testen:
#* Was passiert, wenn Sie beim Methodenaufruf 1 als zahl übergeben.
#* Was passiert, wenn Sie beim Methodenaufruf negative Zahlen eingeben.
#* Was verändert sich, wenn die Zeile mit x++ über der System.out Zeile steht?
#* Wie können Sie in Zweierschritten zählen?
#* Warum wird „Ich komme“ nur ein mal ausgegeben?
# Verändern Sie die Methode so, dass ein Coutntdown heruntergezählt wird.
# Lassen Sie neben zahl auch die Variable schwrittweite übergeben. Sie soll bestimmen, in wie großen Schritten heraufgezählt werden soll (z.B. Schrittwete 3 ergibt: 1, 4, 7, 10...
}}


=== Übungen mit while und Zufallszahlen ===
[[Kategorie:Java]]
[[Kategorie:Quadratische Funktionen]]

Aktuelle Version vom 9. Januar 2020, 00:37 Uhr

gelöschte Kapitel

Versteckspiel

{{Idee| Mit Hilfe des folgenden Beispiels lässt sich die while-Schleife einführen. Besser ist allerdings, wenn man es mit einer for-Schleife realisiert. D.h. falls man es nutzt, sollte man dieses Beispiel vor der for-Schleife behandeln.

Versteckspiel
Als Suchender muss man zunächst bis 100 zählen, dann laut „Ich komme...“ rufen. Erst dann darf man zum Suchen aufbrechen.

Dieses simple Spiel ist ein einfacher Algorithmus:

VERSTECKSPIELZÄHLUNG
Die erste Zahl ist 1.
Prüfe, ob die 100 erreicht wurde
Wenn das noch nicht erfüllt ist, sage die Zahl und erhöhe die Zahl um eins.
Wenn doch, dann rufe „Ich komme“

Mit while (engl. solange) lassen sich Programmabläufe abhängig von einer Bedingung wiederholen. Die Bedingung wird vor Ausführung der Anweisung abgefragt ("prechecked loop", "kopfgesteuerte Schleife").

Solange <Bedingung erfüllt> führe <Anweisung> aus.
Java-Syntax
   while (Bedingung) 
   {
      Anweisungsblock (was soll wiederholt werden?)
   }

So sähe das Verstecken-Beispiel als Methode der Klasse Verstecken aus. Der Computer schreibt die Zahlen von 1 bis zahl in die Konsole.

Hinweis
Wenn die oberen Zahlen nicht mehr zu sehen sind, liegt das an der Konsole, die nur begrenzt viele Zeilen zulässt. Das Problem kann man umgehen, indem man statt println ein print einsetzt. Dann wird nicht bei jeder Zahl eine neue Zeile begonnen.
public class Verstecken
{
      public void zaehleBisZahlundRufe(int zahl)
      {
        int x;                            // Eine Zählvariable x
        x=1;                              // Anfangswert für x
        while (x <= zahl) {   
            System.out.println (x);       // schreibe x auf die Konsole
            x++;                          // erhöhe x um 1
        }
        System.out.println ("Ich komme...!"); 
      }
}

Übung
  1. Analysieren Sie die Methode zaehleBisZahlundRufe (int zahl), indem Sie folgende Dinge zunächst durchdenken und dann testen:
    • Was passiert, wenn Sie beim Methodenaufruf 1 als zahl übergeben.
    • Was passiert, wenn Sie beim Methodenaufruf negative Zahlen eingeben.
    • Was verändert sich, wenn die Zeile mit x++ über der System.out Zeile steht?
    • Wie können Sie in Zweierschritten zählen?
    • Warum wird „Ich komme“ nur ein mal ausgegeben?
  2. Verändern Sie die Methode so, dass ein Coutntdown heruntergezählt wird.
  3. Lassen Sie neben zahl auch die Variable schwrittweite übergeben. Sie soll bestimmen, in wie großen Schritten heraufgezählt werden soll (z.B. Schrittwete 3 ergibt: 1, 4, 7, 10...



Das folgende Beispiel eignet sich, um eine verschachtelte if..else-Verzweigung einzuführen. Neben „if..else“ benötigen Sie Kenntnisse im Umgang mit System.out.println und der Klasse Math, die in Java standardmäßig vorhanden ist.

Die Klasse Math ist das Matheobjekt mit allen Operationen für einfache numerische Berech­nungen.(...) Der Ergebnistyp fast aller Operationen ist double.

  • sqrt: Wurzelziehen
  • pow: Potenzen
double x = Math.sqrt( 2 ); doulbe y = Math.pow( 2,10 );  // 2^10 = 1024


public class Formelberechner
{
public String berechnePQFormel(double pP, double pQ){
    double diskriminante;
    diskriminante = (pP/2) * (pP/2) - pQ;
    if (diskriminante >= 0) {
      double x1,x2;
      x1 = -(pP/2) + Math.sqrt (diskriminante);
      x2 = -(pP/2) - Math.sqrt (diskriminante);
      if (x1==x2){
        return "Das Ergebnis ist L={"+x2+"}";    
      }
      else {
        return "Die Ergebnisse sind L={"+x1+";"+x2+"}";
      }
    }
    else {
      return "Keine Lösung, die Diskriminate ist "+diskriminante;
    }
}

Arbeitshinweise

Beschreiben Sie, weshalb bei berechnePQFormel() innerhalb des ersten if-Anweisungs­blocks noch ein zweiter, verschachtelter if-Block auftritt. Erläutern Sie dabei die Klammersetzung der geschweiften Klammern.

  1. bestimmeBetrag() gibt den Betrag einer Zahl zurück (eine negative Zahl wird zu einer positiven. Analysieren Sie die Funktionsweise dieser Methode.
  2. Vergleichen Sie die beiden Varianten der quadrieren-Methoden. Beide führen zu demselben Ergebnis. Welche würden Sie bevorzugen?
  3. Implementieren Sie eine Methode zieheWurzel(double pZahl), die entweder die Wurzelvon pZahl zurückgibt oder -1, falls pZahl negativ ist.(Hinweis: -1 ist natürlich mathematisch nicht richtig, aber so müssen Sie die Zahl, die Sie zurückgeben, nicht in einen String umwandeln.)


verbesserte Version

Hallo zusammen,

ich habe selbst ein solches Beispiel gebraucht und das aktive etwas umgebaut (Trennung von Berechnung und Texterstellung, Verwendung von StringBuilder zur Erstellung der Ergebnistexte). Die verschachtelte if Bedingung ist nun in der Funktion ergebnisText(...). Sieht noch jemand einen Fehler? Danke und Gruss --Axel Gruenhagen 10:55, 30. Aug. 2009 (UTC)

public class FormelberechnerNeu {

    public String berechnePQFormel(double pP, double pQ) {
        double pPhalbe = pP / 2;        
        double diskriminante = Math.pow(pPhalbe,2) - pQ;
        double x1 = 0;
        double x2 = 0;
        if (diskriminante >= 0) {
            double sqrtDiskriminante = Math.sqrt(diskriminante);
            x1 = -(pPhalbe) + sqrtDiskriminante;
            x2 = -(pPhalbe) - sqrtDiskriminante;
        }
        return ergebnisText(x1, x2, diskriminante);
    }

    private String ergebnisText(double x1, double x2, double diskriminante) {
        StringBuilder ergebnisText = new StringBuilder();

        if (diskriminante >= 0) {
            if (x1 == x2) {
                ergebnisText.append("Das Ergebnis ist L={");
                ergebnisText.append(x2);                

            } else {
                ergebnisText.append("Die Ergebnisse sind L={");
                ergebnisText.append(x1);
                ergebnisText.append(";");
                ergebnisText.append(x2);
            }
            ergebnisText.append("}");
        } else {
            ergebnisText.append("Keine Lösung, die Diskriminante ist ");
            ergebnisText.append(diskriminante);
            
        }
        return ergebnisText.toString();
    }
}


Siehe auch