Bachelor-Klausur im WiSe 2013 / 2014. Grundlagen der Informatik



Ähnliche Dokumente
Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java: Vererbung. Teil 3: super()

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Einführung in die Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmieren in Java

Einführung in die Programmierung

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

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Programmierkurs Java

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Einführung in die Programmierung für Wirtschaftsinformatik

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

Klausur zur Einführung in die objektorientierte Programmierung mit Java

BEISPIELKLAUSUR Softwareentwicklung:

Einführung in die Java- Programmierung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungsblatt 3: Algorithmen in Java & Grammatiken

1 Vom Problem zum Programm

Diplomvorprüfung in Datenverarbeitung EBS Sommersemester 2002

Übung 9 - Lösungsvorschlag

Software Engineering Klassendiagramme Assoziationen

Java Kurs für Anfänger Einheit 5 Methoden

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Kapiteltests zum Leitprogramm Binäre Suchbäume

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

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Java Einführung Collections

Kapitel 6. Vererbung

3 Objektorientierte Konzepte in Java

Programmierung in C. Grundlagen. Stefan Kallerhoff

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

Software Engineering Klassendiagramme Einführung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Objektorientierte Programmierung für Anfänger am Beispiel PHP

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

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

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Studentische Lösung zum Übungsblatt Nr. 7

Vorkurs C++ Programmierung

Kapitel 6. Vererbung

Objektorientierte Programmierung

Kapitel 6. Vererbung

SEP 114. Design by Contract

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

5. Tutorium zu Programmieren

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

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

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Prinzipien Objektorientierter Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Zählen von Objekten einer bestimmten Klasse

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Übungen Programmieren 1 Felix Rohrer. Übungen

2. Programmierung in C

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Graphic Coding. Klausur. 9. Februar Kurs A

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

Folge 18 - Vererbung

Algorithmen & Datenstrukturen 1. Klausur

Grundlagen der Informatik (BSc) Übung Nr. 5

Professionelle Seminare im Bereich MS-Office

Objektorientierte Programmierung

Überblick. Lineares Suchen

U08 Entwurfsmuster (II)

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Algorithmen und Datenstrukturen

Institut für Informatik

Klausur zur Einführung in die objektorientierte Programmierung mit Java

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

Zahlensysteme: Oktal- und Hexadezimalsystem

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Javakurs zu Informatik I. Henning Heitkötter

Probeklausur Softwareengineering SS 15

Programmieren Tutorium

Übung: Verwendung von Java-Threads

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Einführung in die Programmierung

Softwareentwicklung Schrittweise Verfeinerung, Programmieren üben: Tic-Tac-Toe in Raten

SS Björn Berezowski B.Sc. Marco Münch B.Sc. Michael Roth B.Sc. Repetitorium PG 1. Übungsblatt. 1 Übung - Probeklausur SS 2010 Typ Prof.

SWE1 / Übung 2 ( )

Programmierkurs Java

Java Virtual Machine (JVM) Bytecode

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Technische Informatik - Eine Einführung

Einführung in die Java- Programmierung

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Ein erstes Java-Programm

Transkript:

Fachhochschule Kaiserslautern FB Informatik und Mikrosystemtechnik Prof. Dr. M. Duque-Antón Bachelor-Klausur im WiSe 2013 / 2014 im Fach Grundlagen der Informatik Angewandte Informatik / Medieninformatik Datum: 25. Januar 2014 Es sind keinerlei Hilfsmittel zur Klausur zugelassen. Achtung: Bitte schreiben Sie die Lösung unter die Aufgabe in das Aufgabenblatt. Wenn Sie mehr Platz benötigen, legen Sie von der Aufsicht zu erhaltende zusätzliche Blätter dazwischen. Die schriftliche Prüfung besteht aus 5 Aufgaben. Schreiben Sie bitte auf jedes Blatt Ihren Namen, Vornamen, Matrikelnummer und Semester. Es werden nur Blätter mit Namen und Matrikelnummer korrigiert oder bewertet. Unleserliche Lösungen, Lösungen mit Bleistift oder Rotstift werden nicht korrigiert oder bewertet. 1 2 3 4 5 Summe Note /9 /10 /10 /11 /12 /52 1 von 17

