Quiz

Aufgabengruppe 1

Studiere das folgende Programm und beantworte dann die folgenden Fragen. Wir möchten, dass Sie die Fragen nur anhand des Quellcodes beantworten, d.h., kopieren Sie ihn nicht in eine Datei, kompilieren Sie sie nicht und beantworten Sie die Fragen basierend auf der Ausführung. So viel Spaß!

int main() {
  int counter, first, last, next;
  first = 1; last = 2;

  for (counter = first; counter <= last; counter++) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
  }

  counter = first;
  while (counter <= last) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  }

  counter = first;
  do {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  } while (counter < last);
}

Frage 1: Was ist das Ergebnis dieses Programms?

A) 1 2
2 4
1 2
2 4
1 2
2 4
B) 1 1
2 4
1 1
2 4
1 1
2 4
C) 1 1
2 4
1 1
2 4
1 1
D) 1
2 4
1 1
1 1
2 4
E) Die Ausgabe ist fehlerfrei. Die Syntax ist fehlerhaft.

Frage 2: Was würde passieren, wenn wir die Initialisierung von „counter“ vor der do-while-Schleife entfernen?

A) Endlosschleife: Die do-while-Schleife gibt eine Reihe von Einsen aus
B) Die Ausgabe des Programms ändert sich nicht.
C) Die do-while-Schleife gibt 2 und 4 aus.
D) Die do-while-Schleife gibt nichts aus
E) Die do-while-Schleife gibt 3 und 9 aus.

Frage 3: Angenommen, wir haben für das ursprüngliche Programm oben auf dieser Seite die Zeile entfernt, mit der die Zählervariable vor der während-Schleife initialisiert wird. Was würde passieren, wenn wir auch die Zeile counter++ in der while-Schleife entfernen würden, wie im Folgenden dargestellt?

A) Die while-Schleife gibt nichts aus.
B) Die while-Schleife gibt 1 und 1 aus. Die do-while-Schleife gibt nichts aus.
C) Die Ausgabe der while-Schleife ist die gleiche, als wenn beide Zeilen enthalten sind.
D) Das System gibt Zufallszahlen so lange aus, bis der Computer ausgeschaltet wird.
E) Die while-Schleife ist eine Endlosschleife.

Frage 4: Was würde angesichts des ursprünglichen Programms oben auf dieser Seite passieren, wenn die Während-Schleife so aussähe?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) Die Ausgabe der while-Schleife entspricht der Ausgabe im ursprünglichen Programm.
B) Bei der while-Schleife wird nichts ausgegeben
C) Die Ausgabe der while-Schleife ist 1 1 und 1 4.
D) Die Ausgabe der while-Schleife ist 1 2 und 2 4.
E) Die Ausgabe der while-Schleife ist 1 4 und 2 4.
Die Ausgabe der while-Schleife ist 2 4 und 2 4.

Frage 5: Was würde passieren, wenn die erste Variable größer als die letzte ist?

A) Die while-Schleife gibt etwas aus, aber sonst nichts.
B) Mit der „true“-Schleife wird etwas ausgegeben, aber sonst nichts.
C) Es erfolgt keine Ausgabe.
D) Das Programm führt einen Fehler aus oder stürzt ab.
E) Die for-Schleife gibt etwas aus, aber sonst nichts.

Frage 6: Wie sieht die Programmausgabe aus, wenn die erste Variable so initialisiert wird, dass sie mit der letzten Variablen identisch ist?

A) Mit der „true“-Schleife wird etwas ausgegeben, aber sonst nichts.
B) Die while-Schleife gibt etwas aus, aber sonst nichts.
C) Jede Schleife gibt eine Zeile aus.
D) Mit der do while-Schleife werden zwei Zeilen ausgegeben, die andere als Schleife.
E) Es wird nichts ausgegeben
Die for-Schleife gibt etwas aus, aber sonst nichts.


Aufgabengruppe 2

Wie schon bei der vorherigen Aufgabe steht auch hier ein Programm für Sie in Frage. Bitte beantworte die folgenden Fragen und sieh dir nur den Quellcode an.

#include <iostream>
using namespace std;

int main() {
  int Boys = 3, Girls = 5;
  void F1(int males, int females);
  void F2(int &m, int &f);

  F1(Boys, Girls);
  cout << "\nAfter calling F1, within main()";
  cout << "\n\tBoys = " << Boys; // #2
  cout << "\n\tGirls = " << Girls;

  F2(Boys, Girls);
  cout << "\nAfter calling F2, within main()";
  cout << "\n\tBoys = " << Boys; // #4
  cout << "\n\tGirls = " << Girls;
}

