Dr. habil. Bernd Schu ̈rmann TU Kaiserslautern
Dr. Annette Bieniusa pinc-support@cs.uni-kl.de
Fachbereich Informatik
U ̈bungsblatt 13: Programmieren in C (WS 2018/19)
Abgabe: Montag, 04.02.19, 12:00
1. Die Aufgaben auf diesem U ̈bungsblatt sind alle freiwillig zu bearbeiten. Falls Sie bei Blatt 11 die n ̈otige Punktzahl nicht erreicht haben, k ̈onnen Sie die fehlenden Punkte hier nachholen. Bei Fragen wenden Sie sich bitte direkt an pinc-support@cs.uni-kl.de.
2. Die Abgabe erfolgt u ̈ber 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. BitteladenSieeinzelneDateienhoch,wieinderAufgabenstellungangegeben,keineArchive,keinekompilierten Dateien.
5. Bitte beachten Sie unsere Regelung bei Plagiaten:
• Wenn Sie sekund ̈are Quellen, wie Bu ̈cher oder das Internet verwenden, mu ̈ssen Sie immer die Quelle
angeben. Das einfache Kopieren aus anderen Quellen ist fu ̈r die U ̈bungen nicht gestattet. Wenn wir in einer U ̈bungsabgabe kopierten Code ohne Quellenangabe finden, wird die gesamte Abgabe mit 0 Punkten bewertet.
• Sie k ̈onnen U ̈bungsaufgaben 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.
Aufgabe 1: Programmverst ̈andnis (5 Punkte)
Gegeben sind die folgenden C-Strukturen zur Darstellung von einfach verketteten Listen:
typedef struct node node_t; struct node {
int value;
node_t *next; };
typedef struct list list_t; struct list {
node_t *first; };
Erkl ̈aren Sie, was die folgende C-Funktion f macht. Verwenden Sie dazu die Eingabeliste mit den Elementen 1, 5, 6, 3 und zeichnen Sie den Zustand der Liste nach Ausfu ̈hren der Funktion. Der Zustand vor der Ausfu ̈hrung der Schleife ist unten bereits vorgegeben.
node_t * f(list_t *ll) { node_t *p;
node_t *tmp;
if (ll->first == NULL) { return;
}
p = ll->first;
if (p->next == NULL) {
ll->first = NULL; } else {
while (p->next ->next != NULL) { p = p->next;
}
tmp = p->next;
p->next = p->next->next; p = tmp;
}
return p; }
1
5
6
3
first:
p:
Texteditor (Teil 3)
Dieses Aufgabenblatt erweitert den in den vorangegangenen U ̈bungen entwickelten Texteditor. Sie k ̈onnen fu ̈r diese Aufgabe entweder Ihren eigenen Code verwenden oder eine entsprechende Vorlage von der Webseite der Vorlesung herunterladen.
Aufgabe 2: Suchen und Ersetzen (5 Punkte)
Erweitern Sie Ihren Editor um eine Funktion zum Suchen und Ersetzen von Texten : c/
Text
Achtung: Dazu muss die Funktion next_command entsprechend erweitert werden! Verwenden Sie zur Implementierung der Kommandos nach M ̈oglichkeit Funktionen der String-Bibliothek (z.B. strcmp, strcpy, memmove). Das Suchen von
Hinweis: Beachten Sie, dass sich die Zeilenl ̈ange durch die Textersetzung ̈andern kann. In diesem Fall muss bei der Variante des Editors mit dynamischer Speicherverwaltung (siehe Blatt 12) der Speicherbereich fu ̈r eine Zeile durch realloc so vergr ̈oßert oder verkleinert werden, dass der ge ̈anderte Text genau hineinpasst. Achten Sie hierbei darauf, dass das Endezeichen der Zeile ’\0’ korrekt verarbeitet wird.
Aufgabe 3: Funktionspointer: Unterschiedliche Eingabeformate (10 Punkte)
Neben den bisher verwendeten Editor-Kommandos sollen jetzt auch Kommandos in einer Lang- form erlaubt sein:
change “
delete
insert
print bzw. print
quit
reset
search “
Nennen Sie die bisherige Funktion next_command in next_command_short um und implementieren Sie eine weitere Funktion next_command_long, die das hier angegebene Kommandoformat einliest.
Im Hauptprogramm soll eine neue Funktion void read_command (
Zur Erinnerung: Die main-Funktion hat in C eigentlich folgende Schnittstelle: int main(int argc, char *argv[])
Der erste Parameter argc liefert die Anzahl der beim Programmaufruf mit u ̈bergebenen Param- eter. Der zweite Parameter argv ist eine Liste von Texten, bei denen der erste Text (argv[0]) den Programmnamen enth ̈alt und alle weiteren Texte die Aufrufparameter. Beim Aufruf mu ̈ssen die Parameter immer durch mindestens ein Leerzeichen getrennt sein. Rufen Sie Ihr Programm mit einem Argument ’s’ (→ Kurzform) bzw. ’l’ (→ Langform) auf. Abh ̈angig von diesem Wert wird der o.g. Funktion read_command entweder die Funktion next_command_short oder next_command_long u ̈bergeben.
Aufgabe 4: Ein-/Ausgabe in Dateien (15 Punkte)
Der Editor soll um zwei Kommandos ’w/
void read_from_file (char* filename); void print_to_file (char* filename);
Vergessen Sie hierbei nicht, die Module command, main und error handling geeignet zu erweit- ern.
Aufgabe 5: Bitmaske (5 Punkte)
Die Verwendung von Bitmasken soll exemplarisch anhand der Suchfunktion geu ̈bt werden. In vielen F ̈allen funktioniert eine Suche unabh ̈angig von Klein-und Großbuchstaben. Sie k ̈onnen den Vergleich der Buchstaben ’A/a’ bis ’Z/z’ elegant unabh ̈angig von der Groß- und Klein- schreibung durchfu ̈hren, indem Sie geschickt Bits der ASCII-Zeichenkodierung maskieren.
Schreiben Sie Ihre Suchfunktion so um, dass die Buchstaben mit Hilfe von Bitmasken un- abh ̈angig von Groß- und Kleinschreibweise verglichen werden.
Projektideen fu ̈r den Editor: GUI
Falls Sie Ihren Texteditor weiter ausbauen wollen, k ̈onnen Sie Ihn beispielsweise um eine graphis- che Benutzeroberfl ̈ache (Graphical User Interface, GUI) erweitern. Hierzu bietet es sich an die Bibliothek GTK (https://www.gtk.org) zu verwenden. GTK erm ̈oglicht es moderne GUIs fu ̈r Anwendungen fu ̈r verschiedene Betriebssysteme zu entwickeln. Dazu werden verschiedene Kom- ponenten zur Verfu ̈gung gestellt, die geeignet konfiguriert und programmiert werden mu ̈ssen.
Ein Beispiel zur Verwendung dieser Bibliothek um einen Editor zu entwickeln finden Sie hier:
https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.5