1. Aufgabe: Allgemeine Grundlagen Kennzeichnen Sie die folgenden Aussagen durch Ankreuzen als wahr oder falsch. Dabei wird keine Antwort: mit 0 Punkten bewertet, eine richtige Antwort mit +0.5 Punkten und eine falsche Antwort mit -0.5 Punkten. Minimal können 0 Punkte erreicht werden. wahr falsch In Java kann prinzipiell auf eine Instanzvariable sowohl über den Klassenname als auch die Objekt-Instanz zugegriffen werden. In Java kann wahlweise dynamisch oder statisch gebunden werden. Auf jede Variable kann während der gesamten Programmausführung zugegriffen werden. Es kann mehrere Variablen geben, die auf dasselbe Array zeigen. Mit n Bit können im Zweierkomplement genau 2 n positive Ganzzahlen dargestellt werden. Die Darstellung digitaler Informationen mit Hilfe von ASCII-Zeichen ist effizienter als die entsprechende Darstellung mit Hilfe binärer Daten. Jede vernünftige Präzisierung des Algorithmus-Begriffs führt auf die gleiche Menge der berechenbaren Funktionen. String-Literale werden im String-Pool höchstens einmal angelegt und dann nicht mehr verworfen. Eine Java-Methode ist eine in Java geschriebene Funktion oder Prozedur. In der Regel passt der Maschinencode eines Programms vollständig in den Hauptspeicher. Ein Objekt einer abgeleiteten Klasse kann immer dann verwendet werden, wenn ein Objekt einer Oberklasse erwartet wird, da die Oberklasse allgemeiner ist. Der Mechanismus des Überladens betrifft nur Attribute einer Klasse. Alle zu einem Array gehörenden Elemente werden immer nur im Stack abgelegt. Eine abgeleitete Klasse erbt die Attribute und Methoden der Oberklasse. Es können jedoch weitere Attribute und Methoden hinzugefügt werden. Beim Parameterübergabemechanismus call by value wirken sich Änderungen formaler Parameter stets auf die aktuellen Parameter aus. In Java werden allen lokalen Variablen Default-Werte zugewiesen. Der Heap bietet die zwei Operatoren push und pop an. Für eine Integer-Variable n liefert der arithmetische Ausdruck (-n + n++) immer den Wert 0. 1.) Summe Punkte /9 /9 2 von 17

2. Aufgabe: Zahlendarstellungen und Grammatiken Gegenstand dieser Aufgabe ist die Darstellung von Zahlen innerhalb eines Rechners, die entsprechende Umwandlung verschiedener Basissysteme und die Erkennung von Texten auf der Basis vorgegebener Grammatiken / EBNFs (Extended Backus Naur Form). (a) Gegeben sei die folgende Binärzahl (Dualzahl mit der üblichen Interpretation als vorzeichenlose Zahl) 1001101 2. Wie sieht die dezimale und die oktale Darstellung der Zahl aus? (b) Betrachten Sie den Java-Datentyp short. Wir nehmen an, dass die beiden Zahlen 45 10 und -58 10 jeweils in einer short-variablen gespeichert sind. Wie sieht die entsprechende interne binäre Darstellung der beiden Zahlen aus? 3 von 17

(c) Sei die folgende Grammatik G = (N, T, P, S) mit T = {a, b} gegeben. Bestimmen Sie N und P möglichst minimal so, dass die folgende Sprache erzeugt wird: L(G) = {w w = a 2n b n-1 mit n natürliche Zahlen ohne 0}. 2.) a b c Summe Punkte /3 /4 /3 /10 4 von 17