void F1(int b, int g) {
  b += 3, g += 4;
  cout << "\nF1";
  cout << "\n\tBoys = " << b; // #1
  cout << "\n\tGirls = " << g;
}

void F2(int &b, int &g) {
  b = b + 8, g = g + 5;
  cout << "\nF2";
  cout << "\n\tBoys = " << b; // #3
  cout << "\n\tGirls = " << g;
}

Frage 1: Welche Ausgabe liefert die Variable „boys“ auf die markierten Zeilen?

A) Nr. 1: 6
Nr. 2: 3
Nr. 3: 11
Nr. 4: 11
B) Nr. 1: 6
Nr. 2: 3
Nr. 3: 11
Nr. 4: 3
C) Nr. 1: 6
Nr. 2: 6
Nr. 3: 11
Nr. 4: 11
D) Es gibt nichts aus, da es weder kompiliert noch ausgeführt wird.

Question 2: Wählen Sie alle zutreffenden Antworten zu den folgenden Programmzeilen aus:

void F1(int males, int females);
void F2(int &m, int &f);
A) C++-Regeln besagen, dass wir diese beiden Zeilen entfernen können, solange die Methoden vor der Verwendung definiert sind.
B) C++-Regeln besagen, dass die Argumentnamen in der Deklaration und Definition identisch sein müssen.
C) Dieses Programm stürzt ab, wenn wir diese beiden Zeilen entfernen.
D) Es kommt häufiger vor, dass die Deklarationen global angegeben werden.
E) Diese werden als Forward-Deklarationen bezeichnet.

Frage 3: Was passiert, wenn wir die folgende Zeile aus „main()“ in den globalen Geltungsbereich verschieben?

int Boys = 3, Girls = 5;
A) Die Ausgabe wäre die gleiche.
B) Jungen würden = 3 und Mädchen würden = 5 bei der gesamten Ausgabe = 5.
C) Jungen würden = 3 und Mädchen = 5 nur in der Ausgabe von main().

Frage 4: Was wäre, wenn wir den Beginn des Programms folgendermaßen ändern würden?

// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;

void main() {
  //int Boys = 3, Girls = 5;
A) Das Programm würde zwar kompilieren, stürzt jedoch beim Ausführen ab.
B) In der Ausgabe würde es keine Änderungen geben.
C) Die Ausgabe wäre während des gesamten Programms Boys = 3 Girls = 5 .
D) Die Ausgabe wäre nur in der Ausgabe von „main()“ „Boys = 3 Girls = 5“.
E) Das Programm wird wahrscheinlich nicht kompilieren (abhängig vom Compiler).

Question 5: Die Daten werden mit einem Wert in F2 übergeben.

A) Richtig
B) Falsch


Aufgabengruppe 3

Wie schon bei der vorherigen Aufgabe steht auch hier ein Programm für Sie in Frage. Bitte beantworte die folgenden Fragen nur anhand des Quellcodes.Diese ist interessanter als die beiden vorherigen – verfolgen Sie den Code sorgfältig.

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];

void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);

int main() {
  ARR2D matrix;
  int row, col;
  do {
    cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
    cin >> row >> col;
  } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
  Fill(matrix, row, col);
  Print(matrix, row, col);
  return(0);
}

void Print(ARR2D in_array, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++)
      cout << '\t' << in_array[i][j];
    cout << endl;
  }
}

void Fill(ARR2D in_array, int rows, int cols) {
  for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      in_array[i][j] = 0;

  const int limit = rows * cols;
  int cNum = 1;
  int cRow = 0;
  int cCol = 0;
  int cDir = 0;  // 0-north, 1-east, 2-south, 3-west

  while(true) {
    // Place the number.
    in_array[cRow][cCol] = cNum;
    cNum++;
    if (cNum > limit) break;

    int fRow = cRow;
    int fCol = cCol;
    while (true) {
      fRow = cRow;
      fCol = cCol;
      switch(cDir) {
        case 0: fRow--; break;
        case 1: fCol++; break;
        case 2: fRow++; break;
        case 3: fCol--; break;
      }

      if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
        break;
      cDir = (cDir + 1) % 4;
    }
    cRow = fRow;
    cCol = fCol;
  }
}

Frage 1: Was gibt das Programm mit der Eingabe 3 für Zeilen und 4 für Spalten aus?

