Jenkins published newest html+pdf version
This commit is contained in:
parent
596e933ea9
commit
d7241f39f5
|
@ -46,11 +46,11 @@
|
||||||
<section id="ubersicht">
|
<section id="ubersicht">
|
||||||
<h2>1. Übersicht<a class="headerlink" href="#ubersicht" title="Permalink to this headline">¶</a></h2>
|
<h2>1. Übersicht<a class="headerlink" href="#ubersicht" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum.</p>
|
<p>In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum.</p>
|
||||||
<p>Funktionen sind der wesentlichste Bestandteil der C Programmierung welcher eine strukturierte Programmierung ermöglicht:</p>
|
<p>Funktionen sind der wesentlichste Bestandteil der C Programmierung, welcher eine strukturierte Programmierung ermöglicht:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Eine Funktion ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden.</p></li>
|
<li><p>Eine Funktion ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden.</p></li>
|
||||||
<li><p>Jede Funktion besitzt einen eindeutigen Namen, eine eindeutige Signatur (Typen und Reihenfolge der Parameter) und einen Rückgabewert (int falls nichts angegeben wird).</p></li>
|
<li><p>Jede Funktion besitzt einen eindeutigen Namen, eine eindeutige Signatur (Typen und Reihenfolge der Parameter) und einen Rückgabewert (int falls nichts angegeben wird).</p></li>
|
||||||
<li><p>Eine Funktion kann Werte aus dem aufrufendem Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern.
|
<li><p>Eine Funktion kann Werte aus dem aufrufenden Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern.
|
||||||
Beispiel einer Additions-Funktion:</p></li>
|
Beispiel einer Additions-Funktion:</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1">#include <stdio.h></span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1">#include <stdio.h></span>
|
||||||
|
@ -76,7 +76,7 @@ Beispiel einer Additions-Funktion:</p></li>
|
||||||
|
|
||||||
<span class="nb">int</span> <span class="n">main</span><span class="p">(</span><span class="n">void</span><span class="p">)</span> <span class="p">{</span>
|
<span class="nb">int</span> <span class="n">main</span><span class="p">(</span><span class="n">void</span><span class="p">)</span> <span class="p">{</span>
|
||||||
<span class="n">Ampeln</span> <span class="n">ampel1</span><span class="p">;</span>
|
<span class="n">Ampeln</span> <span class="n">ampel1</span><span class="p">;</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="n">ampel1</span> <span class="o">==</span> <span class="n">rot</span><span class="p">)</span> <span class="p">{</span><span class="o">...</span><span class="p">}</span>
|
<span class="k">if</span> <span class="p">(</span><span class="n">ampel1</span> <span class="o">==</span> <span class="n">rot</span><span class="p">)</span> <span class="p">{</span><span class="o">...</span><span class="p">}</span>
|
||||||
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
||||||
<span class="p">}</span>
|
<span class="p">}</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
@ -87,7 +87,7 @@ Beispiel einer Additions-Funktion:</p></li>
|
||||||
<h2>2. Lernziele<a class="headerlink" href="#lernziele" title="Permalink to this headline">¶</a></h2>
|
<h2>2. Lernziele<a class="headerlink" href="#lernziele" title="Permalink to this headline">¶</a></h2>
|
||||||
<p>In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden.</p>
|
<p>In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden.</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Sie können ein Programm schreiben welches aus mehreren Funktionen besteht.</p></li>
|
<li><p>Sie können ein Programm schreiben, welches aus mehreren Funktionen besteht.</p></li>
|
||||||
<li><p>Sie können Funktionen deklarieren, definieren und aufrufen.</p></li>
|
<li><p>Sie können Funktionen deklarieren, definieren und aufrufen.</p></li>
|
||||||
<li><p>Sie können enum Typen definieren und deren Werte bestimmen und abfragen.</p></li>
|
<li><p>Sie können enum Typen definieren und deren Werte bestimmen und abfragen.</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -101,7 +101,7 @@ Beispiel einer Additions-Funktion:</p></li>
|
||||||
<p>(Copyright Bild: <a class="reference external" href="http://www.planet-wissen.de">www.planet-wissen.de</a>)</p>
|
<p>(Copyright Bild: <a class="reference external" href="http://www.planet-wissen.de">www.planet-wissen.de</a>)</p>
|
||||||
<section id="aufgabe-1-tage-pro-monat">
|
<section id="aufgabe-1-tage-pro-monat">
|
||||||
<h3>3.1 Aufgabe 1 Tage pro Monat<a class="headerlink" href="#aufgabe-1-tage-pro-monat" title="Permalink to this headline">¶</a></h3>
|
<h3>3.1 Aufgabe 1 Tage pro Monat<a class="headerlink" href="#aufgabe-1-tage-pro-monat" title="Permalink to this headline">¶</a></h3>
|
||||||
<p>In der ersten Aufgabe berechnen Sie die Tag pro Monat einer beliebigen Kombination Monat / Jahr.
|
<p>In der ersten Aufgabe berechnen Sie die Anzahl Tage pro Monat einer beliebigen Kombination Monat / Jahr.
|
||||||
Erweitern Sie dazu das Programm um folgende Aspekte:</p>
|
Erweitern Sie dazu das Programm um folgende Aspekte:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Bereichsprüfung von Jahr und Monat</p></li>
|
<li><p>Bereichsprüfung von Jahr und Monat</p></li>
|
||||||
|
@ -110,41 +110,41 @@ Erweitern Sie dazu das Programm um folgende Aspekte:</p>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Vorgaben:</p>
|
<p>Vorgaben:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Die Funktion istSchaltjahr nimmt ein Integer (jahr) entgegen und gibt 1 im Falle eiens Schltjahres und 0 im andreren Fall zurück</p></li>
|
<li><p>Die Funktion istSchaltjahr nimmt ein Integer (jahr) entgegen und gibt 1 im Falle eines Schaltjahres und 0 im anderen Fall zurück</p></li>
|
||||||
<li><p>Die Funktion tageProMonat nimmt zwei integer (monat und jahr) entgegeben und gibt die Anzahl Tage als Integer zurück</p></li>
|
<li><p>Die Funktion tageProMonat nimmt zwei Integer (monat und jahr) entgegen und gibt die Anzahl Tage als Integer zurück</p></li>
|
||||||
<li><p>Die Jahreszahl, welche den Funktionen übergeben wird, muss überprüft werden und grösser gleich 1599 und kleiner als 10000 sein</p></li>
|
<li><p>Die Jahreszahl, welche den Funktionen übergeben wird, muss überprüft werden und grösser gleich 1599 und kleiner als 10000 sein</p></li>
|
||||||
<li><p>Der übergebene Monat muss grösser als 0 und kleine als 13 sein.</p></li>
|
<li><p>Der übergebene Monat muss grösser als 0 und kleine als 13 sein.</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Die Regeln für die Schaltjahrberechnung:</p>
|
<p>Die Regeln für die Schaltjahrberechnung:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Schaltjahre sind alle Jahre, die durch 4 teilbar sind.</p></li>
|
<li><p>Schaltjahre sind alle Jahre, die durch 4 teilbar sind.</p></li>
|
||||||
<li><p>Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schltjahre.</p></li>
|
<li><p>Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schaltjahre.</p></li>
|
||||||
<li><p>zu den 100er gibt es ebenfalls Ausnahmen: Diese sind immer Schaltjahre, wenn sie durch 400 teilbar sind
|
<li><p>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 <a class="reference external" href="https://de.wikipedia.org/wiki/Gregorianischer_Kalender">https://de.wikipedia.org/wiki/Gregorianischer_Kalender</a></p></li>
|
… also zum Beispiel 1600 ist eines, nicht jedoch 1700. Weiterführende Details finden Sie unter <a class="reference external" href="https://de.wikipedia.org/wiki/Gregorianischer_Kalender">https://de.wikipedia.org/wiki/Gregorianischer_Kalender</a></p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen:</p>
|
<p>Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>gibIntWert: Die Funktion soll einen Int Wert zurückgeben. Der Bereich, wie auch Fehleingaben sollen sollen berücksichtigt werden. (atoi unfd fgets sind hier hilfreich)</p></li>
|
<li><p>gibIntWert: Die Funktion soll einen Int Wert zurückgeben. Der Bereich, wie auch Fehleingaben sollen berücksichtigt werden. (atoi und fgets sind hier hilfreich)</p></li>
|
||||||
<li><p>istSchaltjahr: Die Funktion gibt 1 im Falle eines Schltjahr und o im anderen Falle zurück.</p></li>
|
<li><p>istSchaltjahr: Die Funktion gibt 1 im Falle eines Schaltjahrs und 0 im anderen Falle zurück.</p></li>
|
||||||
<li><p>tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switchanweisung , sowie den enum Datentypen</p></li>
|
<li><p>tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switch-Anweisung, sowie den enum Datentypen</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>int main (int argc, char *argv[]) {
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>int main (int argc, char *argv[]) {
|
||||||
|
|
||||||
int monat, jahr;
|
int monat, jahr;
|
||||||
|
|
||||||
// Monat einlesen und Bereich ueberpruefen
|
// Monat einlesen und Bereich ueberpruefen
|
||||||
monat = gibIntWert("Monat", 1, 12);
|
monat = gibIntWert("Monat", 1, 12);
|
||||||
jahr = gibIntWert("Jahr", 1600, 9999);
|
jahr = gibIntWert("Jahr", 1600, 9999);
|
||||||
|
|
||||||
// Ausgabe zum Test
|
// Ausgabe zum Test
|
||||||
printf("Monat: %d, Jahr: %d \n", monat, jahr);
|
printf("Monat: %d, Jahr: %d \n", monat, jahr);
|
||||||
|
|
||||||
// Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
|
// Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
|
||||||
printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");
|
printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");
|
||||||
|
|
||||||
// Ausgabe
|
// Ausgabe
|
||||||
printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
|
printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
@ -152,7 +152,7 @@ Erweitern Sie dazu das Programm um folgende Aspekte:</p>
|
||||||
<p>Tipp: Angenommen Sie verwenden den enum month_t { JAN=1, FEB, MAR, APR, MAI, JUN, JUL, AUG, SEP, OKT, NOV, DEZ };
|
<p>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:</p>
|
Dann können Sie im Programm direkt die Konstanten verwenden:</p>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">(</span><span class="n">m</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">schlecht</span> <span class="n">lesbar</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">(</span><span class="n">m</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">schlecht</span> <span class="n">lesbar</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="n">monat</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">besserer</span> <span class="n">Variablenname</span>
|
<span class="k">if</span> <span class="p">(</span><span class="n">monat</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">besserer</span> <span class="n">Variablenname</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="n">monat</span> <span class="o">==</span> <span class="n">FEB</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">am</span> <span class="n">besten</span> <span class="n">lesbar</span>
|
<span class="k">if</span> <span class="p">(</span><span class="n">monat</span> <span class="o">==</span> <span class="n">FEB</span><span class="p">)</span> <span class="o">...</span> <span class="o">//</span> <span class="n">am</span> <span class="n">besten</span> <span class="n">lesbar</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -165,10 +165,10 @@ Prüfen Sie die Umsetzung beider Teilaufgaben mittels make test.</p>
|
||||||
<section id="teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen">
|
<section id="teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen">
|
||||||
<h4>3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen<a class="headerlink" href="#teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen" title="Permalink to this headline">¶</a></h4>
|
<h4>3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen<a class="headerlink" href="#teilaufgabe-argumente-parsen-und-auf-korrektheit-prufen" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel).
|
<p>Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel).
|
||||||
Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde terminiert das Programm mit Exit Code EXIT_SUCCESS.</p>
|
Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde, terminiert das Programm mit Exit Code EXIT_SUCCESS.</p>
|
||||||
<section id="argument-format">
|
<section id="argument-format">
|
||||||
<h5>3.2.1.1 Argument Format<a class="headerlink" href="#argument-format" title="Permalink to this headline">¶</a></h5>
|
<h5>3.2.1.1 Argument Format<a class="headerlink" href="#argument-format" title="Permalink to this headline">¶</a></h5>
|
||||||
<p>Das Format des Kommando Zeilen Arguments soll yyyy-mm-dd sein, wobei yyyy für das vier-stellige Jahr, mm für einen 1-2-stelligen Monat (1…12) und dd für einen Tag des Monats, begin-nend mit 01. Z.B. 2020-02-29.</p>
|
<p>Das Format des Kommando Zeilen Arguments soll yyyy-mm-dd sein, wobei yyyy für das vier-stellige Jahr, mm für einen 1-2-stelligen Monat (1…12) und dd für einen Tag des Monats, beginnend mit 01. Z.B. 2020-02-29.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="korrektes-datum">
|
<section id="korrektes-datum">
|
||||||
<h5>3.2.1.2 Korrektes Datum<a class="headerlink" href="#korrektes-datum" title="Permalink to this headline">¶</a></h5>
|
<h5>3.2.1.2 Korrektes Datum<a class="headerlink" href="#korrektes-datum" title="Permalink to this headline">¶</a></h5>
|
||||||
|
@ -187,12 +187,12 @@ Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist
|
||||||
<section id="vorgaben-an-die-umsetzung">
|
<section id="vorgaben-an-die-umsetzung">
|
||||||
<h5>3.2.1.3 Vorgaben an die Umsetzung<a class="headerlink" href="#vorgaben-an-die-umsetzung" title="Permalink to this headline">¶</a></h5>
|
<h5>3.2.1.3 Vorgaben an die Umsetzung<a class="headerlink" href="#vorgaben-an-die-umsetzung" title="Permalink to this headline">¶</a></h5>
|
||||||
<ol class="arabic simple">
|
<ol class="arabic simple">
|
||||||
<li><p>Definieren Sie einen enum Typen mit (typedef) Namen month_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher dass die Abkürzungen für die uns geläufigen Monatsnummer stehen.</p></li>
|
<li><p>Definieren Sie einen enum Typen mit (typedef) Namen month_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher, dass die Abkürzungen für die uns geläufigen Monatsnummer stehen.</p></li>
|
||||||
<li><p>Definierend Sie einen struct Typen mit (typedef) Namen date_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring “%d-%d-%d” in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang.</p></li>
|
<li><p>Definierend Sie einen struct Typen mit (typedef) Namen date_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring “%d-%d-%d” in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang.</p></li>
|
||||||
<li><p>Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is_leap_year(date_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr».</p></li>
|
<li><p>Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is_leap_year(date_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr».</p></li>
|
||||||
<li><p>Implementieren Sie die Funktion <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">get_month_length(date_t</span> <span class="pre">date)</span></code>. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats ent-spricht) ausgeben – geben Sie 0 für ungültige Monatswerte zurück.</p></li>
|
<li><p>Implementieren Sie die Funktion <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">get_month_length(date_t</span> <span class="pre">date)</span></code>. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats entspricht) ausgeben – geben Sie 0 für ungültige Monatswerte zurück.</p></li>
|
||||||
<li><p>Schliesslich implementieren Sie die Funktion int is_gregorian_date(date_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja).</p></li>
|
<li><p>Schliesslich implementieren Sie die Funktion int is_gregorian_date(date_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja).</p></li>
|
||||||
<li><p>Implementieren Sie eine Funktion int is_valid_date(date_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die <code class="docutils literal notranslate"><span class="pre">month_t</span></code> Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implemen-tierten Hilfsfunktionen.</p></li>
|
<li><p>Implementieren Sie eine Funktion int is_valid_date(date_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die <code class="docutils literal notranslate"><span class="pre">month_t</span></code> Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implementierten Hilfsfunktionen.</p></li>
|
||||||
</ol>
|
</ol>
|
||||||
</section>
|
</section>
|
||||||
<section id="hinweise">
|
<section id="hinweise">
|
||||||
|
@ -202,7 +202,7 @@ Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist
|
||||||
</section>
|
</section>
|
||||||
<section id="teilaufgabe-wochentag-berechnung">
|
<section id="teilaufgabe-wochentag-berechnung">
|
||||||
<h4>3.2.2 Teilaufgabe Wochentag Berechnung<a class="headerlink" href="#teilaufgabe-wochentag-berechnung" title="Permalink to this headline">¶</a></h4>
|
<h4>3.2.2 Teilaufgabe Wochentag Berechnung<a class="headerlink" href="#teilaufgabe-wochentag-berechnung" title="Permalink to this headline">¶</a></h4>
|
||||||
<p>Schreiben Sie eine Funktion welche zu einem Datum den Wochentag berechnet.
|
<p>Schreiben Sie eine Funktion, welche zu einem Datum den Wochentag berechnet.
|
||||||
Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss.</p>
|
Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss.</p>
|
||||||
<figure class="align-center" id="wochentagsberechnung">
|
<figure class="align-center" id="wochentagsberechnung">
|
||||||
<a class="reference internal image-reference" href="../_images/Wochentagsberechnung.jpg"><img alt="../_images/Wochentagsberechnung.jpg" src="../_images/Wochentagsberechnung.jpg" style="width: 600px;" /></a>
|
<a class="reference internal image-reference" href="../_images/Wochentagsberechnung.jpg"><img alt="../_images/Wochentagsberechnung.jpg" src="../_images/Wochentagsberechnung.jpg" style="width: 600px;" /></a>
|
||||||
|
@ -212,17 +212,17 @@ Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine F
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">weekday</span> <span class="o">=</span> <span class="p">((</span><span class="n">day</span> <span class="o">+</span> <span class="p">(</span><span class="mi">13</span> <span class="o">*</span> <span class="n">m</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">5</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">y</span> <span class="o">/</span> <span class="mi">4</span> <span class="o">+</span> <span class="n">c</span> <span class="o">/</span> <span class="mi">4</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span> <span class="o">%</span> <span class="mi">7</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">%</span> <span class="mi">7</span>
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">weekday</span> <span class="o">=</span> <span class="p">((</span><span class="n">day</span> <span class="o">+</span> <span class="p">(</span><span class="mi">13</span> <span class="o">*</span> <span class="n">m</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">5</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">y</span> <span class="o">/</span> <span class="mi">4</span> <span class="o">+</span> <span class="n">c</span> <span class="o">/</span> <span class="mi">4</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span> <span class="o">%</span> <span class="mi">7</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">%</span> <span class="mi">7</span>
|
||||||
<span class="n">alle</span> <span class="n">Zahlen</span> <span class="n">sind</span> <span class="nb">int</span> <span class="n">Werte</span> <span class="n">und</span> <span class="n">alles</span> <span class="n">basiert</span> <span class="n">auf</span> <span class="nb">int</span><span class="o">-</span><span class="n">Arithmetik</span>
|
<span class="n">alle</span> <span class="n">Zahlen</span> <span class="n">sind</span> <span class="nb">int</span> <span class="n">Werte</span> <span class="n">und</span> <span class="n">alles</span> <span class="n">basiert</span> <span class="n">auf</span> <span class="nb">int</span><span class="o">-</span><span class="n">Arithmetik</span>
|
||||||
<span class="n">m</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="n">month</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span> <span class="o">%</span> <span class="mi">12</span>
|
<span class="n">m</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="n">month</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span> <span class="o">%</span> <span class="mi">12</span>
|
||||||
<span class="n">a</span> <span class="o">=</span> <span class="n">year</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">(</span><span class="n">für</span> <span class="n">month</span> <span class="o"><</span> <span class="n">Mar</span><span class="p">),</span> <span class="n">ansonsten</span> <span class="n">year</span>
|
<span class="n">a</span> <span class="o">=</span> <span class="n">year</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">(</span><span class="n">für</span> <span class="n">month</span> <span class="o"><</span> <span class="n">Mar</span><span class="p">),</span> <span class="n">ansonsten</span> <span class="n">year</span>
|
||||||
<span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">%</span> <span class="mi">100</span>
|
<span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">%</span> <span class="mi">100</span>
|
||||||
<span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">/</span> <span class="mi">100</span>
|
<span class="n">c</span> <span class="o">=</span> <span class="n">a</span> <span class="o">/</span> <span class="mi">100</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<p>Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms fol-gende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy-mm-dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020-02-29 is a Sat.
|
<p>Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms folgende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy-mm-dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020-02-29 is a Sat.
|
||||||
Vorgaben an die Umsetzung</p>
|
Vorgaben an die Umsetzung</p>
|
||||||
<ol class="arabic simple">
|
<ol class="arabic simple">
|
||||||
<li><p>Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stel-len Sie sicher dass die Abkürzungen für die Werte 0…6 stehen.</p></li>
|
<li><p>Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stellen Sie sicher, dass die Abkürzungen für die Werte 0…6 stehen.</p></li>
|
||||||
<li><p>Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenom-men, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));)</p></li>
|
<li><p>Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenommen, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));)</p></li>
|
||||||
<li><p>Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti-ger Wert für day erkannt wird, soll assert(!“day is out-of-range”); aufgeru-fen werden.
|
<li><p>Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungültiger Wert für day erkannt wird, soll assert(!“day is out-of-range”); aufgerufen werden.
|
||||||
Hinweise
|
Hinweise
|
||||||
• Für interessierte, siehe: <a class="reference external" href="https://de.wikipedia.org/wiki/Wochentagsberechnung">https://de.wikipedia.org/wiki/Wochentagsberechnung</a></p></li>
|
• Für interessierte, siehe: <a class="reference external" href="https://de.wikipedia.org/wiki/Wochentagsberechnung">https://de.wikipedia.org/wiki/Wochentagsberechnung</a></p></li>
|
||||||
</ol>
|
</ol>
|
||||||
|
@ -267,8 +267,8 @@ Hinweise
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<section id="anhang">
|
<section id="anhang">
|
||||||
<h2>5. Anhang<a class="headerlink" href="#anhang" title="Permalink to this headline">¶</a></h2>
|
<h2>5. Anhang<a class="headerlink" href="#anhang" title="Permalink to this headline">¶</a></h2>
|
||||||
<section id="sprach-element">
|
<section id="sprachelemente">
|
||||||
<h3>5.1 Sprach Element<a class="headerlink" href="#sprach-element" title="Permalink to this headline">¶</a></h3>
|
<h3>5.1 Sprachelemente<a class="headerlink" href="#sprachelemente" title="Permalink to this headline">¶</a></h3>
|
||||||
<div class="highlight-int notranslate"><div class="highlight"><pre><span></span> ...
|
<div class="highlight-int notranslate"><div class="highlight"><pre><span></span> ...
|
||||||
} argc: Anzahl Einträge in argv.
|
} argc: Anzahl Einträge in argv.
|
||||||
argv: Array von Command Line Argumenten.
|
argv: Array von Command Line Argumenten.
|
||||||
|
@ -286,7 +286,7 @@ int res = sscanf(argv[1]
|
||||||
if (res != 3) {
|
if (res != 3) {
|
||||||
// Fehler Behandlung...
|
// Fehler Behandlung...
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
@ -349,7 +349,7 @@ Schreibt formatierten Text auf den stderr Stream.</p>
|
||||||
</li>
|
</li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="#bewertung">4. Bewertung</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="#bewertung">4. Bewertung</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="#anhang">5. Anhang</a><ul>
|
<li class="toctree-l2"><a class="reference internal" href="#anhang">5. Anhang</a><ul>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="#sprach-element">5.1 Sprach Element</a></li>
|
<li class="toctree-l3"><a class="reference internal" href="#sprachelemente">5.1 Sprachelemente</a></li>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="#beschreibung">5.2 Beschreibung</a></li>
|
<li class="toctree-l3"><a class="reference internal" href="#beschreibung">5.2 Beschreibung</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -9,12 +9,12 @@ ___
|
||||||
___
|
___
|
||||||
## 1. Übersicht
|
## 1. Übersicht
|
||||||
In diesem Praktikum sind zwei Themen im Fokus: Funktionen und der Datentyp enum.
|
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:
|
Funktionen sind der wesentlichste Bestandteil der C Programmierung, welcher eine strukturierte Programmierung ermöglicht:
|
||||||
* Eine Funktion ein Teil eines C Codes, der eine spezielle Aufgabe ausführt. Sie kann aus dem Hauptprogramm, oder aus anderen Funktionen, aufgerufen werden.
|
* Eine Funktion 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).
|
* 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 aufrufendem Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern.
|
* Eine Funktion kann Werte aus dem aufrufenden Kontext übernehmen und bei Bedarf einen Wert an den aufrufenden Kontext zurückliefern.
|
||||||
Beispiel einer Additions-Funktion:
|
Beispiel einer Additions-Funktion:
|
||||||
```
|
```
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -32,15 +32,15 @@ int add(int a, int b) {
|
||||||
return a + b;
|
return a + b;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Der Daten typt enum wird verwendet um die Lesbarkeit von Programmen zu erhöhen:
|
Der Daten typt enum wird verwendet um die Lesbarkeit von Programmen zu erhöhen:
|
||||||
|
|
||||||
Beispiel eines enum:
|
Beispiel eines enum:
|
||||||
```
|
```
|
||||||
enum Ampeln = {rot =1, gelb, gruen};
|
enum Ampeln = {rot =1, gelb, gruen};
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
Ampeln ampel1;
|
Ampeln ampel1;
|
||||||
if (ampel1 == rot) {...}
|
if (ampel1 == rot) {...}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -49,7 +49,7 @@ ___
|
||||||
## 2. Lernziele
|
## 2. Lernziele
|
||||||
|
|
||||||
In diesem Praktikum lernen Sie Funktionen zu definieren und aufzurufen, sowie enum anzuwenden.
|
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 ein Programm schreiben, welches aus mehreren Funktionen besteht.
|
||||||
* Sie können Funktionen deklarieren, definieren und aufrufen.
|
* Sie können Funktionen deklarieren, definieren und aufrufen.
|
||||||
* Sie können enum Typen definieren und deren Werte bestimmen und abfragen.
|
* Sie können enum Typen definieren und deren Werte bestimmen und abfragen.
|
||||||
|
|
||||||
|
@ -66,47 +66,47 @@ ___
|
||||||
(Copyright Bild: www.planet-wissen.de)
|
(Copyright Bild: www.planet-wissen.de)
|
||||||
|
|
||||||
### 3.1 Aufgabe 1 Tage pro Monat
|
### 3.1 Aufgabe 1 Tage pro Monat
|
||||||
In der ersten Aufgabe berechnen Sie die Tag pro Monat einer beliebigen Kombination Monat / Jahr.
|
In der ersten Aufgabe berechnen Sie die Anzahl Tage pro Monat einer beliebigen Kombination Monat / Jahr.
|
||||||
Erweitern Sie dazu das Programm um folgende Aspekte:
|
Erweitern Sie dazu das Programm um folgende Aspekte:
|
||||||
* Bereichsprüfung von Jahr und Monat
|
* Bereichsprüfung von Jahr und Monat
|
||||||
* Funktion istSchaltjahr, welche berechnet, ob das Jahr eine Schaljahr ist
|
* Funktion istSchaltjahr, welche berechnet, ob das Jahr eine Schaljahr ist
|
||||||
* Funktion tageProMonat, welche die Anzahl Tage des gegebenen Monats und Jahres berechnet.
|
* Funktion tageProMonat, welche die Anzahl Tage des gegebenen Monats und Jahres berechnet.
|
||||||
|
|
||||||
Vorgaben:
|
Vorgaben:
|
||||||
* Die Funktion istSchaltjahr nimmt ein Integer (jahr) entgegen und gibt 1 im Falle eiens Schltjahres und 0 im andreren Fall zurück
|
* Die Funktion istSchaltjahr nimmt ein 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) entgegeben und gibt die Anzahl Tage als Integer 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
|
* 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 kleine als 13 sein.
|
* Der übergebene Monat muss grösser als 0 und kleine als 13 sein.
|
||||||
|
|
||||||
Die Regeln für die Schaltjahrberechnung:
|
Die Regeln für die Schaltjahrberechnung:
|
||||||
* Schaltjahre sind alle Jahre, die durch 4 teilbar sind.
|
* Schaltjahre sind alle Jahre, die durch 4 teilbar sind.
|
||||||
* Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schltjahre.
|
* 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
|
* 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
|
... 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:
|
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 sollen berücksichtigt werden. (atoi unfd fgets sind hier hilfreich)
|
* 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 Schltjahr und o im anderen Falle zurück.
|
* istSchaltjahr: Die Funktion gibt 1 im Falle eines Schaltjahrs und 0 im anderen Falle zurück.
|
||||||
* tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switchanweisung , sowie den enum Datentypen
|
* tageProMonat: Die Funktion gibt den die Tage des Monats für das definierte Jahr zurück. Verwenden Sie die Switch-Anweisung, sowie den enum Datentypen
|
||||||
|
|
||||||
```
|
```
|
||||||
int main (int argc, char *argv[]) {
|
int main (int argc, char *argv[]) {
|
||||||
|
|
||||||
int monat, jahr;
|
int monat, jahr;
|
||||||
|
|
||||||
// Monat einlesen und Bereich ueberpruefen
|
// Monat einlesen und Bereich ueberpruefen
|
||||||
monat = gibIntWert("Monat", 1, 12);
|
monat = gibIntWert("Monat", 1, 12);
|
||||||
jahr = gibIntWert("Jahr", 1600, 9999);
|
jahr = gibIntWert("Jahr", 1600, 9999);
|
||||||
|
|
||||||
// Ausgabe zum Test
|
// Ausgabe zum Test
|
||||||
printf("Monat: %d, Jahr: %d \n", monat, jahr);
|
printf("Monat: %d, Jahr: %d \n", monat, jahr);
|
||||||
|
|
||||||
// Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
|
// Ausgabe zum Test (hier mit dem ternaeren Operator "?:")
|
||||||
printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");
|
printf("%d ist %s Schaltjahr\n", jahr, istSchaltjahr(jahr) ? "ein" : "kein");
|
||||||
|
|
||||||
// Ausgabe
|
// Ausgabe
|
||||||
printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
|
printf("Der Monat %02d-%d hat %d Tage.\n", monat, jahr, tageProMonat(jahr, monat));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -115,7 +115,7 @@ Tipp: Angenommen Sie verwenden den enum month_t { JAN=1, FEB, MAR, APR, MAI, JUN
|
||||||
Dann können Sie im Programm direkt die Konstanten verwenden:
|
Dann können Sie im Programm direkt die Konstanten verwenden:
|
||||||
```
|
```
|
||||||
if (m == 2) ... // schlecht lesbar
|
if (m == 2) ... // schlecht lesbar
|
||||||
if (monat == 2) ... // besserer Variablenname
|
if (monat == 2) ... // besserer Variablenname
|
||||||
if (monat == FEB) ... // am besten lesbar
|
if (monat == FEB) ... // am besten lesbar
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -127,9 +127,9 @@ Erweitern Sie das vorgegebene zweite Programm Gerüst an den bezeichneten Stelle
|
||||||
Prüfen Sie die Umsetzung beider Teilaufgaben mittels make test.
|
Prüfen Sie die Umsetzung beider Teilaufgaben mittels make test.
|
||||||
#### 3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen
|
#### 3.2.1 Teilaufgabe Argumente Parsen und auf Korrektheit prüfen
|
||||||
Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel).
|
Das Argument stellt ein gültiges Datum unseres Gregorianischen Kalenders dar (d.h. ein Datum ab Donnerstag, den 15. Oktober 1582, mit der Gregorianischen Schaltjahr Regel).
|
||||||
Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde terminiert das Programm mit Exit Code EXIT_SUCCESS.
|
Wenn kein Argument gegeben ist oder wenn das eingegebene Datum nicht gültig ist, soll das Programm einem Hilfetext auf stderr ausgeben und mit EXIT_FAILURE Exit Code terminieren. Wenn ein gültiges Datum erkannt wurde, terminiert das Programm mit Exit Code EXIT_SUCCESS.
|
||||||
##### 3.2.1.1 Argument Format
|
##### 3.2.1.1 Argument Format
|
||||||
Das Format des Kommando Zeilen Arguments soll yyyy-mm-dd sein, wobei yyyy für das vier-stellige Jahr, mm für einen 1-2-stelligen Monat (1…12) und dd für einen Tag des Monats, begin-nend mit 01. Z.B. 2020-02-29.
|
Das Format des Kommando Zeilen Arguments soll yyyy-mm-dd sein, wobei yyyy für das vier-stellige Jahr, mm für einen 1-2-stelligen Monat (1…12) und dd für einen Tag des Monats, beginnend mit 01. Z.B. 2020-02-29.
|
||||||
##### 3.2.1.2 Korrektes Datum
|
##### 3.2.1.2 Korrektes Datum
|
||||||
Das Datum muss alle folgenden Bedingungen erfüllen damit es als korrekt erkannt wird:
|
Das Datum muss alle folgenden Bedingungen erfüllen damit es als korrekt erkannt wird:
|
||||||
* Obergrenze für ein «sinnvolles» Datum ist das Jahr 9999
|
* Obergrenze für ein «sinnvolles» Datum ist das Jahr 9999
|
||||||
|
@ -142,16 +142,16 @@ Das Datum muss alle folgenden Bedingungen erfüllen damit es als korrekt erkannt
|
||||||
* der Tag darf für den Februar nicht grösser sein als 28 für ein Nicht-Schaltjahr
|
* der Tag darf für den Februar nicht grösser sein als 28 für ein Nicht-Schaltjahr
|
||||||
|
|
||||||
##### 3.2.1.3 Vorgaben an die Umsetzung
|
##### 3.2.1.3 Vorgaben an die Umsetzung
|
||||||
1. Definieren Sie einen enum Typen mit (typedef) Namen month_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher dass die Abkürzungen für die uns geläufigen Monatsnummer stehen.
|
1. Definieren Sie einen enum Typen mit (typedef) Namen month_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Monate sind, nämlich Jan, Feb, … Dec und stellen Sie sicher, dass die Abkürzungen für die uns geläufigen Monatsnummer stehen.
|
||||||
2. Definierend Sie einen struct Typen mit (typedef) Namen date_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring "%d-%d-%d" in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang.
|
2. Definierend Sie einen struct Typen mit (typedef) Namen date_t und den int Elementen year, month, day. Lesen Sie das Argument (falls vorhanden) via sscanf und dem Formatstring "%d-%d-%d" in die drei Elemente einer Date Variable. Siehe dazu die Hinweise im Anhang.
|
||||||
3. Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is_leap_year(date_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr».
|
3. Für die Berechnung der Monatslänge implementieren Sie die Hilfsfunktion is_leap_year(date_t date) (nach obigen Vorgaben). Der Return Wert 0 bedeutet «Kein Schaltjahr», 1 bedeutet «Schaltjahr».
|
||||||
4. Implementieren Sie die Funktion `int get_month_length(date_t date)`. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats ent-spricht) ausgeben – geben Sie 0 für ungültige Monatswerte zurück.
|
4. Implementieren Sie die Funktion `int get_month_length(date_t date)`. Diese soll für den Monat des Datums die Monatslänge (was dem letzten Tag des Monats entspricht) ausgeben – geben Sie 0 für ungültige Monatswerte zurück.
|
||||||
5. Schliesslich implementieren Sie die Funktion int is_gregorian_date(date_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja).
|
5. Schliesslich implementieren Sie die Funktion int is_gregorian_date(date_t date) welche prüft, ob ein gegebenes Datum im Bereich 15. Oktober 1582 und dem Jahr 9999 ist (0 = nein, 1 = ja).
|
||||||
6. Implementieren Sie eine Funktion int is_valid_date(date_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die `month_t` Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implemen-tierten Hilfsfunktionen.
|
6. Implementieren Sie eine Funktion int is_valid_date(date_t date), welche obige Bedingungen für ein gültiges Datum umsetzt. Der Return Wert 0 bedeutet «Kein gültiges Datum», 1 bedeutet «Gültiges Datum». Benutzen Sie für die Prüfung des Datums die `month_t` Werte wo immer möglich und sinnvoll. Verwenden Sie die oben implementierten Hilfsfunktionen.
|
||||||
##### 3.2.1.4 Hinweise
|
##### 3.2.1.4 Hinweise
|
||||||
Beachten Sie die Kommentare im Code für die geforderten Implementierungs-Details.
|
Beachten Sie die Kommentare im Code für die geforderten Implementierungs-Details.
|
||||||
#### 3.2.2 Teilaufgabe Wochentag Berechnung
|
#### 3.2.2 Teilaufgabe Wochentag Berechnung
|
||||||
Schreiben Sie eine Funktion welche zu einem Datum den Wochentag berechnet.
|
Schreiben Sie eine Funktion, welche zu einem Datum den Wochentag berechnet.
|
||||||
Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss.
|
Die Formel wird Georg Glaeser zugeschrieben, möglicherweise angelehnt an eine Formel von Carl Friedrich Gauss.
|
||||||
|
|
||||||
```{eval-rst}
|
```{eval-rst}
|
||||||
|
@ -167,15 +167,15 @@ Hier ist eine für C abgewandelte Variante davon.
|
||||||
weekday = ((day + (13 * m - 1) / 5 + y + y / 4 + c / 4 - 2 * c) % 7 + 7) % 7
|
weekday = ((day + (13 * m - 1) / 5 + y + y / 4 + c / 4 - 2 * c) % 7 + 7) % 7
|
||||||
alle Zahlen sind int Werte und alles basiert auf int-Arithmetik
|
alle Zahlen sind int Werte und alles basiert auf int-Arithmetik
|
||||||
m = 1 + (month + 9) % 12
|
m = 1 + (month + 9) % 12
|
||||||
a = year - 1 (für month < Mar), ansonsten year
|
a = year - 1 (für month < Mar), ansonsten year
|
||||||
y = a % 100
|
y = a % 100
|
||||||
c = a / 100
|
c = a / 100
|
||||||
```
|
```
|
||||||
Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms fol-gende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy-mm-dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020-02-29 is a Sat.
|
Erweitern sie das Programm so, dass vor dem erfolgreichen Terminieren des Programms folgende Zeile (inklusive Zeilenumbruch) ausgegeben wird: yyyy-mm-dd is a Ddd, wobei yyyy für das Jahr, mm für die Nummer des Monats (01…12) und dd für den Tag im Monat (01…). Z.B. 2020-02-29 is a Sat.
|
||||||
Vorgaben an die Umsetzung
|
Vorgaben an die Umsetzung
|
||||||
1. Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stel-len Sie sicher dass die Abkürzungen für die Werte 0…6 stehen.
|
1. Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stellen Sie sicher, dass die Abkürzungen für die Werte 0…6 stehen.
|
||||||
2. Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenom-men, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));)
|
2. Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenommen, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));)
|
||||||
3. Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti-ger Wert für day erkannt wird, soll assert(!"day is out-of-range"); aufgeru-fen werden.
|
3. Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungültiger Wert für day erkannt wird, soll assert(!"day is out-of-range"); aufgerufen werden.
|
||||||
Hinweise
|
Hinweise
|
||||||
• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung
|
• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmco
|
||||||
___
|
___
|
||||||
## 5. Anhang
|
## 5. Anhang
|
||||||
|
|
||||||
### 5.1 Sprach Element
|
### 5.1 Sprachelemente
|
||||||
|
|
||||||
```int main(int argc, char *argv[]) {
|
```int main(int argc, char *argv[]) {
|
||||||
...
|
...
|
||||||
|
@ -214,7 +214,7 @@ int res = sscanf(argv[1]
|
||||||
if (res != 3) {
|
if (res != 3) {
|
||||||
// Fehler Behandlung...
|
// Fehler Behandlung...
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5.2 Beschreibung
|
### 5.2 Beschreibung
|
||||||
|
@ -225,4 +225,4 @@ fprintf(stderr, "Usage: %s…\n", argv[0]); Siehe man 3 fprintf.
|
||||||
Schreibt formatierten Text auf den stderr Stream.
|
Schreibt formatierten Text auf den stderr Stream.
|
||||||
|
|
||||||
___
|
___
|
||||||
Version: 15.02.2022
|
Version: 15.02.2022
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#bewertung">4. Bewertung</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#bewertung">4. Bewertung</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#anhang">5. Anhang</a><ul>
|
<li class="toctree-l2"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#anhang">5. Anhang</a><ul>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#sprach-element">5.1 Sprach Element</a></li>
|
<li class="toctree-l3"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#sprachelemente">5.1 Sprachelemente</a></li>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#beschreibung">5.2 Beschreibung</a></li>
|
<li class="toctree-l3"><a class="reference internal" href="P02_Funktionen_Datentyp_enum/README.html#beschreibung">5.2 Beschreibung</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Loading…
Reference in New Issue