3BHET CPE Test (Group A)

2022-05-25

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
    Ein Pointer kann auf einen anderen Pointer zeigt.
    Header Dateien werden durch den Assembler mit den C Dateien verbunden.
    Ein Pointer zeigt auf eine Adresse im Hauptspeicher des Computers.
    Das Aufteilen eines Programms auf mehrere Sourcecode Dateien verlängert die Kompilierzeit drastisch.
    Der C Preprocessor kümmert sich primär um relativ einfache Textersetzungen.
    Include guards erlauben es dem Assembler, effizienteren 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. int a = 5;
      int* ptr = &a;
      *ptr -= 2;
      printf("%d\n", a);
      3
    2. int a = 3;
      int* p = &a;
      int** pp = &p;
      **pp *= **pp;
      printf("%d\n", a);
      9
    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);
      5
    4. char str[] = "students";
      char* haystack = str;
      char needle = 's';
      int occ = 0;
      while (*haystack) {
        if (*haystack == needle) { occ++; }
        haystack++;
      }
      printf("%d\n", occ);
      2
    5. int numbers[] = {1, 2, 3, 2};
      int* itr = numbers;
      int cnt = sizeof(numbers) / sizeof(int);
      int total = 1;
      while (cnt) {
        total *= *itr++;
        cnt--;
      }
      printf("%d\n", total);
      12
  3. Schreibe eine Funktion bool has_digit(char* string) welche true zurück gibt, wenn mindestens eine Ziffer (0-9) darin vorkommt. Verwende dazu die Funktion int isdigit(.) welche ein Zeichen als Argument nimmt und 0 zurück gibt, wenn das Argument keine Ziffer 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 isdigit(.)
    1 Punkt für den passenden Rückgabewerte
    bool has_digit(char* string) {
      while (*string) {
        if (isdigit(*string)) {
          return true;
        }
        string++;
      }
      return false;
    }
  4. Schreibe eine Funktion void ones(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 1 bekommen.
    Anwendungsbeispiel:
    int* numbers[5];
    ones(numbers, 5);  // initializes `numbers` to {1, 1, 1, 1, 1}
    1 Punkt für die korrekte Signatur
    1 Punkt für korrekte Schleifenbedingung
    1 Punkt für das korrekte Setzen aller Werte
    void ones(int* array, int count) {
      for (int i = 0; i < count; ++i) {
        array[i] = 1;
      }
    }
  5. Schreibe eine Funktion void init_squares(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 das Quadrat seines Index sein. Das heißt, dass das erste Element den Wert 0 (0*0), das zweite (Index 1) den Wert 1 (1*1), das dritte (Index 2) den Wert 4 (2*2) bekommt und so weiter. Das n-te Element soll den Wert (n1)2 bekommen.
    Anwendungsbeispiel:
    int* number[5];
    init_squares(numbers, 5);  // initializes `numbers` to {0, 1, 4, 9, 16}
    1 Punkt für die korrekte Signatur
    1 Punkt für korrekte Schleifenbedingung
    1 Punkt für das korrekte Setzen aller Werte
    void init_squares(int* array, int count) {
      for (int i = 0; i < count; ++i) {
          array[i] = i * i;
      }
    }