A) 1 2 3
4 5 6
7 8 9
10 11 12
B) 1 2 3 4
5 6 7 8
9 10 11 12
C) 12 11 10 9
8 7 6 5
4 3 2 1
D) 1 3 2 4
8 6 7 5
9 11 10 12
E) 1 2 3 4
10 11 12 5
9 8 7 6
G) 9 8 7 6
10 11 12 5
1 2 3 4
H) Es erfolgt keine Ausgabe, da die Logik fehlerhaft ist.
I) Es wird nichts ausgegeben, es liegen Syntaxfehler vor.
J) Die Ausgabe ist nicht sinnvoll.
T. Er gibt die ersten 12 Zahlen aus, die Ihnen einfallen, während Sie auf die Ausführung des Programms warten.

Question 2: Was wäre, wenn wir der Funktion main() die folgende Zeile hinzufügen würden?

MAX_SIZE = 10;
A) Dies ist in C++ nicht zulässig.
B) Dies ist zulässig. Das Programm würde mit einem Wert von MAX_SIZE auf 20 ausgeführt werden.
C) Dies ist zulässig. Das Programm würde mit einem Wert von MAX_SIZE auf 10 ausgeführt werden.

Frage 3: Betrachten Sie die folgenden vier Zeilen aus dem obigen Programm:

const int MAX_SIZE = 20;
typedef int ARR2D [MAX_SIZE][MAX_SIZE];

void Print  (ARR2D A, int rows, int cols);
void Fill   (ARR2D A, int rows, int cols);

1) Ist es möglich, eine Konstante in einer typedef zu verwenden?
2) Ist es möglich, eine „typedef“-Anweisung in einer Deklaration zu verwenden, bevor eine Variable dieses Typs deklariert wurde?

A) 1) Ja 2) Ja
B) 1) Nein 2) Nein
C) 1) Nein 2) Ja
D) 1) Ja, 2) Nein

Question 4: Dürfen wir Folgendes verwenden:

#define MAX_SIZE 20
anstelle von:
const int MAX_SIZE = 20;
A) Ja, es funktioniert und Sie können #define für Konstanten in C++ verwenden.
B) Ja, es wird funktionieren, aber wir verwenden in der Regel nicht #define für Konstanten in C++
C) #define ist nicht verfügbar in C++
D) In C ist das nicht möglich.

Frage 5: Mit typedef wird ein Alias für einen Typnamen erstellt.

A) Richtig
B) Falsch

Frage 6: Was würde passieren, wenn wir das Array in der Funktion „Fill()“ nicht mit 0 initialisieren würden?

A) Er wird ausgeführt, aber die Ausgabe umfasst alle 12
B) Die Ausführung erfolgt problemlos und es wird die gleiche Ausgabe generiert, als ob das Array mit 0 initialisiert worden wäre.
C) Das Programm wird nicht ausgeführt oder stürzt ab
D) Sie wird ausgeführt, aber die Ausgabe ist nur Nullen.
E) Sie wird ausgeführt, generiert aber möglicherweise keine Ausgabe

Frage 7: Wählen Sie alle zutreffenden Antworten aus. Warum verwenden wir in diesem Programm const für MAX_SIZE? Ist es nicht einfacher, statt von MAX_SIZE einfach „20“ einzugeben, wo es erforderlich ist?

A) MAX_SIZE ist ein integrierter C++-Wert, den jeder verwenden kann. Richten Sie es einfach ein und verwenden Sie es.
B) Globale Variablen sollten genau wie globale Variablen vermieden werden.
C) Die Verwendung einer Konstante vereinfacht das Verständnis unseres Programms
D) Magische Zahlen in einem Programm werden in der Regel als bewährte Praxis angesehen.
E) Wenn wir MAX_SIZE ändern möchten, müssen wir dies nur an einer Stelle ändern.

Question 8: Die Switch-Anweisung in der Funktion Fill() sollte einen Standardfall haben, da sie als guter Stil angesehen wird.

A) Richtig
B) Falsch

Question 9: Beachten Sie, dass in der Funktion Fill() Variablen zwischen Anweisungen deklariert werden. Zum Beispiel werden cNum und cRow deklariert und initialisiert, nachdem eine for-Schleife ausgeführt wurde. Funktioniert das in C++ oder müssen alle Variablen oben in der Funktion deklariert werden?

A) Das ist kein Problem.
B) Alle Variablen müssen oben in der Funktion deklariert werden.
C) Beide Methoden sind falsch: C++ lässt keine Variablen in einem Programm zu.
D) Alle Variablen müssen global deklariert werden.

Aufgabengruppe 4

Im Folgenden finden Sie eine Reihe von Dateien, mit denen eine einfache Klasse definiert und getestet wird. Beantworten Sie die folgenden Fragen wie immer, indem Sie sich ausschließlich auf den Quellcode beziehen.

