Computer Science I Week 10
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Outline 1. Self-Assessment III 2. Function Overloading 3. Classes 4. Repetition: Recursion David Sommer 25. November 2020 2
Übungen Fragen David Sommer 25. November 2020 3
Self-Assessment • To get feedback about your progress. • Get familiar with the exam questions. • The score of the test is not included in the final grade! • Participation is completely voluntary, but highly recommended. • Solutions will be provided immediately after the test. • Time: 20 Minuten • https://moodle-app2.let.ethz.ch David Sommer 25. November 2020 4
v1 Informatik Self-Assessment III Lösung Name, Vorname: ............................................................. Legi-Nummer: ............................................................. Diese Selbsteinschätzung dient Ihrer und unserer Orientierung. Sie wird eingesammelt, korrigiert und vertraulich behandelt. Sie hat keinen Einfluss auf eine spätere Leistungs- bewertung. Sie haben 20 Minuten Zeit. Das folgende Kleingedruckte finden Sie auch auf einer "scharfen" Prüfung. Allgemeine Richtlinien: General guidelines: 1. Dauer der Prüfung: 20 Minuten. Exam duration: 20 minutes. 2. Erlaubte Unterlagen: Wörterbuch (für gesprochene Permitted examination aids: dictionary (for spoken Sprachen). Keine eigenen Notizblätter! Bei Bedarf languages). No sheets of your own! We will give stellen wir Ihnen weitere Blätter zur Verfügung. you extra sheets on demand. 3. Benützen Sie einen Kugelschreiber (blau oder schwarz) Use a pen (black or blue), not a pencil. Please und keinen Bleistift. Bitte schreiben Sie leserlich. Nur write legibly. We will only consider solutions that lesbare Resultate werden bewertet. we can read. 4. Lösungen sind direkt auf das Aufgabenblatt in die dafür Solutions must be written directly onto the exam vorgesehenen Boxen zu schreiben (und direkt darunter, sheets in the provided boxes (and directly below, if falls mehr Platz benötigt wird). Ungültige Lösungen sind more space is needed). Invalid solutions need to be deutlich durchzustreichen! Korrekturen bei Multiple- crossed out clearly. Provide corrections to answers Choice Aufgaben bitte unmissverständlich anbringen! of multiple choice questions without any ambiguity! Lösungen auf Notizblättern werden nicht berücksichtigt. Solutions on extra sheets will not be considered. 5. Es gibt keine Negativpunkte für falsche Antworten. There are no negative points for false answers. 6. Störungen durch irgendjemanden oder irgendetwas If you feel disturbed by anyone or anything, let the melden Sie bitte sofort der Aufsichtsperson. supervisor of the exam know immediately. 7. Wir sammeln die Prüfung zum Schluss ein. Wichtig: We collect the exams at the end. Important: you stellen Sie unbedingt selbst sicher, dass Ihre Prüfung von must ensure that your exam has been collected by einem Assistenten eingezogen wird. Stecken Sie keine an assistant. Do not take any exam with you and Prüfung ein und lassen Sie Ihre Prüfung nicht einfach do not leave your exam behind on your desk. The am Platz liegen. Dasselbe gilt, wenn Sie früher abgeben same applies when you want to finish early: please wollen: bitte melden Sie sich lautlos, und wir holen die contact us silently and we will collect the exam. Prüfung ab. Vorzeitige Abgaben sind nur bis 15 Minuten Handing in your exam ahead of time is only possible vor Prüfungsende möglich. until 15 minutes before the exam ends. 8. Wenn Sie zur Toilette müssen, melden Sie dies einer Auf- If you need to go to the toilet, raise your hand and sichtsperson durch Handzeichen. wait for a supervisor. 9. Wir beantworten keine inhaltlichen Fragen während der We will not answer any content-related questions Prüfung. Kommentare zur Aufgabe schreiben Sie bitte during the exam. Please write comments referring auf das Aufgabenblatt. to the tasks on the exam sheets. 10. Richtig beantwortete Multiple-Choice Fragen erhalten Correctly answered Multiple-Choice questions re- jeweils 1 Punkt. Es gibt keine negativen Punkte in MC ceive 1 point each. There are no negative points in Fragen. MC questions P Aufgabe 1 2 3 4 5 Punkte Maximum 4 6 5 6 8 29
v1 1 Characters (4 Punkte) Betrachten Sie die folgende Schleife und Consider the following loop and write its geben Sie ihre Ausgabe direkt in dem dafür output directly in the provided box. As- vorgesehenen Kästchen an. Nehmen Sie an, sume that letters are ordered according dass Buchstaben gemäss dem ASCII-Code to the ASCII code! sortiert sind! for (char c = ’F’; c < ’R’; c += 3) std::cout
v1 2 Referenzen (6 Punkte) Kreuzen Sie an, ob die Aussagen richtig oder Mark if the statements are correct or falsch sind. wrong. Aussage correct wrong Statement richtig falsch Referenzen können benutzt werden, um bei Funktionsaufrufen un- x nötige Kopien der Argumente zu verhindern. (Richtig. Dies ist der Grund, weshalb const-Referenzen eingeführt wurden.) References can be used to prevent unecessary copies of the arguments of function calls. (Correct. This is the reason for introducing const-references.) Eine nicht const-Referenz kann nicht verwendet werden, um x eine const-Variable zu referenzieren. (Richtig. Ansonsten würde dies die const-Correctness unterlaufen.) A non-const reference cannot be used to refer to a const vari- able. (Correct. Otherwise it would have undermined the const-correctness. ) Eine Referenz muss immer mit einem L-Wert initialisiert werden. x (Falsch. const-Referenzen erlauben auch R-Werte mit entsprechender Lebensdauer.) A reference must always be initialized with an L-value. (Wrong. const-references allow R-values, given sufficient variable lifetime.) Eine Funktion sollte niemals eine Referenz auf eine lokale Variable x zurückgeben. (Richtig. Die Lebensdauer der Variable endet mit deren Rückgabe.) A function should never return a reference to a local vari- able. (Correct. The lifetime of a variable ends as the function returns.) Nachdem eine Referenzvariable initialisiert wurde, kann sie jede x andere Variable des gleichen Typs referenzieren. (Falsch. Referenzen können nicht geändert werden) Once a reference variable has been initialized, it can refer to any other variable of the same type. (Wrong. A reference cannot be modified.) Page 3 of 8
v1 3 EBNF I (5 Punkte) Die folgende EBNF definiert eine Sprache zur Beschreibung von kantengewichteten Bäu- men. Ein geklammerter Ausdruck steht für einen Baum, ganze Zahlen bezeichnen Kan- tengewichte. Ein illustrierendes Beispiel ist unter der EBNF zu finden. Beantworten Sie die Fragen auf der rechten Seite. The EBNF displayed below defines a language for trees with weighted edges. An ex- pression in parentheses stands for a tree, integer numbers designate edge weights. An illustrating example is displayed below the EBNF. Answer the questions on the right side. Tree = ’(’ Branches ’)’. Branches = Branch { Branch }. Branch = Length | Length Tree. Length = unsigned int. Beispiel / Example: (3 (2 1 (4 3)) 4 4) ⇔ Die gestrichelten Linien kennzeichnen Pfad mit maximaler Länge. Das ist nur für Aufgabe 4 relevant. The dashed lines designate the path with maximal length. This is only relevant for problem 4. Page 4 of 8
v1 (a) Wahr oder falsch? true or false? true 1P Die folgende Zeichenkette ist ein gültiger Baum (Tree) nach der EBNF: The following string is a valid tree (Tree) according to the EBNF: (10 20 30) (b) Wahr oder falsch? true or false? false 1P Die folgende Zeichenkette ist ein gültiger Baum (Tree) nach der EBNF: The following string is a valid tree (Tree) according to the EBNF: () (c) Wahr oder falsch? true or false? true 1P Die folgende Zeichenkette ist ein gültiger Baum (Tree) nach der EBNF: The following string is a valid tree (Tree) according to the EBNF: (10 5 (20 30 40) 30 40 (5 2 1) 45) (d) Wahr oder falsch? true or false? false 1P Die folgende Zeichenkette ist ein gültiger Baum (Tree) nach der EBNF: The following string is a valid tree (Tree) according to the EBNF: 10 (10 20 30) (e) Zeichnen Sie den Baum, welcher zu folgender Eingabe gehört. 1P Draw the tree that belongs to the following input. (1 (2 (3) 4) 5) Page 5 of 8
v1 4 EBNF II (6 Punkte) Die folgende main-Funktion soll zu einem Baum, welcher gemäss der EBNF der vorigen Aufgabe am Eingabestrom vorliegt, die maximale Pfadlänge ausgeben. Die Länge eines Pfades ist die Summe der Gewichte entlang des Pfades. Ein Pfad eines Baumes geht jeweils von der Wurzel des Baumes bis zu einem Blatt. Im Beispiel auf Seite 4 ist der Pfad mit maximaler Länge 3+1+4=8 gestrichelt eingezeichnet. Vervollständigen Sie den Code der Funktionen Tree, Branches und Branch entsprechend (jeweils 2P). The following main function shall return the maximal path length of a tree that is provided at the input stream according to the EBNF defined in the previous task. The length of a path is given by the sum of its weights. A path of a tree starts from the tree root and ends at a leaf. In the example on page 4 the path with maximal length 3+1+4=8 is dashed. Complement the code of functions Tree, Branches and Branch accordingly (2P each). #include // code on the right hand side ----> int main() { int length = Tree(std::cin); std::cout
v1 // POST: leading whitespace characters are extracted from is, and the // first non-whitespace character is returned (0 if there is none) char lookahead (std::istream& is); // Tree = ’(’ Branches ’)’. // Returns length of longest outgoing path. int Tree (std::istream& is){ char c; is >> c; assert(c==’(’); length = Branches(is) ; is >> c; assert(c==’)’); return length; } // Branches = Branch { Branch }. int Branches (std::istream& is){ int length = Branch(is); while (lookahead(is) != ’)’){ int bLength = Branch(is); if (bLength > length) length = bLength; } return length; } // Branch = Length | Length Tree. int Branch(std::istream& is){ int length = Length(is); if (lookahead(is) == ’(’) return Tree(is)+length ; return length; } // Length = unsigned int. // Returns integer present at input stream int Length (std::istream& is); Page 7 of 8
v1 5 Vektoren und Referenzen (8 Punkte) Seien x und y zwei Folgen mit Län- Let x and y be two sequences of lengths gen n und m, x = (x1 , x2 , . . . , xn ) und n and m, x = (x1 , x2 , . . . , xn ) and y = y = (y1 , y2 , . . . , ym ). Wir definieren den (y1 , y2 , . . . , ym ). We define the zip of x Reissverschluss von x und y als and y as zip(x, y) = (x1 , y1 , x2 , y2 , . . . , xmin(n,m) , ymin(n,m) ). Gesucht ist eine Funktion, die zwei Folgen We are looking for a function that re- ganzer Zahlen x und y als Zeigerbereiche ceives two integer sequences x and y as erhält und zip(x, y) ausgibt. Hier ist ein ranges and outputs zip(x, y). Here is Beispiel: an example: x = (1, 3, 5, 7, 9, 11), y = (2, 4, 6, 8) ⇒ zip(x, y) = (1, 2, 3, 4, 5, 6, 7, 8). Unten finden Sie das Skelett eines Pro- Above, you find a skeleton of a program gramms, das eine solche Funktion definiert that defines and calls such a function. und aufruft. Ihre Aufgabe ist es, die Lücken Your task is to fill the gaps in such a so zu füllen, dass sich eine korrekte Funktion way that you get a correct function and und ein korrektes Programm ergibt. a correct program. // POST: writes the zip of xVec and yVec void zip (const std :: vector& xVec, const std:: vector& yVec) { unsigned int xInd = 0 ; unsigned int yInd = 0 ; while ( xInd < xVec.size() && yInd < yVec.size() ) { std :: cout
Function Overloading int max ( int a , int b ) { ... } int max ( int a , int b , int c ) { ... } → Distinguishable functions for compilers → valid in C++ int fun2 ( int a ) { ... } int fun2 ( float a ) { ... } → Type difference matters ( int ↔ float ) → Variable names ( a ) does not matter David Sommer 25. November 2020 5
Function Overloading II int fun3 ( int a ) { ... } int fun3 ( int b ) { ... } // compiler error → Compiler cannot distinguish these functions! → Only variable names are not enough to distinguish the two functions. int c = fun3 (3); // unclear ( no variable name ) int fun4 ( int a ) { ... } double fun4 ( int a ) { ... } // compiler error → Not distinguishable for the compiler! std :: cout
Function Overloading III # include < iostream > void out ( const int i ) { std :: cout
Classes • Similar to struct • But: supports private Methods and Members class rect { private : int x1 , y1 , x2 , y2 ; // private member public : int area () { // public member function int a = ( x1 - x2 ) * ( y2 - y1 ); if ( a < 0) return -a ; else return a ; } }; David Sommer 25. November 2020 8
Classes II - Declaration vs Definition Declaration: rect.h Definition: rect.cpp class rect { # include " rect . h " private : int x1 , y1 , x2 , y2 ; public : // POST : return the area of the rect int area (); int rect :: area () { int a = ( x1 - x2 ) * ( y2 - y1 ); // definitions also if ( a < 0) return -a ; int get_x1 () { return x1 ; } else return a ; }; } David Sommer 25. November 2020 9
Classes III - Constructors Constructors are required for initialization: class rect { private : int x1 , x2 , y1 , y2 , surface ; public : rect ( int p1_x , int p1_y , int p2_x , int p2_y ) : x1 ( p1_x ) , x2 ( p2_x ) , y1 ( p1_y ) , y2 ( p2_y ) { surface = area (); } ~ rect () { // Destructor - called when object expires ( out of scope ) // int , float , vector etc deleted automatically // pointers : must be deleted ! } }; David Sommer 25. November 2020 10
Example: Operator Overloading Addition of two objects of class Point: class point { private : int x , y ; public : point ( x_inp , y_inp ): x ( x_inp ) , y ( y_inp ) {}; }; point operator +( const point & first , const point & second ) { return point ( first . x + second .x , first . y + second . y ); } David Sommer 25. November 2020 11
TriBool CodeExpert: https://expert.ethz.ch David Sommer 25. November 2020 12
Recursion Exercise 3
Recursion Exercise 3 Write a function rev_out (see template below) which outputs the contents of an istream in reverse order using recursion. #include #include // POST: output the content of is in reverse order to // std::cout, and removed it from is. void rev_out (std::istream& is) { // your code } int main () { std::stringstream input ("abcdefghijklmno"); rev_out (input); return 0; } 8
Recursion Exercise 3 Other solutions are of course also possible. #include #include // POST: output the content of is in reverse order to // std::cout, and removed it from is. void rev_out (std::istream& is) { char val; if (is >> val) { rev_out(is); std::cout
Recursion Exercise 1
Recursion Exercise 1 Rewrite the following recursive function in iterative form. unsigned int f (const unsigned int n) { if (n
Recursion Exercise 1 Solution below uses just 4 variables. Other solutions are of course also possible. unsigned int f_it (const unsigned int n) { if (n
Recursion Exercise 2
Recursion Exercise 2 Rewrite the following recursive function in iterative form. unsigned int f (const unsigned int n) { if (n == 0) return 1; return f(n-1) + 2 * f(n/2); } (From: Script Exercise 129) 5
Recursion Exercise 2 Solution below stores intermediate results in a vector. Other solutions are of course also possible. unsigned int f_it (const unsigned int n) { if (n == 0) return 1; // special case std::vector f_values(n+1, 0); f_values[0] = 1; for (unsigned int i=1; i
Questions? David Sommer 25. November 2020 13
Sie können auch lesen