Case/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Case/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + | \ | |
| 2 | + | Zurück zu den [[Reserved words/de|reservierten Wörtern]].\ | |
| 3 | + | Zurück zu den [[Branch/de|Verzweigungen / bedingten Anweisungen]].\ | |
| 4 | + | \ | |
| 5 | + | \ | |
| 6 | + | =Case= Das Schlüsselwort **Case** kann auf zwei Arten eingesetzt werden:\ | |
| 7 | + | \# einmal in der Form einer Liste von Verzweigungen im Körper eines Unterprogramms\ | |
| 8 | + | \# einmal in der Typdefinition um für einen speziellen Fall unterschiedliche Schreibweisen zu ermöglichen\ | |
| 9 | + | \ | |
| 10 | + | Im ersten Fall ersetzt es verschachtelte [[If/de|IF-Anweisungen]] und ermöglicht so eine bessere Lesbarkeit des Codes.\ | |
| 11 | + | Im zweiten Fall ermöglicht es dem Programmierer auf unterschiedliche Weise auf einen bestimmten Speicherereich zu zugreifen.\ | |
| 12 | + | \ | |
| 13 | + | Für die Case Anweisung können nur Ordinale (Ganzzahlige) Datentypen und String Datentypen verwendet werden.\ | |
| 14 | + | Der Wert vor dem **:** muss **'zwingend** eine **Konstante** sein.\ | |
| 15 | + | \ | |
| 16 | + | ||
| 17 | + | # Fall 1 Verwendung in einem Unterprogramm | |
| 18 | + | ||
| 19 | + | \ | |
| 20 | + | Die Case Anweisung im Körper eines Unterprogramms ist eine Verzweigung im Unterprogramm. Hier wird die Entscheidung getroffen, welcher Zweig des Unterprogramms abgearbeitet wird.\ | |
| 21 | + | übersichtlichere Schreibweise für die Schreibweise 'else if' und erzeugt auch schnelleren Code als die Schreibweise 'else if'.\ | |
| 22 | + | ==Case als Ersatz von If==\ | |
| 23 | + | Anweisungen wie diese:\ | |
| 24 | + | ||
| 25 | + | ``` pascal | |
| 26 | + | if (b = 1) or (b = 7) then | |
| 27 | + | ... | |
| 28 | + | else if (b = 2037) or (b = 5) then | |
| 29 | + | ... | |
| 30 | + | else if (b = 390) then | |
| 31 | + | ... | |
| 32 | + | else | |
| 33 | + | ...; | |
| 34 | + | ``` | |
| 35 | + | ||
| 36 | + | \ | |
| 37 | + | können durch eine Case Anweisung ersetzt werden: | |
| 38 | + | ||
| 39 | + | ``` pascal | |
| 40 | + | case b of | |
| 41 | + | 1,7: | |
| 42 | + | ...; | |
| 43 | + | 2037,5: | |
| 44 | + | ...; | |
| 45 | + | 390: | |
| 46 | + | ...; | |
| 47 | + | else | |
| 48 | + | ...; | |
| 49 | + | end; | |
| 50 | + | ``` | |
| 51 | + | ||
| 52 | + | \ | |
| 53 | + | ==Die Abfrage von Wertebereichen==\ | |
| 54 | + | Es können auch Wertebereiche abgefragt werden:\ | |
| 55 | + | In diesem Beispiel wird der Wertebereich eines Chars abgefragt.\ | |
| 56 | + | ||
| 57 | + | ``` pascal | |
| 58 | + | case c of | |
| 59 | + | '0' .. '9': | |
| 60 | + | ...; | |
| 61 | + | 'a' .. 'z': | |
| 62 | + | ...; | |
| 63 | + | 'A' .. 'Z': | |
| 64 | + | ...; | |
| 65 | + | '+' , '-' : | |
| 66 | + | ...; | |
| 67 | + | else | |
| 68 | + | ...; | |
| 69 | + | end; | |
| 70 | + | ``` | |
| 71 | + | ||
| 72 | + | \ | |
| 73 | + | ==Die Schreibweisen else und otherwise==\ | |
| 74 | + | Für den Sonstfall, also für alle die Fälle, die in der Case Anweisung nicht abgefragt wurden gibt es zwei gültige Schreibweisen | |
| 75 | + | ||
| 76 | + | - else | |
| 77 | + | - otherwise | |
| 78 | + | ||
| 79 | + | \ | |
| 80 | + | Beide Beispiele sind richtig und führen zum selben Ergebnis: | |
| 81 | + | ||
| 82 | + | ``` pascal | |
| 83 | + | // Beispiel 1 | |
| 84 | + | case i of | |
| 85 | + | 1: | |
| 86 | + | ...; | |
| 87 | + | 2: | |
| 88 | + | ...; | |
| 89 | + | otherwise | |
| 90 | + | ...; | |
| 91 | + | end; | |
| 92 | + | ||
| 93 | + | //Beispiel 2 | |
| 94 | + | case i of | |
| 95 | + | 1: | |
| 96 | + | ...; | |
| 97 | + | 2: | |
| 98 | + | ...; | |
| 99 | + | else | |
| 100 | + | ...; | |
| 101 | + | end; | |
| 102 | + | ``` | |
| 103 | + | ||
| 104 | + | \ | |
| 105 | + | =Fall 2 Bestandteil einer Typdeklaration= Die Caseanweisung in der Typdeklaration erlaubt es den Inhalt des Speicherbereichs auf drei unterschiedliche Weisen auszulesen.\ | |
| 106 | + | \ | |
| 107 | + | Die drei Möglichkeiten sind:\ | |
| 108 | + | * (r,g,b) belegt drei Byte\ | |
| 109 | + | * (ColorArray) belegt drei Byte\ | |
| 110 | + | * (Color) belegt vier Byte\ | |
| 111 | + | \ | |
| 112 | + | Beispiel:\ | |
| 113 | + | ||
| 114 | + | ``` pascal | |
| 115 | + | ... | |
| 116 | + | // Tpydefinition | |
| 117 | + | type | |
| 118 | + | TColorRec = record | |
| 119 | + | case integer of | |
| 120 | + | 1: (r, g, b: byte); // belegt drei Byte | |
| 121 | + | 2: (ColorArray: array[0..2] of byte); // belegt drei Byte | |
| 122 | + | 3: (Color: TColor); // belegt vier Byte | |
| 123 | + | end; | |
| 124 | + | ... | |
| 125 | + | var | |
| 126 | + | // Typzuweisung | |
| 127 | + | // erstellt eine Variable vom Typ TColorRec | |
| 128 | + | Farbe: TColorRec; | |
| 129 | + | ||
| 130 | + | begin | |
| 131 | + | // Typverwendung | |
| 132 | + | // belegt jede der drei Variablen mit einem gültigen Wert | |
| 133 | + | Farbe.r := 255; | |
| 134 | + | Farbe.g := 0; | |
| 135 | + | Farbe.b := 255; | |
| 136 | + | ||
| 137 | + | // Auf diese drei Arten wird der Speicher ausgelesen und jeweils ein Panel gefärbt | |
| 138 | + | // Der Farbwert ist in allen drei Fällen gleich, | |
| 139 | + | // nur die Art wie auf den Speicherinhalt zugegriffen wird unterscheidet sich | |
| 140 | + | Panel1.Color := RGB(Farbe.r, Farbe.g, Farbe.b); | |
| 141 | + | Panel2.Color := RGB(Farbe.ColorArray[0], Farbe.ColorArray[1], Farbe.ColorArray[2]); | |
| 142 | + | Panel3.Color := Farbe.Color; | |
| 143 | + | ... | |
| 144 | + | end; | |
| 145 | + | ``` | |
| 146 | + | ||
| 147 | + | \ | |
| 148 | + | \ | |
| 149 | + | --Olaf 17:49, 19 October 2012 (UTC) | |
| 150 | + | ||
| 151 | + | --- | |
| 152 | + | *From the Free Pascal wiki, page "Case/de", as it stood on 2023-05-10 after a change by Joh, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* | |
| 153 | + | Category: FreePascal/de | |
| 154 | + | Category: Reserved words/de |
