2BHEL FSST Test (Group C)

2022-03-28

Max. 24 points

Name:

Task Max. Achieved
1 2
2 10
3 6
4 6
Sum 24
Benotung: >=21: 1, >=18: 2, >=15: 3, >=12: 4, <12: 5
  1. Markiere, welche der folgenden Aussagen wahr bzw. falsch sind.
    0-2 korrekt: 0 Punkte, 3 korrekt: 1 Punkt, 4 korrekt: 2 Punkte.
    Aussage Wahr Falsch
    Der mit malloc(.) reservierte Speicher muss manuell mittels Aufruf von free(.) freigegeben werden.
    Dynamische Speicherverwaltung in C is notwendig, um den gesamten vorhandenen Hauptspeicher nutzen zu können.
    Mit malloc(.) kann auch Speicher für einen ganzen struct reserviert werden.
    Mit free(.) bekommt der Programmierer Auskunft darüber, wieviel Hauptspeicher aktuell frei ist.
  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. typedef struct { double x; double y; } Point;
      Point test = {.25, .75};
      printf("[%.2lf %.2lf]\n", test.x, test.y);
      [0.25 0.75]
    2. int a = 3;
      int* p = &a;
      int** pp = &p;
      **pp -= **pp;
      printf("%d\n", a);
      0
    3. int array[] = {2, 2, 2, 2};
      int* array_ptr = array;
      int count = sizeof(array) / sizeof(int);
      int value = 0;
      while (count--) {
        value += *array_ptr++;
      }
      printf("%d\n", value);
      8
    4. char name[] = "Chris";
      char* name_ptr = name;
      while (*name_ptr) {  // string ends with the `\0` character
        printf("%c", toupper(*name_ptr));
        name_ptr++;
      }
      printf("\n");
      CHRIS
    5. struct listnode {int value; ListNode *prev; ListNode *next;};
      ListNode *node = (ListNode*) malloc(sizeof(TreeNode));
      node->value = 123; node->prev=NULL; node->next=NULL;
      printf("%d\n", node->value);
      ERROR
  3. Schreibe eine Funktion int *ones(int count); welche einen Pointer zu einem Array mit lauter Einsen zurück gibt. Zum Beispiel gibt der Aufruf ones(4) einen Pointer zu folgendem Array zurück: {1, 1, 1, 1}.
    1 Punkt den korrekten Funktionsnamen und die korrekte Signatur
    2 Punkt für das Reservieren des Speichers
    2 Punkt für das Initialisieren der Werte
    1 Punkt für die Rückgabe des Arrays
    int *ones(int count) {
      int *array = malloc(count * sizeof(int));
      for (int i = 0; i < count; ++i) {
        array[i] = 1;
      }
      return array;
    }
  4. Erstelle einen Typen Complex, welcher folgende Werte speichert: real, imag, r, phi. Alle vier Werte müssen den Datentyp double haben.
    1 Punkt für die Deklaration des Structs
    1 Punkt für den Typedef
    je 1 Punkt für die vier Felder
    typedef struct complex Complex;
    struct complex {
      double real;
      double imag;
      double r;
      double phi;
    };