02: Funktionen, Datentyp “enum”¶
(Copyright Bild: xkcd.com)
1. Übersicht¶
In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum.
Funktionen sind der wesentlichste Bestandteil der C Programmierung, welcher eine strukturierte Programmierung ermöglicht:
Eine Funktion ist ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden.
Jede Funktion besitzt einen eindeutigen Namen, eine eindeutige Signatur (Typen und Reihenfolge der Parameter) und einen Rückgabewert (int falls nichts angegeben wird).
Eine Funktion kann Werte aus dem aufrufenden Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern. Beispiel einer Additions-Funktion:
#include <stdio.h>
/* Funktionsdeklaration */
int add(int a, int b);
int main(void) {
int aa = 1, bb = 2, cc;
(void) printf("%d + %d = %d", aa, bb, add(aa, bb));
return 0;
}
/* Funktionsdefinition */
int add(int a, int b) {
return a + b;
}
Der Datentyp enum wird verwendet um die Lesbarkeit von Programmen zu erhöhen:
Beispiel eines enum:
enum Ampeln {rot =1, gelb, gruen};
int main(void) {
Ampeln ampel1;
if (ampel1 == rot) {...}
return 0;
}
2. Lernziele¶
In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden.
Sie können ein Programm schreiben, welches aus mehreren Funktionen besteht.
Sie können Funktionen deklarieren, definieren und aufrufen.
Sie können enum Typen definieren und deren Werte bestimmen und abfragen.
3. Aufgaben¶
(Copyright Bild: www.planet-wissen.de)
3.1 Aufgabe 1 Tage pro Monat¶
In der ersten Aufgabe berechnen Sie die Anzahl Tage pro Monat einer beliebigen Kombination Monat / Jahr. Erweitern Sie dazu das Programm um folgende Aspekte:
Bereichsprüfung von Jahr und Monat
Funktion istSchaltjahr, welche berechnet, ob das Jahr eine Schaljahr ist
Funktion tageProMonat, welche die Anzahl Tage des gegebenen Monats und Jahres berechnet.
Vorgaben:
Die Funktion istSchaltjahr nimmt einen Integer (jahr) entgegen und gibt 1 im Falle eines Schaltjahres und 0 im anderen Fall zurück
Die Funktion tageProMonat nimmt zwei Integer (monat und jahr) entgegen und gibt die Anzahl Tage als Integer zurück
Die Jahreszahl, welche den Funktionen übergeben wird, muss überprüft werden und grösser gleich 1599 und kleiner als 10000 sein
Der übergebene Monat muss grösser als 0 und kleiner als 13 sein.
Die Regeln für die Schaltjahrberechnung:
Schaltjahre sind alle Jahre, die durch 4 teilbar sind.
Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schaltjahre.
zu den 100er gibt es ebenfalls Ausnahmen: Diese sind immer Schaltjahre, wenn sie durch 400 teilbar sind … also zum Beispiel 1600 ist eines, nicht jedoch 1700. Weiterführende Details finden Sie unter https://de.wikipedia.org/wiki/Gregorianischer_Kalender
Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen:
gibIntWert: Die Funktion soll einen Int Wert zurückgeben. Der Bereich, wie auch Fehleingaben sollen berücksichtigt werden. (atoi und fgets sind hier hilfreich)
istSchaltjahr: Die Funktion gibt 1 im Falle eines Schaltjahrs und 0 im anderen Falle zurück.
tageProMonat: Die Funktion gibt die Anzahl Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switch-Anweisung , sowie den enum Datentyp.
int main (int argc, char *argv[]) {
int monat, jahr;
// Monat einlesen und Bereich ueberpruefen
monat = gibIntWert("Monat", 1, 12);
jahr = gibIntWert("Jahr", 1600, 9999);
// Ausgabe zum Test
(void) printf("Monat: %d, Jahr: %d \n", monat, jahr);
// Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
(void) printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");
// Ausgabe
(void) printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
return 0;
}
Tipp: Angenommen Sie verwenden den enum month_t { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ }; Dann können Sie im Programm direkt die Konstanten verwenden:
if (m == 2) ... // schlecht lesbar
if (monat == 2) ... // besserer Variablenname
if (monat == FEB) ... // am besten lesbar
4. Bewertung¶
Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden können.
Aufgabe |
Kriterium |
Gewicht |
---|---|---|
alle |
Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären. |
|
gibIntWert |
Eingabe, Bereichsüberprüfung korrekt |
1 |
istSchaltjahr |
Funktion korrekt |
1 |
TageProMonat |
Funktion korrekt |
1 |
Aufgabe 2 |
Fehlenden Teile ergänzt und lauffähig |
1 |
5. Anhang¶
5.1 Sprachelemente¶
...
} argc: Anzahl Einträge in argv.
argv: Array von Command Line Argumenten.
argv[0]: wie das Programm gestartet wurde
argv[1]: erstes Argument
…
argv[argc-1]: letztes Argument
int a = 0;
int b = 0;
int c = 0;
int res = sscanf(argv[1]
, "%d-%d-%d"
, &a, &b, &c
);
if (res != 3) {
// Fehler Behandlung...
// ...
}
5.2 Beschreibung¶
Siehe man 3 sscanf. Die Funktion sscanf gibt die Anzahl erfolgreich erkannte Argumente zurück. Unbedingt prüfen und angemessen darauf reagieren. Die gelesenen Werte werden in a, b und c, gespeichert, dazu müssen Sie die Adresse der Variablen übergeben. Mehr Details dazu werden später erklärt. fprintf(stderr, “Usage: %s…\n”, argv[0]); Siehe man 3 fprintf. Schreibt formatierten Text auf den stderr Stream.
Version: 15.02.2022