Lösungshinweise/-vorschläge zum Übungsblatt 12: Software-Entwicklung 1 (WS 2017/18)

Ähnliche Dokumente
Lösungshinweise/-vorschläge zum Übungsblatt 13: Software-Entwicklung 1 (WS 2017/18)

Lösungshinweise/-vorschläge zum Übungsblatt 5: Software-Entwicklung 1 (WS 2017/18)

Lösungshinweise/-vorschläge zum Übungsblatt 8: Software-Entwicklung 1 (WS 2017/18)

Lösungshinweise/-vorschläge zum Übungsblatt 9: Software-Entwicklung 1 (WS 2017/18)

Dynamische Speicherverwaltung

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

einlesen n > 0? Ausgabe Negative Zahl

Lösungshinweise/-vorschläge zum Übungsblatt 4: Software-Entwicklung 1 (WS 2017/18)

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

Advanced Programming in C

Lösungshinweise/-vorschläge zum Übungsblatt 7: Software-Entwicklung 1 (WS 2017/18)

Software Entwicklung 1

Lösungshinweise zum Übungsblatt 6: Programmieren in C (WS 2018/19)

Lösungshinweise/-vorschläge zum Übungsblatt 11: Software-Entwicklung 1 (WS 2017/18)

Software Entwicklung 1

Dynamische Speicherverwaltung

U8 7. Übung U8 7. Übung

Funktionen, Zeiger und Arrays in C Software Entwicklung 1

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Lösungshinweise/-vorschläge zum Übungsblatt 3: Software-Entwicklung 1 (WS 2017/18)

ESP Tutorium. Studienassistent: Ewald Moitzi. Gruppe 1

Probeklausur Name: (c)

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

C/C++-Programmierung

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Dynamische Speicherverwaltung

Grundlagen der Informatik

Lösungshinweise zum Übungsblatt 10: Programmieren in C (WS 2018/19)

Prüfung Algorithmen und Datenstrukturen, WS 2008/2009 (97 Punkte, 4 Seiten)

Lösungshinweise zum Übungsblatt 11: Programmieren in C (WS 2018/19)

GI Vektoren

Software Entwicklung 1. Spezifikation von Prozedureigenschaften. Spezifikation prozeduraler Programme. Warum Spezifikationen?

Funktionen und Arrays in C

Informatik I Einführung in die Informatik und Programmierung. Klausur

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Klausur: Grundlagen der Informatik I, am 27. März 2009 Gruppe: E Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Klausur Informatik WS 2012/13

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Einführung in die Programmiersprache C

Speichermanagement Software Entwicklung 1

Musterlösung: 12. Jgst. 2. Kursarbeit Datum: Fach: Informationsverarbeitung (LK)

Übersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C

Arrays (Felder/Vektoren)

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Aufgabenblatt 4. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Algorithmen und Datenstrukturen Abstrakte Datentypen. M. Herpers, Y. Jung, P. Klingebiel

Klausur: Grundlagen der Informatik I, am 27. März 2009 Gruppe: F Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

6. Zeiger Allgemeines Definition eines Zeigers

Grundlagen der Programmierung

INE1 Speicherverwaltung und zweidimensionale Arrays. Speicherorganisation Dynamischer Speicher in C Zweidimensionale Arrays

Programmieren in C (Übungsblatt 1)

Tutorium #2. Einführung in die strukturierte Programmierung Gruppe 6 Anja Karl.

TU Kaiserslautern. Übungsblatt 2: Software-Entwicklung 1 (WS 2017/18) Hinweise zu Einreichaufgaben. Hinweise zu den Übungen

Klausur Programmieren 1 SS 17 Prof. Dr.-Ing. Jürgen Brauer

Primzahlen und Programmieren

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

Speichermanagement Software Entwicklung 1

Programmieren in C (Übungsblatt 1)

Teil 6: Strukturen und Unionen Gliederung

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Betriebssysteme. Agenda. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Wiederholungen / Schleifen

