![]() |
Programmieren in Cvon Prof. Dr. Rainer Thomas |
Erstellen Sie ein ANSI-C-Programm, daß folgende Ein- und Ausgaben durch-
führt (s. untenstehendes Beispiel eines Musterlaufs):
Alle Programmausgaben müssen dem nachfolgenden Beispiel entsprechen :
G:\>e:auf1
Zeichen ? f
Integer-Zahl ? 2468
Double-Zahl ? 326.109
Ausgabe der eingegebenen Werte :
'f' : 102 $66 @146
2468 |000000002468
326.109000 3.26109000e+02
Ausgabe einiger Gleitpunkt-Grenzwerte :
FLT_MIN : x...
: x...
FLT_MAX : x...
: x...
DBL_MAX : x...
G:\>
Bei vielen Rechnersystemen/Terminals existieren spezielle Steuersequenzen
zur Steuerung der Bildschirmausgabe.
Eine Ausgabe dieser Steuersequenzen führt nicht zur direkten Ausgabe der
darin enthaltenen Zeichen sondern bewirkt eine Bildschirmsteuerung.
Diese Steuersequenzen können für unterschiedliche Systeme unterschiedlich
sein.
Beispielsweise gelten für den IBM-PC (bei geladenem ANSI-Treiber) die ANSI-
Steuersequenzen und für den Atari die VT52-Steuersequenzen :
| ANSI (IBM-PC) | VT52 (ATARI) | |
|---|---|---|
| Clear Screen (u. Cursor Home) | <ESC> [ 2 J | <ESC> E |
| absolute Cursor-Positionierung | <ESC> [ Zn;Sn f
|
<ESC> Y Zx Sx
|
| Zn Zeilennummer (1..25) | Zx = (char)(Zn + 31) | |
| Sn Spaltennumm. (1..80) | Sx = (char)(Sn + 31) |
<ESC> ist das ASCII-Steuerzeichen mit dem sedizimalen Zeichencode $1B
FFFF H H
F H H
FFFF HHHH
F H H
F H H
FH MUENCHEN
Nach Drücken der <RETURN>-Taste soll der Bildschirm wieder gelöscht und das Programm beendet werden.
Die Portabilität ist durch - mittels geeigneter Preprozessoranweisungen realisierbare - Definition der Makros
| CLS | (Löschen des Bildschirms und Cursor Home) |
| POS(x, y) | (Cursor zu Spalte x und Zeile y) |
Als Unterscheidungskriterium soll die nur beim ATARI-PURE-C-Compiler definierte Konstante __PUREC__ (=1) dienen.
Ein über die Standardeingabe einzugebender Text soll analysiert werden.
Erstellen Sie ein ANSI-C-Programm, mit dem
Unter einem Wort sei dabei jede Zeichenfolge, die mit einem Buchstaben
oder Underscore ('_') beginnt, nur aus Buchstaben, Ziffern und dem Underscore
besteht und von beliebigen Steuer- oder Sonder-Zeichen (nicht aber Ziffern)
begrenzt wird, verstanden.
Beachten Sie, daß nach dieser Definition z. B. die Zeichenfolge ;2abc%
kein Wort enthält.
| BU | (Groß- u. Kleinbuchstaben, Underscore) |
| ZIFF | (Ziffern) |
| SONST | (restliche Zeichen, d.h. Steuerzeichen und sonstige Sonderzeichen) |
| PRE_WORT | (nächstes Zeichen kann Anfang eines Wortes sein) |
| IN_WORT | (innerhalb eines Wortes) |
| NO_WORT | (innerhalb einer Zeichenfolge, die kein Wort ist, nächstes Zeichen kann nicht Anfang eines Wortes sein) |
Erstellen Sie ein ANSI-C-Programm, mit dem ein Histogramm der Wortlänge
eines über die Standardeingabe eingegebenen Textes ermittelt und in
folgender Form auf dem Bildschirm ausgegeben werden kann:
H i s t o g r a m m der Wortlänge eines Textes
-----------------------------------------------
*
* *
* * *
* * *
* * *
* * *
* * *
* * *
* * * * *
* * * * * *
* * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * *
---------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Unter einem Wort sei hier jede Zeichenfolge, die mit einem Buchstaben
oder Underscore ('_') beginnt, nur aus Buchstaben, Ziffern und dem Underscore
besteht und von beliebigen Steuer- oder Sonder-Zeichen (nicht aber Ziffern)
begrenzt wird, verstanden.
Beachten Sie, daß nach dieser Definition z. B. die Zeichenfolge ;3abc%
kein Wort enthält.
Die Anzahl der Sternchen soll gleich der Anzahl der Auftritte eines Worts
der entsprechenden Länge sein.
Alle Worte, die größer gleich 25 Zeichen lang sind, sollen dabei zu einer
Gruppe zusammengefaßt werden.
Damit die gesamte Bildschirmausgabe sichtbar ist, ist bei Wortlängen, deren Auftritte die Anzahl 20 überschreitet die Ausgabe auf 19 Sternchen zu begrenzen und an der Position des 20. (obersten) Sternchens die tatsächliche Anzahl der Auftritte auszugeben.
| - Index, | den das erste Zeichen von str1 in str2 innehat, wenn str1 vollständig in str2 enthalten ist (erster Index : 0) |
| - -1, | wenn str1 nicht "vollständig" (oder garnicht) in str2 enthalten ist. |
| - Stringlänge, | wenn die Eingabe mit <RET> abgeschlossen wurde |
| - EOF, | wenn die Eingabe mit CTRL-Z abgeschlossen wurde |
| - | bei Enthaltensein den Index des ersten Auftritts des Suchstrings im Zielstring |
| - | bzw. bei Nicht-Enthaltensein die Meldung "Nicht enthalten !" |
Entwickeln Sie ein ANSI-C-Programm, das auf die Eingabe von Abkürzungsbezeichnungen
für die - deutschen - Wochentage mit der Ausgabe des vollen - englischen - Namens
der Wochentage reagiert.
Geben Sie die Abkürzung eines Wochentages ein :
? mon
--> Monday
? mo
--> No_day
? Dienstag
--> Tuesday
? ^Z
| int get_mstr(int m, char s[]) | Einlesen eines Strings der maximalen
Länge m in die Variable s (von stdin),
Überlesen eventueller weiterer Zeichen
bis zum Zeilenende.
|
| void up_str(char s[]) | Umwandlung aller Klein-Buchstaben im String s in Großbuchstaben |
Zur eigentlichen Ermittlung des vollen englischen Namens aus der deutschen Abkürzung sind eine oder zwei weitere geeignete Funktionen zu definieren und einzusetzen.
Erstellen Sie ein ANSI-C-Programm, mit dem über die Tastatur eingegebene
arithmetische Ausdrücke ausgewertet werden (Taschenrechner !).
Beispiel:
Das Programm soll in einer Schleife fortwährend die Eingabe eines Ausdrucks
anfordern, diesen einlesen, auswerten und das Ergebnis am Bildschirm ausgeben.
Es soll enden, wenn an beliebiger Stelle ein Dateiendezeichen (CTRL_Z)
eingegeben wird.
Auf die Eingabe eines fehlerhaften Ausdrucks sowie eines Nenners mit dem Wert
"0" soll das Programm mit der Ausgabe einer entsprechenden Fehlermeldung
statt eines Ergebnisses reagieren.
Dabei sollen folgende Fehlermeldungen unterschieden werden :
Hinweise :
Ausdruck ::== Term { +Term || -Term }
Term ::== Faktor { *Faktor || /Faktor }
Faktor ::== Zahl || (Ausdruck)
Zahl ::== [-] Ziffer{Ziffer}[.{Ziffer}]
Erstellen Sie ein Programm mit dem maximal 1000 Strings der maximalen
Länge 136 alphabetisch sortiert werden können, wobei große
und kleine Buchstaben jeweils als gleich betrachtet werden sollen.
Verwenden Sie zum Sortieren den Quick-Sort-Algorithmus.
Durch Angabe von "auf" bzw. "ab" in der
Kommandozeile soll beim Programmaufruf bestimmt werden, ob aufsteigend oder
absteigend sortiert wird.
Wird kein oder kein zulässiger Kommandozeilenparameter angegeben, so ist
aufsteigend zu sortieren.
Die zu sortierenden Strings sind von stdin einzulesen.
Die sortierten Strings sind nach stdout auszugeben.
Hinweise :
| str_feld_ein(.....) | Einlesen der Strings |
| str_feld_sort(.....) | Sortieren der Strings |
| str_feld_aus(.....) | Ausgabe der Strings |
In der Funktion main() dürfen nach der Ermittlung der Sortierrichtung im wesentlichen nur diese drei Funktionen aufgerufen werden.
In einer Datei, deren Name wechseln kann, befinden sich eine nicht bekannte
Anzahl unsortierter "double"-Werte in maschineninterner
Darstellung.
Erstellen Sie ein ANSI-C-Programm, mit dem die Werte gelesen und intern in einer binären Baumstruktur aufsteigend sortiert gespeichert werden.
Anschliessend ist die sortierte Wertefolge auf den Maximalwert normiert
in eine Textdatei - pro Zeile ein Wert - auszugeben.
Der Name der Textdatei soll ebenfalls variabel sein.
Am Bildschirm sind die Anzahl der gelesenen Werte, der Maximalwert und der Minimalwert (jeweils unnormiert) auszugeben.
Die Namen der Eingabe-(Double-Werte-)Datei und der Ausgabe-(Text-)Datei
sind als Kommandozeilenparameter zu übergeben.
Wird nur ein oder kein Kommandozeilenparameter übergeben, so ist daß
Programm mit einem Hinweis auf das richtige Aufrufformat zu beenden.
Kann die Eingabedatei nicht geöffnet werden (z.B. weil sie nicht existiert) oder kann die Ausgabedatei nicht geöffnet werden, so ist das Programm mit der Ausgabe eines entsprechenden Hinweises, der den Dateinamen enthalten muß, zu beenden.
Für Testzwecke wird eine geeignete Datei mit den "double"-Werten zur Verfügung gestellt.
Hinweise :
| dwerte_ein(.....) | Einlesen und sortiertes Abspeichern der double-Werte |
| dwerte_aus(.....) | Ausgabe der normierten double-Werte in Textdatei |
| display_info(.....) | Ausgabe der am Bildschirm über die eingelesenen Zahlen auszugebende Information |
Diese Funktionen können gegebenenfalls weitere zu definierende Funktionen aufrufen.
Erstellen Sie ein C-Programm DUMP mit dem der Inhalt einer beliebigen
Datei sedezimal und in ASCII-Interpretation am Bildschirm ausgegeben
werden kann (siehe untenstehende Darstellung ). Dabei sind Steuerzeichen
und Zeichen mit einem Code >=$80 in der ASCII-Interpretation als Punkt
darzustellen.
Der Name der Datei ist als Kommandozeilenparameter zu übergeben.
Bei Fehlen dieser Angabe ist durch das Programm nach dem Dateinamen
zu fragen.
Kann die angegebene Datei nicht geöffnet werden, so ist das Programm mit
der Ausgabe eines entsprechenden Hinweises zu beenden.
Der Dump ist seitenweise (jeweils 16 Zeilen zu je 16 Bytes) durchzuführen. Nach der Darstellung einer Seite soll jeweils wie folgt fortgefahren werden: Bei Eingabe von
| '+' oder <RETURN> | : Darstellung der nächsten Seite |
| '-', 'b' oder 'B' | : Darstellung der vorhergehenden Seite |
| 'q' oder 'Q' | : Beendigung des Programms |
Nach der Darstellung der letzten - eventuell nicht mehr vollständigen - Seite soll das Programm n i c h t automatisch beendet werden (sondern erst nach Eingabe von 'q' bzw 'Q').
Hinweis zur Lösung :
Beispiel für die Ausgabe des Programms DUMP :
Dumping File *** c:display.com *** (11053 Bytes)
Adresse 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
00000000 : E9 51 29 90 90 CD AB 43 6F 70 79 72 69 67 68 74 .Q)....Copyright
00000010 : 20 28 43 29 20 31 39 38 35 20 42 4F 52 4C 41 4E (C) 1985 BORLAN
00000020 : 44 20 49 6E 63 02 08 00 20 54 00 1E 30 00 00 00 D Inc... T..0...
00000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000050 : 00 00 00 00 00 0C 53 69 65 6D 65 6E 73 20 50 43 ......Siemens PC
00000060 : 2D 44 73 65 6C 65 63 74 65 64 50 19 00 04 1B 5B -DselectedP....[
00000070 : 30 6D 00 00 00 00 00 00 00 00 00 00 00 04 1B 5B 0m.............[
00000080 : 30 6D 00 00 00 00 00 00 00 00 00 00 00 08 1B 5B 0m.............[
00000090 : 30 30 3B 30 30 48 30 48 00 00 00 00 00 00 01 01 00;00H0H........
000000A0 : 07 04 00 00 04 1B 5B 32 4A 00 03 1B 5B 66 00 00 ......[2J...[f..
000000B0 : 04 1B 5B 31 4C 00 04 1B 5B 31 4D 00 00 00 03 1B ..[1L...[1M.....
000000C0 : 5B 4B 00 00 04 1B 5B 30 6D 00 04 1B 5B 32 6D 00 [K....[0m...[2m.
000000D0 : 00 00 08 1B 5B 32 35 3B 30 31 48 30 48 00 00 00 ....[25;01H0H...
000000E0 : 00 00 2E 8A 27 0A E4 F9 74 0E 43 2E 8A 07 50 E8 ....'...t.C...P.
000000F0 : 4C 05 58 FE CC 75 F3 F8 C3 8B D8 43 4B 75 01 C3 L.X..u.....CKu..
Adresse 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
Weiter mit <+> o. <RETURN> Zurueck mit <-> o. <B> Abbruch mit <Q>
Zum Inhaltsverzeichnis |
Zum nächsten Abschnitt |