Musterlösung der Testklausur zur Vorlesung. Programmieren in C. Prof. Dr. Nikolaus Wulff WS/SS 2004/05

Ähnliche Dokumente
Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Objektbasierte Entwicklung

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Embedded Software. Der C Präprozessor. Sichere objektbasierte Entwicklung dank C Präprozessor. Prof. Dr. Nikolaus Wulff

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Moderne C-Programmierung

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Zusammenfassung des Handzettels für Programmieren in C

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Einführung in die C-Programmierung

Programmierkurs Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

182. stdio stdio. Eingabe. Ausgabe. Typisch für Zeileneingabe und Analyse: #include <stdio.h>

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Fallunterscheidung: if-statement

Angewandte Mathematik und Programmierung

1 Vom Problem zum Programm

Lösung Übungszettel 6

Modellierung und Programmierung

Informatik Repetitorium SS Volker Jaedicke

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

ubasic Port für STM32F4 von Uwe Becker

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Dienstspezifikation nach RFC

Übung zur Vorlesung Programmieren in C

Deklarationen in C. Prof. Dr. Margarita Esponda

Hello world. Sebastian Dyroff. 21. September 2009

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kurzeinführung in C. Johannes J. Schneider

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Einführung in die Informatik I

Alltagsnotizen eines Softwareentwicklers

Institut für Informatik Lösungen Übungsaufgaben zu LV "Grundlagen der Informatik" Programmierung in C (Teil 2)

Modellierung und Programmierung

Codingstandard. Softwareentwicklung Praktikum Stand:

BAUINFORMATIK. SS 2013 Vorlesung 1 Johannes Lange

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Dr. Monika Meiler. Inhalt

Kurzeinführung in C++

Microcontroller / C-Programmierung Selbststudium Semesterwoche 1

Tutorium Rechnerorganisation

C/C++ Programmierung

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Primitive Datentypen

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

Übersicht. Informatik 1 Teil 10 Dateien

Objekt-Orientiertes Programmieren in C

Ingenieurinformatik Diplom-FA (Teil 2, C-Programmierung)

Methodische Grundlagen des Software Engineering - Übung 9

Praktikum Betriebssysteme 1. Aufgabe (1)

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

1. Übung zu "Numerik partieller Differentialgleichungen"

Programmieren in C. Eigene Datentypen per typedef und Strukturen. Prof. Dr. Nikolaus Wulff

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Kontrollstrukturen. Bedingter Ablauf: if. Bedingter Ablauf: if-else

Computergrundlagen Programmieren in C

Objektorientierte Programmierung mit C++ SS 2007

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

FB Informatik. Fehler. Testplan

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Die LogTrace-Bibliothek

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Klausur Grundlagen der Informatik

Inf 12 Aufgaben

Buch-Add-Ons. Jürgen Bayer. Object Pascal-Tipps und Tricks. 1 Konvertieren und auf numerische Werte überprüfen 2

Modul 122 VBA Scribt.docx

1. Pflicht-Übung Num. Mathematik 2 SFT (SS02)

Einführung in die Programmierung

Einführung in die Programmiersprache C

Java-Schulung Grundlagen

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Einführung in die Programmierung (EPR)

Einführung in die Programmierung

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Interprozesskommunikation

Karlsruher Institut für Technologie

Projektdokumentation für den Fußballroboter Jaqueline. Rene Peschmann und Ronny Gorzelitz