Programmieren in C SS Vorlesung 4, Dienstag 14. Mai (Strings, Zeiger, Allokation, Strukturen)

Übung 1 (Entwurf von Algorithmen) Beispiellösung

Algorithmen und Datenstrukturen

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

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

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Programmieren in Java

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Praxis der Programmierung

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

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

Teil 6: Strukturen und Unionen Gliederung

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

1 wsort - Datenstrukturen (1. Möglichkeit)

Grundlagen der Informatik 6. Arrays I

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

Vorlesung 6: Operatoren, Logische Ausdrücke

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Übungspaket 8 Datentyp int

Klausur: Informatik, am 13. August 2015 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Programmieren in C (Übungsblatt 1)

File I/O. Persistieren von Daten. Gastvorlesung Ralph Erdt erdt (bei) informatik.fh-wiesbaden.de

Übungspaket 8 Datentyp int

Bachelorprüfung: Programmieren I

Transkript:

Dr. Annette Bieniusa Mathias Weber, M. Sc. Peter Zeller, M. Sc. TU Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungshinweise/-vorschläge zum Übungsblatt 12: Software-Entwicklung 1 (WS 2017/18) Die Hinweise und Vorschläge in diesem Dokument sollen der Lösungsfindung dienen und erheben demnach weder Anspruch auf Vollständigkeit noch Korrektheit. Sollten Sie Fehler finden, würden wir uns freuen, wenn Sie uns diese mitteilen. (Kontaktdaten finden Sie auf unserer Webpräsenz.) Aufgabe 1 Mittelwert (5 Punkte) Schreiben Sie ein C-Programm mittelwert.c, welches int-zahlen von der Standardeingabe liest bis diese leer ist und dann den Mittelwert der eingelesenen Zahlen ausgibt. Verwenden Sie zum einlesen der Zahlen die Funktion scanf und zum Ausgeben die Funktion printf. Der Mittelwert soll mit 2 Nachkommastellen ausgegeben werden, also mit printf("%0.2f\n", wert);. # include <stdio.h> # include <stdbool.h> int main( void) int count = 0; int sum = 0; while ( true) int x; int r = scanf("%d", &x); if (r == EOF) break; count ++; sum += x; printf("%0.2f\n", sum*1.0/ count); return 0; Aufgabe 2 Fibonacci-Zahlen (6 Punkte) a) Schreiben Sie eine Funktion void fibarray(int *res, int n), welche einen Pointer res auf einen Speicherbereich und eine Zahl n nimmt. Die Funktion soll die Reihe der ersten n Fibonacci-Zahlen in res Speichern. Nach Aufruf der Funktion soll gelten, dass res[0] = 0, res[1] = 1 und res[i] = res[i-1] + res[i-2] für 1<i<n. # include <stdio.h> # include <stdlib.h> // requires size >=2 && res hat Platz für size integer void fibarray( int *res, int size)

res[0] = 0; res[1] = 1; for ( int i=2; i<size; i++) res[i] = res[i-1] + res[i-2]; b) Schreiben Sie eine main-funktion, welche einen int-wert n von der Standardeingabe liest und dann mit Hilfe der Funktion fibarray die ersten n Fibonacci-Zahlen berechnet und dann ausgibt. Bei der Ausgabe soll genau eine Zahl pro Zeile ausgegeben werden. Verwenden Sie die Funktion malloc um den Speicherbereich für die Funktion fibarray anzufordern und die Funktion free um den Speicher wieder freizugeben. int main( void) int n; scanf("%d", &n); int * fibs = malloc(n* sizeof( int)); fibarray(fibs, n); for ( int i=0; i<n; i++) printf("%d\n", fibs[i]); free( fibs); Aufgabe 3 Eingabe umdrehen (4 Punkte) Schreiben Sie ein C-Programm, welches int-werte von der Standardeingabe liest, bis diese zu Ende ist und dann die eingelesenen Zahlen in umgekehrter Reihenfolge ausgibt. Verwenden Sie malloc um zu Beginn des Programms Speicherplatz für 8 int-werte anzufordern. Speichern Sie dort die eingelesenen Zahlen und fordern Sie bei Bedarf zusätzlichen Speicher an. Geben Sie den Speicher am Ende mit free wieder frei. # include <stdio.h> # include <stdlib.h> # include <stdbool.h> int main( void) int count = 0; int * buffer = malloc(8* sizeof( int)); int size = 8; while ( true) int x; int r = scanf("%d", &x); if (r == EOF) break; if ( count +1 >= size) size *= 2; buffer = realloc( buffer, size* sizeof( int));

