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

Ähnliche Dokumente
Nachname:... Vorname:... MatrNr.:... Klausur PR2. Erstellen Sie eine Struktur für eine Komplexe Zahl mit den Elementen real und imag vom Typ double.

Klausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 13. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Bearbeitungszeit: 120 Minuten. Kommentare kosten Zeit; kommentieren Sie ihr Programm nur da, wo der Code alleine nicht verständlich wäre.

RO-Tutorien 3 / 6 / 12

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Programmierung mit C Zeiger

Klausur in Programmieren

Programmieren I + II Regeln der Code-Formatierung

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

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

Angewandte Mathematik und Programmierung

Probeklausur: Programmierung WS04/05

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Advanced Programming in C

Einführung in die Programmiersprache C

Klausur in Programmieren

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

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

GI Vektoren

Fallunterscheidung: if-statement

Probeklausur: Programmierung WS04/05

Informatik B von Adrian Neumann

5. Tutorium zu Programmieren

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Klausur in Programmieren

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Allgemeine Informatik II SS :30-13:30 Uhr

Programmierkurs Java

Kurzeinführung in C. Johannes J. Schneider

AuD-Tafelübung T-B5b

"Einführung in die Programmierung" Krefeld, den 24. September 2013

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

Computergrundlagen Programmieren in C

Übungen zu C++ Kapitel 1

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

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

Modellierung und Programmierung 1

Einführung in die C-Programmierung

Otto-von-Guericke-Universität Magdeburg Fakultät für Informatik Institut für Technische und Betriebliche Informationssysteme Dr.

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Übungspaket 19 Programmieren eigener Funktionen

HS Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Kurzeinführung in C++

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

Kurze Einführung in die Programmiersprache C++ und in Root

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

2. Semester, 2. Prüfung, Lösung

Zeiger, Arrays und Strings in C und C++

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

Übungen Programmieren 1 Felix Rohrer. Übungen

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

Probeklausur: Einführung in die objektorientierte Programmierung mit Java 15WS

Hello world. Sebastian Dyroff. 21. September 2009

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

+ C - Array (Vektoren, Felder)

6 Speicherorganisation

Informatik Repetitorium SS Volker Jaedicke

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Deklarationen in C. Prof. Dr. Margarita Esponda

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

Die Kunst des schönen Kodierens

Prüfung Informatik D-MATH/D-PHYS :00 11:00

Einführung in die Programmierung für Wirtschaftsinformatik

