11.07.2015 Aufrufe

10 Algorithmen am Beispiel Java I - Walterkirchgessner.de

10 Algorithmen am Beispiel Java I - Walterkirchgessner.de

10 Algorithmen am Beispiel Java I - Walterkirchgessner.de

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Algorithmen</strong> <strong>am</strong> <strong>Beispiel</strong> „<strong>Java</strong>“ Iwww.java.com/<strong>de</strong>Entwicklungsumgebung:JDK 6.1.0empfohlener Editor :http://notepad-plus.sourceforge.net/<strong>de</strong>/site.htmDownload <strong>Java</strong> SE Runtime Environment (<strong>de</strong>utsch):http://www.soft-ware.net/add.asp?url=http%3A%2F%2Fjava-runtime-environment.software.net%2Fdownload2.asp%3Fco<strong>de</strong>%3Djbibb%26pro%3Dp022311. Sprachmerkmale<strong>am</strong> <strong>Beispiel</strong> <strong>de</strong>s Collatz-Algorithmusumgangssprachlich: Falls x gera<strong>de</strong> teile durch 2, sonst verdreifache x und erhöhe um 1Progr<strong>am</strong>m mit <strong>Java</strong> als Formalismus, um präzise einen Algorithmus zu formulieren:/***************************** Collatz.java *******************************************/import AlgoTools.IO;// Klasse Algotools soll benutzt wer<strong>de</strong>n/** Berechnet Collatz-Funktion, d.h.* Anzahl <strong>de</strong>r Iterationen <strong>de</strong>r Funktion g: N -> N* bis die Eingabe auf 1 transformiert ist* mit g(x) = x/2 falls x gera<strong>de</strong>, 3*x+1 sonst*/public class Collatz{public static void main(String [] argv){int x, z;x = IO.readInt("Bitte eine Zahl: ");z = 0; // setze z auf 0while (x != 1)// 2 Variablen mit int (Ganzzahl) vereinbaren// lies einen Wert ein [Klasse IO, Metho<strong>de</strong> readlnt]// solange x ungleich 1 ist{if (x % 2 == 0) // falls x gera<strong>de</strong> istx = x / 2;// halbiere xelse// an<strong>de</strong>rnfallsx = 3 * x + 1; // verdreifache x und add. 1z = z+1;// erhöhe z um eins}IO.println("Anzahl <strong>de</strong>r Iterationen: " + z); // gib z aus [Klasse: IO, Metho<strong>de</strong>: printl]}}Alternative Schreibweisex = x % 2 == 0 ? x/2 : 3*x + 1; // bedingter Ausdruck mit ? und : (entwe<strong>de</strong>r-o<strong>de</strong>r)// wenn Bedingung vor ? wahr, dann weise <strong>de</strong>r linken// Seite <strong>de</strong>n Ausdruck vor : zu, sonst <strong>de</strong>n hinter ’:’© Dr. Walter Kirchgessner 2008 1


