Dr. habil. Bernd Sch¨urmann
Dr. Annette Bieniusa
pinc-support@cs.uni-kl.de
TU Kaiserslautern
Fachbereich Informatik
Ubungsblatt 9: Programmieren in C (WS 2018/19) ¨
Abgabe: Montag, 07.01.19, 12:00
1. Dieses Ubungsblatt ist ein ¨ Pflicht¨ubungsblatt, d.h. Sie m¨ussen bei der Bearbeitung dieses Blattes mind. 50%
der Gesamtpunkte erreichen.
2. Die Abgabe erfolgt ¨uber das Exclaim-System gemeinsam mit Ihrem Teampartner.
3. Zur Beantwortung von Fragen und Hilfestellung bei der Bearbeitung kommen Sie bitte in die w¨ochentliche
Fragestunde, Mittwoch 15:30, in Terminalraum 32-410.
4. Bitte laden Sie einzelne Dateien hoch, wie in der Aufgabenstellung angegeben, keine Archive, keine kompilierten
Dateien.
5. Programme, die nicht kompilieren, werden nicht korrigiert und mit 0 Punkten bewertet.
6. Bitte beachten Sie unsere Regelung bei Plagiaten:
Wenn Sie sekund¨are Quellen, wie B¨ucher oder das Internet verwenden, m¨ussen Sie immer die Quelle
angeben. Das einfache Kopieren aus anderen Quellen ist f¨ur die Ubungen nicht gestattet. Wenn wir ¨
in einer Ubungsabgabe kopierten Code ohne Quellenangabe finden, wird die gesamte Abgabe mit 0 ¨
Punkten bewertet.
Sie k¨onnen Ubungsaufgaben gerne mit den Mitgliedern anderer Teams diskutieren. Sie sollten jedoch ¨
Ihren Code vor der Abgabefrist nicht an andere Teams weitergeben bzw. zeigen.
Wenn Code von anderen Teams kopiert wurde, werden die Abgaben von beiden Teams mit 0 Punkten
bewertet.
Wir behalten uns vor Punkte auch nachtr¨aglich abzuziehen, wenn ein Versto? erst sp¨ater bemerkt wird.
Rettet das Weihnachtsfest!
Bei der Auftaktbesprechung der diesj¨ahrigen Weihnachtssaison verk¨undet der Weihnachtsmann:
“Liebe Weihnachtswichtel, Engel und Elfen! Wir werden dieses Jahr die Planung der Geschenke
und Verarbeitung der Listen mittels neuester Technologie angehen. Wir steigen um von der
Elfen-verarbeitetenden Datenverarbeitung auf die Elektronische Datenverarbeitung!”
Ihre Aufgabe ist es, dem Weihnachtsmann dabei zu unterst¨utzen und Programme zu schreiben,
die die Aufgaben der Wichtel, Engel und Elfen automatisieren.
Aufgabe 1: Durchsuchen der Wunschzettel (10 Punkte)
Die Weihnachtswichtel haben von allen Menschen die Wunschzettel eingesammelt und eingescannt.
Um die Produktion der Geschenke besser planen zu k¨onnen, will der Weihnachtsmann
wissen, auf welchem Wunschzettel ein bestimmtes Geschenk gew¨unscht wurde.
Ziel dieser Aufgabe ist es, ein C-Programm zu schreiben, das einen gegebenen Suchtext in
einem Eingabetext finden kann und alle Zeilen des Eingabetexts ausgibt, welche den Suchtext
enthalten.
a) Laden Sie von der Vorlesungshomepage die Vorlage wunschzettel.c herunter und erg¨anzen
Sie diese wie in den n¨achsten Schritten beschrieben.
b) Schreiben Sie eine Funktion:
bool contains(char *search, int searchSize, char *input, int inputSize).
Die Funktion nimmt einen Suchtext search der L¨ange searchSize und einen Eingabetext
input der L¨ange inputSize. Die Funktion soll true zur¨uckgeben, wenn der gesuchte Text im
Eingabe-Text vorkommt und ansonsten false.
Verwenden Sie keine Funktionen aus der C-Bibliothek f¨ur diese Aufgabe.
c) Schreiben Sie eine main-Funktion f¨ur Ihr Programm, welches einen Suchtext als ProgrammParameter
nimmt und die Standard-Eingabe nach Vorkommen des Suchstrings durchsucht.
Die Zeilen der Eingabe, welche den Suchtext enthalten, sollen zusammen mit ihrer Zeilennummer
ausgegeben werden. Dabei soll zuerst die Zeilennummer ausgegeben werden, dann
ein Leerzeichen und dann der Text der Zeile.
F¨ur das zeilenweise Lesen der Eingabe (Wunschzettel) verwenden Sie die Funktion char
*fgets(char *s, int n, FILE *stream). Diese Funktion nimmt einen Buffer s der Gr¨o?e n
und einen Eingabe-Strom. Wenn Sie stdin als Eingabe-Strom verwenden, wird von der
Standardeingabe gelesen. Die Funktion liest bis eine neue Zeile startet, das Ende des Stroms
erreicht ist oder die maximale L¨ange n-1 erreicht ist. R¨uckgabe der Funktion ist s, falls das
Einlesen erfolgreich war und NULL falls das Ende des Stroms erreicht wurde oder ein Fehler
auftritt. Zeilenumbr¨uche am Ende der Zeile werden in s beibehalten. Der eingelesene
String endet jeweils mit einem ‘\0‘-Zeichen. Verwenden Sie zum Einlesen einen Buffer der
Gr¨o?e 1024. L¨angere Zeilen m¨ussen nicht korrekt behandelt werden, sollten aber nicht zu
undefinierten Verhalten f¨uhren.
Beispiel
Programmparameter: Schoko
Eingabe: Ausgabe:
Apfel, Nuss und Mandeln
Autoparkgarage und Schoko
Feuerwehrauto
Schokoladenlinsen
Filzpantoffel
2 Autoparkgarage und Schoko
4 Schokoladenlinsen
Aufgabe 2: Die fleitigsten Studierenden (10 Punkte)
Die Engel haben das Jahr Aufzeichnungen angefertigt, wer brav war und eine Liste aller
Studierenden ermittelt, die regelm¨a?ig an den Ubungen teilgenommen haben. Um die Auszeich- ¨
nung “Fleitigster Studi 2018” zu vergeben, ben¨otigt der Weihnachtsmann f¨ur jeden Studiengang
die Person mit der h¨ochsten Punktzahl auf den gesamten Ubungsbl¨attern. ¨
Ihre Aufgabe ist es ein Programm zu schreiben, das aus der Liste der Engel den fleitigsten
Studierenden ermittelt und ausgibt.
a) Laden Sie von der Vorlesungshomepage die Vorlage studis.c herunter und erg¨anzen Sie
diese wie in den n¨achsten Schritten beschrieben.
b) Modellieren Sie einen Studierenden als einen struct Studi mit folgenden Strukturvariablen:
Name mit max. 20 Zeichen als String (name)
Punktezahl als Integer (punkte)
Studiengang als Wert eines enum Fach {EIT, INF, MATH} (studiengang)
c) In der Vorlage finden Sie eine Funktion void init(struct Studi *s, char *eingabe) , die die Informationen
aus dem String eingabe nimmt und in die Struktur s eintr¨agt. Beschreiben Sie
(als Kommentar) die Funktionsweise von init; d.h. die einzelnen Schritte sowie die Verwendung
von strtok. Erl¨autern Sie anhand von "Michael Meier,34,INF", wie sich der Eingabestring
eingabe durch Aufruf der Funktion init ver¨andert.
d) Schreiben Sie eine Funktion void busyStudi(Studi* studis, int n, Fach f) die aus einem Array
von n Studierenden-Eintr¨agen den Namen des Studierenden mit der h¨ochsten Punktzahl aus
einer Fachrichtung f ermittelt und ausgibt.
e) Schreiben Sie eine main-Funktion, die wie in Aufgabe 1 oben beschrieben, die zun¨achst die
Daten der Studierenden zeilenweise einliest und ein Array von Strukturen des Studi f¨ullt.
Die Eingabe soll dabei max. 100 Eintr¨age enthalten. Die Ausgabe des Programms soll den
Namen des fleitigsten Studis des Fachbereichs EIT beinhalten.
Beispiel:
Eingabe: Ausgabe:
Michael Maier,12,INF
Marja Martin,56,EIT
Berta Bubble,23,INF
Karl Klein,34,EIT
Ulli Schmitt,87,MATH
Yan Ying,34,EIT
Fleissigster Studi der EIT: Marja Martin
Aufgabe 3: Die Elfen und die Weihnachtsfeier (5 Punkte)
Die Elfen Anton, Berta, Claus und Doris freuen sich schon alle riesig auf das grotie Weihnachtsfest
im Weihnachtsdorf. Beim Aufstellen des Tannenbaums kommt es aber zum grotien Streit
unter den Elfen: Steht der Baum gerade oder nicht? Der Baum wird k¨urzer und k¨urzer ges¨agt,
bis schlie?lich nur noch wenige Nadeln ¨ubrig bleiben. Dem Weihnachtsmann platzt der Kragen:
“Zur Strafe d¨urft ihr dieses Jahr nicht mitfeiern!” In einer gemeinsamen Diskussion kann man
sich schlie?lich auf die folgenden Grunds¨atze verst¨andigen:
Mindestens ein Elf geht zu der Feier.
Anton geht auf keinen Fall zusammen mit Doris.
Wenn Berta geht, dann geht Claus mit.
Wenn Anton und Claus gehen, dann bleibt Berta zu Hause.
Wenn Anton zu Hause bleibt, dann geht entweder(!) Doris oder Claus (aber nicht beide).
Helfen Sie den Elfen, in dem Sie ein Programm schreiben, dass alle erlaubten Konstellationen
ermittelt, in denen die Elfen am Fest teilnehmen k¨onnen. Die Ausgabe des Programs soll
pro Zeile eine erlaubte Konstellation sein, wobei die Namen der teilnehmenden Elfen immer
aufsteigend sortiert ausgegeben werden sollen. Auf der Vorlesungshomepage finden Sie eine
entsprechende Vorlage party.c.
Aufgabe 4: Ein toller Start ins Neue Jahr! (10 Punkte)
Das Mondprogramm der Volksrepublik China plant am Freitag, den 07.12.2018, die Sonde
“Chang’e 4” zu starten, die auf der R¨uckseite des Mondes landen soll und die bislang wenig
erforschte Gegend zu untersuchen. Sie wurden ausgew¨ahlt f¨ur diese wichtige Mission eine Programm
zu entwickeln, die es erlaubt verschiedene Szenarien bei der Landung zu simulieren.
Nehmen Sie an, die Landef¨ahre befindet sich in 50 km H¨ohe ¨uber der Mondoberfl¨ache und hat
eine Abw¨artsgeschwindigkeit von derzeit 3.600km/Std = 1.000m/s. Wenn Sie keinen Schub
geben, so werden Sie mit 1, 63m/s2 vom Mond angezogen. Die Antriebe Ihrer Landef¨ahre
verm¨ogen bei vollem Schub jedoch eine Gegenbeschleunigung von 12m/s2
zu erzeugen und
verbrauchen dabei pro Sekunde 100 Liter Treibstoff. Anfangs verf¨ugen Sie ¨uber 10000 Liter
Treibstoff. Ihre Landef¨ahre kann eine Aufsetzgeschwindigkeit von 10m/s aushalten, ansonsten
ist das Landeman¨over gescheitert.
Es gelten folgende Formeln:
a = aMond + aSchub
v = v0 + a t
s = v0 t + 0.5at2
Dabei bezeichnet v die Geschwindigkeit, a die Beschleunigung und t die Zeit. Die Beschleunigungen
durch die Mondanziehung aMond und die Triebwerke aSchub addieren sich, wobei auf
die Richtung zu achten ist. Der erste Term in der Gleichung f¨ur s berechnet die zur¨uckgelegte
Wegstrecke bei konstanter Geschwindigkeit, der zweite Term die zus¨atzlich zur¨uckgelegte Wegstrecke
aufgrund der Beschleunigung.
Entwickeln Sie eine einfache Simulation einer Mondlandung und gehen Sie dazu wie folgt vor:
a) Definieren Sie die in der Aufgabenstellung angegebenen Werte als symbolische Pr¨aprozessorkonstanten.
b) Definieren Sie einen Struktur-Datentyp sim_daten, der die notwendigen Simulationsdaten
(Simulationszeit, H¨ohe, Geschwindigkeit, Treibstoff) zusammenfasst.
c) Implementieren Sie eine Funktion void init(struct sim_daten *data), die die Komponenten
von data mit den Pr¨aprozessorkonstanten initialisiert.
d) Implementieren Sie eine Funktion void ausgabe(struct sim_daten *data), die die Komponenten
von data strukturiert ausgibt.
e) Implementieren Sie eine Funktion, die einen Simulationsschritt berechnet und die Komponenten
von data aktualisiert:
void simulations_schritt(struct sim_daten *data, bool bremsschschub)
Der Parameter bremsschub gibt an, ob im aktuellen Simulationsschritt die Bremstriebwerke
z¨unden. Ein Simulationsschritt hat eine Dauer von 1s.
f) Implementieren Sie schlie?lich eine main-Funktion. Diese besteht aus einer Schleife, die
von der Kommandozeile einliest, ob im n¨achsten Simulationsschritt gebremst werden soll
(Eingabe: ’y’/’n’) und dann entsprechend die Funktionen simulations_schritt aufruft. Die
Schleife wird abgebrochen, wenn entweder ’q’ eingegeben wird oder die Sonde auf dem Mond
aufgekommen ist.
g) Zum Abschluss ist auszugeben, ob der Landeversuch erfolgreich war oder scheiterte.
Beispiel:
Eingabe:
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
Ausgabe:
Die Sonde ist auf dem Mond zerschellt!
Zeit: 49 s
Hoehe: -956.8 m
Geschwindigkeit: 1079.9 m/s
Treibstoff: 10000.0 l
Hinweis:
Die Ausgabe der Simulationsdaten soll mit 8 Vor- und 1 Nachkommastelle erfolgen.
Die Angabe der Zeit ist als ganze Zahl gegeben.
Bei erfolgreicher Landung ist der Ausgabetext: Die Sonde ist erfolgreich auf dem Mond
gelandet!
Bei missgl¨uckter Landung ist der Ausgabetext: Die Sonde ist auf dem Mond zerschellt!
Bei Abbruch der Simulation soll ausgegeben werden: Die Simulation wurde abgebrochen.
版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。