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 #include
s 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.
reserved
array
elem
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++;
}