19.05.2015 Aufrufe

Programmieren in C Übungsaufgaben Sommersemester 2013 Seite ...

Programmieren in C Übungsaufgaben Sommersemester 2013 Seite ...

Programmieren in C Übungsaufgaben Sommersemester 2013 Seite ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!