buffer[ count] = x; count ++; for ( int i=count -1; i>=0; i--) printf("%d\n", buffer[i]); free( buffer); return 0; Aufgabe 4 Sortieren (5 Punkte) Verwenden Sie für diese Aufgabe die Vorlage sort.c und passen Sie die main-funktion nicht an. a) Schreiben Sie eine Funktion bool sort2(int *x, int *y), welche 2 Pointer auf int-werte nimmt. Wenn der von x referenzierte Wert größer ist, als der von y referenzierte Wert, dann sollen die beiden Werte vertauscht und true zurückgegeben werden. Ansonsten ist das Ergebnis der Funktion false. Verwenden Sie zur Implementierung die Funktion swap2 aus der Vorlesung. bool sort2( int *x, int *y) if (*x > *y) swap2(x, y); return true; return false; b) Schreiben Sie eine Funktion void sort(int ar[], int size), welche ein Array von int-werten ar und die Anzahl der Werte im Array nimmt. Die Funktion soll das Array aufsteigend sortieren. Verwenden Sie zum Sortieren die Funktion sort2 um jeweils zwei Array-Einträge zu sortieren und befolgen Sie der folgenden Algorithmen-Beschreibung: wiederhole so lange es Änderungen am Array gibt: für i aus [0,..,size -2]: sortiere ar[i] und ar[i+1] Verringere size um 1 ( das letzte Element ist schon an der richtigen Stelle) void sort( int ar[], int size) bool changes = true; // Idee: Wenn keine Änderungen mehr möglich muss Array sortiert sein while ( changes) changes = false; // probiere jeweils einen Eintrag und seinen Nachfolger zu sortieren for ( int i=0; i<size -1; i++) changes = sort2(& ar[i], &ar[i+1]) changes;

Aufgabe 5 Programmverständnis (5 Punkte) Versuchen Sie diese Aufgabe ohne Verwendung eines Computers zu lösen. In der Klausur müssen Sie eventuell ähnliche Aufgaben auch ohne Unterstützung lösen können. a) Was passiert beim Übersetzen und Ausführen des folgenden Programms? Falls es dabei Fehler gibt, erklären Sie diese. Falls nicht, geben Sie die Ausgabe des Programms an. 1 # include <stdio.h> 2 3 int main( void) 4 5 int ar[] = 200, 30, 4, 1000; 6 int *p = &ar[0]; 7 int *q = &ar[3]; 8 int r = 0; 9 while (p < q) 10 11 r = r + *p + *q; 12 p = p + 1; 13 q = q - 1; 14 15 printf("r = %d\n", r); 16 Die 2 pointer p und q laufen aufeinander zu. Es werden alle Zahlen im Array ar aufsummiert. Die Ausgabe ist daher 1234. b) Das folgende Programm enthält einen Speicherleck. Wie kann dieser behoben werden? 1 # include <stdlib.h> 2 # include <stdio.h> 3 # include <stdbool.h> 4 5 int * alloc_space( int value) 6 int * space = malloc (10* sizeof( int)); 7 for ( int i=0; i<10; i++) 8 9 *( space + i) = value; 10 11 return space; 12 13 14 void dealloc_space( int * space) 15 for ( int i=0; i<10; i++) 16 *( space + i) = 0; 17 18 space = NULL; 19 20 21 int main( void) 22 while( true) 23 int v; 24 scanf("%d", &v); 25 if (v<=0) 26 27 break; 28 29 30 int * myspace = alloc_space(v); 31 for ( int i=0; i<10; i++) 32 33 myspace[i] *= i; 34 35 for ( int i=0; i<10; i++) 36 37 printf("%d\n", *(myspace + i)); 38 39 dealloc_space( myspace);

