Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Aufgabe 2 (7 Punkte)
## Vorlesungsfolien
* Strukturen, Unions, Bitfelder (EidP-09-StrukturenUnionsBitfelder.pdf)
* Dynamische Speicherverwaltung (EidP-11-DynamischeSpeicherverwaltung.pdf)
## Beschreibung
In dieser Aufgabe sollen Funktionen für das Generieren, Ausgeben und Freigeben des Speichers für einen Teil des
[Pascalschen Dreiecks](https://en.wikipedia.org/wiki/Pascal%27s_triangle) implementiert werden. Das Pascalsche Dreieck
ist eine grafische Darstellung der Binomialkoeffizienten $$n\choose k$$ mit $$n\in\mathbb{N}\_{\ge0}$$ als Zeilenindex
und $$k\in\mathbb{N}\_{\ge0}$$ als Spaltenindex: Jeder Eintrag entsteht durch die Summe der zwei darüberstehenden
Einträge, wobei Randeinträge, welche nicht zwei direkt darüberstehende Einträge haben, gleich $$1$$ gesetzt werden.
Die folgende Veranschaulichung zeigt ein Pascalsches Dreieck mit $$5$$ Zeilen.
```text
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
```
Die Struktur `struct pascals_triangle` wird verwendet, um ein Pascalsches Dreieck einer bestimmten Zeilenanzahl
abzubilden, sodass die Einträge des Pascalschen Dreiecks im dynamisch allozierten, nicht-rechteckigen, zweidimensionalen
Array `values` der Struktur `struct pascals_triangle` gespeichert werden können. Der Pointer `values` zeigt auf einen
Speicher, welcher Zeiger für jede einzelne Zeile des Pascalschen Dreiecks beinhaltetet. Jeder Zeiger einer Zeile zeigt
auf einen Speicherbereich, welcher genau die Anzahl der Werte von dieser Zeile speichern kann.
Implementieren Sie folgende Funktionen:
- `init_pascals_triangle`: Reserviert Speicher für die Struktur `struct pascals_triangle` und für die Werte des
Pascalschen Dreiecks entsprechend der übergebenen Zeilenanzahl `rows`. Anschließend wird das Element `rows` der
Struktur auf den übergebenen Wert gesetzt und die Werte des Pascalschen Dreiecks berechnet.
- `get_element`: Retourniert den Wert des Eintrags in der Zeile `row` und Spalte `column` des zweidimensionalen Arrays
`values`, d. h. des Pascalschen Dreiecks. Sofern der Wert für `row` oder `column` die Grenzen überschreitet, wird der
Wert $$0$$ zurückgegeben.
- `free_pascals_triangle`: Gibt den reservierten Speicher für die Struktur `struct pascals_triangle` und damit die
Einträge des Pascalschen Dreiecks frei.
- `print_pascals_triangle`: Gibt die Einträge des Pascalschen Dreiecks auf der Standardausgabe aus. Das Format der
Ausgabe ist nicht vorgegeben.
- `main`: Vervollständigen Sie die `main`-Funktion mithilfe der zuvor implementierten Funktionen, sodass das Programm
Speicher für ein Pascalsches Dreieck mit Zeilenanzahl `rows` reserviert, die Einträge berechnet, diese auf der
Standardausgabe ausgibt und anschließend den Speicher für das Pascalsche Dreieck wieder freigibt. Die
Zeilenanzahl `rows` wird als Kommandozeilenparameter übergeben.
### Beispielaufrufe mit Ausgabe:
Beispiel 1: Beispielaufruf mit Zeilenanzahl `4` als Kommandozeilenparameter und Programmablauf.
```text
./s10e02 4
1
1 1
1 2 1
1 3 3 1
```
Beispiel 2: Beispielaufruf mit Zeilenanzahl `9` als Kommandozeilenparameter und Programmablauf.
```text
./s10e02 9
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
```
Beispiel 3: Beispielaufruf mit Zeilenanzahl `10` als Kommandozeilenparameter und Programmablauf.
```text
./s10e02 10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
```
## Hinweise
- Sie können für die Ausgabe des Pascalsches Dreiecks mit einer bestimmten Zeilenanzahl ein Format frei wählen. Die
Beispiele zeigen eine gängige, mögliche Darstellung.
## Tests
1. [task][Kompilieren](Compile)
2. [task][Strukturtests](CodeStructure)
3. [task][Funktionstests: Beispiele init_pascals_triangle](GreyBoxExamplesInit)
4. [task][Funktionstests: Beispiele get_element](GreyBoxExamplesGet)
5. [task][Funktionstests: init_pascals_triangle](GreyBoxInit)
6. [task][Funktionstests: get_element](GreyBoxGet)
7. [task][Linter](Linter)