Bedingte Anweisungen

Ähnliche Dokumente
Operatoren in C/C++ und Java:

Schleifen in C/C++/Java

Schleifen in C/C++/Java

Java Anweisungen und Ablaufsteuerung

Java Ablaufsteuerung (Beispiele)

Einführung in die Programmierung II. 3. Kontrollstrukturen

Kompaktkurs Einführung in die Programmierung. 4. Kontrollstrukturen

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen

Einführung in die Programmierung

Einführung in die Programmierung Wintersemester 2011/12

Einstieg in die Informatik mit Java

3. Anweisungen und Kontrollstrukturen

Schleifen: Immer wieder dasselbe tun

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Java: Syntax-Grundlagen III

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

C# - Einführung in die Programmiersprache Bedingte Anweisungen und Schleifen

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration

Kontrollstrukturen (1)

Kontrollstrukturen und Logik

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Grundlagen der Informatik 4. Kontrollstrukturen I

Informatik I Übung, Woche 40

C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Blöcke. Beispiel: Variablen in Blöcken

Programmsteuerung mit PHP - if/else, elseif,switch

Einstieg in die Informatik mit Java

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

Annehmende Schleife do while

Einstieg in die Informatik mit Java

Programmieren I + II Regeln der Code-Formatierung

9 Anweisungen und Kontrollstrukturen

Einstieg in die Informatik mit Java

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

4.2 Gleitkommazahlen. Der Speicherbedarf (in Bits) ist üblicherweise. In vielen Anwendungen benötigt man gebrochene Werte. Physikalische Größen

Tag 2 Repetitorium Informatik (Java)

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Programmiertechnik Kontrollstrukturen

Programmieren I. Kapitel 5. Kontrollfluss

Brückenkurs Programmieren

Kontrollstrukturen Blöcke / Schleifen / Bedingungen

Programmierkurs Java

Welche Informatik-Kenntnisse bringen Sie mit?

Informatik I: Einführung in die Programmierung

Quick-Start Informatik Programmieren in Python Teil 1

Java I Vorlesung Imperatives Programmieren

Operatoren (1) Operatoren (2)

Javakurs für Anfänger

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Kontrollstrukturen

2 Programmieren in Java I noch ohne Nachbearbeitung

Projekt 3 Variablen und Operatoren

Einführung in die Programmierung für NF. Übung