Hier ist die Headerdatei (cow.h):

#ifndef COW_H
#define COW_H

using namespace std;

typedef enum Color {black, brown, beige, blackandwhite, nocolor};

class Cow {
 public:
  Cow();
  ~Cow();

  // accessors
  double weight() { return weight_; };
  string name() { return name_; };
  Color color() { return color_; };

  // mutators
  void set_name(string inName) { name_ = inName; };
  void set_color(Color inColor) { color_ = inColor; };
  void set_weight(double inWeight) {weight_ = inWeight; };

  void Moo();
  void Properties();

 private:
  Color color_;
  double weight_;
  string name_;
};

#endif

Hier ist die zugehörige CC-Datei (cow.cc):

#include <iostream>
#include "cow.h"

using namespace std;

Cow::Cow() {}

Cow::~Cow() {}

void Cow::Moo() {
  cout << name() << " says MOO." << endl;
}

void Cow::Properties() {
  cout << name() << " weighs " << weight() << ", is "
       << color() << " and says MOO." << endl;
}

Und hier ist ein Clientprogramm für diese Klasse (cowmain.cc):

#include <iostream>
#include "cow.h"

using namespace std;

int main() {
  Cow cow1;
  cow1.set_name("betsy");
  cow1.set_weight(400.0);
  cow1.set_color(black);

  cow1.Moo();
  cow1.Properties();
}

Frage 1: Was gibt dieses Programm aus?

A) Betsy sagt „MOO“.
Betsy wiegt 400, ist 0 und sagt „MOO“.
B) Betsy sagt „MOO“.
Betsy wiegt 400, ist schwarz und sagt „MOO“.
C) Betsy sagt „MOO“.
Betsy wiegt 400, ist

Question 2: Wir sollten den Code für Accessor- und Mutator-Methoden niemals in einer Header-Datei platzieren. (Beachten Sie, dass eine Zugriffsfunktion eine Methode ist, die einen Wert zurückgibt, und ein Mutator eine Methode, die einen Wert ändert.)

A) Richtig
B) Falsch

Question 3: Brauchen wir das "Cow::" vor jeder der Funktionsdefinitionen in cow.cc?

A) Nein, da kuh.h enthalten ist
B) Ja

Frage 4: Welche Rolle spielen die folgenden Personen?

#ifndef COW_H
#define COW_H
...
#endif

Header-Datei wiedergeben?

Wähle alle zutreffenden Antworten aus.

A) Sie haben keinen Zweck, da der Name der Datei cow.h und nicht COW_H lautet.
B) Andernfalls würden wir einen Laufzeitfehler erhalten.
C) Andernfalls wird die Datei möglicherweise mehrmals eingefügt.
D) Sie tun nichts, weil mindestens eines der Keywords falsch geschrieben ist.
E) Sie tun nichts, da die Cow-Klasse nur eine Header-Datei hat.

Question 5: Was würde passieren, wenn wir die folgende Zeile zu cowmain.cc hinzufügen würden?

cow1.weight_ = 24;
A) Das Programm würde ausgeführt und die Variable für Gewichtung würde durch diese Zeile geändert.
B) Das Programm würde zwar kompilieren und ausführen, stürzt in dieser Zeile jedoch ab.
C) Dies ist in C++ nicht möglich.
D) Das Programm würde kompilieren und ausführen, aber die Gewichtungsvariable wird durch diese Zeile nicht geändert.

Question 6: Wenn die folgende Zeile ausgeführt wird, wird der Konstruktor in der Klasse Cow aufgerufen:

Cow cow1;

Was sind einige wichtige Merkmale von Konstruktoren?

Wähle alle zutreffenden Antworten aus.

A) Normalerweise werden keine Werte zurückgegeben.
B) Wenn wir in unserer Klasse keinen Konstruktor angeben, wird die Klasse nicht kompiliert.
C) Der Konstruktor in der Cow-Klasse ist untypisch, da er die privaten Variablen nicht initialisiert.
D) Sie haben immer denselben Namen wie die Klasse.
E) Eine Klasse kann mehrere Konstruktoren enthalten, solange sich die Argumente unterscheiden.
Ein Konstruktor wird aufgerufen, wenn eine Klasse instanziiert wird.

Frage 7: Was sind einige wichtige Merkmale eines Destruktors?

A) Ein Destruktor wird aufgerufen, wenn ein Objekt außerhalb des Gültigkeitsbereichs liegt
B) Ein Destruktor hat denselben Namen wie die Klasse, aber vorangestelltem „~“
C) Der Destruktor in cow.cc ist fehlerhaft, da er nichts bewirkt.
D) Wenn wir keinen Destruktor für unsere Klasse erstellen, wird die Klasse nicht kompiliert.