int ConcatBuffers(char *buf1, char *buf2, size_t len1, size_t len2) {

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

MIKROPROZESSOR PROGRAMMIERUNG 8. VORLESUNG. LV-Nr SS INSTITUT FÜR ELEKTRONIK BIT

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

VBA-Programmierung: Zusammenfassung

Shell-Programmierung

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Ostfalia Hochschule für angewandte Wissenschaften Fakultät Elektrotechnik Prof. Dr.-Ing. M. Haas

Erster Kontakt mit Java und Pseudocode

Besonderheiten von C#

Timm M. Steinbeck und Arne Wiebalck Lehrstuhl für Technische Informatik Universität Heidelberg. Prozess-Monitoring auf CPU-Takt Ebene

Transkript:

Musterlösung der Testklausur zur Vorlesung Programmieren in C Prof. Dr. Nikolaus Wulff WS/SS 2004/05 Juni 2005

1 Der Lottogewinn #define MAX_TIPS 6 typedef struct lotto_schein *LottoSchein; typedef struct lotto_liste *LottoListe; struct lotto_schein { char* name; int tip[max_tips]; ; struct lotto_liste { LottoSchein schein; LottoListe next_element; ; Abbildung 1: Die Lotto Strukturen. Die Lottoliste enthält einen Zeiger auf einen Lottoschein und einen Zeiger auf weitere Elemente vom Type Lottoliste, so dass sich mit dieser Struktur eine rekursive Lottoliste aufbauen lässt. LottoSchein createschein(char* name, int tip[]) { int i; LottoSchein schein = (LottoSchein) malloc( sizeof(struct lotto_schein)); schein->name = name; for(i=0;i<max_tips;i++) schein->tip[i] = tip[i]; return schein; Abbildung 2: Erzeugung eines Lottoscheins. Beim Erzeugen eines Lottoscheins werden der Name und die Gewinnzahlen übergeben, die in der Struktur vermerkt werden. Das Hinzufügen eines Lottoscheins in die Tipliste geschieht entweder durch Einfügen des neuen Scheins am Anfang der Kette, wie in Lösung (3) es war nicht verlangt, dass die Einfügereihenfolge erhalten bleibt oder aber indem der neue Schein am Ende der Liste angehängt wird, wie im Beispiel (4). Diese Variante erhält die Einfügereihenfolge. SS 2005 Musterlösung Programmieren in C 1

LottoListe addschein(lottoliste liste, LottoSchein schein) { LottoListe neu = (LottoListe) malloc( sizeof(struct lotto_liste)); neu->next_element = liste; neu->schein = schein; return neu; Abbildung 3: Einfügen eines Lottoscheins am Anfang der Liste. LottoListe lastelement(lottoliste list) { while(list->next_element) { list = list->next_element; return list; LottoListe addschein(lottoliste liste, LottoSchein schein) { LottoListe ende, neu = (LottoListe) malloc( sizeof(struct lotto_liste)); neu->next_element = NULL; neu->schein = schein; if (liste == NULL) { liste = neu; else { ende = lastelement(liste); ende->next_element = neu; return liste; Abbildung 4: Einfügen eines Lottoscheins am Ende der Liste. SS 2005 Musterlösung Programmieren in C 2

2 Teile und Herrsche Wie im Tip zur Aufgabe angegeben gibt es zwei prinzipielle Lösungsmöglichkeiten, entweder inkrementell wie in Lösung (5) oder rekursiv wie in (6). typedef double (*Function)(double x); /* Function Pointer */ #define dabs(x) ( (x)<0? -(x):(x)) /* abs Makro */ double bisection(function f, double a, double b, double eps) { double x,fx; assert(f(a)*f(b)<0); do { x = (a+b)/2; fx = f(x); if (f(a)*fx < 0) b = x; else a = x; while (dabs(fx) >= eps); return x; Abbildung 5: Inkrementelles Bisektionsverfahren mit do-while Schleife. double bisection(function f, double a, double b, double eps) { double x,fx; assert(f(a)*f(b)<0); x = (a+b)/2; fx = f(x); if (dabs(fx) < eps) return x; else if (f(a)*fx < 0) return bisection(f,a,x,eps); else return bisection(f,x,b,eps); Abbildung 6: Rekursives Bisektionsverfahren. SS 2005 Musterlösung Programmieren in C 3

3 ZickZack /** Vorwaertsdeklarationen */ double F(double ); double G(double ); /** Implementierung von G */ double G(double x) { if (x>0) { return F(x-1); else { return F(x+1); /** Implementierung von F */ double F(double x) { if(0 <= x && x <1) { return x; else { return F(G(x)); Abbildung 7: Implementierung der Funktionen f und g. 1-2 -1 0 1 2 Abbildung 8: Graph der Funktion f(x). Die Implementierung (7) der Funktionen f und g ergibt sich direkt aus den angegebenen Definitionsgleichungen. f(x) beschreibt eine Sägezahnfunktion der Periode τ = 1 auf R. Dies legt die folgende optimierte Lösung nahe: double F(double x) { return x - (long) x; SS 2005 Musterlösung Programmieren in C 4

4 Geheimschrift /* Makro Definition XOR */ #define XOR ^ void encrypt(char *phrase, FILE *input, FILE *output) { int c, i, l = strlen(phrase); i = 0; while(!feof(input)) { c = fgetc(input); c = c XOR phrase[++i%l]; fputc(c,output); Abbildung 9: Implementierung des Verschlüsselungsalgorithmus. In einer Schleife wird der Eingabestrom Zeichen für Zeichen eingelesen und decodiert. Der fehlende XOR Operator wurde per #define XOR ^ definiert und dann verwendet. Anstatt des XOR Makros kann natürlich auch direkt der Ausdruck c = c ^ phrase[++i%l]; oder auch noch kürzer der ^= Operator per c ^= phrase[++i%l]; codiert werden. SS 2005 Musterlösung Programmieren in C 5

5 Die Suche im Heuhaufen #define MAXLINE 120 void grep(char *needle, int len, char *names[]) { FILE *fp; char line[maxline]; int count; while(--len >=0) { fp = fopen(names[len],"rt"); count=0; while(fgets(line,maxline,fp)!= 0) { count++; if (strstr(line,needle)!= NULL ) { printf("%s %3d: %s",names[len],count,line); fclose(fp); Abbildung 10: Implementierung der grep Routine. In einer Schleife werden zu allen übergebenen Dateinamen FILE Pointer im lesenden Textmodus geöffnet, Zeile für Zeile durchsucht und anschließend wieder geschlossen. Wird der gesuchte Ausdruck gefunden erfolgt eine Ausgabe des Dateinamen, der Zeilennummer und der betreffenden Zeile. Früher lange ist das her hatten Textdateien maximal 80 Zeichen pro Zeile. Diese Implementierung geht daher davon aus, dass ein festes Zeichenfeld von 120 chars als Puffer für die fgets Routine ausreicht. Ansonsten ist die #define MAXLINE 120 Anweisung entsprechend zu modifizieren. SS 2005 Musterlösung Programmieren in C 6