2AKIFT POS Test (Group A)

2022-04-28

Max. 32 points

Name:

Task Max. Achieved
1 4
2 12
3 8
4 8
Sum 32
Benotung: <16: 5, 16-20: 4, 21-24: 3, 25-28: 2, 29-32: 1
  1. Answer the following statements indicating whether they are True or False.
    0-4 correct: 0 points, 5 correct: 1 point, 6 correct: 2 points, 7 correct: 3 points, 8 correct: 4 points.
    Statement True False
    Der mit malloc(.) reservierte Speicher muss manuell mittels Aufruf von free(.) freigegeben werden.
    Dynamische Speicherverwaltung in C ist notwendig, um den gesamten vorhandenen Hauptspeicher nutzen zu können.
    Mit malloc(.) kann auch Speicher für einen ganzen struct reserviert werden.
    Mit free(.) bekommen Programmierer Auskunft darüber, wieviel Hauptspeicher aktuell frei ist.
    Alle member eines struct müssen den gleichen Datentypen haben.
    Ein struct darf Pointer beinhalten.
    Es ist gültig, einen typedef zu einem struct zu erstellen, bevor der struct deklariert wurde.
    Es ist nicht erlaubt, dass ein Pointer auf einen anderen Pointer zeigt.
  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) {
        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
    6. typedef struct node Node;
      typedef struct route {unsigned id; Node* head; Node* tail;} Route;
      Route *r = (Route*) malloc(sizeof(Route));
      r->id = 1; r->head=NULL; r->tail=NULL;
      printf("%u\n", r->id);
      1
  3. Definiere einen Typen Student, der die Member char first_name[30], char last_name[50], unsigned long id und unsigned* grades beinhaltet.
    Implementiere auch eine Funktion Student read_student(), welche Vornamen, Nachnamen und id von stdin einliest. grades soll auf den Wert NULL gesetzt werden.
    1 Punkt für die Deklaration des Structs
    1 Punkt für den Typedef
    je 0.5 Punkte für die vier Felder
    1 Punkt den korrekten Funktionsnamen und die korrekte Signatur
    1 Punkt für das Lesen der Strings
    1 Punkt für das Lesen der id
    0.5 Punkte für s.grades = NULL; 0.5 Punkte für die Rückgabe des Structs
    typedef struct student Student;
    struct student {
      char first_name[30];
      char last_name[50];
      unsigned long id;
      unsigned* grades;
    };
    
    
    Student read_student() {
      Student s;
      char buffer[20];
      printf("Enter the first name: ");
      fgets(s.first_name, 30, stdin);
      s.first_name[strcspn(s.first_name, "\n")] = '\0';
      printf("Enter the last name: ");
      fgets(s.last_name, 50, stdin);
      s.last_name[strcspn(s.last_name, "\n")] = '\0';
      printf("Enter the student id: ");
      fgets(buffer, 20, stdin);
      sscanf(buffer, "%lu", &s.id);
      s.grades = NULL;
      return s;
    }
  4. Gegeben ist folgender struct
    struct intarray {
      size_t reserved;  // available storage
      size_t elements;  // current number of elements
      int* array;
    };
    Erstelle einen Typen IntArray, mit dem Instanzen von struct intarray erstellt werden können. Implementiere die Funktion void ia_push_back(IntArray* ia, int elem), welche elem am Ende von ia->array anfügt und die Anzahl von elements und reserved korrekt anpasst. Nicht darauf vergessen, gegebenenfalls mehr Speicher für das neue Element zu reservieren.
    1 Punkt für den Typedef
    1 Punkt für den korrekten Funktionsnamen und die korrekte Signatur
    1 Punkt für die rechtzeitige Abfrage, ob der array voll ist
    1 Punkt für das korrekte Anpassen von reserved
    1 Punkt für die Reallokation von array
    2 Punkte für das Anfügen von elem
    1 Punkt für den richtigen Wert von elements
    typedef struct intarray IntArray;
    
    void ia_push_back(IntArray* ia, int elem) {
      if (ia->elements == ia->reserved) {
        ia->reserved *= 2;
        ia->array = realloc(ia->array, ia->reserved * sizeof(int));
      }
      ia->array[ia->elements] = elem;
      ia->elements++;
    }