> ## Documentation Index
> Fetch the complete documentation index at: https://docs.baenninger.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Funktionen

Eine Funktion ist ein Codeblock, der eine spezielle Aufgabe erledigt.

Wenn man beispielsweise ein Programm machen muss, dass die Aufgabe hat einen Kreis zu zeichnen und den Kreis zu färben. Um dieses Problem zu lösen, kann mann zwei Funktionen erstellen:

* eine Funktion für den Kreis
* eine Funktion für die Farbe

Das heisst, man nimmt ein komplexes Problem und bricht es in kleine Probleme runter. Das erhöht die Lesbarkeit und die Wiederverwendung.

## Typen von Funktionen﻿

Es gibt zwei Arten von Funktionen:

* **Standard Library Functions**
* **User-defined Functions**

## Standard Library Functions﻿

Diese Standard Library Functions sind eingebaute Funktionen in C. Diese Funktionen werden in den Header-Files definiert. Beispiele:

* `printf()`: In der Header-Datei `stdio.h`
* `sqrt()`: In der Header-Datei `math.h`

## User-defined functions﻿

Man kann als Programmierer seine eigenen Funktionen erstellen.

```c theme={null}
#include <stdio.h>

void functionName()
{
    ... .. ...
    ... .. ...
}

int main()
{
    ... .. ...
    ... .. ...

    functionName();

    ... .. ...
    ... .. ...
}
```

Die Ausführung fängt bei der `main()`-Funktion an. Wenn der Compiler zu `functionName()` kommt, springt er zu der Funktion oben (Zeile 3).

Jetzt fängt der Compiler an, den Code in der Funktion `functionName()` auszuführen. Nachdem die Funktion fertig ist, geht sie zurück zur `main()`-Funktion.

### Beispiel

```c theme={null}
#include <stdio.h>

int addNumbers(int a, int b);

int main()
{
    int n1, n2, sum;

    printf("Enters two numbers: ");
    scanf("%d %d", &n1, &n2);

    sum = addNumbers(n1, n2);
    printf("sum = %d", sum);

    return 0;
}

int addNumbers(int a, int b)
{
    int result;
    result = a + b;
    return result;
}
```

### Function Prototype

Ein Funktionsprototyp ist einfach die Deklaration einer Variable, die Name, Parameter und den `return`-Type angibt.

Ein Funktionsprototyp gibt dem Compiler die Information, dass die Funktion möglicherweise später genutzt wird.

```c theme={null}
returnType functionName(type1 argument1, type2 argument2, ...);
```

<Info>
  Man braucht den Funktionsprototypen nicht, wenn die Funktion vor der `main()`-Funktion definiert wird.
</Info>

### Funktionsaufruf

Der Programmablauf wird bei Aufrufen einer Funktion unterbrochen und geht zur jeweiligen Funktion und führt diese aus.

```c theme={null}
functionName(argument1, argument2, ...);
```

### Funktionsdefinition

Die Funktionsdefinition enthält den Code, welche die Funktion ausführen sollte.

```c theme={null}
returnType functionName(type1 argument1, type2 argument2, ...)
{
    // body of the function
}
```

### `return`-Statement

Das `return`-Statement beendet die Funktion und gibt ein Wert zurück.

```c theme={null}
return (expression);
```

#### Beispiel

```c theme={null}
return a;
return (a + b);
```

<Warning>
  Der Wert des `return`-Statements muss mit dem Typen der Funktion übereinstimmen.
</Warning>
