3BHET CPE Test (Group B)

2022-06-08

Max. 24 points

Name:

Task Max. Achieved
1 3
2 10
3 5
4 3
5 3
Sum 24
Benotung: >=21: 1, >=18: 2, >=15: 3, >=12: 4, <12: 5
  1. Markiere, welche der folgenden Aussagen wahr bzw. falsch sind.
    0-3 korrekt: 0 Punkte, 4 korrekt: 1 Punkt, 5 korrekt: 2 Punkte, 6 korrekt: 3 Punkte.
    Aussage Wahr Falsch
    char* p = "hello"; ist gültiges C.
    Der Preprocessor ersetzt #include mit dem Inhalt der angegebenen Header Datei.
    Ein Pointer benötigt auf einem 64bit Betriebssystem gleich viel Speicher wie ein short.
    Das Aufteilen eines Programms auf mehrere Sourcecode Dateien erlaubt die Verwendung mehrerer CPU Kerne beim kompilieren.
    Der C Assembler kümmert sich primär um relativ einfache Textersetzungen.
    Include guards erlauben es dem Preprocessor, plattformabhängigen Binärcode herzustellen.
  2. Welcher Text wird durch die folgenden Code Snippets in der C-Programmiersprache auf Standard Output (Terminal) geschrieben? Schreibe den genauen Output des Snippets. Die Snippets werden als Teil von int main() ausgeführt und alle notwendigen #includes sind vorhanden. Wenn das Snippet nicht kompilierbar ist oder zu einem Absturz führen würde, so ist das Wort “ERROR” als Antwort zu geben. Erzeugt das Snippet keinen Output (wenn beispielsweise kein printf oder dergleichen aufgerufen wird), so ist "-" als richtige Antwort zu verwenden.
    1. char* p[] = {"Hello", "World!"};
      puts(p[0]);
      puts(p[1]);
      Hello
      World!
    2. int a = 3;
      int* p = &a;
      int** pp = &p;
      **pp = **pp;
      printf("%d\n", a);
      3
    3. int array[] = {1, 1, 1, 1, 1};
      int* array_ptr = array;
      int count = sizeof(array) / sizeof(int);
      int value = 0;
      while (count--) {
        value *= *array_ptr++;
      }
      printf("%d\n", value);
      0
    4. char str[] = "students";
      char* haystack = str;
      char needle = 'x';
      int occ = 0;
      while (*haystack) {
        if (*haystack == needle) { occ++; }
        haystack++;
      }
      printf("%d\n", occ);
      0
    5. int numbers[] = {1, 2, 3, 2};
      int* itr = numbers;
      int cnt = sizeof(numbers) / sizeof(int);
      int total = 0;
      while (cnt) {
        total += *itr++;
        cnt--;
      }
      printf("%d\n", total);
      8
  3. Schreibe eine Funktion bool has_space(char* string) welche true zurück gibt, wenn mindestens ein Whitespace Character darin vorkommt. Verwende dazu die gegebene Funktion int isspace(.) welche ein Zeichen als Argument nimmt und 0 zurück gibt, wenn das Argument Whitespace ist, sonst wird >0 zurückgegeben.
    1 Punkt für die korrekte Signatur
    1 Punkt für korrekte Schleifenbedingung
    1 Punkt für inkrement des Schleifenpointers
    1 Punkt für die Richtige Verwendung von isspace(.)
    1 Punkt für den passenden Rückgabewerte
    bool has_space(const char* string) {
      while (*string) {
        if (isspace(*string)) {
          return true;
        }
        string++;
      }
      return false;
    }
  4. Schreibe eine Funktion void zeroes(int* array, int count). Die Argumente dieser Funktion sind ein Pointer zu einem Array und die Anzahl der Elemente des Arrays. Die Funktion soll die Elemente des Arrays initialisieren (gegebenenfalls ersetzen). Jedes Element soll den Wert 0 bekommen.
    Anwendungsbeispiel:
    int* numbers[5];
    zeroes(numbers, 5);  // initializes `numbers` to {0, 0, 0, 0, 0}
    1 Punkt für die korrekte Signatur
    1 Punkt für korrekte Schleifenbedingung
    1 Punkt für das korrekte Setzen aller Werte
    void zeroes(int* array, int count) {
      for (int i = 0; i < count; ++i) {
        array[i] = 0;
      }
    }
  5. Schreibe eine Funktion void range(int* array, int count). Die Argumente dieser Funktion sind ein Pointer zu einem Array und die Anzahl der Elemente des Arrays. Die Funktion soll die Elemente des Arrays initialisieren (gegebenenfalls ersetzen). Der Wert jedes Elements des Arrays soll seine Index sein. Das heißt, dass das erste Element den Wert 0, das zweite (Index 1) den Wert 1, das dritte (Index 2) den Wert 2 bekommt und so weiter. Das n-te Element soll den Wert n-1 bekommen.
    Anwendungsbeispiel:
    int* number[5];
    range(numbers, 5);  // initializes `numbers` to {0, 1, 2, 3, 4}
    1 Punkt für die korrekte Signatur
    1 Punkt für korrekte Schleifenbedingung
    1 Punkt für das korrekte Setzen aller Werte
    void range(int* array, int count) {
      for (int i = 0; i < count; ++i) {
          array[i] = i;
      }
    }