2022-04-28
Max. 32 points
Name:
| Task | Max. | Achieved |
|---|---|---|
| 1 | 4 | |
| 2 | 12 | |
| 3 | 8 | |
| 4 | 8 | |
| Sum | 32 |
| 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. |
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.
typedef struct { double x; double y; } Point;
Point test = {.25, .75};
printf("[%.2lf %.2lf]\n", test.x, test.y);
int a = 3;
int* p = &a;
int** pp = &p;
**pp -= **pp;
printf("%d\n", a);
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);
char name[] = "Chris";
char* name_ptr = name;
while (*name_ptr) {
printf("%c", toupper(*name_ptr));
name_ptr++;
}
printf("\n");
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);
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);
Student, der die Member
char first_name[30],
char last_name[50],
unsigned long id und unsigned* grades
beinhaltet.Student read_student(),
welche Vornamen, Nachnamen und id von stdin einliest.
grades soll auf den Wert NULL gesetzt werden.
s.grades = NULL;
0.5 Punkte für die Rückgabe des Structstypedef 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;
}
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.
reservedarrayelemelements
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++;
}