ZeichenWhilesolangeIfwennElsesonst% [Modulo-Operator: Rest, <strong>de</strong>r bei ganzzahliger Division entsteht]== Gleichheit [mathematische I<strong>de</strong>ntität]= Zuweisung [keine mathematische Gleichheit]!= ungleich( ) steht für Bedingungen [was in <strong>de</strong>n Kl<strong>am</strong>mern steht, soll geprüft wer<strong>de</strong>n]; schließt Befehl abprintlnsorgt dafür, dass etwas in neuer Zeile ausgegeben wirdprintsorgt dafür, dass etwas innerhalb einer Zeile erscheint{ } fasst mehrere Anweisungen zus<strong>am</strong>men+ kann arithmetisch gelten, aber auch als string-Verknüpfung<strong>Java</strong> objektorientierte Progr<strong>am</strong>miersprache: Wir können mit <strong>Java</strong> Objekte erzeugen, an <strong>de</strong>nen „Metho<strong>de</strong>n“dranhängen (an<strong>de</strong>re Progr<strong>am</strong>miersprachen: „Prozedur“).Def. Metho<strong>de</strong>: Ans<strong>am</strong>mlung von Befehlen, <strong>de</strong>nen man einen N<strong>am</strong>en (z.B. „main“ = Hauptmetho<strong>de</strong>)gibt, unter <strong>de</strong>m man dann die Folge <strong>de</strong>r Anweisungen abarbeiten kann.D<strong>am</strong>it <strong>de</strong>r Compiler alles versteht, müssen in <strong>Java</strong> alle Metho<strong>de</strong>n in eine Klasse gepackt wer<strong>de</strong>n:z.B. public class Collatzpublic static void main (String [] argv)öffentlich statische Metho<strong>de</strong> liefert keinen Wert zurück Metho<strong>de</strong>, Zeichen arrayhängt nichtdie beginntan einem ObjektKommentararten// Dies sind die Vorzeichen für einen Kommentar/* Das sind Kl<strong>am</strong>merzeichen für einen Kommentar *///* Gibt an, was eine Klasse tut /Ausführung1. Quelltext im Editor speichern:Datein<strong>am</strong>e muss immer heißen wie die Klasse heißt, und zwar mit Anhang „*.java“!2. „<strong>Java</strong>c“ aufrufen, Quelldatei „Collatz.java“ kompilieren (Byteco<strong>de</strong> „Collatz.class“ wird angelegt)3. „<strong>Java</strong> Collatz“ ausführen.Zus<strong>am</strong>menfassung<strong>Java</strong> ist objektorientiert (s. auch Skript „<strong>Java</strong>“ II: S. 1 ff.), das heißt:Die Mo<strong>de</strong>llierung <strong>de</strong>r Realwelt erfolgt durch Objekte, zus<strong>am</strong>mengefasst in Klassen.Zu einer Klasse und ihren Objekten gehören Datenfel<strong>de</strong>r mit entsprechen<strong>de</strong>n Daten.Auf ihnen operieren Metho<strong>de</strong>n, das sind Anweisungsfolgen, die ihren Zustand zu manipulieren.Der Collatz-Algorithmus als <strong>Java</strong>-Progr<strong>am</strong>m besteht aus <strong>de</strong>r Definition <strong>de</strong>r Klasse Collatz mit <strong>de</strong>r Metho<strong>de</strong>main.© Dr. Walter Kirchgessner 2008 2


Nach Übersetzung <strong>de</strong>s Progr<strong>am</strong>ms in <strong>de</strong>n maschinenunabhängigen Byteco<strong>de</strong> wird die Metho<strong>de</strong> maingestartet, sobald die sie umschließen<strong>de</strong> Klasse gela<strong>de</strong>n wur<strong>de</strong>. Der Quelltext besteht aus durch Wortzwischenräume(Leerzeichen, Tabulatoren, Zeilen- und Seitenvorschubzeichen) getrennten Token.Zur Verbesserung <strong>de</strong>r Lesbarkeit wer<strong>de</strong>n Kommentare eingestreut. Der Dokumentationsgenerator ordnet<strong>de</strong>n durch /** . . . */ gekl<strong>am</strong>merten Vorspann <strong>de</strong>r nachfolgen<strong>de</strong>n Klasse zu. Die von <strong>de</strong>n Schlüsselwörternverschie<strong>de</strong>n gewählten Bezeichner beginnen mit einem Buchstaben, Unterstrich ( ) o<strong>de</strong>r Dollarzeichen($). Darüber hinaus dürfen im weiteren Verlauf <strong>de</strong>s Bezeichners auch Ziffern verwen<strong>de</strong>t wer<strong>de</strong>n.Zur Vereinfachung <strong>de</strong>r Ein-/Ausgabe verwen<strong>de</strong>n wir die benutzer<strong>de</strong>finierte Klasse AlgoTools.IO mit <strong>de</strong>nbei<strong>de</strong>n Metho<strong>de</strong>n readInt und println.Realwelt x Klassen y Datenfel<strong>de</strong>r z Metho<strong>de</strong>n2. VariablenDatentypen für Variablen (s. S. 9)z.B.: int x, y, z drei Variablen anlegen mit Datentyp „integer“Variablen sind benannte Speicherstellen, <strong>de</strong>ren Inhalte gemäß ihrer vereinbarten Typen interpretiertwer<strong>de</strong>n. <strong>Java</strong> unterstützt folgen<strong>de</strong> “eingebaute” Datentypen (genannt einfache Datentypen):• boolean entwe<strong>de</strong>r true o<strong>de</strong>r false 8 Bit• char 16 Bit Unico<strong>de</strong> 16 Bit• byte vorzeichenbehaftete ganze Zahl 8 Bit• short vorzeichenbehaftete ganze Zahl 16 Bit• int vorzeichenbehaftete ganze Zahl 32 Bit• long vorzeichenbehaftete ganze Zahl 64 Bit• float Gleitkommazahl 32 Bit• double Gleitkommazahl 64 BitZum Begriff „Gleitkommazahlen“: Ein Computer kann nicht problemlos eine unendliche Zahl anzeigen,bzw. berechnen. Das wür<strong>de</strong> ja be<strong>de</strong>uten, dass er unendlich lang diese Zahl ausdrucken müsste o<strong>de</strong>r er© Dr. Walter Kirchgessner 2008 3


