Prof. Dr. Ulrich Breitschuh Hochschule Anhalt(FH) Fachbereich Informatik Aufgaben zur C-Programmierung für die Praktikumsperiode des 1.Semesters Hinweis: Die Aufgaben 3, 6 und 8 sind testatpichtige Aufgaben. Beachten Sie in diesem Zusammenhang die jeweiligen Abgabetermine.
Aufgaben für den 1. Praktikumstag Aufgabe 1: Zum Sortieren von Vektoren wird in den Bibliotheken der C-Compiler die Funktion qsort bereitgestellt. Diese Funktion sortiert die Elemente des Feldes in fallender Folge. Die Sortierfunktion kann folgenden Prototyp besitzen: void qsort (void *base,int num,int width, int (*compare)(const void *elmt1,const void *elmt2)) Die Parameter haben folgende Bedeutung: base void* Anfangsadresse des Feldes num int Zahl der Feldelemente width int Gröÿe der einzelnen Feldelemente in Byte compare Sortierfunktion In der Sortierfunktion compare wird das Kriterium für das Sortieren festgelegt. Zum Sortieren von ganzen Zahlen muÿ diese Funktion den folgenden Aufbau besitzen: int compare(const void *elmt1,const void *elmt2) { int *e1=(int *)elmt1; int *e2=(int *)elmt2; return *e1-*e2; } Für das Ergebnis der Sortierfunktion gelten folgende Festlegungen: Ergebnis negativ Null positiv Bedingung elmt1 kleiner als elmt2 elmt1 gleich elmt2 elmt1 gröÿer als elmt2 Verwenden Sie die Funktion qsort zum Sortieren eines Feldes von ganzen Zahlen in aufsteigender Folge. Testen Sie dabei das Sortieren eines kleinen Feldes mit eigenen Daten.
Aufgabe 2: Schreiben Sie eine C-Funktion dsort zum Sortieren eines Feldes eines beliebigen Datentyps unter Verwendung des Verfahrens des direkten Austauschs. Diese Funktion soll den gleichen Prototyp void dsort (void *base,int num,int width, int (*compare)(const void *elmt1,const void *elmt2)) besitzen, wie in der Aufgabe 1 beschriebene Standardfunktion qsort. In diesem Verfahren wird im gesamten Feld das kleinste Element gesucht und in die erste Position getauscht. Dann wird das verbleibende Feld wieder nach dem kleinsten Element durchsucht und getauscht. usw. Testen Sie diese Funktion mit dem gleichen Beispiel, wie in Aufgabe 1.
Aufgabe 3: Endabgabetermin: 12.01.2012 Vergleichen Sie das Rechenzeitverhalten dieser beiden Sortierverfahren beim Sortieren groÿer Felder. Erzeugen Sie dazu Felder ganzer Zahlen, die durch den Zufallszahlengenerator erzeugt werden. Dieser wird mit dem Befehl rand(); aufgerufen. Für die bessere Lesbarkeit der erzeugten Ausgaben ist es möglich den Zahlenbereich der Zufallszahlen mittels rand()%1000; z.b. auf den Bereich von 0 bis 999 zu begrenzen. Es ist auch möglich den Zufallszahlengenerator zu initialisieren, damit unterschiedliche Zahlenfolgen sortiert werden können, das kann unter Verwendung der Sekundenbruchteil der aktuellen Uhrzeit erreicht werden. Dazu muÿ folgende Anweisungsfolge im Programm enthalten sein: struct timeb tm; ftime(&tm); srand(tm.millitm); Es muÿ noch die nachfolgende Headerdatei eingebunden werden: #include<sys/timeb.h> Betrachten Sie dazu das Rechenzeitverhalten bei dsort für Vektoren mit 10000, 20000 und 40000 Elementen bzw. bei qsort für Vektoren mit 1000000, 2000000 und 4000000 Elementen. Dazu kann die Funktion ZeitDierenz, die in zeiten.c bereitgestellt wird verwendet werden. Die dazugehörigen Prototypen sind in zeiten.h festgelegt. Beide Quelltexte benden sich in meinem Downloadbereich.
Aufgaben für den 2. Praktikumstag Aufgabe 4: Schreiben Sie zwei Funktionen strrchr und strrstr, die nach dem letzten auftreten eines Zeichens bzw. einer Teilzeichenkette innerhalb einer vorgegebenen Zeichenkette suchen. Diese Funktionen sollen folgenden Protoypen besitzen: char* strrchr(char*,char); char* strrstr(char*,char*); Als Ergebnis sollen diese Funktionen den Zeiger auf das letzte Auftreten des vorgegebenen Objektes liefern. Falls keine Übereinstimmung gefunden wurde, soll der NULL-Zeiger zurückgeliefert werden.
Aufgabe 5: Schreiben Sie eine Funktion str2int, die eine Zeichenkette in eine nichtnegative ganze Zahl konvertiert. Diese Funktion soll folgenden Prototyp besitzen: int str2int(char* kette,int basis); Der Parameter basis ist Basis der Zahlendarstellung der Zahl in der Zeichenkette. Die Basis soll Werte zwischen 2 und 16 annehmen können. Zur Darstellung der Ziern sind die numerischen Ziern zugelassen und die Buchstaben a-f. Wenn ein Fehler beider Konvertierung auftritt, soll der Wert 1 als Ergebnis geliefert werden. Beispiel: Der Funktionsaufruf str2int("3a",12) soll das Ergebnis 46 liefern.
Aufgabe 6: Endabgabetermin: 19.01.2012 Schreiben Sie ein C-Programm, welches den Text einer Kopfzeile von C- Funktionen analysiert. Der Text der Kopfzeile soll als Zeichenkette eingegeben werden und untersucht werden. Als Ergebnis soll das Programm den Namen der Funktion, die Zahl der Parameter und die Parameternamen bestimmen. Beispiel: Für den Funktionsaufruf soll folgende Ausgabe erzeugt werden: Name der Funktion: funk 1.Parameter: a1 2.Parameter: b1 3.Parameter: u Zahl der Parameter: 3 Hinweis: funk(a1,b1,u) Da die Funktion scanf als Datentrennzeichen das Leerzeichen verwendet, eignet sich diese Funktion nicht zum Eingeben von Zeichenketten, welche auch Leerzeichen enthalten dürfen. Deshalb soll die Funktion gets verwendet werden, die eine Eingabezeile in eine Zeichenkette schreibt.
Aufgaben für den 3. Praktikumstag Aufgabe 7: Schreiben Sie ein C-Programm zur Eingabe von Informationen über Buchtitel. Für jedes Buch soll der Nachname und der Vorname des Autor sowie der Titel des Buches verwaltet werden. Diese Information sollen als lineare Liste gespeichert werden. Dazu kann folgende Struktur benutzt werden: typedef struct _buch { char Nachname[31]; char Vorname[31]; char Titel[81]: struct _buch *Nf; } Buch; Das Programm soll diese Liste durch Eingabe aufbauen und dann in einer binären Datei abspeichern. Informieren Sie sich dazu über die Arbeitsweise der Funktionen fwirte bzw. fread zur binären Ein- bzw. Ausgabe von Speicherblöcken. Hinweis: Diese Datei sollte als erste Inforamtion, die Zahl der Buchtitel beinhalten und dann nacheinander die einzelnen Buchtitel.
Aufgabe 8: Endabgabetermin: 25.01.2012 Schreiben Sie ein C-Programm, welches die Datei mit den Buchinformationen der Aufgabe 7 in ein Feld vom Typ Buch einliest, welches über dynamische Feldvereinbarung erzeugt wurde und dieses Feld mit Hilfe von qsort sortiert. Das Feld soll in alphabetischer Reihenfolge der Nachnamen der Autoren sortiert werden. Bei gleichen Nachnamen soll die alphabetische Reihenfolge der Vornamen verwendet werden. Die Bücher eines Autors werden alphabetisch nach dem Titel sortiert. Das Ergebnis des Sortierens ist am Bildschirm auszugeben.