Programmieren in C Ãbungsaufgaben Sommersemester 2013 Seite ...
Programmieren in C Ãbungsaufgaben Sommersemester 2013 Seite ...
Programmieren in C Ãbungsaufgaben Sommersemester 2013 Seite ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 1 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Übungsaufgabe 1<br />
(02.10.2014)<br />
In der Vorlesung entstand der Programmcode für e<strong>in</strong> C-Programm, das die folgende Anforderung erfüllen<br />
soll:<br />
Entwickeln Sie e<strong>in</strong> Programm, das fortlaufend neue Werte e<strong>in</strong>er fiktiven Messgröße aus der E<strong>in</strong>gabe liest<br />
und für jeden neuen Messwert den Mittelwert dieser "Messreihe" aktualisiert. Als Rechenformel für den<br />
aktuellen Mittelwert soll gelten:<br />
aktueller Mittelwert = (aktuelle Summe der Messwerte) / (aktuelle Anzahl der Messungen)<br />
"Anzahl der Messungen" können Sie gleichsetzen mit der Anzahl wiederholter E<strong>in</strong>gaben.<br />
Das Programm wiederholt E<strong>in</strong>gabe und Mittelung endlos. Ändern Sie das, <strong>in</strong>dem Sie die Bed<strong>in</strong>gung<br />
"E<strong>in</strong>gabe ist negativ" als Kriterium zu Beendigung benutzen. Das Programm sollte danach auch die letzte<br />
Ausgabe ausführen, was es bisher nicht kann.<br />
Das Programm f<strong>in</strong>den Sie auf dem Public Server der Ostfalia über die Webseite zu dieser Vorlesung unter<br />
https://www.ostfalia.de/cms/de/pws/haas/Lehre/Vorlesungen/<strong>Programmieren</strong>C/Beispielprogramme/<br />
als<br />
Quelle1.cpp<br />
Um mit Firefox den Zugriff auf die verme<strong>in</strong>tlich "unsicheren Inhalte" auf dem Public Server herzustellen,<br />
klicken Sie auf das kle<strong>in</strong>e Vorhängeschloss l<strong>in</strong>ks oben <strong>in</strong> der Adresszeile, das sich dann <strong>in</strong> e<strong>in</strong> Ritterschild<br />
verwandelt:
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 2 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Zeigen Sie auf das Ritterschild und dann auf den Abwärtspfeil rechts neben "Weiter blockieren". Wählen Sie<br />
"Schutz auf dieser <strong>Seite</strong> deaktivieren". Nun sollten Sie im Contentbereich rechts auch die Daten am Ziel des<br />
Hyperl<strong>in</strong>ks sehen.<br />
Klicken Sie auf "Vorlesungsbeispiele" und speichern Sie die Datei gmw_1.cpp <strong>in</strong> e<strong>in</strong>em Ordner, <strong>in</strong> dem Sie<br />
die Programmquellen für Projekte mit Ihrem Entwicklungssystem sicher aufbewahren.<br />
Legen Sie nun mit Ihrem bevorzugten Entwicklungssystem für C/C++ e<strong>in</strong> "leeres Projekt" an und fügen Sie<br />
diesem die Programmquelle gmw_1.cpp h<strong>in</strong>zu.<br />
Falls Sie noch ke<strong>in</strong>e Entwicklungsumgebung für C/C++ haben, können Sie z.B. Microsoft Visual C++<br />
2008 Express aus der folgenden Quelle herunterladen und <strong>in</strong>stallieren:<br />
http://e5.onthehub.com/WebStore/Offer<strong>in</strong>gsOfMajorVersionList.aspx?pmv=fe39e2d6-8ff9-e011-8e6c-<br />
f04da23e67f6&cmi_mnuMa<strong>in</strong>=bdba23cf-e05e-e011-971f-0030487d8897&ws=04bfd63d-b99b-e011-969d-<br />
0030487d8897&vsro=8&JSEnabled=1<br />
oder dem L<strong>in</strong>k auf der Webseite folgen, um stattdessen Visual C++ 2012 Express zu <strong>in</strong>stallieren:<br />
http://www.microsoft.com/de-de/download/details.aspx?id=34673<br />
Versuchen Sie nun, e<strong>in</strong> Zielprogramm aus dem vorhandenen Programmcode zu erstellen, bevor Sie diesen<br />
verändern.
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 3 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Für die E<strong>in</strong>- und Ausgabe verwenden Sie die Standardfunktionen fscanf und fpr<strong>in</strong>tf. Ihre Beschreibung<br />
f<strong>in</strong>den Sie z.B. unter der Adresse<br />
http://www.cplusplus.com/reference/cstdio/<br />
die auch <strong>in</strong> der Ostfalia-<strong>Seite</strong> zu dieser Vorlesung verl<strong>in</strong>kt ist. Sie f<strong>in</strong>den dort <strong>in</strong> der Box "Reference" den<br />
E<strong>in</strong>trag "C library" und dort unter " (stdio.h)" e<strong>in</strong>e Liste der Funktionen für die E<strong>in</strong>- und Ausgabe.<br />
Erproben Sie Ihr Programm nach erfolgreicher Erstellung und prüfen Sie, ob es sich korrekt verhält.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 2<br />
(06.10.2014)<br />
Sie haben <strong>in</strong> der Vorlesung erfahren, dass jedes ASCII-Zeichen e<strong>in</strong>erseits e<strong>in</strong>e ganze Zahlen mit festem<br />
Wert im Bereich 0 … 255 ist, andererseits auf ASCII-fähigen Term<strong>in</strong>als als Zeichen ersche<strong>in</strong>t. Die Zahl ist<br />
der Index, das zugehörige Zeichen der Inhalt der ASCII-Codetabelle.<br />
Formulieren Sie e<strong>in</strong> kle<strong>in</strong>es Programm, dass für e<strong>in</strong>en zwischen Index 32 und 127 (dezimal) per<br />
Konsolene<strong>in</strong>gabe frei wählbaren Ausschnitt der ASCII-Tabelle sowohl Index als auch Zeichen auf der<br />
Konsole ausgibt.<br />
……………………………………………………………………………………………………………………………
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 4 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Übungsaufgabe 3<br />
(17.10.2014)<br />
Auf dem Netzwerkordner mit den Beispielprogrammen zur Vorlesung f<strong>in</strong>den Sie das Programm mit der<br />
strukturierten Darstellung der Mittelwertberechnung. Ergänzen Sie es durch die Bearbeitung e<strong>in</strong>er zweiten<br />
Messreihe, d.h. E<strong>in</strong>gabe und Mittelung e<strong>in</strong>er zusätzlichen Größe. Auch die zweite Messreihe gehört <strong>in</strong> die<br />
schon vorhandene Schleife, die e<strong>in</strong>er zeitlichen Abfolge der Erfassung und Auswertung neuer Werte der<br />
beiden Größen entspricht.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 4<br />
(20.10.2014)<br />
Auf dem Netzwerkordner mit den Beispielprogrammen zur Vorlesung f<strong>in</strong>den Sie nun auch die<br />
Weiterentwicklung des Programm mit der strukturierten Mittelwertberechnung. Es enthält Funktionen für<br />
Initialisierung und die Messwerte<strong>in</strong>gabe und Mittelung.<br />
"Testen" Sie, ob es funktioniert wie erwartet.<br />
Erweitern Sie den Strukturdatentyp um e<strong>in</strong>en e<strong>in</strong>deutigen Schlüssel (Nummer), mit dem jedes der beiden<br />
Objekte identifierbar wird.<br />
Verändern Sie die Ausgabe so, dass dem Anwender klar ist, für welche der beiden Messreihen das<br />
Programm die E<strong>in</strong>gabe anfordert. Verändern Sie schließlich die Ausgabe am Ende des Programms so,<br />
dass sie das Endergebnis der Mittelung beider Messreihen anzeigt.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 5<br />
(28.10.2014)<br />
Dem Beispiel mwstr3.cpp , dessen Messprozessobjekte nun als Feldelemente implementiert s<strong>in</strong>d, fehlt<br />
noch die richtige Laufbed<strong>in</strong>gung für die Hauptschleife. Formulieren Sie die Zuweisung an die Größe<br />
app_run nun iterativ mithilfe e<strong>in</strong>er for-Schleife so, dass app_run solange true ist, wie für m<strong>in</strong>destens<br />
e<strong>in</strong> Messobjekt x[i] noch gilt, dass x[i].runn<strong>in</strong>g == true ist.<br />
Ändern Sie auch die abschließende Ausgabe so, dass das Endergebnis des Mittelwerts für alle Messobjekt<br />
auf der Konsole ersche<strong>in</strong>t.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 6<br />
(03.11.2014)<br />
Im Beispielordner f<strong>in</strong>den Sie mwstr5.cpp . Bei diesem Programm s<strong>in</strong>d Feldlänge und Feldbearbeitung<br />
durch e<strong>in</strong>e geme<strong>in</strong>same konstant deklarierte Variable verknüpft.<br />
Setzen Sie die Weiterentwicklung so fort, dass e<strong>in</strong> Anwender des Programms zur Laufzeit die Anzahl der<br />
Messreihen per E<strong>in</strong>gabe an der Konsole bestimmen kann, für die das Programm jeweils e<strong>in</strong> Objekt anlegt,<br />
Messwerte e<strong>in</strong>liest und den Mittelwert aktualisiert.<br />
Benutzen Sie für die Anforderung von Speicher zur Laufzeit den C++ - Operator new, wie <strong>in</strong> der Vorlesung<br />
gezeigt:<br />
messreihe * x; // Zeiger auf e<strong>in</strong> beliebiges Objekt vom Typ messreihe<br />
// deklarieren<br />
x = new messreihe[wunsch_anzahl]; // Speicher für e<strong>in</strong> Feld anfordern und<br />
// Zeiger auf das erste Element richten<br />
if( x == NULL )<br />
// Fehler behandeln<br />
else<br />
// Messwerte<strong>in</strong>gaben und Mittelwerte<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 7<br />
(10.11.2014)
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 5 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Im Beispielordner f<strong>in</strong>den Sie das <strong>in</strong> der heutigen Vorlesung entwickelte Programm m<strong>in</strong>max.cpp . Im fehlt<br />
noch e<strong>in</strong>e Verifikation, d.h. Starten und Erproben, für die weitere Entwicklung. Führen Sie das aus und<br />
setzen Sie dann die Entwicklung des Programms fort, <strong>in</strong>dem Sie e<strong>in</strong>e weitere Funktion def<strong>in</strong>ieren, die der<br />
Anwendung ma<strong>in</strong> per Konsolene<strong>in</strong>gabe beliebige Werte des Feldes liefert, bevor ma<strong>in</strong> die Funktion zur<br />
Bestimmung des m<strong>in</strong>imalen und maximalen Werts aufruft. Halten Sie sich bei der Gestaltung des<br />
Funktionsarguments an die schon vorhandenen beiden Funktionen des Programms.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 8<br />
(17.11.2014)<br />
Im Beispielordner f<strong>in</strong>den Sie jetzt auch m<strong>in</strong>max2.cpp . Wie <strong>in</strong> der Vorlesung am 17.11. besprochen, sollte<br />
die Funktion für die Ausgabe des m<strong>in</strong>- und des max-Wertes anstelle wie jetzt programmiert 2 Zahlenwerte<br />
vom Typ <strong>in</strong>t zu übernehmen und auszugeben dasselben mit e<strong>in</strong>er Folge von N <strong>in</strong>t-Werten ab e<strong>in</strong>er<br />
Anfangsadresse tun. Es ist dann nur noch Sache unserer Anwendung ma<strong>in</strong>, hier e<strong>in</strong> Feld der Länge 2<br />
anzulegen, dar<strong>in</strong> den m<strong>in</strong>-Wert im Element 0 und den max-Wert <strong>in</strong> Element 1 zu speichern und dann den<br />
Zeiger auf das Feld zusammen mit dessen Länge im Aufruf der Funktion zu übergeben.<br />
<strong>Programmieren</strong> Sie außerdem <strong>in</strong> m<strong>in</strong>max2.cpp die Fehlerbehandlung für den Fall, dass malloc bzw. new<br />
den Po<strong>in</strong>ter auf NULL zurückgibt. Dies wäre der Fall, wenn der angeforderte Speicher nicht fortlaufend<br />
adressierbar zur Verfügung stünde, oder wenn malloc e<strong>in</strong>e negative Anzahl von Bytes anforderte (falscher<br />
Parameterwert). Das Programm soll <strong>in</strong> diesem Fall e<strong>in</strong> Feld fester Länge anlegen (benutzen Sie das Makro<br />
N) und dann mit dem Feld so verfahren wie bei erfolgreicher Speicheranforderung mit dem Po<strong>in</strong>ter auf den<br />
angeforderten Speicher. Gestalten Sie Ihr Übungsprogramm so, dass es mit if( ke<strong>in</strong> Speicher) auch nicht<br />
teilweise denselben Code ausführen muss wie mit else, abgesehen vielleicht von fpr<strong>in</strong>tf o.ä.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 9<br />
(25.11.2014)<br />
Sie f<strong>in</strong>den im Beispielordner die Programmquelle ppo<strong>in</strong>ter.cpp . Laden Sie diese herunter, erstellen Sie<br />
daraus e<strong>in</strong> Zielprogramm und probieren Sie es aus.<br />
Öffnen Sie dann mit e<strong>in</strong>em e<strong>in</strong>fachen Texteditor (z.B. notepad) e<strong>in</strong>e neue Datei, geben Sie e<strong>in</strong>e Anzahl<br />
Werte e<strong>in</strong> und speichern Sie den Inhalt <strong>in</strong> dem Ordner ab, <strong>in</strong> dem sich Ihr Zielprogramm bef<strong>in</strong>det.<br />
Benennen Sie dann ppo<strong>in</strong>ter.cpp um und ändern Sie am Programm folgendes:<br />
1.) ma<strong>in</strong> öffnet die Datei im Projektordner zum Lesen:<br />
FILE * <strong>in</strong>putfile;<br />
<strong>in</strong>putfile = fopen( "datei.txt", "r" );<br />
if( <strong>in</strong>putfile == NULL )<br />
// Fehler<br />
else<br />
// hier geht es weiter ...<br />
2.) ma<strong>in</strong> fragt nach der E<strong>in</strong>gabe für e<strong>in</strong>e Anzahl Werte N, die es aus der geöffneten Datei lesen und <strong>in</strong><br />
e<strong>in</strong>em Feld von double speichern soll, übernimmt für N e<strong>in</strong>en Wert per Konsole<strong>in</strong>gabe, und wenn N > 0,<br />
führt aus:<br />
Speicher reservieren für N Werte;<br />
wenn OK,<br />
wiederhole für alle N:<br />
fscanf( <strong>in</strong>putfile, "%lg", AdresseNaechsterWert );<br />
Diese Operationen sollten Sie wenn möglich mit der Funktion gibSpeicherUndWerte realisieren,<br />
<strong>in</strong>dem Sie deren Code entsprechend ändern und sie mit ma<strong>in</strong> aufrufen.<br />
Dabei ersetzen Sie AdresseNaechsterWert durch den passenden Zeigerausdruck, der auf den<br />
reservierten Speicher zeigt.
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 6 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Es kann nun se<strong>in</strong>, dass <strong>in</strong> der Datei weniger Werte stehen als der Anwender Ihres Programms daraus lesen<br />
möchte. Diese Fall kann e<strong>in</strong> C-Programm unterscheiden mit<br />
if ( feof( <strong>in</strong>putfile ) )<br />
break; // Dateiende ist erreicht<br />
else<br />
// hier geht es weiter.<br />
E<strong>in</strong> geöffnete Datei wird <strong>in</strong> C wieder geschlossen, also freigegeben, mit<br />
fclose (<strong>in</strong>putfile);<br />
<strong>Programmieren</strong> Sie zum Abschluss e<strong>in</strong>e Kontrollausgabe der Daten im dynamischen Feld von double.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 10<br />
(02.12.2014)<br />
Laden Sie vom Beispielordner der Webseite zur Vorlesung die Programmquelle copydata_neu.cpp<br />
herunter. Zum Programmcode aus der Vorlesung am 1.12. habe ich für Ihr besseres Verständnis der<br />
Dateioperationen und des doppelten Zeigers Kommentare h<strong>in</strong>zugefügt.<br />
In der vorhandenen Fassung startet das Programm mit den Namen der E<strong>in</strong>gabedatei im Programmaufruf.<br />
Es verlangt dann die Anzahl der aus der Datei e<strong>in</strong>zugebenden Werte per Term<strong>in</strong>ale<strong>in</strong>gabe vom Anwender.<br />
Ändern Sie dies Verhalten so, dass das Programm nun ohne Anwendere<strong>in</strong>gabe auskommt, <strong>in</strong>dem es selbst<br />
<strong>in</strong> der neuen Funktion<br />
void bestimmeAnzahl ( FILE * <strong>in</strong>, <strong>in</strong>t * anzahl );<br />
die den Referenzparameter anzahl Anzahl der Werte <strong>in</strong> der Datei <strong>in</strong> bestimmt..<br />
Die Funktion soll die Datei als Textdatei ansehen und die dar<strong>in</strong> vorhandenen Werte zählen, <strong>in</strong>dem sie die<br />
E<strong>in</strong>gabe e<strong>in</strong>er Zeichenkette solange wiederholt, bis das Dateiende erreicht ist, und bei jedem Lesen e<strong>in</strong>en<br />
Zähler <strong>in</strong>krementieren. Vor der Rückkehr soll die Funktion dem Ziel des Zeigers anzahl den Zähler<br />
zuweisen.<br />
Nachdem Ihr um bestimmeAnzahl erweitertes Programm diese Funktion aufgerufen hat, soll es<br />
copydata aufrufen, um die E<strong>in</strong>gabe aller Werte aus der Datei und Ablage im dynamisch angeforderten<br />
Speicher auszuführen. Dabei können Sie copydata unverändert verwenden.<br />
Überzeugen Sie sich vom Funktionieren dieser Weiterentwicklung. Ändern Sie das Programm dann so, dass<br />
es <strong>in</strong> ma<strong>in</strong> e<strong>in</strong>e Protokollierungsdatei öffnet:<br />
logfile = fopen( argv[2], "w" ); // auch dieser Date<strong>in</strong>ame aus dem Programmaufruf<br />
und ersetzen Sie nun jede Term<strong>in</strong>alausgabe durch Ausgabe <strong>in</strong> diese Datei:<br />
fpr<strong>in</strong>tf(logfile, "..."); // wo bisher stand fpr<strong>in</strong>tf(stdout, "...");<br />
Erproben Sie das Programm und öffnen Sie die Protokollierungsdatei mit e<strong>in</strong>em Texteditor: sehen Sie sich<br />
an, was das Programm dort e<strong>in</strong>getragen hat.<br />
……………………………………………………………………………………………………………………………<br />
Übungsaufgabe 10<br />
(09.12.2014)<br />
Laden und öffnen Sie die Programmquelle copydata4.cpp auf dem WWW-Ordner mit Programmbeispielen.<br />
Sie f<strong>in</strong>den dort e<strong>in</strong>en Header mit sog. Makros #def<strong>in</strong>e ... , welche die Stellen ("Bits", Flags)<br />
e<strong>in</strong>es Statusworts bezeichnen und nummerieren. Das Programm soll dafür sorgen, dass im Statuswort an<br />
jeder der so def<strong>in</strong>ierten Stellen der logischen Wert 1 steht, wenn der zugehörige Fehler im Programmablauf<br />
e<strong>in</strong>tritt.<br />
Ihre Aufgabe besteht also zunächst dar<strong>in</strong>, anstelle aller Kommentare<br />
// setze entsprechendes Bit im Statuswort<br />
die richtige Setzoperation des entsprechenden Bits im Statuswort <strong>in</strong>s Programm zu schreiben. Die b<strong>in</strong>äre<br />
Setzoperation habe ich <strong>in</strong> der Vorlesung am 8.12. erklärt, Sie f<strong>in</strong>den Sie auch im Umdruck auf der <strong>Seite</strong> 37,<br />
Abschnitt 6.4.4 als "Set e<strong>in</strong>es Bit" erklärt. Damit setzt das Programm im Statuswort grundsätzlich nur das<br />
entsprechende Bit an der Stelle bit auf im word auf 1, während an allen anderen Bits <strong>in</strong> word nichts<br />
verändert wird.<br />
Beachten Sie, dass das Statuswort <strong>in</strong> den von ma<strong>in</strong> aufgerufenen Funktionen des Vorlageprogramms als<br />
Referenzparameter vorkommt.
<strong>Programmieren</strong> <strong>in</strong> C<br />
Übungsaufgaben W<strong>in</strong>tersemester 2014/15<br />
<strong>Seite</strong> 7 von 7<br />
Ostfalia Hochschule für angewandte Wissenschaften<br />
Fakultät Elektrotechnik<br />
Prof. Dr.-Ing. M. Haas<br />
Vor Beendigung des Programms ruft ma<strong>in</strong> e<strong>in</strong>e Art Meldungsfunktion namens kontrollAusgabe auf. Diese<br />
soll an den Stellen mit dem Kommentar<br />
teste im if‐Argument entsprechendes Bit im Statuswort<br />
das Statuswort auf je e<strong>in</strong> gesetztes Bit überprüfen ("testen"), um ggf. e<strong>in</strong>e passende Ausgabe auf die<br />
Konsole zu br<strong>in</strong>gen.<br />
Das Testen e<strong>in</strong>es Bit ist an derselben Stelle im Umdruck beschrieben wie das Set bzw. Reset. Für den Test<br />
im Argument von if reicht aber hier der vere<strong>in</strong>fachte Ausdruck<br />
status & (1