40 41 return 0; 42 Die Funktion setzt die Werte auf 0, welche sich im von space referenzierten Speicherbereich befinden und sie setzt den Parameter space auf NULL. Beides sorgt aber nicht dafür, dass der Speicherbereich freigegeben wird, der in Zeile 6 alloziert wurde. Statt dessen sollte die Funktion einen Aufruf free(space) enthalten. c) Was ist die Ausgabe des folgenden Programms? Begründen Sie Ihre Antwort, indem Sie den Zustand der Variablen number, pointer und p jeweils nach Ausführen von Zeile 8, 9, 10 und 11 beschreiben oder grafisch darstellen. 1 # include <stdio.h> 2 # include <stdlib.h> 3 4 int main( void) 5 6 int number[] = 1, 2, 3, 4; 7 int *pointer[] = &number[0], &number[1], &number[2], &number [3]; 8 int **p = pointer; 9 p = p + 1; 10 *p = *p + 1; 11 **p = **p + 1; 12 13 for ( int i = 0; i < 4; i++) 14 15 printf(" number[%d] = %d\n", i, number[i]); 16 17 Die Ausgabe ist: number[0] = 1 number[1] = 2 number[2] = 4 number[3] = 4 Die Zustände der Variablen bei der Ausführung lassen sich mit einem Debugger oder dem Online-Tool Python Tutor a überprüfen. Die folgenden ScreenShots zeigen die geforderten Zustände im Python Tutor a http://pythontutor.com/visualize.html Aufgabe 6 Verschachtelte Arrays (5 Punkte) Verwenden Sie für diese Aufgabe die Vorlage flatten.c und passen Sie die main-funktion nicht an.

Schreiben Sie eine Funktion int flatten(int **ar, int n, int **res), welche einen Zeiger ar und eine Größe n nimmt. Dieser zeigt auf einen Speicherbereich mit n Zeigern auf die inneren int-arrays. Diese inneren Arrays sind ähnlich wie Arrays in Java strukturiert: Sie beinhalten eine Größe, welche wir hier im ersten Array-Eintrag speichern. Nach der Größe folgen die eigentlichen Array-Einträge. Die Funktion flatten soll alle Zahlen, ohne die Längen-Information, der Reihe nach in einen zusammenhängenden Speicherbereich übertragen. Die Anzahl der übertragenen Zahlen soll als Rückgabewert der Funktion zurückgegeben werden und der Parameter res soll nach dem Aufruf auf den Speicherbereich mit den Zahlen zeigen. Sie können davon ausgehen, dass der Parameter res zu Beginn NULL ist oder auf einen gültigen Speicherbereich zeigt (das heißt, dass res als Parameter von free oder realloc verwendet werden darf). Beispiel: int main( void) int a1[] = 2, 4, 7; int b2[] = 3, 5, 5, 9; int *ar[] = a1, b2; int * res = NULL; int size = flatten(ar, 2, & res); printf(" size = %d\n", size); for ( int i=0; i<size; i++) printf(" res[%d] = %d\n", i, res[i]); free(res); Erwartete Ausgabe: size = 5 res[0] = 4 res[1] = 7 res[2] = 5 res[3] = 5 res[4] = 9 ar: 2 4 7 3 5 5 9 int flatten( int **ar, int n, int** res) int size = 0; for ( int i=0; i<n; i++) size += *ar[i]; int *r = realloc(* res, size* sizeof( int)); if (r == NULL) printf(" Could not allocate memory\n"); exit(1); int k = 0; for ( int i=0; i<n; i++) for ( int j=1; j<=* ar[i]; j++) r[k] = ar[i][j]; k++; *res = r; return size;