Skip to content
Snippets Groups Projects
README.md 4.35 KiB
Newer Older
Simon Priller's avatar
Simon Priller committed
# 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)