3BHET CPE Test (Group A)

2022-06-15

Max. 24 points

Name:

Task Max. Achieved
1 4
2 10
3 5
4 5
Sum 24
Benotung: >=21: 1, >=18: 2, >=15: 3, >=12: 4, <12: 5
  1. Markiere, welche der folgenden Aussagen wahr bzw. falsch sind.
    0-4 korrekt: 0 Punkte, 5 korrekt: 1 Punkt, 6 korrekt: 2 Punkte, 7 korrekt: 3 Punkte, 8 korrekt: 4 Punkte.
    Aussage Wahr Falsch
    Ein struct in C ist ein Pointer zu einem Array.
    Ein struct darf Pointer beinhalten.
    Ein Pointer kann auf einen anderen Pointer zeigen.
    Header Dateien werden durch den Assembler mit den C Dateien verbunden.
    malloc(.) initialisiert den reservierten Speicher mit Nullen.
    Ein Pointer zeigt auf eine Adresse im Hauptspeicher (RAM) des Computers.
    Das Aufteilen eines Programms auf mehrere Sourcecode Dateien verlängert die Kompilierzeit drastisch.
    Der C Compiler übersetzt C Code in Assembly.
  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 = 3;
      int* ptr = &a;
      *ptr += 4;
      printf("%d\n", a);
      7
    2. int a = 3;
      int* ptr = &a;
      int** p = &ptr;
      **p += **p;
      -
    3. int array[] = {3, 3, 3, 3, 3};
      int* array_ptr = array;
      int count = sizeof(array) / sizeof(int);
      int value = 0;
      while (count--) {
        value += *array_ptr++;
      }
      printf("%d\n", value);
      15
    4. char name[] = "Pat";
      char* name_ptr = name;
      while (*name_ptr) {  // string ends with the `\0` character
        printf("%c", *name_ptr);
        name_ptr++;
      }
      printf("\n");
      Pat
    5. typedef struct {int year; int month; int day;} IsoDate;
      IsoDate date = {2022, 2, 1};
      printf("%s\n", date);
      ERROR
  3. Schreibe eine Funktion int* range(int start, int stop); welche einen Pointer zu einem Array mit aufsteigenden Zahlen zurück gibt. Der erste Wert des Arrays ist start, der letzte stop - 1. Die Anzahl der Elemente ist dementsprechend stop - start. Zum Beispiel gibt der Aufruf range(3, 8) einen Pointer zu folgendem Array zurück: {3, 4, 5, 6, 7}.
    0.5 Punkt den korrekten Funktionsnamen und die korrekte Signatur
    1 Punkt für das Berechnen der richtigen Menge an Speicher
    1 Punkt für das Reservieren des Speichers
    1 Punkt für die korrekte Schleife zum Initialisieren
    1 Punkt für das Initialisieren mit den richtigen Werten
    0.5 Punkt für die Rückgabe des Arrays
    int* range(int start, int stop) {
      int* array = (int*) malloc((stop - start) * sizeof(int));
      for (int i = 0; i < stop - start; ++i) {
        array[i] = start + i;
      }
      return array;
    }
  4. Erstelle einen Typen Resistor, welcher folgende Eigenschaften speichert: unsigned int resistance, unsigned int max_voltage, float tolerance und char type[50]. Reserviere Speicher auf dem Free Store für einen neuen Resistor und speichere einen Pointer darauf in der Variable Resistor* r.
    1 Punkt für den Typedef
    1 Punkt für die Deklaration des Structs
    2 Punkte für die 4 Felder
    1 Punkt für Variable mit Pointer auf reservierten Resistor
    typedef struct resistor Resistor;
    struct resistor {
      char type[50];
      unsigned int resistance;
      float tolerance;
      unsigned int max_voltage;
    };
    Resistor* r = (Resistor*) malloc(sizeof(Resistor));