Algorithmus Ein Kochrezept zum Beispiel Kartoffelbrei Frage Aus
Algorithmus
Ein Kochrezept, zum Beispiel:
Kartoffelbrei
Frage: Aus welchen zwei Teilen besteht ein Kochrezept ?
Zutaten: 2 Kg Kartoffeln, 0, 5 l Milch, 200 gr Butter, 1 TL Salz, 1 TLPfeffer, 1 TL Muskat
Zubereitung: Kartoffeln schälen, zerkleinern und in Salzwasser gar kochen. Mit dem Mörser zerstampfen und unter Hinzufügen der Butter und Milch mit dem Schneebesen schaumig schlagen und würzen.
Ein Algorithmus ist - salopp ausgedrückt ein Kochrezept
Präziser:
Ein Algorithmus ist ein Verfahren zur Lösung eines gegebenen Problems. Er hat folgende Eigenschaften:
• schrittweise • eindeutig • endlich
Was "schrittweise" bedeutet, muss in der konkreten Situation geklärt werden: Bei einem modernen Rechner bedeutet ein Schritt z. B: - Addition zweier Zahlen - Subtraktion zweier Zahlen - Multiplikation zweier Zahlen - Division zweier Zahlen - Vergleich zweier Zahlen mit <, , >, Ein Schritt ist z. B. nicht der Vergleich dreier Zahlen wie z. B: 3 < 5 < 2
Aufgabe: Geben Sie ein Beispiel eines nicht endlichen "Kochrezepts":
Auf der Suche nach einer Genehmigung in irgendeinem Amt:
Der Pförtner schickt Sie ins Zimmer 10.
Vom Zimmer 10 werden Sie ins Zimmer 17 geschickt.
Vom Zimmer 17 werden Sie ins Zimmer 10 geschickt.
10 17
Frage: Welche Algorithmen haben Sie bis jetzt in der Schule kennengelernt ?
- addieren, subtrahieren multiplizieren, dividieren, wurzelziehen kg. V gg. T
Braucht die Fußball. Bundesliga auch einen Algorithmus ?
In der 1. Fußballbundesliga gibt es insgesamt 18 Mannschaften. Jede dieser Mannschaften muß in 17 Spieltagen gegen jede andere Mannschaft genau einmal gespielt haben, ohne dabei an einem Spieltag auszusetzen. Dazu braucht man einen Algorithmus! Der Algorithmus kann auch verallgemeinert werden, so daß nicht nur für 18 Mannschaften, sondern allgemein für eine beliebige vorgegebene gerade Anzahl von Mannschaften (>=4) funktioniert!
Ein weiteres konkretes Beispiel aus der Industrie
Wie packt man möglichst viele Garnrollen platzsparend auf eine Palette? Für dieses Problem der Firma Autefa Automation Gmbh galt es ein Steuerprogramm für einen Roboterarm zu entwickeln, der diese Garnrollen dann entprechend auf Paletten stellt. Ein dazugehöriger Algorithmus wurde von der Uni Ulm (Institut für theoretische Informatik) erstellt! Eine abstrakte Formulierung der Problemstellung: Eine einfache mathematische Beschreibung des Problems erhält man, wenn man eine Palette als Rechteck und die Garnrollen als Kreise auffasst. Die Aufgabenstellung lautet dann folgendermaßen: Gegeben sind ein Rechteck einer festen Größe und Kreise von verschiedenen Durchmessern. Gesucht ist eine nicht-überlappende Anordnung von einigen dieser Kreise innerhalb des Rechtecks, so dass die abgedeckte Fläche maximal ist.
Die Grundidee des Algorithmus Man schaut sich ein Verfahren ab, das vermutlich die Meisten aus dem Alltag kennen: Füllt man eine Dose beispielsweise mit Kaffeebohnen voll und schüttelt die Dose dann etwas, so sinken die Bohnen ein wenig in sich zusammen. Der Schüttelvorgang, gewissermaßen ein Zufallsprozess, führt zu einer dichteren Lagerung der Bohnen. Intuitiv kann man sich vorstellen, dass eine Bohne durch das Schütteln zunächst angehoben wird und dann durch die Schwerkraft wieder nach unten fällt. Dabei kann sie dann in Lücken fallen, die vorher durch andere Bohnen versperrt waren. Die Schwerkraft wird in unserem Algorithmus simuliert durch eine gewichtete Wahrscheinlichkeitsverteilung der Bewegungsrichtung der Kreise, die mit höherer Wahrscheinlichkeit zum Rechteckszentrum führt. Näheres: Siehe Website des Instituts für theoretische Informatik an der Uni Ulm
Darstellungsmöglichkeiten eines Algorithmus
• Flußdiagramm • Programmiersprache (z. B. C++)
Elemente des Flußdiagramms
Anfang WICHTIG: Keinen Eingang Anfang WICHTIG: gibt es genau einmal im Flussdiagramm WICHTIG: Genau 1 Ausgang unten
Ende WICHTIG: Genau 1 Eingang oben Ende WICHTIG: Gibt es genau einmal im Flussdiagramm. Jeder Durchgang durch das Flussdiagramm, muß hier enden! WICHTIG: Keinen Ausgang
Eingabe bzw. Ausgabe WICHTIG: Genau 1 Eingang oben WICHTIG: Genau 1 Ausgang unten
Anweisung WICHTIG: Genau 1 Eingang oben WICHTIG: Genau 1 Ausgang unten
Fallunterscheidung (Verzweigung) WICHTIG: Genau 1 Eingang oben Bedingung wahr falsch WICHTIG: Genau 2 Ausgänge: einen an der Seite und einen unten
kurz: Bedingung w f
Flußrichtung
Achtung ! Folgendes Element gehört nicht zu einem Flußdiagramm !!
Kein Element eines Flußdiagramms. Warum ? Weil Flußdiagramm nicht eindeutig ist. Geht es nach links oder rechts weiter ?
Kein Element eines Flußdiagramms. Warum ? Weil Flußdiagramm 3 Eingänge hat und 1 Eingang von der Seite kommt.
Kein Element eines Flußdiagramms. Warum ? Flußdiagramm hat zwar 1 Eingang. Das ist noch korrekt. Falsch ist aber, daß dieser von der Seite kommt.
Variablen (technisch gesehen sind dies Stellen im Arbeitsspeicher). Zum Beispiel wird eine Eingabe in einer Variablen gespeichert.
Unter einer Variablen kann man sich einen Behälter vorstellen. In diesem Behälter wird ein Wert gespeichert (z. B. eine bestimmte Menge Flüssigkeit). Diese Menge bleibt solange konstant in diesem Behälter, solange sie nicht verändert wird. Diese Eigenschaft nennt man speichern. Es "verdunstet" deshalb auch nichts.
Jede Variable hat einen Namen, den der Programmierer vergibt. Inhalt der Variablen z 1 Inhalt der Variablen z 2 z 1 z 2 Namen einer Variablen
Einer Variablen kann man einen Wert zuweisen (der Behälter kann gefüllt werden). Zum Beispiel: Variablen b wird der Inhalt 0, 5 zugewiesen b : = 0, 5 Der (Der Behälter wird mit 0, 5 gefüllt). 0, 5 b Das Zeichen : = bedeutet soviel wie "der Wert rechts von : = wird der linken Variablen zugewiesen" und ist auf keinen Fall mit dem aus der Mathematik bekannten Gleichheitszeichen = zu verwechseln ! WICHTIG: Vor dieser Zuweisung hat die Variable b einen unbekannten Wert. Man sagt, die Variable hat einen undefinierten Wert.
Einer Variablen kann man einen Wert zuweisen (der Behälter kann gefüllt werden). Zum Beispiel: b : = 0, 5 b Links des Zeichens : = muss genau eine Variable stehen. Rechts davon muss ein Wert oder ein aus Variablen (und Werten) bestehender Term stehen, wie z. B. x+y*z oder x * 2 Wichtig: Umgekehrt gemacht, ist es falsch: 0, 5 : = b oder x + y + z : = b ist falsch.
Was bewirkt die gleich folgende weitere Anweisung ? b : = 0, 5 b : = 0, 3 0, 5 b Der Variablen b wird der Inhalt 0, 3 zugewiesen. Der alte Wert von 0, 5 wird überschrieben und geht verloren.
Was bewirkt folgende weitere Anweisung ? b : = 0, 5 b : = 0, 3 Der Variablen b wird der Inhalt 0, 3 zugewiesen. Der alte Wert von 0, 5 wird überschrieben und geht verloren. b
Was bewirkt folgende weitere Anweisung ? b : = 0, 5 b : = 0, 3 b Der Variablen b wird der Inhalt 0, 3 zugewiesen. Der alte Wert von 0, 5 wird überschrieben und geht verloren.
Was würde das Gleichheitszeichen = bewirken ? b = 0, 5 b = 0, 3 b 0, 5 = 0, 3 Man sieht jetzt auch genau, was passieren würde, wenn man in der letzten Folie statt : = das Gleichheitszeichen = verwenden würde. Was würde mathematisch oben aus den zwei Gebilden folgen ? Also:
Welche Werte haben die Variablen g und h ? g h
Welche Werte haben die Variablen g und h ? ? ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 ? g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 0, 5 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 g : = h 0, 3 0, 5 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 g : = h 0, 5 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 g : = h 0, 5 g Der Wert von h - also 0, 5 - wird von h in den Behälter g kopiert (nicht geleert, also nicht verschoben). Der alte Wert von g wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht). D. h. nur der Wert der linken Variablen wird verändert. Der Wert der rechten Variablen bleibt unverändert. Dies entspricht also z. B. nicht den Erfahrungen eines durstigen, aber wenig Geld besitzenden Besuchers einer Trinkherberge, der in einem günstigen Augenblick den Inhalt des benachbarten Bierglases in des seinen verschiebt. 0, 5 h
Bitte folgende Regel einhalten: Anfangsbuchstabe eines Variablennamens immer klein schreiben. Dies ist dem Compiler zwar egal, doch an diese Regel halten sich alle Programmierer.
Ein weiteres Beispiel:
Welche Werte haben die Variablen g und h ? g h
Welche Werte haben die Variablen g und h ? ? ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? g h
Was bewirkt folgende Anweisung ? g : = 0, 3 ? g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 ? g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 0, 3 0, 5 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 h : = g 0, 3 0, 5 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 h : = g 0, 3 g h
Was bewirkt folgende weitere Anweisung ? g : = 0, 3 h : = 0, 5 h : = g 0, 3 g Der Wert von g - also 0, 3 - wird von g in den Behälter h kopiert (nicht geleert, also nicht verschoben). Der alte Wert von h wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht). D. h. nur der Wert der linken Variablen wird verändert. Der Wert der rechten Variablen bleibt unverändert. Dies entspricht also z. B. nicht den Erfahrungen eines durstigen, aber wenig Geld besitzenden Besuchers einer Trinkherberge, der in einem günstigen Augenblick den Inhalt des benachbarten Bierglases in des seinen verschiebt. 0, 3 h
Ein weiteres Beispiel:
Welchen Wert hat die Variable z ? ? z
Was bewirkt folgende Anweisung ? z : = 3 ? z
Was bewirkt folgende Anweisung ? z : = 3 z
Was bewirkt folgende Anweisung ? z : = 3 3 z
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 3 9 3 z 3 Der Wert von z - also 3 - wird mit dem Wert von z - also 3 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 3 9 z 3 Der Wert von z - also 3 - wird mit dem Wert von z - also 3 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 3 9 9 z 3 Der Wert von z - also 3 - wird mit dem Wert von z - also 3 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 81 9 z 9 9 Der Wert von z - also 9 - wird mit dem Wert von z - also 9 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 81 9 z 9 Der Wert von z - also 9 - wird mit dem Wert von z - also 9 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Was bewirkt folgende weitere Anweisung ? z : = 3 z : = z*z 81 81 z 9 9 Der Wert von z - also 9 - wird mit dem Wert von z - also 9 - multipliziert und in den Behälter z kopiert (nicht geleert, also nicht verschoben). Der alte Wert von z wird überschrieben (er geht verloren, d. h. er wird vorher gelöscht).
Aufgabe: Der Wasserstand des Neckars wird zweimal im Jahr (im Sommer und Winter) gemessen. Bestimmen Sie den maximalen Wasserstand, kurz. . .
Bestimmen Sie das Maximum zweier eingegebener Zahlen, wobei. . .
. . . dies durch den Vergleich zweier Zahlen zu lösen ist. Auf einmal können nur 2 Zahlen verglichen werden, also keine 3 oder mehrere. Also, z. B: x<y möglich, x<y<z nicht möglich
Anfang 1. Zahl eingeben: Eingabe(z 1) 2. Zahl eingeben: Eingabe(z 2)
z 1 < z 2 f w max : = z 2 Das Maximum ausgeben: Ausgabe(max) max : = z 1 Das Zeichen : = bedeutet soviel wie "der Wert der rechten Variablen wird der linken Variablen zugewiesen" und ist auf keinen Fall mit dem aus der Mathematik bekannten Gleichheitszeichen = zu verwechseln !
Ende
Nachdem der Algorithmus entwickelt wurde, muss er einem “Crash-Test“ (Härte-Test, Stress-Test) unterzogen werden. Dieses Prinzip wird prinzipiell in der Wissenschaft verwendet:
Man versucht eine aufgestellte Behauptung “kaputt zu testen“. Anschaulich gesprochen wird auf die aufgestellte Behauptung so lange eingedroschen, bis sie kaputt geht. Falls dies nicht gelingt, kann man davon ausgehen, ein gutes Produkt entwickelt zu haben.
Wir testen den Algorithmus für die Eingabe konkreter Zahlen, wie z. B:
Anfang 1. Zahl eingeben: Eingabe(z 1) 2. Zahl eingeben: Eingabe(z 2) Annahme (nach der Eingabe), also an dieser Stelle des Flußdiagramms: z 1 = 3 z 2 = 7
3 7 z 1 < z 2 7 w f 7 max : = z 2 max : = z 1 7 Das Maximum ausgeben: Ausgabe(max) Ende Welchen Wert hat max an dieser Stelle des Flußdiagramms ? max ist undefiniert, d. h. der Wert ist unbekannt.
8 Annahme: z 1 = 8 z 2 = 2 2 z 1 < z 2 f w max : = z 2 max : = z 1 8 Das Maximum ausgeben: Ausgabe(max) Ende 8 8
5 Annahme: z 1 = 5 z 2 = 5 5 z 1 < z 2 f w max : = z 2 max : = z 1 5 Das Maximum ausgeben: Ausgabe(max) 5 5
Bei allen folgenden Aufgaben müssen Test-Protokolle gemacht werden. Bei der Aufgabe das Maximum zweier Zahlen zu finden, sieht ein Test-Protokoll z. B. so aus (siehe auch entsprechendes Word. Dokument auf der Website):
TESTPROTOKOLL Name des Algorithmus: Maximum zweier Zahlen Datum: 25. 5. 2014 Name des Entwicklers: Erich Überflieger Name des Testers: Ernst Bockelhart TESTDATEN z 1, z 2 z 1 z 2 max Algorithmus korrekt? ja 3 7 7 8 2 8 ja 5 5 5 ja
Aufgabe: Stellen Sie den Algorithmus durch ein Flußdiagramm dar, der das Maximum dreier in beliebiger Reihenfolge eingegebener Zahlen berechnet.
Bemerkungen: Nur der wichtigste Teil der Lösung wird hier und in den folgenden Lösungen dargestellt (z. B. wird der Eingabeteil weggelassen).
1. Lösung:
z 1 < z 2 f w max 1 : = z 2 max 1 : = z 1 Zuerst wird - genau so wie ein paar Folien vorher - das Maximum von den Zahlen z 1 und z 2 berechnet. Dieses Maximum nennen wir das vorläufige Maximum (bezeichnet mit max 1) , weil es noch nicht das endgültige Maximum von z 1, z 2 und z 3 ist. Was muss man jetzt nur noch machen, um das endgültige Maximum zu berechnen? Man muss nur noch das Maximum von z 3 und max 1 berechnen!
z 1 < z 2 f w max 1 : = z 2 max 1 < z 3 max 1 : = z 1 w f max 2 : = max 1 Ausgabe(max 2) Ende max 2 : = z 3 Vorläufiges Maximum von z 1 und z 2, kurz: max 1 =Maximum(z 1, z 2) Maximum von z 3 und max 1, also Maximum von z 3 und z 1 und z 2, kurz: max 2 = Maximum(z 3, max 1) = Maximum(z 3, z 1, z 2)
z 1 < z 2 f w max 1 : = z 2 max 1 < z 3 max 1 : = z 1 w f max 2 : = max 1 Ausgabe(max 2) Ende max 2 : = z 3 Angenommen, man müsste Speicher sparen. Wie kann man den Algorithmus mit einer Variable (einem Behälter) weniger realisieren?
2. Lösung:
10 20 z 1 < z 2 20 f 20 w max : = z 2 max : = z 1 20 max < z 3 30 f w max : = z 3 30 30 30 Ausgabe(max) Ende Test 1 Annahme: z 1 = 10 z 2 = 20 z 3 = 30
10 20 z 1 < z 2 20 f 20 w max : = z 2 max : = z 1 20 max < z 3 30 f w max : = z 3 30 30 30 Ausgabe(max) Ende Test 1 Annahme: z 1 = 10 z 2 = 20 z 3 = 30 Wichtig: max kann also während des Programmablaufs verschiedene Werte annehmen. Berechnet hier das (vorläufige) Maximum von z 1 und z 2. Berechnet hier das (endgültige) Maximum von max (also z 1 und z 2) und z 3.
70 60 z 1 < z 2 f 70 70 w max : = z 2 max : = z 1 Test 2 Annahme: z 1 = 70 z 2 = 60 z 3 = 50 70 max < z 3 50 f w max : = z 3 Ausgabe(max) Ende 70
80 80 z 1 < z 2 f 80 80 w max : = z 2 max : = z 1 Test 3 Annahme: z 1 = 80 z 2 = 80 z 3 = 80 80 max < z 3 80 f w max : = z 3 Ausgabe(max) Ende 80
Aufgabe: Stellen Sie den Algorithmus durch ein Flußdiagramm dar, der drei in beliebiger Reihenfolge eingegebene Zahlen ihrer Größe nach aufsteigend sortiert und ausgibt.
k: kleinste Zahl m: mittlere Zahl g: größte Zahl f z 1 < z 2 w z 3 < z 1 w k: =z 3 m: =z 1 g: =z 2 z 3 < z 2 f w z 3 < z 2 k: =z 3 m: =z 2 g: =z 1 f w k: =z 1 m: =z 3 g: =z 2 Ausgabe(k, m, g) k: =z 1 m: =z 2 g: =z 3 f z 3 < z 1 w k: =z 2 m: =z 3 g: =z 1 f k: =z 2 m: =z 1 g: =z 3
Aufgabe: Stellen Sie den Algorithmus durch ein Flußdiagramm dar, der für eine Klassenarbeit für jeden Schüler den Prozentsatz erreichter Punkte – auf die maximal möglich zu erreichende Gesamtpunktzahl bezogen - errechnet und ausgibt. a) Die Klasse besteht aus 1 Schüler. b) Die Klasse besteht aus „unendlich“ vielen Schülern. c) Die Klasse besteht aus 50 Schülern. d) Der Lehrer kann die Schüleranzahl eingeben.
Lösung a)
Anfang Eingabe (gesamtpunkte) Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) Ende
Lösung b)
Anfang Eingabe (gesamtpunkte) Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) Ende Was muss man machen, damit nochmals das gleiche für mehrere Schüler gemacht wird ? Man muss ein Schleife einbauen !
Anfang Eingabe (gesamtpunkte) Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) Warum ist dies ein anwenderunfreundliche Lösung ? Weil der Anwender bei jedem Schüler die Gesamtpunkte nochmals eingeben muss, obwohl diese Zahl für jeden Schüler die gleiche ist. Welche Lösung wäre dann anwenderfreundlicher ?
Anfang Eingabe (gesamtpunkte) Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p)
Lösung c): (für 50 Schüler)
Anfang Eingabe (gesamtpunkte) Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) Was muß in diese Lösung noch eingebaut werden, damit genau 50 Schüler ausgegeben werden ? Ein Zähler und eine Verzweigung, die den Wert des Zählers überprüft.
Eingabe(gesamtpunkte) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < 50 f Ende w PROBLEM: Woher kann man sicher sein, dass in der Verzweigung die Bedingung zähler < 50 heißt ? Warum könnte hier z. B. nicht stehen: zähler < 51 oder zähler 51 Im folgenden wird eine Möglichkeit dargestellt, wie man nachprüfen kann, ob das Programm das Gewünschte macht.
Welcher Zusammenhang besteht Eingabe(gesamtpunkte) zwischen Schülerausgaben und zähler ? zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) Am roten Pfeil wird das Programm bei jedem Durchgang gedanklich angehalten und der Wert der Variablen zähler und die Anzahl der Schülerausgaben protokolliert (besonders der erste und der letzte Durchgang): Dieses schrittweise Abarbeiten des Programms nennt man auch "Schreibtischtest" zähler : = zähler + 1 w 1 2 zähler < 50 f Schülerausgaben = zähler. . . letzter Durchgang: 50 Ende Schülerausgaben 1 2 . . . 50
Was muß im Programm geändert werden, damit die Schüleranzahl eingegeben werden kann ?
Eingabe(gesamtpunkte) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < f Ende w
Eingabe(gesamtpunkte) Eingabe(anz) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < anz f Ende w
Eingabe(gesamtpunkte) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < 50 f Ende w NOCHMALS PROBLEM: Woher kann man sicher sein, dass in der Verzweigung die Bedingung zähler < 50 heißt ? Warum könnte hier z. B. nicht stehen: zähler < 51 oder zähler 51 Im folgenden wird eine weitere Möglichkeit dargestellt, wie man nachprüfen kann, ob das Programm das Gewünschte macht.
Eingabe(gesamtpunkte) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < 50 f Ende w Da es sehr aufwendig wäre, das ganze Programm (der Wert 50 ist sehr groß) bis zum Programmende am Schreibtisch durch zu gehen, nimmt man statt 50 einfach einen kleineren Wert, wie z. B. 3 und führt das Programm bis zum Programmende am Schreibtisch durch. Außerdem muss natürlich ein Protokoll gemacht werden. Nach jedem Schritt des Programms wird der Wert der Variablen neben die Variable geschrieben
Eingabe(gesamtpunkte) zähler : = 0 Eingabe (punkte) p : = punkte/gesamtpunkte*100 Ausgabe(p) zähler : = zähler + 1 zähler < f Ende w Da es sehr aufwendig wäre, das ganze Programm (der Wert 50 ist sehr groß) bis zum Programmende am Schreibtisch durch zu gehen, nimmt statt 50 einfach einen kleinern Wert, wie z. B. 3 und führt das Programm bis zum Programmende am Schreibtisch durch. Außerdem muss natürlich ein Protokoll gemacht werden. Nach jedem Schritt des Programms wird der Wert der Variablen neben die Variable geschrieben
200 Eingabe(gesamtpunkte) 0 zähler : = 0 20 30 50 Eingabe (punkte) 10 15 25 p : = punkte/gesamtpunkte*100 10 15 25 Ausgabe(p) 1 2 3 zähler : = zähler + 1 1 2 3 zähler < 3 f Ende w Da es nehmen sehr aufwendig Wir an, dasswäre, hier das ganze Programm (der 200 wird. Wert 50 eingegeben ist sehr groß) bis zum Programmende amhier Wir nehmen an, dass Schreibtisch durch zu 20 eingegeben wird. gehen, nimmt statt 50 einfach einen Wir nehmen kleinern Wert, an, wiedass z. B. hier 3 eingegeben wird. bis und 30 führt das Programm zum Programmende am Wir nehmendurch. an, dass hier Schreibtisch 50 eingegeben wird. Außerdem muss natürlich ein Protokoll gemacht werden. Nach jedem Schritt des Programms wird der Wert der Variablen neben die Variable geschrieben
200 Eingabe(gesamtpunkte) 0 zähler : = 0 20 30 50 Eingabe (punkte) 10 15 25 p : = punkte/gesamtpunkte*100 10 15 25 Ausgabe(p) 1 2 3 zähler : = zähler + 1 1 2 3 zähler < 3 f Ende w Da es. Essehr aufwendig wäre, wurden also bei das ganze Programm (der zaehler < 3 bis Wert 50 ist sehr groß) Ausgaben gemacht. zum 3 Programmende am Schreibtisch durch zu Also ist es "einsichtig", gehen, nimmt statt 50 bei einfach einen dass kleinernzaehler Wert, wie < 50 z. B. 3 und führt das Programm bis 50 Programmende Ausgaben gemacht zum am werden. Schreibtisch durch. Außerdem muss natürlich ein Protokoll gemacht werden. Nach jedem Schritt des Programms wird der Wert der Variablen neben die Variable geschrieben
Aufgabe: Siehe Übungsblatt
Die 2. Möglichkeit, einen Algorithmus zu beschreiben ist die Programmiersprache.
Eine Programmiersprache ist eine künstliche Sprache – im Gegensatz zu einer natürlichen Sprache (wie z. B. der englischen Sprache). Eine künstliche Sprache wird für spezielle Dinge - wie z. B. der Programmierung - benutzt, weil eine natürliche Sprache dazu zu ungenau wäre.
Programmiersprache: • Syntax • Semantik
Die Syntax definiert die äußeren Formgesetze dieser Programmiersprache (ähnlich den grammatikalischen Regeln einer natürlichen - wie z. B. der englischen- Sprache).
Die Semantik ist der Bedeutungsinhalt (ähnlich der Bedeutung der einzelnen Worte einer natürlichen - wie z. B. der italienischen - Sprache) der einzelnen Objekte einer Programmiersprache. Ein interesanter Link dazu: https: //denkspuren. blogspot. de/2008/11/syntax-und-semantik. html
Eine "höhere" Programmiersprache (z. B: Java, C, Pascal, Cobol, Ada, Prolog, usw. ) kann zwar von einem Menschen verstanden werden ("menschengerecht"), doch nicht von einem Mikroprozessor (dem Herz des Computers), weil ein Mikroprozessor nur sogenannte Maschinenbefehle (bestehen aus 0 en und 1 en) versteht.
Deshalb benötigt man einen Übersetzer (engl. Compiler), der einen in einer höheren Programmiersprache formulierten Text (ein sogenanntes Programm) in einen aus Maschinenbefehlen bestehenden Text (einem sogenannten Maschinenprogramm) verwandelt. Dieses kann dann vom Mikroprozessor abgearbeitet (ausgeführt) werden.
Jeder Compiler erzeugt auch eine Fehlermeldungen, wenn er einen syntaktischen Fehler entdeckt. Und das unabhängig vom Geschlecht, der Hautfarbe, der Religionszugehörigkeit oder irgendeiner Eigenschaft bzw. Meinung des Programmierers (der Compiler kennt keine Vorurteile). Man kann daher sagen:
All Compilers Are Beautiful. Oder auf Deutsch: Nichts ist gailer als der Compiler.
- Slides: 139