1. Eine Entwicklungsumgebung. Dazu gibt es folgende Varianten:
ihr habt Java Editor zu Hause installiert – bestens!
ihr wollt ihn installieren – auch gut: http://javaeditor.org/doku.php?id=de:java-editor bzw. http://javaeditor.org/doku.php?id=en:download , er lässt sich auch auf dem USB-Stick installieren
ihr nutzt einen Online-Editor – z. B. https://www.jdoodle.com/online-java-compiler/
Da besteht das Problem, dass nur reines Java ohne die GUI-Bibliotheken wie SWING zur Verfügung steht. Aber für unsere Übungen reicht es und die Website ist gut gemacht.
Natürlich bietet sich es an, hier noch einmal die wichtigsten Programmstrukturen zu üben. Deshalb lautet die erste Aufgabe auch: java-tutorial (http://www.gailer-net.de/tutorials/java/index.html ).
Dort arbeitet ihr euch durch die folgenden Lektionen
bearbeitet zuerst Kapitel 10, denn die Ein- und Ausgabe erfolgt nicht in Boxen, sondern muss bei den Beispielen an der Kommandozeile erfolgen.
Beispiel für jdoodle:
Bearbeitet die Lektionen 14 bis 19, da habt ihr gut zu tun, wenigstens aber 15 bis 17. Wer Zeit hat kann auch noch die 20 machen. Probiert die Programmbeispiele aus (siehe 1.)
Kopiert also den Programmtext aus den Java-Notes in euren Editor (Offline oder Online) und testet die Programme. Macht auch die Übungen und das Quiz.
Dass der inhaltliche Sprung von Aufgabe 1 zu Aufgabe 2 etwas groß ist, hängt mit dem Wechsel zwischen Präsenz- und Online-Unterricht zusammen. Ich will aber hier weitermachen, da die Bearbeitung unter Google Sites wirklich einfach ist.
Bisher haben wir die Kontrollstrukturen linear (Sequenz), verzweigt (Alternative) und wiederholend (Zyklus) kennengelernt. Dabei haben wir die while-Schleife praktisch erarbeitet. Eine weitere Schleifenform ist die FOR Schleife oder der FOR-Zyklus. Diese Form wird in den meisten Fällen als Zählschleife bezeichnet. Bei Java Notes ist das etwas anders, deshalb werden wir diese Schleife unabhängig davon erarbeiten.
Bei der while-Schleife war es so, dass die Abbruchbedingung sowohl am Eingang als auch am Ausgang des Schleifen Körpers stehen konnte. Es konnte also auch passieren, dass eine Abbruchbedingung nicht erfüllt wird und die Schleife somit zu einer Endlosschleife wird. Dies kann bei einer for-Schleife normalerweise nicht passieren. Hier wird von Anfang an festgelegt, wie viele Durchläufe erfolgen sollen. Ein typisches Beispiel wäre ein Schritt einer Spielfigur in einem Computerspiel. Für eine fließende Bewegung muss dieser Schritt in viele kleine Abschnitte unterteilt werden, für jeden Schritt muss sich dies wiederholen.
Wir beginnen mit einem einfachen Beispiel. Eine Folge von Zahlen, deren Ausgangs und Endwert bekannt sind, soll quadriert und ausgegeben werden.
mit jdoodle
mit Javaeditor
Beim Struktogramm ist der Schleifenkörper eingerückt zu zeichnen. Eine andere Art der Darstellung lässt unterhalb noch eine Zeile frei.
Fakultät:
Es gilt N! = N * (N-1) * (N-2) * ... * 3 * 2 * 1, also das Produkt aller ganzzahligen Werte innerhalb eines Intervalls von 1 bis N. Schreibe ein Programm dass dies erledigt und ausgibt.
Zufälle
Ein Programm soll eine vorgegebene Anzahl Zufallswerte eines Wertebereichs erzeugen. Weiterhin ist ein Vergleichswert aus dem Wertebereich einzugeben. Nach Ablauf der Werterzeugung soll ausgegeben werden, wie oft der Vergleichswert vorkommt.
Wortumkehr
Eine einzugebende Zeichenkette soll umgekehrt ausgegeben werden. Es könnte auch geprüft werden, ob es sich um ein Palindrom handelt...
Fakultät
Wortumkehr
Aufgabe 1 - Fakultät
Aufgabe 2 - Wertesuche - zum Kopieren
import java.util.Scanner;
public class zufall_1 {
public static void main(String args[]) {
String eingabe;
int aw; int ew; int az; int suchwert; int zw; int i; int zaehler;
Scanner scan = new Scanner(System.in);
//*****Eingabe*****
//die Strings des Scanners müssen in int-Werte umgewandelt werden
System.out.print ("Gib die Anzahl der Zufallswerte ein: ");
az = Integer.valueOf(scan.nextLine());
System.out.println ("Lege das Intervall fest, aus dem die Zufallswerte kommen sollen. ");
System.out.print ("Gib einen Anfangswert ein: ");
eingabe = scan.nextLine(); //Eingabe per schanner
aw = Integer.valueOf(eingabe); //Umwandlung
System.out.print ("Gib einen Endwert ein: ");
ew = Integer.valueOf(scan.nextLine()); //Beides in einer Anweisung
System.out.print ("Gib nun den zu suchenden Wert ein: ");
suchwert = Integer.valueOf(scan.nextLine()); //Beides in einer Anweisung
System.out.println("Es sollen "+az+" Zufallszahlen im Bereich zwischen "+aw+" und "+ew+" erzeugt werden.");
System.out.println("Danach soll ermittelt werden, wie oft der Suchwert "+suchwert+" vorkommt.");
System.out.println("********************************************************************");
//*****Verarbeitung*******
zaehler = 0;
for(i=1; i<=az; i++) //Abbruchbedingung
//Schleifenkörper
{
zw = (int)(Math.random() * (ew-aw)) + 1 + aw;
if(zw == suchwert){
zaehler++;
}
//*****Ausgabe****
System.out.println(i+". Zufallswert = "+zw);
}
System.out .println("Der Suchwert "+suchwert+" wurde "+zaehler+" mal gefunden.");
}
}
Aufgabe 2 - mit farbiger Darstellung
Aufgabe 3 - Wortumkehr & Palindrom
Bei einer Verkehrszählung werden LKW, PKW, motorisierte Zweiräder und Fahrräder gezählt. Das geschieht so lange, bis eine Art von Fahrzeugen eine vorzugebende Anzahl erreicht.
Das Beispiel ist zugegeben nicht ganz praxisnah, da müsste dann ja noch ein Zeitintervall eingebaut werden. Wer will kann die Sache ja noch ausfeilen. Ich stelle hier nur die Minimalvariante vor.
Ihr braucht dazu eine Schleife, in der durch eine Verzweigung die die Fahrzeuge je nach Art gezählt werden. Die Schleife bricht nach der maximalen Anzahl der Fahrzeuge ab. Danach wird das Endergebnis ausgegeben.
Ich habe ein Struktogramm vorgeschlagen...
2. Getränkeautomat (freiwillig)
In der Schule wurde ein Getränkeautomat aufgestellt, der in genau 8 s ein Getränk ausgeben kann. Allerdings dauert es immer 5-25 s, bis ein Schüler ein Geld eingeworfen hat und sich für eine Sorte entschieden hat.
Ein Algorithmus soll durch Simulation mit einer Schleife berechnen, wie lange die Warteschlange vor dem Automaten wird, wenn in einer großen Pause (15 min) pro Minute 7-12 Schüler zum Automaten kommen.
Das hat mich auch ganz schön Zeit gekostet, besonders die Problemanalyse.
Üblicherweise wird ein Programm in kleinere Bausteine zerlegt, die idealerweise als eigene Klassen erstellt und dann als neue Objekte nur in eigene Projekte eingebaut werden müssen. Diese Klassen enthalten dann natürlich auch Methoden, mit denen Daten bearbeitet werden.
Dazu gliedert man Aufgaben in Methoden aus, denen bei Bedarf Werte zur Bearbeitung als sogenannte aktuelle Parameter übergeben werden.
Man unterscheidet zwei Arten von Methoden:
Bei der ersten Variante (Prozedur) wird beim Aufruf nur eine Folge von Befehlen ausgeführt. In Java tragen solche Methoden im Kopf das Schlüsselwort "void" (leer).
Bei der zweiten Variante (Funktion) verkörpert die Methode selbst einen Wert eines Datentyps. Dieser Funktionswert kann dann weiter verwendet werden. Innerhalb der Methode wird dem zurück zu gebenden Wert das Schlüsselwort return voran gestellt.
Das folgende Beispiel hat das Ziel, aus einer einzugebenden Zeichenkette ein bestimmtes Zeichen zu entfernen und das Ergebnis auszugeben.
Schreibe in die Klasse "buchstabensuche3" eine neue Methode "ersetze()", die den eingegebenen Buchstaben durch ein "*" ersetzt.
Hier ist die Klasse zum Download:
import java.util.Scanner;
public class buchstabensuche3 {
// Anfang Methoden
public static void main(String[] args) {
String et=""; //Eingabetext
String zei="";
char suchz; //Suchzeichen
Scanner scan = new Scanner(System.in);
System.out.print("Gib eine Zeichenkette ein: ");
et = scan.nextLine().toUpperCase();
System.out.print("Welches Zeichen soll aussortiert werden: ");
zei = scan.nextLine().toUpperCase();
suchz = zei.charAt(0);//returns 0tes char in zei
//Aufruf der Methode (Funktion) "entferne" mit dem
//aktuellen Parameter suchz und et
//der Funktionswert kann direkt ausgegeben werden
System.out.println(entferne(suchz,et));
} // end of main
//hier die Methode "entferne" als Funktion vom Typ
//String mit den aktuellen Parametern buchstabe und zeichenkette
public static String entferne(char buchstabe, String zeichenkette) {
//lokale Variable, gelten in der Methode
int i=0;
String at="";
int laenge = zeichenkette.length();
char z;
for (i=0; i<=laenge-1 ;i++ ) {
//z ist das i-1 te Zeichen von et
z = zeichenkette.charAt(i);
if (z!=buchstabe) {
at = at + z;
} // end of if
}
return ("Ausgabe ohne "+buchstabe+": "+at);
}
} // end of class buchstabensuche3
Zur Übung von Methoden und Funktionen sollt ihr die folgende Klasse 5_1_groesste() vervollständigen:
Man gibt 3 Zahlen ein. Über eine Methode soll die größte ermittelt und dann ausgegeben werden.
Die Methode groesste_f() (Zeile 18) ist eine Funktion. Ihr Wert vom Typ integer wird mit System.out.println() ausgegeben.
Die Methode groesste_p() (Zeile 20) ist einfach eine Reihe von Anweisungen ohne eigenen Funktionswert. Sie erzeugt die Ausgabe innerhalb der Methode.
Beiden Methoden werden die aktuellen Parameter z1, z2 und z3 übergeben.
Schreibe die Methoden groesste_f() und groesste_p().
Schreibe eine Programm (Klasse), dass nach Eingabe von 2 Zeichenketten (Wörtern) diese so ausgibt, dass sie gemixt werden, also der erste Buchstabe des ersten Wortes, dann der erste Buchst. des zweiten Wortes, der zweite Buchst. des ersten Wortes, dann der zweite des zweiten Wortes usw. Die 2 Worte sollen als Parameter übergeben werden, du kannst eine Prozedur oder eine Funktion schreiben.
Struktogramm Wortmixer
Lösung Wortmixer
Erstelle ein Programm, bei dem die 4 Grundrechenarten (+ - * /) für zwei Zahlen als Funktion programmiert werden.
Beispiel:
Eingabe von 2 Zahlen
Starten
Ausgabe der Ergebnisse der 4 Grundrechenarten als Funktionswerte von 4 Funktionen
// Lösung von Hannes Berg
import java.util.Scanner;
public class MyClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println ("Gib 2 Zahlen ein: ");
System.out.print ("Zahl 1: ");
double eingabe1 = Double.valueOf(scan.nextLine());
System.out.print ("Zahl 2: ");
double eingabe2 = Double.valueOf(scan.nextLine());
System.out.println("Du hast "+eingabe1+" und "+eingabe2+" eingegeben.\n");
//Ausgabe
System.out.println("Addieren: "+Addition(eingabe1, eingabe2));
System.out.println("Subtrahieren: "+Subtraktion(eingabe1, eingabe2));
System.out.println("Multiplizieren: "+Multiplikation(eingabe1, eingabe2));
System.out.println("Dividieren: "+Division(eingabe1, eingabe2));
} //end of main
public static double Addition(double eingabe1, double eingabe2){
double Addition = eingabe1 + eingabe2;
return Addition;
}
public static double Subtraktion(double eingabe1, double eingabe2){
double Subtraktion = eingabe1 - eingabe2;
return Subtraktion;
}
public static double Multiplikation(double eingabe1, double eingabe2){
double Multiplikation = eingabe1 * eingabe2;
return Multiplikation;
}
public static double Division(double eingabe1, double eingabe2){
double Division = eingabe1 / eingabe2;
return Division;
}
} // end of class MyClass
Nutzt die Quellen auf der Startseite von Info 11.
Ihr solltet die Ein- oder Ausgabe in der Konsole können (siehe Aufgabe 1 Nr.1 und Kapitel 10).
Ihr solltet alle Kontrollstrukturen (Sequenz (Linear), Alternative (Verzweigung) und Zyklus (Schleife) mit ihren Unterformen kennen. Dazu kann man auch noch einmal ein paar Videos in diesem Tutorial ansehen: https://panjutorials.de/tutorials/java-tutorial-programmieren-lernen-fuer-anfaenger/
Ihr habt hoffentlich auch die Zufallswerte angesehen (Kapitel 20)
Wiederholt das also wenn erforderlich!
Aufbau und Funktion der strukturierten Datentypen Array und ArrayList.
Anwendungen dieser Datentypen für Zahlen und Zeichenketten (String).
Es geht um strukturierte Datentypen. Die bisher verwendeten Datentypen sind primitiv, d. h. sie können nur einen Wert eines speziellen Datentyps speichern. Eine Ausnahme ist String, dieser Datentyp ist bereits ein strukturierter und enthält mehrere Elemente vom Typ char, also einzelne Zeichen.
Wenn ich also zum Beispiel 1000 Zahlen irgendwo speichern will, dann brauchte ich dafür 1000 Variablen vom Typ integer, für eine Liste von 30 Namen müsste ich das mit 30 Variablen vom Typ String tun. Das ist praktisch sinnlos.
Damit man mehrere Daten eines Datentyps gemeinsam speichern und verwalten kann, gibt es eine Reihe strukturierte Datentypen. Wir werden speziell Array und ArrayList besprechen. Diese erlauben es über einen Index, auf die Elemente von Array oder ArrayList zuzugreifen.
Arrays sind statisch, sie haben eine feste Anzahl von Elementen. Diese Anzahl wird durch den Index angegeben, der bei 0 beginnt. Der Index darf zur Laufzeit nicht überschritten werden.
Das Beispiel zeigt in Zeile 6 die Deklaration eines array für 5 String-Elemente. Durch den Index ist es einfach, arrays mit Schleifen zu bearbeiten.
In Zeile 34 bis 38 erfolgt die Ausgabe durch eine For-Each-Schleife. Diese führt den Schleifenkörper solange aus, bis keine Elemente mehr da sind, also quasi für alle Elemente. Es geht natürlich auch mit einer Schleife wie in Zeile 22 bis 25, da werden die Elemente eingetragen.
Erstelle mit Javaeditor oder joodle.com dieses Beispielprogramm. Teste und speichere es.
Ändere es so, dass nur 3 Elemente verarbeitet werden.
import java.util.Scanner; //Input-Tastatur-Scanner importieren
public class aufg_array1 {
public static void main(String args[]) {
//ein Array für 5 Worte wird angelegt - Deklaration
String worte[] = new String[5];
Scanner scan = new Scanner( System.in );
new aufg_array1(); //legt eine Instanz der Klasse an
System.out.println("Gib ein Wort ein:");
String wort = scan.nextLine();
System.out.println("Gib den Index (0...4) an:");
int index = Integer.valueOf(scan.nextLine());
//jetzt soll das wort an die index-Position geschrieben werden
worte[index] = wort;
//jetzt soll das Wort noch einmal angezeigt werden
System.out.println("Das Wort an der Position "+index+" heißt "+worte[index]+".");
} //end of main
}//end of class
Erstelle eine Klasse aufg_array2, mit einem array "zahlen[]", das 100 Elemente des Typs Integer aufnehmen kann.
Programmiere in dieser Klasse eine Methode "fuellen()", bei der das array zahlen mit 100 zufälligen Zahlen zwischen 1 und 99 gefüllt wird.
Programmiere in dieser Klasse eine Methode "ausgeben", bei der die 100 Elemente angezeigt werden.
Zusatz: Programmiere eine Methode "sortieren", die die 100 Zufallszahlen sortiert. Danach sollen sie ausgegeben werden. Das geht eigentlich ganz einfach, sucht im Internet mal nach den Begriffen Java array sortieren.