Computer Science I Week 10

Die Seite wird erstellt Wolfger Burger
 
WEITER LESEN
Computer Science I Week 10
Computer Science I
Week 10
David Sommer

                     David Sommer   25. November 2020   1
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