3. Aufgabe: Java-Programmierung Gegenstand dieser Aufgabe ist die Programmierung mit Hilfe der Programmiersprache Java, insbesondere die Verwendung von Rekursion. (a) Gegeben sei die folgende Klasse WasWohlTest. Was wird beim Aufruf java WasWohlTest auf dem Bildschirm ausgegeben? public class WasWohlTest { static int waswohl (int n) { if (n < 2) { return n; } // if return (waswohl (n-1) + 2 * waswohl (n-2) ); } // waswohl public static void main (String [ ] args) { for (int i = 0; i < 10; i++) { System.out.println (i + " : " + waswohl (i) ); } // for } // main }// WasWohlTest 5 von 17

(b) Gegenstand dieser Aufgabe ist die Funktion fmod4 (n) = n mod 4 für Argumente der natürlichen Zahlen einschließlich der 0. Schreiben Sie ein Java-Programm, welches die Funktion fmod4 in einer eigenen Methode implementiert, die ohne die explizite Modulo-Funktion auskommt und nur die Rekursion und Fallunterscheidung verwendet. Schreiben Sie auch die main-methode, welche die Methode fmod4 aufruft. In der main-methode soll insbesondere die Eingabe von der Tastatur erfragt werden und die Ausgabe auf dem Bildschirm erfolgen. 6 von 17

(c) Betrachten Sie wieder die Java-Methode waswohl aus Teilaufgabe (a). In diesem Zusammenhang soll die Komplexität des Rechenaufwands beschrieben werden. Welche Problemgröße sollte sinnvollerweise verwendet werden? Welche Ordnung ergibt sich bezüglich der Rechenkomplexität? 3.) a b c Summe Punkte /4 /4 /2 10 7 von 17

4. Aufgabe: Java-Programmierung Gegenstand dieser Aufgabe ist die Programmierung mit Hilfe der Programmiersprache Java, insbesondere die Verwendung interner Datenstrukturen und der Umgang mit Ein- und Ausgabe-Methoden in Java. Als Anwendung werden die Ziehung bzw. der Umgang mit den bekannten Lotttozahlen 6 aus 49 verwendet. (a) Zunächst soll eine einzige Lottozahl gewürfelt werden. Es soll also zufällig eine Zahl aus der Menge der natürlichen Zahlen 1 bis 49 ermittelt werden. Dazu wird das folgende Code- Segment angeboten. In dieser Teilaufgabe soll die main-methode so erweitert werden, dass durch korrekten Aufruf der Methode lottozahl die gewürfelte Lottozahl auf der Standardausgabe ausgegeben wird. Die Methode lottozahl darf dabei nicht verändert werden. public class TestLotto { public static int lottozahl (int anzahl) { int zahl = (int) (Math.random() * anzahl); return zahl; } // lottozahl public static void main (String args [ ]) { } // main } // TestLotto 8 von 17

(b) Als Resultat dieser Teilaufgabe sollen, wie aus der Praxis üblich, alle sechs Lottozahlen gewürfelt werden. Bitte beachten Sie dabei, dass dieselbe Zahl natürlich nicht zweimal gewürfelt werden kann. Bitte fügen Sie dazu in die Methode sechslottozahlen die notwendigen Java-Anweisungen ein. Innerhalb der Methode sechslottozahlen soll die Methode lottozahl verwendet werden. Die Methoden lottozahl und main dürfen dabei nicht verändert werden. public class TestLotto { public static int lottozahl (int anzahl) { int zahl = (int) (Math.random() * anzahl); return zahl; } // lottozahl public static int [ ] sechslottozahlen ( ) { } // sechslottozahlen public static void main (String args [ ]) { int [ ] result = sechslottozahlen ( ); System.out.print ("Die aktuellen Lottozahlen lauten: "); for (int i=0; i<6; i++) System.out.print (result [i] + " "); } // main } // TestLotto 9 von 17

(c) Als Resultat der Teilaufgabe (b) werden die sechs Lottozahlen ungeordnet auf dem Bildschirm ausgegeben. In dieser Teilaufgabe soll dieser Fehler korrigiert werden. Dazu kann aus dem Package java.util.arrays die Methode sort verwenden werden. Die Elemente des Arrays feld werden mit Hilfe der Methode static void sort (Typ [ ] feld) aufsteigend sortiert. Typ steht für einen der Datentypen byte, char, short, int, long, float, double oder String. Der Code aus der Teilaufgabe (b) muß in genau einer Methode um eine neue Anweisung erweitert werden. Welche Methode muß wie erweitert werden? Fügen Sie bitte die entsprechende Anweisung an der richtigen Stelle ein! import java.util.arrays; public class TestLotto { public static int lottozahl (int anzahl) { int zahl = (int) (Math.random() * anzahl); } // lottozahl return zahl; public static int [ ] sechslottozahlen ( ) {... } // sechslottozahlen public static void main (String args [ ]) { int [ ] result = sechslottozahlen (); System.out.print ("Die aktuellen Lottozahlen lauten: "); for (int i=0; i<6; i++) System.out.print (result [i] + " "); } // main } // TestLotto 10 von 17

(d) Eine Tip-Gemeinschaft wettet jede Woche auf dieselben Lottozahlen und kreuzt jede Woche dieselben 4 Blöcke auf dem Lottozettel an. Die entsprechenden Lottozahlen sind in einer nicht binären Eingabe-Datei gespeichert, eine Sechser-Reihe jeweils zusammenhängend hintereinander geschrieben. Die entsprechenden Werte können mit Hilfe der Scanner-Klasse eingelesen werden. Insgesamt sind also 24 Zahlen in der Datei gespeichert. Alle Werte sind als Integer-Werte zu interpretieren. Die Aufgabe besteht darin, mit Hilfe der Methode einlesen die 4 Lottotips von der Eingabedatei einzulesen und in ein internes 2-dimensionales Array abzulegen, welches in der ersten Dimension die 4 Lottotips unterscheidet und in der zweiten Dimension jeweils die 6 Lottozahlen enthält. import java.io.file; import java.io.ioexception; import java.util.scanner; class Test { static int [ ][ ] einlesen (String datei) throws IOException { } // einlesen public static void main (String args [ ]) throws IOException { int [ ][ ] lottotips = einlesen (args [0]); } // main } // Test 4.) a b c d Summe Punkte /2 /5 /1 /3 /11 11 von 17

5. Aufgabe: Objektorientierung (a) Betrachten Sie die folgenden zwei Packages Package1 und Package2 und das Hauptprogramm in der Klasse Test: 1:package Package1; 2:public class Konto { 3: public int kontonummer; 4: public double saldo; 5: protected Konto (int nummer, double betrag) { 6: kontonummer = nummer; 7: saldo = betrag; 8: } // Konto 9:} // Konto 12:package Package2; 13:import Package1.*; 14:public class GiroKonto extends Konto { 15: public double dispo; 16: public GiroKonto (int nummer, double betrag, double limit) { 17: super (nummer, betrag); 18: dispo = limit; 19: } // Girokonto 20:} // GiroKonto 23:import Package2.*; 24:class Test { 25: public static void main (String [] args) { 26: GiroKonto g = new GiroKonto (4711, 1000., 500.); 27: Konto k = new Konto (4712, 2000.); 28: System.out.println ("Die Kontonummer beträgt: " + g.kontonummer); 29: System.out.println ("Der aktuelle Saldo beträgt: " + g.saldo); 30: System.out.println ("Der Dispo beträgt: " + g.dispo); 31: System.out.println ("Die Kontonummer beträgt: " + k.kontonummer); 32: System.out.println ("Der aktuelle Saldo beträgt: " + k.saldo); 33: } // main 34:} // Test 12 von 17

Compiliert das Programm bestehend aus den beiden Packages und der Klasse Test, falls nein, wo genau passiert der Fehler, in welcher Zeile gibt es eine Fehlermeldung. Erläutern Sie bitte auch den entsprechenden Hintergrund der Fehlermeldung! 13 von 17

(b) Eine Warteschlange arbeitet nach dem FIFO-Prinzip (First-In-First-Out) und bietet Methoden zum Einfügen und Entfernen von Elementen an. Das als erstes in der Warteschlange abgelegte Element wird beim Herausnehmen auch als erstes wieder entfernt. Mit Hilfe der Klasse Queue soll eine Warteschlange implementiert werden, welche als Elemente nur positive Integer-Werte verwaltet. Es müssen also die beiden folgenden öffentlichen Methoden void put (int element) und int get ( ) angeboten werden. Bei der Realisierung muß darauf geachtet werden, dass auf die internen Strukturen von Außen nicht zugegriffen werden darf. Im Wesentlichen soll ein Objekt der Klasse Queue nur über die beiden Methoden put und get ansprechbar sein. Als interne Realisierung bietet sich ein Array an, welches zyklisch erweitert wird. Es wird genau ein Konstruktor angeboten, welcher die Größe des internen Arrays erwartet. Die Klasse Queue enthält neben dem internen Array drei Instanzvariablen first, last und load mit deren Hilfe die FIFO-Dynamik umgesetzt werden soll. In der folgenden Abbildung wird dieser Sachverhalt mit Hilfe eines Arrays der Größe 10 veranschaulicht. Das Array ist aktuell mit 6 Elementen belegt: load = 6 0 1 2 3 4 5 6 7 8 9 last first Die Instanzvariable load hat daher aktuell den Wert 6. Das erste Element, welches mit der Methode first zurückgegeben würde, liegt an der Position 8. Das letzte Element, welches in die Warteschlange eingefügt wurde, liegt an Position 3. Das nächste Element, welches mit Hilfe der put-methode eingefügt werden würde, käme an Position 4. Zur Implementierung sollen die Instanzvariablen last, first und load und die interne Hilfs- Methode int next (int position), die auf der nächsten Seite angegeben sind, verwendet werden und sonst keine weiteren Methoden. Es soll also die in der Abbildung angedeutete zyklische Logik umgesetzt werden, die mit Hilfe der internen Methode next implementiert werden kann. Das bedeutet umgekehrt, dass zur Lösung der Aufgabe bereits in der Warteschlange gespeicherte Werte nicht umpositioniert werden dürfen. Bei der Realisierung der Methode void put (int element) muß also der Eingabewert einmalig an einer Position gespeichert werden, bei der Realisierung der Methode int get ( ) muß der gesuchte Wert nur gelesen werden. In dieser Teilaufgabe soll zunächst keine Exception Handling realisiert werden. Der Versuch, eine volle Warteschlange zu beschreiben bzw. von einer leeren Warteschlange, etwas zu entnehmen, soll allerdings bei der Implementierung berücksichtigt werden. Der entsprechende Vorgang soll also abgefangen werden aber ohne Effekt bleiben. Im folgenden werden die Teile der Java-Klasse Queue vorgegeben, die bei der Implementierung zu verwenden sind. Die Aufgabe lautet also, die beiden Methoden put und get geeignet zu implementieren! 14 von 17

public class Queue { private int [ ] queue; private int last, first, load; public Queue (int size) { queue = new int [size]; last = size-1; } // Queue private int next (int position) { if (position!= queue.length -1) position++; else position = 0; return position; } // next public void put (int element) { } // put public int get ( ) { } // Queue } // get 15 von 17

(c) In dieser Teilaufgabe soll das Ergebnis der Teilaufgabe (b) um Exception Handling erweitert werden. Dazu müssen zwei Exception-Klassen QueueFull und QueueEmpty in Java implementiert werden, die dann von einem entsprechenden Test-Programm im Fehlerfall "gefangen" werden können. Auf der folgenden Seite wird die Klasse QueueFull und ein mögliches Test-Programm aufgezeigt. Auf dieser Seite sind die beiden relevanten Methoden der Klasse Queue angedeutet. Bitte ergänzen Sie so, dass ein Exception Handling korrekt ablaufen kann. Falls Sie die Teilaufgabe (b) nicht gelöst haben, deuten Sie die fehlenden Teile entsprechend an! public class Queue { public void put (int element) { } // put public int get ( ) { } // Queue } // get 16 von 17

public class QueueFull extends Exception { QueueFull (int value) { super ("Warteschlange ist voll: " + value + " passt nicht mehr rein"); } // QueueFull } // QueueFull public class Test { public static void main (String [ ] args) { Queue q = new Queue (Integer.parseInt(args[0])); queue.put (11); queue.get ( ); } // main } // Test 5.) a b c Summe Punkte /2 /6 /4 /12 17 von 17