if ( Logischer Operator ) { } else { Anweisungen false

Informatik I Übung, Woche 40

Einführung in die Programmierung für NF. Übung

Programmieren I. Kontrollstrukturen Heusch 8 Ratz Institut für Angewandte Informatik

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Intensivübung zu Algorithmen und Datenstrukturen

Programmieren in C/C++ und MATLAB

Sprachkonstrukte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Modellierung und Programmierung 1

Wiederholung, Abbruch von Schleifen, switch-anweisung Datentypen, char, formatierte Ausgabe

Anweisungen und Kontrollstrukturen

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Einführung Java Programmieren in Java Arrays Schleifen Fehler. Einführung in Java. Arne Hüffmeier. Michelle Liebers, Dennis Hoffmann

1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.

Algorithmen und ihre Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Übungen zu Programmieren - Code-Formatierung -

PROGRAMMIERUNG IN JAVA

4.4 Imperative Algorithmen Verzweigung und Iteration

Programmieren I. Kontrollstrukturen Heusch 8 Ratz Institut für Angewandte Informatik

1.8.5 Wiederholungen. Beispiele Unendliche Schleife: 1.8 Kontrollstrukturen 75. ( Bedingung ) AnweisungOderBlock. ja Anweisung. Bedingung erfüllt?

Unterlagen. CPP-Uebungen-08/

Programmieren I + II Regeln der Code-Formatierung

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Javakurs für Anfänger

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Nachklausur: Grundlagen der Informatik I, am 02. April 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Transkript:

Bedingte Anweisungen Bedingte Anweisungen werden nicht immer ausgeführt, sondern nur, wenn eine Bedingung erfüllt (wahr) ist. C/C++/Java bieten hier 2 Konstruktionen an: if-anweisung sowie switch-case Block. Erstere ist die allgemeinere Variante und wird viel häufiger eingesetzt. Die if-anweisung Syntax: if (Bedingung) // die runden Klammern sind Pflicht! genau-eine-anweisung; oder if (Bedingung) { Eine-Anweisung; Noch-eine-Anweisung;... Die Bedingung ist in C (also auch in C++ gestattet) irgendein numerischer Ausdruck. Ein Wert von 0 gilt als falsch und ein Wert ungleich 0 als wahr. In C++ kann (bzw. soll!) auch ein Ausdruck mit dem Ergebnistyp bool verwendet werden (in Java muss ein Ausdruck mit Ergebnis boolean verwendet werden). Einrücken zur optischen Verdeutlichung der Abhängigkeit gehört zum guten Stil und wird dringend empfohlen. Ich schlage die Einrückung um eine Tabulatorposition (= 4-8 Zeichen) vor, damit die Abhängigkeit klar ersichtlich ist. Kernighan/Ritchie würden die öffnende Klammer auf derselben Zeile wie die Bedingung schreiben. Beispiele: if (1) // ok in C/C++, falsch in Java (kein boolean) cout << "diese Anweisung wird immer ausgeführt\n"; if (true) // C++ und Java cout << "diese Anweisung wird immer ausgeführt\n";

// ab 2 Anweisungen MUSS man Klammern { verwenden { cout << "x ist zu gross und wird durch 5 ersetzt\n"; x = 5; { // K&R Klammernsetzung, ist nur optisch unterschiedlich cout << "x ist zu gross und wird durch 5 ersetzt\n"; x = 5; Fehler: if (i > 5) cout << "i ist zu gross\n"; return EXIT_SUCCESS; // diese Anweisung steht NICHT im if if (i > 5); // der Klassiker: falscher Strichpunkt cout << "i zu gross\n"; // diese Anweisung steht NICHT im if Der Fehler mit dem falschen Strichpunkt wird nicht vom Compiler erkannt, da es sich hierbei um keinen Syntaxfehler handelt. Solche Patzer sind extrem schwer zu finden, da optisch fast alles richtig aussieht. Fehler: if (i = 0) // Achtung: das ist eine Zuweisung, sollte sein: i == 0 cout << "i darf nicht 0 sein!\n"; Solche Fehler passieren in C/C++ oft, weil die Zuweisung (ein Gleichheitszeichen) und die Abfrage auf Gleichheit (logischer Operator ==) so ähnlich sind. Dummerweise ist diese Konstruktion in C/C++ erlaubt, auch wenn sie meistens völlig sinnfrei ist. Der Compiler gibt deshalb nicht einmal eine Warnung aus (der Gnu-Compiler warnt immerhin bei der Option - Wall für alle Warnungen). In Java wäre das fast immer ein Syntaxfehler, da das Ergebnis der Zuweisung meistens kein Wahrheitswert ist.

Der if - if - Block Die if-anweisung kann mit einer -Anweisung kombiniert werden (muss es aber nicht). In diesem Fall muss die -Anweisung direkt auf die if-anweisung folgen. Genauso wie beim if kann man genau eine Anweisung oder aber einen Anweisungsblock zwischen geschweiften Klammer { verwenden. Diese Anweisung(en) kommen genau dann zur Ausführung, wenn die if-bedingung nicht zutrifft (Alternative). Auch hier empfehle ich das Einrücken. Beispiel: Fehler: ; // dieser Strichpunkt ist die leere Anweisung // NICHT im if // Syntaxfehler: folgt nicht direkt auf das if Lässt man vom wieder eine if-anweisung abhängen, so spricht man von einer if Konstruktion. Eine solche gibt es in unseren 3 Sprachen eigentlich nicht, sondern es ist eben eine Kombination von mit einem weiteren if. Man rückt aber anders ein, um Platz zu sparen: schlecht: if (x < -5) // zu weit rechts besser: cout "x ist zu gross\n"; if (x < -5)

Dadurch kann man wirklich von einem if - if - Block sprechen : if (x < -70) cout << "x ist viel zu klein\n"; if (x < -7) Vergleiche obigen Code mit der äquivalenten Variante ohne if if (x < -70) cout << "x ist viel zu klein\n"; { if (x < -7) { Die Bedingungen werden der Reihe nach überprüft. Die erste zutreffende Bedingung bestimmt die auszuführende Anweisung (oder den ganzen Anweisungsblock in {) und beendet den ganzen if-block. Trifft keine der Bedingungen zu und ist ein reines vorhanden, so wird dessen Anweisung ausgeführt. Kommen mehrere if-anweisungen vor und nur ein, so ist es manchmal schwierig zu erkennen, wohin letzteres gehört. In diesem Fall sollte man immer klammern: if (x > 70) cout << x ist viel zu gross\n"; // nicht (x > 70) genau dasselbe, aber optisch eindeutig:

{ if (x > 70) cout << "x ist viel zu gross\n"; die andere Variante (die etwas ganz anderes bewirkt): hier muss man Klammern setzen: { if (x > 70) cout << "x ist viel zu gross\n"; // nicht (x > 7) cout << "x ist ok\n"; Ich möchte noch einmal betonen, dass das korrekte Einrücken nur für den Programmierer wichtig ist. Der Compiler ignoriert alle Arten von Einrückungen bei der Übersetzung. if und C++17 Seit C++17 ist eine weitere Form des if-statements erlaubt: if (Init; Bedingung) genau-eine-anweisung; Init ist meist eine Variablendefinition. Solche Variablen stehen im gesamten if-block und auch (falls vorhanden) im -Block zur Verfügung, sind aber außerhalb des if nicht mehr definiert: if (double d = b*b 4*a*c; d > 0) // 2 reelle Loesungen if (d == 0) // reelle Doppel-Loesung // Diskriminante negativ // 2 konjugiert-komplexe Loesungen // Diskriminante positiv Der switch-case Block Manchmal muss man verschiedene (ganzzahlige!) Werte eines Ausdrucks oder einer Variablen untersuchen. Wir wollen z.b. die Werte der Variablen errno (Fehlernummer)

abfragen und je nach Wert die richtige Fehlermeldung ausgeben. Mit einem if-block ginge das so: if (errno == 1) // Abfrage auf Gleichheit cout << "Datei wurde nicht gefunden\n"; if (errno == 5) cout << "Ausgabedatei konnte nicht geschrieben werden\n";... cout << "unbekannte Fehlernummer: " << errno << '\n'; Obwohl dieses Beispiel nicht ideal für die Demonstration ist, verwende ich dafür den switch-case Block: switch (errno) { // () um den Wert und geschweifte Klammern { sind Pflicht case 1: // hier braucht man keine Klammern cout << "Datei wurde nicht gefunden\n"; // beendet diesen Fall case 5: cout << "Ausgabedatei konnte nicht geschrieben werden\n";... default: // entspricht dem cout << "unbekannte Fehlernummer: " << errno << '\n'; Im Allgemeinen erzeugt der Compiler bei vielen zu untersuchenden Fällen wesentlich schnelleren Code als bei der if-variante. Will man für 2 unterschiedliche Werte dieselben Statements ausführen lassen, schreibt man einfach zwei case-statements untereinander: case 1: case 5: // in beiden Fällen mache das folgende cout << "Datei wurde nicht gefunden\n"; Beachte: Trifft ein Fall zu, so endet dessen Anweisungsblock erst bei der nächsten break- Anweisung! Vergisst man diese, so werden u.u. zu viele Anweisungen ausgeführt.

Ein besseres Beispiel: In der Variable monat sei eine Monatsnummer gespeichert und man möchte die Variable tage mit der richtigen Anzahl von Wochentagen für dieses Monat belegen. Hier die Lösung mit switch-case (ohne Schaltjahre!): switch(monat) { case 1: // Jänner case 3: // März case 5: // Mai case 7: // Juli case 8: // August case 10: // Oktober case 12: // Dezember tage = 31; // beendet diesen Fall case 2: // Feber tage = 28; // beendet diesen Fall case 4: // April case 6: // Juni case 9: // September case 11: // November tage = 30; // beendet diesen Fall default: // entspricht dem bei einem if cout << "falscher Monat in monat: " << monat << '\n'; Der Fall default ist optional, d.h. man muss ihn nicht verwenden. Auch die Reihenfolge ist egal (default muss nicht der letzte Fall sein). Die break Anweisung ist nur im switch-block und in Schleifen erlaubt, aber nicht in if-konstruktionen. Eine return Anweisung beendet immer die ganze Funktion, d.h. insbesondere auch einen switch- Block oder einen if-block. Seit C++17 ist auch die Form switch (Init; Ausdruck) möglich