Frage 8: Überlegen Sie in Anbetracht der Art, wie das Clientprogramm die Klasse verwendet:

Die Unterteilung der Mitglieder in öffentlich und privat ist in der Kuh-Klasse nicht angemessen. Das heißt, etwas, das privat ist, sollte öffentlich oder etwas, das öffentlich ist, privat sein.

A) Richtig
B) Falsch

Question 9: Was wäre, wenn wir zusätzlich zu dem Konstruktor cow.cc einen weiteren Konstruktor hinzufügen würden? Der neue Konstruktor sieht so aus:

Cow::Cow(string inName, double inWeight, Color inColor) {
  set_name(inName);
  set_weight(inWeight);
  set_color(inColor);
}

Und wir fügen die folgenden Zeilen zu main() hinzu:

Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();

Wenn ja, unter welchen Voraussetzungen?

Wähle alle zutreffenden Antworten aus.

A) Die Zeile in main(), in der wir cow2 initialisieren, stürzt ab.
B) Wir können nur einen Konstruktor haben.
C) Dies kommt häufig in C++-
D) Ja, aber dies ist keine typische Verwendung von C++.
E) Die Ausführung wird fehlerfrei ausgeführt, gibt aber nichts aus, da die privaten Daten nicht initialisiert sind.
Wir können setName(), setColor() und setWeight() nicht innerhalb einer Methode derselben Klasse aufrufen.


Bonusfragen

Question 1) Wie wird das Ergebnis ausgegeben?

#include <iostream>
using namespace std;

void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);

void HelpMe(int *p, int *num, int *q) {
  int a;

  a = 2;
  q = &a;
  *p = *q + *num;
  num = p;
}


void WhereAmI(int *p, int *q, int a) {
  a = 6;
  *p = a + *p;
  *q = a + 3;
  HelpMe(q, &a, p);
}


int main() {
  int *p;
  int q;
  int *num;
  int a;

  a = 3;
  q = 5;
  p = &a;
  num = &q;

  HelpMe(&a, p, num);
  WhereAmI(&q, p, *num);

  cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
 

Frage 2: Betrachten Sie die folgende Aussage unter der Annahme, dass eine Apple-Klasse vorhanden und initialisiert wurde. Die Apple-Klasse hat eine Variable „color_instance“:

Apple* granny_smith = new Apple; 

Wählen Sie alle der folgenden Aussagen aus, die zutreffen:

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... Das ist NICHT zulässig. NULL ist kein Wert, der auf diese Weise überprüft werden kann.
B) Apple* granny_smith, fuji; Dadurch werden zwei Zeiger auf Apple-Objekte deklariert.
C) Die Variable granny_smith enthält die Werte der Instanzvariablen, die einem Apple-Objekt zugeordnet sind.
D) Apple* granny_smith = NULL; Das ist okay,
E) Die Variable granny_smith enthält die Adresse für ein Apple-Objekt.
string gs_color = *(granny_smith.get_color()); Diese Anweisung gibt die Farbe des granny_smith-Objekts zurück, vorausgesetzt, es wurde initialisiert.
G) Speicher für das neue Apple-Objekt wird im Heap zugewiesen
H) Speicher für das neue Apple-Objekt wird im Laufzeitstack zugewiesen
I) int* a = &b; Dadurch wird die Adresse von b in a platziert.


Question 3) Was ist das Ergebnis des folgenden Programms?

#include <iostream>
using namespace std;

const int kNumVeggies = 4;

void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);


void Grill(int squash, int *mushroom) {
  *mushroom = squash/4;
  cout << *mushroom + squash << endl;
}

int Saute(int onions[], int celery) {
  celery *= 2;
  onions[celery]++;
  Grill(onions[0], &onions[3]);
  cout << celery << " " << onions[3] << endl;
  return celery;
}

int main() {
  int broccoli, peppers[kNumVeggies], *zucchini;

  for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
    peppers[broccoli] = kNumVeggies - broccoli;
  zucchini = &peppers[Saute(peppers,1)];
  Grill(*zucchini, zucchini);
  zucchini--;
  cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}


Quizantworten

Sie sollten versuchen, alle oben genannten Fragen zu beantworten, ohne sich die Antworten anzusehen. Es ist besser, jemanden um Hilfe zu bitten, als direkt zum Antwortblatt zu springen.

Hier finden Sie die Antworten auf die oben genannten Probleme.