Boole’scher Ausdruck mit Modulo (s.o.)(mod gibt <strong>de</strong>n Rest aus <strong>de</strong>r Division zweier ganzer Zahlen an, z.B. 7 mod 2 = 1)Ermittlung gera<strong>de</strong>r Zahlen in <strong>Java</strong>-Syntax: wenn kein Rest (R = 0) bleibt, dann ist x gera<strong>de</strong>{IF x % 2 == 0 // if ( (x mod 2) == 0), dann ist x gera<strong>de</strong>…}// Falls x gera<strong>de</strong>, dann …Wenn es wahr ist, dass x % 2 == 0, dann folgt für <strong>de</strong>n Ausdruck <strong>de</strong>r Wahrheitswert 1 ( „true“)Bedingte Anweisung (<strong>Beispiel</strong> mit Boole’schen Operatoren)/***************************** Bedingung.java **************************************/public class Bedingung{public static void main (String [] argv){int x = -5, m;/* <strong>de</strong>finiere zwei Integer-Variablen, davon xals -5 initialisiert */if (x < 0) x = -x;/* prüft eingetipptes x auf Vorzeichen:wenn x = 0 o<strong>de</strong>r positiv keine Verän<strong>de</strong>rungwenn x = negativ, dann multipliziere x mit -1 */m = IO.readInt("Bitte Monatszahl: ");// Eingabeauffor<strong>de</strong>rungif ((3


Fallunterscheidung 2 (switch/case-Anweisung)/**************************** Fall2.java *************************************/import AlgoTools.IO;public class Fall2{public static void main (String [] argv){int m = IO.readInt(“Bitte einen Monatsn<strong>am</strong>en „);IO.print(“Es han<strong>de</strong>lt sich um „);// „print“ für direkte AnzeigeSwitch m// „Println“ für neue Zeile( // ‚switch“ für Verzweigungcase 3:case 4: case 5: IO.println(“Frühling”); break;case 6:case 7: case 8: IO.println(“Sommer”); break;case 9:case <strong>10</strong>: case 11: IO.println(“Herbst”); break;case 12:case 1: case 2: IO.println(“Winter”); break;<strong>de</strong>fault: IO.println(“unbekannte Jahreszeit”); // Ausnahme}}}Schleife 1 (while-Schleife, do-while-Schleife, break, continue, for-Schleife)/*************************** Schleife.java *****************************************/import AlgoTools.IO;*/public class Schleife{public static void main (String [] argv){int i, x=<strong>10</strong>, y=2, summe;// 4 Integer-Variablenwhile (x > 0) { // solange x groesser als 0x--;// erniedrige x um einsy = y + 2;// erhöhe y um zwei}do {x++;// erhöhe x um einsy += 2; // erhöhe y um 2}while (x < <strong>10</strong>); // solange x kleiner als <strong>10</strong>while (true) {// auf immer und ewigx /= 2; // teile x durch 2if (x == 1) break;// falls x=1 verlasse Schleifeif (x % 2 == 0) continue;// falls x gera<strong>de</strong> starte Schleifex = 3*x + 1; // verdreifache x und erhoehe um 1}IO.println("Bitte Zahlen eingeben. 0 als Abbruch");summe = 0;// initialisiere summex = IO.readInt();// lies x einwhile (x != 0) {// solange x ungleich 0 istsumme += x;// erhöhe summex = IO.readInt();// lies x ein}IO.println("Die Summe lautet " + summe);do {x=IO.readInt("Bitte 1


Schleife 2 (Berechnung <strong>de</strong>r Fakultät mit for-, while- und do-while-Schleifen)/*************************** Fakultaet.java ****************************************/import AlgoTools.IO;public class Fakultaet{public static void main (String [] argv){int i, n, fakultaet;n = IO.readInt("Bitte Zahl: ");fakultaet = 1;for (i = 1; i


4. Datentypen (s.S. 3)Mit <strong>de</strong>m Deklarieren weist man einer Variable einen Datentyp zu, legt aber auch fest: Operationen z.B. Addition, Multiplikation usw. Wertebereich z.B. ganze Zahlen bei Integer Konstantenbezeichner Wertzuweisung, z.B. x = 42; x = -42; x = 0x2A [ 42 als Hex-Wert] Kodierung Kodierung durch Bit-Sequenzen im BinärsystemDatentypz.B.LängeWertebereich: ganze Zahlen darstellbar aufgrund von 8, 16, 32, 64 Bitbyte 8 Bit -128 …… 127short 16 Bit -32768 …….32767int 32 Bit -2147483648 ……2147483647long 64 Bit -9223372036854775808…...9223372036854775807„digits“ (d i ): dn -1 dn -2 ….. d 2 , d 1 , d 0 ( Sequenz von Nullen und Einsen)Zeichen: ….. 1 1 1Wert: ..… 4 2 1 ( gewichtet nach Position <strong>de</strong>r jeweiligen 2er-Potenz)a) Duale Kodierung natürlicher Zahlen (positiv, neutral):Binärwert Dezimalwert (x = z.B. 1<strong>10</strong>1 [2] = 13 [<strong>10</strong>] ) x =1. 13/2 = [Rest1] ungera<strong>de</strong>: 1 Summierung <strong>de</strong>r gewichteten 2er-Potenzen,2. 12/2 = 6 gera<strong>de</strong>: 0 (hier: 1<strong>10</strong>1)3. 6/2 = 3 ungera<strong>de</strong>: 1 je<strong>de</strong>s d i wird mit 2 i multipliziert:4. 3/2 = 1 ungera<strong>de</strong>: 1 d 3 x 2 3 | d 2 x 2 2 | d 1 x 2 1 | d 0 x 2 0Dezimalwert Dualwert (Algorithmus)while (x != 0) // Eingabe: z.B. 13{if (x%2 == 0) IO.print(’0’);else IO.print(’1’);x = x/2; } // Resultat: 1<strong>10</strong>18 4 0 1 = 13 [<strong>10</strong>]b) Duale Kodierung ganzer Zahlen [ positiv, neutral, negativ ( 2er-Komplement) ]Achtung! vorgegebene Zahl <strong>de</strong>r Bits: 4 Stellen, wobei die 1. Stelle (0 o<strong>de</strong>r 1) für das Vorzeichen reserviert ist!d 3 d 2 d 1 d 0 Dezimalwert0 1 1 1 70 1 1 0 60 1 0 1 50 1 0 0 40 0 1 1 30 0 1 0 20 0 0 1 <strong>10</strong> 0 0 0 01 1 1 1 -11 1 1 0 -21 1 0 1 -31 1 0 0 -41 0 1 1 -51 0 1 0 -61 0 0 1 -71 0 0 0 -8© Dr. Walter Kirchgessner 2008 8


Umfang ganzer Zahlen bei z.B. 8 Stellen (1. Bit regelt Vorzeichen!):<strong>10</strong>00 0000…..0111 1111-128……….+127Ermittlung <strong>de</strong>r Kodierung einer negativen ZahlProblem: Kodiere -xLösung: 1. Kodiere x2. Invertiere x3. Addiere dual 1<strong>Beispiel</strong>:gegeben negative Zahl −x -4Problem: fin<strong>de</strong> d i zu x = 4 0<strong>10</strong>0Lösung: invertiere Bits <strong>10</strong>11addiere dual 1 +11<strong>10</strong>02er-Komplement: Addition/Subtraktion 3 + (-5) = 3 - 50011 3+ <strong>10</strong>11 -5= 11<strong>10</strong> -200<strong>10</strong> 2+ <strong>10</strong>11 -51<strong>10</strong>1 -3Achtung, Überlauf!01<strong>10</strong> 6+ 0111 71<strong>10</strong>1 -3 falsch!Trick zur Überprüfung:1. Verdoppele das Vorzeichen-Bit, aber nur für die Dauer <strong>de</strong>r Rechnung(Zahl ist im Speicher mit 4 Bits, zusätzliches 5. Bit nur im Rechenwerk)2. Verknüpfe3. Falls Vorzeichen-Bits i<strong>de</strong>ntisch Ergebnis korrekt, sonst: nicht korrekt00111 7 00011 3+ 00001 1 + 1<strong>10</strong>11 -50<strong>10</strong>00 8 111<strong>10</strong> -2Ergebnis un<strong>de</strong>finiertErgebnis wahr© Dr. Walter Kirchgessner 2008 9


c) Kodierung von Gleitkommazahlen (float, double)Gleitkommazahlen sind <strong>de</strong>r übliche Weg, um Kommazahlen, also reelle Zahlen, für <strong>de</strong>n Computer darzustellen.Rationelle Zahlen wie z.B. 3,5 sind unproblematisch. Schwieriger wird es bei Kommazahlen, die keinEn<strong>de</strong>, also unendlich viele Nachkommstellen haben, wie z.B. bei <strong>10</strong> geteilt durch 3 = 3,33333…Weil ein Computer keine unendliche Zahl anzeigen bzw. berechnen kann, beschränkt man sich auf einebestimmte Anzahl an Nachkommastellen, z.B. beim Geldwert auf 3,33 Euro.Für <strong>de</strong>n Computer wer<strong>de</strong>n Gleitkommazahlen durch Vorzeichen, Mantisse und Exponent beschriebenund erreichen d<strong>am</strong>it <strong>de</strong>utlich größere Absolutwerte als Integerzahlen:Für eine gegebene Zahl x wer<strong>de</strong>n Mantisse m und Exponent e gesucht mit <strong>de</strong>r Eigenschaftx = m · 2 eDer Wert <strong>de</strong>r Gleitkommazahl ergibt sich also aus <strong>de</strong>m Produkt von Mantisse und <strong>de</strong>r Zweierpotenz <strong>de</strong>sExponenten. Da es für ein gegebenes x mehrere zueinan<strong>de</strong>r passen<strong>de</strong> Mantissen und Exponenten gibt,wählt man die normalisierte Form mit einer Mantisse:z.B. 12 = 6 x 2 1= 3 x 2 2= 1,5 x 2 3= 0,75 x 2 4Mantisse soll „normalisiert“ sein: 1 m < 2Da eine normalisierte Mantisse immer mit einer 1 vor <strong>de</strong>m Komma beginnt, reicht es aus, ihren Nachkommawertals reduzierte Mantisse f = m − 1.0 abzuspeichern.Bei einer Kodierung für 32 Bitsmit <strong>de</strong>m Datentyp float sind vorgesehen fürdas Vorzeichen:<strong>de</strong>n Exponenten:die Mantisse:1 Bit8 Bits23 Bits<strong>Java</strong> verwen<strong>de</strong>t zur Kodierung von Vorzeichen, Mantisse und Exponent <strong>de</strong>n IEEE-Standard 754-1985.d) Kodierung logischer Werte (boolean)Der Typ boolean dient zum Speichern <strong>de</strong>r logischen Werte bzw. Operationen im Sinne von wahr undfalsch. Die einzigen Konstantenbezeichner lauten true (1) und false (0).e) Kodierung von Zeichen (char)Der Datentyp Character beschreibt in <strong>de</strong>r EDV Datenelemente <strong>de</strong>s Typs „Zeichen“, d.h. alle Zeichen im16 Bit breiten Unico<strong>de</strong>-Zeichensatz. Je<strong>de</strong>s Zeichen wird kodiert durch eine 2 Byte breite Zahl, z.B. <strong>de</strong>rBuchstabe A hat die Nummer 65 (<strong>de</strong>zimal) = 00000000 0<strong>10</strong>00001 (binär). Die nie<strong>de</strong>rwertigen 7 Bitsstimmen mit <strong>de</strong>m ASCII-Zeichensatz (American Standard Co<strong>de</strong> for Information Interchange) überein.© Dr. Walter Kirchgessner 2008 <strong>10</strong>


5. ArraysMehrere Variablen <strong>de</strong>sselben Typs können zu einem Feld („Array“) zus<strong>am</strong>mengefasst wer<strong>de</strong>n:Statt Aufzählung <strong>de</strong>r Variablen z.B. m1 für Januar, m2 für Februar, m3 für März usw. Zus<strong>am</strong>menfassung <strong>de</strong>r 12 Variablen zu einem N<strong>am</strong>en (In<strong>de</strong>x)Zus<strong>am</strong>menfassen lassen sich in diesem Sinn:• Ziffern• Daten• Zeichen• Wahrheitswerten• Indizes• Zustän<strong>de</strong>© Dr. Walter Kirchgessner 2008 11

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!