public class SternchenRechteckGefuellt {

Allgemeine Informatik 1 (AI1)

Vorlesung Objektorientierte Programmierung Probeklausur

1. Das erste Programm

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

Studentische Lösung zum Übungsblatt Nr. 7

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

Programmieren in C Einführung

Klausur in Programmieren

Propädeutikum zur Programmierung

1 Vom Problem zum Programm

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Klausur zur Veranstaltung Softwareentwicklung 1. Sommersemester Hessische VWA. Dr. Alexandra Roder, Bernd Ulmann 5.

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Klausurvorbereitung Lösung

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/04- Abschlussklausur

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

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

3. Anweisungen und Kontrollstrukturen

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

Primitive Datentypen

Elementare Datentypen in C++

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einführung in die Programmierung

Testklausur 1 zur Vorlesung. Modellierung und Programmierung I. Dr. Monika Meiler Zeit: 60 Minuten

Klausur zur Vorlesung: Einführung in die objektorientierte Programmierung mit Java WS1415

Programmiersprachen Einführung in C

Actionscript Kleine Programme Fragen & Aufgaben

Semestralklausur Einführung in die Programmierung, WS 2005/06, Seite 1/6 Name, Vorname, Matrikelnummer: Gruppe A

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Inhalt. 4.7 Funktionen

Zusammengesetzte Datentypen -- Arrays und Strukturen

Transkript:

Klausur Programmieren 1 SS 17 Prof. Dr.-Ing. Jürgen Brauer Prüfungstag Dienstag, 18.07.2017 Prüfungszeitraum 10:00-12:00 Prüfungsdauer 120min Prüfungsraum A002/003 Name (Blockschrift): Vorname (Blockschrift): Matrikelnummer Bitte ausfüllen! Unterschrift Hinweise zur Klausur Bitte tragen Sie als erstes Ihren Namen, Vornamen, Matrikel-Nr und Ihre Unterschrift ein Legen Sie bitte als Identitätsnachweis Ihren Personal- oder Studienausweis neben sich Schreiben Sie nur mit dokumentenechten Stiften (kein Bleistift). Verwenden Sie nicht die Farbe rot oder grün. Schreiben Sie deutlich! Unleserliche Passagen können nicht korrigiert werden. Es sind keine Hilfsmittel erlaubt! Täuschungsversuche führen zum Nichtbestehen der Klausur. Tragen Sie Ihre Lösung zu jeder Aufgabe in das vorgesehene Feld nach der Aufgabenbeschreibung ein. Eigenes Papier darf nicht verwendet werden! Die nicht bedruckten Rückseiten dürfen Sie bei Bedarf als zusätzlichen Platz für Ihre Antworten verwenden. Kennzeichen Sie in diesem Falle dann deutlich bei einer Aufgabe, dass Sie von diesem zusätzlichen Platz Gebrauch machen und kennzeichnen Sie Ihre Antwort auf der Rückseite eindeutig mit der Aufgaben-Nr. Diese Klausur enthält 10 Aufgaben und besteht inklusive diesem Deckblatt aus insgesamt 12 Seiten. Insgesamt können Sie maximal 86 Punkte erreichen: Aufgabe 1 2 3 4 5 6 7 8 9 10 Punkte 10 6 10 10 10 10 8 6 6 10 Gesamtpunkte Note Seite 1 von 12

Aufgabe 1 Source-Code Formatierung Betrachten Sie folgenden Source-Code: #include <stdio.h> float f543(float* a879, int b03) { float opmv980 = 0.0f; for(int op230=0; op230<b03; op230=op230-5+10-5+1) opmv980 += a879[op230]; return opmv980; float mm0289[]={1.0f,2.0f,3.0f,4.0f,5.0f; printf("mm0289=%.2f", f543(mm0289, 5)); _getch(); i) Welche Maßnahmen könnte man treffen, damit der Source-Code besser lesbar ist? (bis zu 5 Pkte, pro sinnvoller Maßnahme 1 Pkt) - Sprechende Bezeichner für Funktionsnamen - Sprechende Bezeichner für Variablennamen - Nur ein Befehl pro Zeile - Einrückung des Schleifenkörpers - Kommentare - Zählerinkrement klar um eins erhöhen - Besser verständlichere Ausgaben auf Konsole für Benutzer - Leerzeilen zwischen Sinnabschnitten ii) Schreiben Sie den Source-Code nochmal neu unter Berücksichtigung der von Ihnen vorgeschlagenen Maßnahmen: (3 Pkt) #include <stdio.h> float compute_sum(float* ptrarray, int N) { float sum = 0.0f; for(int i=0; i<n; i++) sum+=ptrarray[i]; return sum; float testarray[]={1.0f,2.0f,3.0f,4.0f,5.0f; printf("sum of all elements in testarray is %.2f", compute_sum(testarray, 5)); _getch(); iii) Was macht die Funktion f543? (2 Pkt) Sie berechnet die Summe der ersten N Arrayelemente des angegebenen Arrays. von 10 Punkten Seite 2 von 12

Aufgabe 2 for-schleife & do-while Schleife Schreiben Sie jeweils eine Schleife, die die angegebenen Zahlen in der angegebenen Reihenfolge ausgibt! Bei jedem Schleifendurchlauf soll nur eine weitere Zahl ausgegeben werden. i) Schreiben Sie eine for-schleife, die folgende Zahlen ausgibt: (2 Pkt) 2 4 6 8 10 12 14 16 18 for (int i = 2; i <= 18; i+=2) printf("%d ", i); ii) Schreiben Sie eine do-while-schleife, die alle Zahlen zwischen 1 und 100 ausgibt, die durch 7 oder 17 teilbar sind: (4 Pkt) 7 14 17 21 28 34 35 42 49 51 56 63 68 70 77 84 85 91 98 int i=0; do { i++; if ((i % 7==0) (i%17)==0) printf("%d ", i); while (i<=100); von 6 Punkten Seite 3 von 12

Aufgabe 3 while-schleife & Fibonacci-Zahlen ohne rekursive Funktion berechnen Schreiben Sie eine while-schleife, die die Fibonacci-Zahlen f(2) bis f(15) ausgibt, wobei die Fibonacci Zahlen folgendermaßen definiert sind: f(0):=0, f(1):=1 und f(n):=f(n-1)+f(n-2) Bei dem i-ten Schleifendurchlauf soll die nächste Fibonacci-Zahl f(i) auf Basis vorher berechneter Fibonacci-Zahlen berechnet werden und der Wert von f(i) ausgegeben werden. Gewünschte Ausgabe: f(2)=1 f(3)=2 f(4)=3 f(5)=5 f(6)=8 f(7)=13 f(8)=21 f(9)=34 f(10)=55 f(11)=89 f(12)=144 f(13)=233 f(14)=377 f(15)=610 Hinweis: Verwenden Sie bei Ihrer Lösung keine rekursive Funktion! int pp = 0; int p = 1; int n = 2; while (n <= 15) { int result = pp + p; printf("f(%d)=%d ", n, result); pp = p; p = result; n++; von 10 Punkten Seite 4 von 12

Aufgabe 4 Verschachtelte Schleifen & Programmausführungspfad verfolgen Was gibt folgendes Programm aus? void foo2() { printf("=345"); void foo(int i, int j) { int sum=i+j; printf("%d", sum); if (sum%2==0) printf("+"); (i==3) && (j==2)? foo2() : printf("") ; for (int i=1; i<=3; i++) for (int j=1; j<=2; j++) foo(i,j); _getch(); Lösung: 2+334+4+5=345 10 Punkte bei komplett richtiger Ausgabe 6 Punkte bei 1 falscher Zahl / Zeichen 2 Punkte bei 2 falschen Zahlen / Zeichen 0 Punkte sonst von 10 Punkten Seite 5 von 12

Aufgabe 5 Pointer & Referenzen, Parameterübergabe an Funktionen Gegeben sei folgendes C++ Programm. Geben Sie an, welche Ausgabe das Programm erzeugt! void foo(int* A, int* c) { *c=*a + *(A+2); void foo2(int c) { c += 100; void foo3(int& c) { c += 50; int A[]={10,20,30,40,50; int c=0; foo(a, &c); printf("c1=%d\n", c); foo2(c); printf("c2=%d\n", c); foo3(c); printf("c3=%d\n", c); Lösung: c1=40 c2=40 c3=90 von 10 Punkten Seite 6 von 12

Aufgabe 6 Statische & Dynamische Speicheralloziierung In der Computertomographie arbeitet man mit sog. Voxeldatensätzen. Dabei ist ein Voxeldatensatz ein 3D Array, bei dem für jeden Eintrag des 3D Arrays ein Wert gespeichert werden kann, z.b. ein int Wert. (i) 3 Punkte: Wie deklariert man in C zur Compilezeit (d.h. vor dem Start eines Programmes = statische Speicheralloziierung) ein 3D Array, bei dem die 3 Dimensionen die Größen dimx, dimy und dimz haben? (ii) 2 Punkte: Geben Sie ein Codestück in C an, um alle Einträge des 3D Arrays auf den Wert 0 zu setzen! (iii) 5 Punkte: Geben Sie ein Codestück in C an, bei dem zur Laufzeit (d.h. nach dem Start eines Programmes = dynamische Speicheralloziierung) die Größen dimx, dimy und dimz vom Benutzer eingegeben werden und ein entsprechend großes 3D Array erzeugt wird! #include <stdio.h> #include <conio.h> #include <malloc.h> #define dimstatz 10 #define dimstaty 20 #define dimstatx 30 // (i) int A_static[dimstatz][dimstaty][dimstatx]; // (ii) for (int z = 0; z < dimstatz; z++) for (int y = 0; y < dimstaty; y++) for (int x = 0; x < dimstatx; x++) A_static[z][y][x] = 0; // (iii) int dimx,dimy,dimz; printf("\nlaenge x-dimension: "); scanf_s("%d", &dimx); printf("\nlaenge y-dimension: "); scanf_s("%d", &dimy); printf("\nlaenge z-dimension: "); scanf_s("%d", &dimz); char*** A; A = malloc(dimz * sizeof(char**)); for (int z = 0; z < dimz; z++) { A[z] = malloc(dimy * sizeof(char*)); for (int y = 0; y < dimy; y++) A[z][y] = malloc(dimx * sizeof(char)); _getch(); von 10 Punkten Seite 7 von 12

Aufgabe 7 Klassen Gegeben sei folgender Code: class A { public: virtual void f1() = 0; virtual void f2() = 0; int var1; protected: int var2; private: int var3; ; class B : public A { void f1() { printf("we are in f1()\n"); ; class C : public B { void f2() { printf("we are in f2()\n"); ; A* mya = new A(); // (Z1) B* myb = new B(); // (Z2) C* myc = new C(); // (Z3) myc->var1 = 1; // (Z4) myc->var2 = 2; // (Z5) myc->var3 = 1; // (Z6) Identifizieren Sie von den Zeilen Z1-Z6 alle Zeilen die nicht kompiliert werden können und begründen Sie jeweils wieso (jeweils 2 Pkt bei richtiger Zeile und Begründung)! Z1: kompiliert nicht, da Klasse A abstrakt Z2: kompiliert nicht, da Klasse B abstrakt Z5: kompiliert nicht, da auf var2 nicht zugegriffen werden darf aus main() Fkt Z6: kompiliert nicht, da auf var3 nicht zugegriffen werden darf aus main() Fkt von 8 Punkten Seite 8 von 12

Aufgabe 8 Übersetzungsprozess Beschreiben Sie mit eigenen Worten, was beim Übersetzen eines C bzw. C++ Programmes in Maschinencode passiert! Gehen Sie hierbei v.a. auf die Aufgaben des - Präprozessors - Compilers - Linkers ein! Für Präprozessor, Compiler, Linker jeweils 2 Pkt von 6 Punkten Seite 9 von 12

Aufgabe 9 Regeln in boolesche Ausdrücke fassen Es soll eine C Funktion teste_ob_schaltjahr angegeben werden, die in der Lage ist, zu überprüfen, ob ein angegebenes Jahr ein Schaltjahr ist oder nicht! Hierzu die Regeln von https://de.wikipedia.org/wiki/schaltjahr: Die durch 4 ganzzahlig teilbaren Jahre sind Schaltjahre. Säkularjahre, also die Jahre, die ein Jahrhundert abschließen (z.b. 1800, 1900, 2100 und 2200) sind doch keine Schaltjahre. Schließlich sind die durch 400 ganzzahlig teilbaren Säkularjahre doch wiederum Schaltjahre. Damit sind z.b. 1600, 2000 und 2400 jeweils wieder Schaltjahre. Die Codezeilen teste_ob_schaltjahr(1900); teste_ob_schaltjahr(1976); teste_ob_schaltjahr(2000); teste_ob_schaltjahr(2001); teste_ob_schaltjahr(2100); teste_ob_schaltjahr(2400); sollen dann zum Beispiel zu folgender Ausgabe führen: Das Jahr 1900 ist kein Schaltjahr. Das Jahr 1976 ist ein Schaltjahr. Das Jahr 2000 ist ein Schaltjahr. Das Jahr 2001 ist kein Schaltjahr. Das Jahr 2100 ist kein Schaltjahr. Das Jahr 2400 ist ein Schaltjahr. #include <stdio.h> #include <conio.h> void teste_ob_schaltjahr(int jahr) { printf("das Jahr %d ist ", jahr); if ( (jahr%4==0) && ((jahr%100!=0) (jahr%400==0)) ) printf("ein Schaltjahr.\n"); else printf("kein Schaltjahr.\n"); teste_ob_schaltjahr(1900); teste_ob_schaltjahr(1976); teste_ob_schaltjahr(2000); teste_ob_schaltjahr(2001); teste_ob_schaltjahr(2100); teste_ob_schaltjahr(2400); _getch(); von 6 Punkten Seite 10 von 12

Aufgabe 10 Klassen und Ableitung Betrachten Sie den Code auf nachfolgender Seite und ergänzen Sie alle 10 Codestellen die mit gekennzeichnet sind (d.h. Schreiben Sie dort hin, was dort fehlt), so dass das Programm compiliert und folgende Ausgabe erzeugt: Spritztour mit Rennwagen: Das Auto ist 2.0 Stunde(n) weiter gefahren. Neuer km-stand: 500.00 Das Auto ist 1.0 Stunde(n) weiter gefahren. Neuer km-stand: 750.00 Spritztour mit LahmeEnte: Das Auto ist 2.0 Stunde(n) weiter gefahren. Neuer km-stand: 180.00 Das Auto ist 1.0 Stunde(n) weiter gefahren. Neuer km-stand: 270.00 (Pro richtigem Eintrag 1 Punkt) Seite 11 von 12

<stdio.h> PKW { double km_stand; double max_geschwindigkeit; : PKW(double ) { this->km_stand = 0.0; this->max_geschwindigkeit = max_geschwindigkeit; void fahre_mit_max_geschwindigkeit(double ) { ; += max_geschwindigkeit * fahrzeit; printf("das Auto ist %.1f Stunde(n) weiter gefahren. Neuer km-stand: %.2f\n", fahrzeit, km_stand); class Rennwagen : public { public: Rennwagen() : PKW(250) { ; class LahmeEnte : public { public: LahmeEnte() : PKW(90) { ; int () { Rennwagen wagen1; printf("spritztour mit Rennwagen:\n"); wagen1.fahre_mit_max_geschwindigkeit( 2.0 ); wagen1.fahre_mit_max_geschwindigkeit( 1.0 ); LahmeEnte ; printf("\nspritztour mit LahmeEnte:\n"); wagen2.fahre_mit_max_geschwindigkeit( 2.0 ); wagen2.fahre_mit_max_geschwindigkeit( 1.0 ); Seite 12 von 12

Lösung: #include <stdio.h> class PKW { double km_stand; double max_geschwindigkeit; public: PKW(double max_geschwindigkeit) { this->km_stand = 0.0; this->max_geschwindigkeit = max_geschwindigkeit; void fahre_mit_max_geschwindigkeit(double fahrzeit) { km_stand += max_geschwindigkeit * fahrzeit; printf("das Auto ist %.1f Stunde(n) weiter gefahren. Neuer km-stand: %.2f\n", fahrzeit, km_stand); ; class Rennwagen : public PKW { public: Rennwagen() : PKW(250) { ; class LahmeEnte : public PKW { public: LahmeEnte() : PKW(90) { ; Rennwagen wagen1; printf("spritztour mit Rennwagen:\n"); wagen1.fahre_mit_max_geschwindigkeit( 2.0 ); wagen1.fahre_mit_max_geschwindigkeit( 1.0 ); LahmeEnte wagen2; printf("\nspritztour mit LahmeEnte:\n"); wagen2.fahre_mit_max_geschwindigkeit( 2.0 ); wagen2.fahre_mit_max_geschwindigkeit( 1.0 ); von 10 Punkten Seite 13 von 12