Mathematische Funktionen bisher bekannt aus dem Schulunterricht
\(f: \mathbb{R} \rightarrow \mathbb{R}\)
Beispiel
\(f: f(x) = x^3 + x^2 - x\) mit Eingabe \(x = 0.5\)
Schritte für \(y = x^3 + x^2 - x\)
Funktionen in Programmiersprachen sind sehr ähnlich aufgebaut!
Eine Funktion in C besteht ebenfalls aus einem
Formaler Aufbau:
<Rückgabewert> <Name> (<Parameter 1>, <Parameter 2>{, …) { <Code-Block> }
Bereits bekanntes Beispiel: int main()
return)return 0;Angewandt auf das Sinus-Beispiel ergibt sich folgendes:
#include <math.h> // Mathematik-Funktionen
#include <stdio.h>
int main() {
double x = 0.5, y, z;
y = sin(x); // sin(): Funktion mit 1 Parameter
z = sin(1.5);
printf("y: %f, z: %f", y, z);
return 0;
}
(Zur Referenz: sin() auf CPPReference)
sum(2, 3)2 und 3 auf den Stack kopiertgoto)summand1/summand2 verweisen auf den StackZurück zu den Funktionen!
#include <stdio.h>
float sum_of_two_params(float summand1, int summand2) {
float sum = summand1 + summand2;
return sum;
}
int main() {
float first_sum = sum_of_two_params(2.9f, 5);
float second_sum = sum_of_two_params(5, 2.9f);
printf("first = %.2f, second = %.2f\n", first_sum, second_sum);
}
Was wird für second_sum ausgegeben?
7.07.9#include <stdio.h>
void print_float_and_int(float f, int i) {
printf("Float %.2f\n", f);
printf("Int %d\n", i);
}
int main() {
print_float_and_int(1, 2.73);
}
return erfolgenvoidvoidvoid ist ein spezieller Variablen-Typ: Steht für einen leeren Wert
Gilt formal als unvollständiger Typ, kann nicht vervollständigt werden
Benötigt nicht zwingend ein return innerhalb der Funktion…
… kann aber für einen vorzeitigen Abbruch genutzt werden
void#include <stdio.h>
void print() {
printf("Message\n");
}
int main() {
print();
print();
return 0;
}
#include <stdio.h>
void print2(int num) {
if (num < 2) {
// vorzeitiger Rücksprung
return;
}
else {
printf("Message\n");
}
}
int main() {
print2(1);
return 0;
}
Problem: Arrays enthalten nicht ihre Größe
Lösung: Länge als zusätzlichen Parameter angeben
void print_array(int array[], int n);
Wichtig: So bitte nicht, Compiler ignoriert die Größenangabe
void print_array(int array[5]);
int b[3][4]
b[1][2]: Drittes Element der zweiten Spalte#include <XX>stdio.h, math.h, stdbool.hstdlib.h → u.a. Speicherverwaltungtime.h → Zeit, Datumstring.h → Speichermanipulation + String-Operationen#include <stdio.h>
int sum(int num) {
if(num > 0) {
return num + sum(num -1);
}
return num; // 0
}
int main() {
printf("%d\n", sum(10));
}
sum() bildet Summe der Zahlen im Intervall \([1,num]\)(num > 0)sum()
num bzw. num - 1 im Speichersum(10000))Analog zu Variablen: Vor der ersten Benutzung müssen Funktionen bekannt sein
Unterscheidung zwischen Deklaration und Definition
Deklaration macht Signatur bekannt
int sum(int a, int b);Definition spezifiziert die Anweisungen
→ Funktionsrumpf, als Code-Block {}
Deklaration und Definition können getrennt oder zusammen erfolgen
Platzverbrauch: Eine Zeile pro Deklaration ⇔ beliebig viele pro Definition
Vorteile einer Trennung
Für kleine Projekte (\(<\) 10000 Zeilen Code) ist die Geschwindigkeit nachrangig
Aber: Sehr wichtig bei großen Projekten mit mehreren Millionen Zeilen
Die praktische Umsetzung dieser Trennung wird erst im nächsten Kapitel betrachtet
#include <stdio.h>
void swap_values(int one, int two) {
int temp;
temp = one;
one = two;
two = temp;
}
int main() {
int x = 1, y = 2;
swap_values(x, y);
printf("x = %d, y = %d", x, y);
}
return kann also nur einen der beiden Werte zurückgeben