Uebungsaufgaben
Uebungsaufgaben
Uebungsaufgaben
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Übungsaufgaben Informatik<br />
Aufgabe 1 'Hello World' B *<br />
Tippen Sie das 'Hello World' Programm ab und bringen sie es zum Laufen.<br />
Aufgabe 2 'Agenten' B **<br />
Schreiben Sie ein Programm, welches folgenden Text ausgibt:<br />
Die Datei "c:\agenten\007\treffer.txt" wurde geschrieben!<br />
Kein Fehler aufgetreten.<br />
Aufgabe 3 'Zahlen Addieren' B **<br />
Schreiben Sie ein Programm welches 2 ganze Zahlen (int) von der Tastatur einliest, und die Summe der beiden<br />
Zahlen ausgibt<br />
Aufgabe 4 'Datentypen IO' B *<br />
Schreiben Sie ein Programm, welches verschiedene Datentypen einliest, jeweils in einer passenden Variable<br />
abspeichert und wieder ausgibt. Speichern sie nacheinander alle eingelesenen Werte in einer weiteren char<br />
Variablen ab und geben sie diese nach jeder Zuweisung wieder aus.<br />
Experimentieren Sie etwas mit den Datentypen und den Formatbezeichnern.<br />
Aufgabe 5 'Konversionen' B **<br />
Schreiben Sie ein Programm, welches einen int, einen float und einen double in eine entsprechende Variable<br />
einliest. Geben Sie die Werte anschliessend wieder aus.<br />
Weisen Sie nun die Werte der int-, der float- und der double- Variablen jeweils einer char-Variablen zu und<br />
geben Sie deren Wert jeweils aus.<br />
Experimentieren Sie etwas mit den Datentypen und Konstanten (Literale).<br />
Aufgabe 6 'Datentypen' B **<br />
Schreiben Sie ein Programm, welches möglichst viele Datentypen verwendet. (Einlesen, Rechnen, Ausgeben).<br />
Aufgabe 7 'Kegelstumpf' B **<br />
Schreiben Sie ein einfaches Programm, welches das Volumen eines Kegelstumpfes berechnet. Es soll die Höhe,<br />
den kleinen und den grossen Durchmesser des Kegelstumpfes einlesen. Führen Sie die Berechnung mit Integer<br />
Variablen durch, nehmen Sie Pi als 3 an)<br />
V = Pi/12*h*(D 2 + D*d + d 2 )<br />
Aufgabe 8 '1-9 Expressions' B *<br />
Schreiben Sie ein Programm, das möglichst viele verschiedene Ausdrücke (Expressions) benutzt, um die Zahlen<br />
von 1 bis 9 auszugeben. D.h. Die Zahlen 1-9 sollen für die Ausgabe durch Ausdrücke berechnet werden.<br />
(Beispiel: 3-2 um 1 auszugeben)<br />
Aufgabe 9 '1-9 More expressions' B *<br />
B: Basic<br />
C: Kontrollstrukturen<br />
F: Funktionen<br />
A: Arrays<br />
T: Texte (Strings)<br />
S: Strukturen<br />
P: Pointer<br />
L: Library (Standardlibrary)<br />
D: Algorithmen/Datenstrukturen<br />
* Einfach ******Schwierig<br />
Schreiben Sie noch ein Programm, das möglichst viele Variationen der Operatoren für die Ausgabe der Zahlen<br />
von 0 bis 9 verwendet. (Will heissen: Machen sie es möglichst 'kompliziert').<br />
Berücksichtigen Sie dabei besonders die Operatoren, die Ihnen nicht so geläufig sind<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 1
Aufgabe 10 'Teilbar' C **<br />
Schreiben Sie ein Programm, das eine Zahl von der Tastatur einliest und sagt, ob sie durch 7 teilbar ist.<br />
Beispiel: Zahl ? 33<br />
33 ist nicht teilbar<br />
Aufgabe 11 'Zahlen Sortieren' C ***<br />
Schreiben Sie ein Programm das drei Zahlen von der Tastatur in die drei Variablen a, b und c einliest, und diese<br />
anschliessend durch Vertauschen so ordnet, dass in der Variablen a die grösste, in der Variablen b die mittlere<br />
und in der Variablen c die kleinste Zahl steht. Anschliessend soll das Programm zur Kontrolle den Inhalt der<br />
Variablen a, b und c ausgeben.<br />
Aufgabe 12 'Quadratzahlen' C **<br />
Schreiben Sie ein Programm, das die Quadratzahlen von 1 bis 10 ausgibt (mit Schlaufen).<br />
Beispiel: 1: 1<br />
2: 4<br />
3: 9<br />
usw<br />
Aufgabe 13 'Fakultäten I' Cf *<br />
Für welche Zahlen liefert das Programm 'public\Labor\Info\1_Semester\data\aufgaben\fakultaeten\' korrekte<br />
Resultate? Rechnen Sie 1! .. 10! Von Hand aus und vergleichen Sie mit den Resultaten des Programms.<br />
Aufgabe 14 'Fakultäten II' Cf *<br />
Bauen Sie im Programm Fakultaeten einen Test ein, der prüft ob die Eingabe im zulässigen Bereich liegt. Geben<br />
Sie eine Fehlermeldung aus und verhindern Sie die Berechnung, falls dies nicht der Fall ist. Ändern Sie die<br />
Funktion main() so, dass die beiden Zeilen printf("\n Zahl eingeben... und scanf(%hd", Zahl) nur je einmal<br />
vorkommen.<br />
Aufgabe 15 'Fibonacci' C ***<br />
Schreiben Sie ein Programm, das die ersten 15 Zahlen der Fibonaci-Reihe ausgibt. (Jede Zahl ist die Summe der<br />
beiden vorherigen Zahlen), die Reihe soll mit 0 1 beginnen.<br />
Bildungsvorschrift der Fibonacci-Reihe: Fn = Fn-1 + Fn-2, wobei F0 = 0, F1 = 1<br />
Beispiel: 0<br />
1<br />
1<br />
2<br />
3<br />
5<br />
8<br />
13<br />
Aufgabe 16 'Nächste Fibonacci' C ****<br />
Schreiben Sie ein Programm, welches zu einer gegebenen Zahl die nächstliegende Fibonacci-Zahl ausgibt<br />
Beispiel: Eingabe 7<br />
Ausgabe 8<br />
Eingabe 14<br />
Ausgabe 13<br />
Beginnen Sie zuerst mit einem Programm, welches die nächst grössere Fibonacci-Zahl ausgibt.<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 2
Aufgabe 17 'Fakultät' C **<br />
Schreiben Sie ein Programm, das die Fakultät für eine gegebene int Zahl berechnet. Bestimmen sie, bis zu<br />
welcher Eingabe das Programm korrekt arbeitet.<br />
Die Fakultät n! ist definiert als<br />
n! = n * (n-1) * (n-2) * .... *2 * 1,<br />
Wobei 0! per Definition 1 ist.<br />
Aufgabe 18 'Datum zu Wochentag' C ***<br />
Schreiben Sie ein Programm, das aus einem eingegebenen Datum den dazugehörigen Wochentag ausgibt.<br />
Der Wochentag kann mit folgender Formel bestimmt werden:<br />
Tag = ([2.6m-0.2]+d+y+[y/4]+[c/4]-2c)mod7<br />
Tag: 0=Sonntag, 1= Montag ... 6=Samstag<br />
y = Jahr innerhalb des Jahrhunderts (z.B. für = 1981, y = 81)<br />
c = Jahrhundert (z.B. für = 1981, c = 19)<br />
m = Monat (1=März ... 10=Dezember), 11 = Jan und 12 = Feb, wobei Jan und Feb zum vorherigen<br />
Jahr gehören. D.h. Jan 1900 wird zu Jan 1899.<br />
d = Tag des Monats (1 .. 31)<br />
[x] = Nachkommastellen abschneiden, kein Runden<br />
mod = Modulus (Rest von Division)<br />
Beispiel: Eingabe: 24.12.2001<br />
Ausgabe: Der 24.12.2001 ist ein Montag<br />
Welcher Wochentag war der 1.10.2003?<br />
Aufgabe 19 'Weihnachtsaufgabe' C ***<br />
Schreiben Sie ein Programm, welches ein Bäumchen aus Sternen auf den Bildschirm zeichnet. Die Höhe des<br />
Bäumchens soll durch den Anwender eingegeben werden können.<br />
Beispiel:<br />
Hoehe = 5 Hoehe = 7<br />
* *<br />
*** ***<br />
***** *****<br />
******* *******<br />
********* *********<br />
* ***********<br />
* *************<br />
*<br />
*<br />
Aufgabe 20 'Zahlen in Klartext' C *****<br />
Schreiben Sie ein Programm, welches eine eingegebene Zahl im Bereich von 0 bis 99999 im Klartext ausgibt.<br />
Also bei 1013 soll z.B. eintausendunddreizehn ausgegeben werden.<br />
Aufgabe 21 'Römisch' C ****<br />
Schreiben Sie ein Programm, das eine eingegebene Zahl im Bereich von 0 bis 3999 im römischen Format<br />
ausgibt.<br />
I = 1; V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 3
Aufgabe 22 'Römisch 2' CTA ****<br />
Schreiben Sie ein Programm, das eine eingegebene römische Zahl in eine Dezimalzahl umrechnet und ausgibt.<br />
I = 1; V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000<br />
Aufgabe 23 'Halbieren' C **<br />
Schreiben Sie ein Programm, welches herausfindet, wie oft eine eingegebene Zahl halbiert werden kann, bis sie 0<br />
wird. 40 kann zum Beispiel 5 mal halbiert werden (40-20-10-5-2-1-0).<br />
Aufgabe 24 'Bitzählen' C **<br />
Schreiben Sie ein Programm, das eine 32-Bit Zahl (long) einliest, und anschliessend zählt, wiviele Bits in dieser<br />
Zahl gesetzt sind und das Ergebnis ausgibt. Also bei einer Eingabe von 0x0000123F soll 8 ausgegeben werden.<br />
Aufgabe 25 'Kleinste' C *<br />
Erstellen Sie ein Programm, das in einer Schleife ganze Zahlen einliest Wenn eine negative Zahl eingelesen wird,<br />
beendet das Programm die Schleife. Am Schluss soll die kleinste der eingelesenen positiven Zahlen ausgegeben<br />
werden<br />
Aufgabe 26 'Einfacher Rechner' C **<br />
Schreibe ein Programm, das zwei Zahlen und ein Operationszeichen (+, -, *, /) von der Tastatur einliest und<br />
anschliessend das Ergebnis der Operation ausgibt (Summe, Differenz, Produkt, Quotient).<br />
Erweiterung: Verhindere ungültige Operationen wie Division durch Null.<br />
Aufgabe 27 'Zählen' C **<br />
Schreiben Sie ein Programm, das alle auf der Tastatur eingegebenen Blanks, Tabs und Newlines zählt. Beim<br />
Zeichen '$' sollen die Werte ausgegeben werden.<br />
Aufgabe 28 'Sternenquadrat' C *<br />
Schreibe ein Programm, das eine Sternenquadrat ausgibt. Die Seitenlänge des Quarates soll vom Benutzer<br />
angegeben werden können.<br />
Beispiel für Länge = 1: Beispiel für Länge = 2: Beispiel für Länge = 3:<br />
* **<br />
**<br />
Aufgabe 29 'Sternenpyramide'<br />
***<br />
***<br />
***<br />
C **<br />
Schreibe ein Programm, das eine Sternenpyramide ausgibt. Die Höhe der Pyramide soll vom Benutzer angegeben<br />
werden können.<br />
Beispiel für Hoehe = 2: Beispiel für Hoehe = 3: Beispiel für Hoehe = 5:<br />
*<br />
***<br />
*<br />
***<br />
*****<br />
*<br />
***<br />
*****<br />
*******<br />
*********<br />
Aufgabe 30 'Kegelstumpf Funktion' CF *<br />
Ändern Sie das Programm der Aufgabe 7 so, dass das Volumen des Kegelstumpfes in einer separaten Funktion<br />
berechnet wird. (Die Ein- und Ausgabe soll weiterhin im Hauptprogramm stattfinden):<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 4
Aufgabe 31 'Durchschnitt +' C **<br />
Schreiben Sie ein Programm, welches vom Benutzer eine beliebige Anzahl positiver Zahlen entgegennimmt, bis<br />
0 eingegeben wird. Das Programm soll anschliessend die kleinste Zahl, die grösste Zahl und den Durchschnitt<br />
aller eingegebenen Zahlen ausgeben.<br />
(Die Eingabe soll über die Tastatur erfolgen, die Ausgabe über den Bildschirm)<br />
Beispiel: Eingabe: 10 Ausgabe: Die kleinste Zahl ist 5<br />
20 Die grösste Zahl ist 25<br />
25 der Durchschnitt ist 16<br />
5<br />
20<br />
0<br />
Aufgabe 32 'Kreuz' C ***<br />
Schreiben Sie eine Funktion Kreuz, welche ein Kreuz aus Sternen mit der angegebenen Achslänge auf dem<br />
Bildschirm ausgibt.. Schreiben Sie ein Hauptprogramm main() das einige Kreuze ausgibt.<br />
Prototyp: void Kreuz( int Laenge ) ;<br />
Beispiel: Aufruf: Kreuz(3);<br />
Aufgabe 33 'Münz'<br />
Ausgabe: *<br />
*<br />
*<br />
*******<br />
*<br />
*<br />
*<br />
C ****<br />
Schreiben Sie ein Programm, das die minimale Anzahl Münzstücke und Noten berechnet, mit denen ein<br />
gegebener Geldbetrag in Schweizer Währung zusammengestellt werden kann (Nur für ganze Frankenbeträge).<br />
Prototyp: int Muenz(int Betrag);<br />
Beispiel: printf("%d", Muenz(27));<br />
gibt 3 aus (27 = 1*20 + 1*5 + 1*2)<br />
Aufgabe 34 'Text Ein-/Ausgabe'<br />
printf("%d", Muenz(233));<br />
gibt 5 aus (233 = 1*200 + 1*20 + 1*10 + 1*2 + 1*1)<br />
CA **<br />
Schreiben Sie ein Programm, das einen Text von bis zu 1000 Chars von der Tastatur einliest und danach wieder<br />
ausgibt. Als Ende des Textes gilt das End of File EOF oder wenn 1000 Chars eingelesen wurden. Am einfachsten<br />
verwenden Sie getchar für die Eingabe (EOF = ctrl-z auf sonst leerer Zeile)<br />
Aufgabe 35 'Zahleneingabe umdrehen'<br />
CA **<br />
Schreiben Sie ein Programm, das bis zu 100 Integerwerte von der Tastatur einliest und in einem Array<br />
abspeichert. Wenn eine negative Zahl eingegeben wird, soll die Eingabe abgebrochen und die bisher<br />
gespeicherten Werte in umgekehrter Reihenfolge wieder ausgegeben werden.<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 5
Aufgabe 36 'Mittelwert Array' CAFP **<br />
Schreiben Sie eine Funktion, die den Mittelwert aller (positiven) Elemente eines Arrays berechnet. Eine -1<br />
kennzeichnet das Ende des Arrays und darf nicht mitberücksichtigt werden.<br />
Prototyp: unsigned int Mittelwert( int *Daten );<br />
Das Hauptprogramm main soll einfach ein initialisiertes int Array enthalten, Mittelwert() darauf anwenden<br />
und das Ergebnis ausgeben. Beispiel:<br />
int main (int argc, char *argv[]) {<br />
int Array[] = {1, 5, 9, 3, 4, 7, -1};<br />
printf("Mittelwert ist %d \n", /* Mittelwert berechnen */ );<br />
return 0;<br />
}<br />
Aufgabe 37 'Grossbuchstaben zählen' CFAT *<br />
Schreiben Sie eine Funktion, die als Rückgabewert die Anzahl Grossbuchstaben in einem String zurückgibt.<br />
Prototyp: int anzahl_gross( char str[] );<br />
Zum Beispiel soll bei folgendem Aufruf der Wert 2 auf dem Bildschirm ausgegeben werden:<br />
int main (int argc, char *argv[]) {<br />
char aString[] = "Programmieren in C++";<br />
printf(" %d ", anzahl_gross(aString));<br />
return 0;<br />
}<br />
Aufgabe 38 'Palindrom'<br />
CFAT ***<br />
Schreiben Sie eine Funktion, die herausfindet, ob ein gegebener String ein Palindrom ist. Wenn ein Palindrom<br />
vorliegt, soll die Funktion True (1) zurückliefern, sonst False (o). Ein Palindrom ist ein Wort oder ein Satz, der<br />
von vorne nach hinten und von hinten nach vorne gelesen dasselbe ergibt. (Beispiele: 'otto', 'ein neger<br />
mit_gazelle_zagt_im regen nie'. Testen Sie die Funktion im Hauptprogramm main().<br />
Prototyp: int IsPalindrom(char String[]);<br />
Beispiel: printf("%d", IsPalindrom(“otto“));<br />
gibt 1 aus<br />
printf("%d", IsPalindrom(“fritz“));<br />
gibt 0 aus<br />
Aufgabe 39 'Zeichen löschen' CFAT **<br />
Schreiben Sie die Funktion DelChar, die ein Zeichen aus einem String löscht, welches sich an der Position<br />
‘pos’ befindet. Schreiben Sie ein kleines Testprogramm main() für diese Funktion.<br />
Returnwert: 1: falls das Zeichen erfolgreich gelöscht werden kann.<br />
0: falls das Zeichen nicht gelöscht werden kann.<br />
Prototyp: int DelChar( char str[], int pos ) ;<br />
Beispiel: char str[] = "abcdefg";<br />
DelChar(str, 3); // str ==> "abdefg"<br />
// Returnwert: 1<br />
Aufgabe 40 'Zeichen duplizieren' CFATP **<br />
Schreiben Sie die Funktion dup(), die das Zeichen an Position Pos in einen String str verdoppelt (Also eine<br />
Kopie des Zeichens einfügt). Der Rest des Strings soll nach hinten verschoben werden. Sie dürfen annehmen,<br />
dass der String immer Platz genug hat. Testen Sie die Funktion im Hauptprogramm main().<br />
Prototyp: void dup( char *str, int pos );<br />
Beispiel: char str[5] = "ABCD";<br />
dup( str, 2 ); // ==> str = "ABCCD"<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 6
Aufgabe 41 'Wort löschen' CFATP ***<br />
Schreiben Sie eine Funktion DeleteFirstWord( ), die das erste Wort in einem String löscht. Schreiben Sie<br />
ein kleines Testprogramm main() für diese Funktion. Wortgrenzen sind durch Leerzeichen (Spaces) definiert.<br />
Prototyp: void DeleteFirstWord( char *str );<br />
Beispiel:<br />
char string[ ] = "Hallo, liebe Leute";<br />
DeleteFirstWord( &string[0] ); // string ist jetzt<br />
// "liebe Leute"<br />
Aufgabe 42 'Stringfunktionen' CFAT ***<br />
Unter 'public\Labor\Info\1_Semester\data\aufgaben\stringfunktionen' finden Sie das Ausgangsprojekt für diese<br />
Aufgabe. Vervollständigen Sie die Stringfunktionen im Modul strfun.c. Die Funktionen StringCompare(),<br />
StringCopy() und StringAppend() müssen noch implementiert werden. Die Funktionen sind wie folgt deklariert:<br />
int StringLength(String Str);<br />
Diese Funktion bestimmt die Länge eines Strings (inkl. abschliessender Null). Diese ist als<br />
Musterbeispiel bereits implementiert<br />
int StringCompare(String Dest, String Src);<br />
Diese Funktion vergleicht den Inhalt zweier Strings. Falls die beiden Strings identisch sind wird<br />
True (1), sonst False (0) zurückgeliefert.<br />
void StringCopy(String Dest, String Src);<br />
Diese Funktion kopiert den Inhalt des Strings 'Src' in den String 'Dest'. Der Anwender dieser<br />
Funktion ist selbst dafür verantwortlich, dass 'Dest' genug Platz für 'Src' besitzt.<br />
void StringAppend(String Dest, String Src);<br />
Diese Funktion hängt den Inhalt des Strings 'Src' an den String 'Dest' an. Der Anwender dieser<br />
Funktion ist selbst dafür verantwortlich, dass 'Dest' genug Platz zum anhängen von 'Src' besitzt.<br />
Mindestens eine Lösung sollte mit Pointer realisiert werden.<br />
Um die Funktion des Modules zu testen, binden Sie es mit dem Modul strtest.c zusammen. Zusammen mit dem<br />
Modul strtest,c entsteht ein Programm, welches Ihre Funktionen austestet und Diagnosemeldungen ausgibt.<br />
Aufgabe 43 'Text in Worte'<br />
CFATP ***<br />
Schreiben Sie ein Programm, das einen String in einzelne Worte unterteilt, und diese ausgibt. (Als Wortende<br />
können Leerzeichen und nichtdruckbare Zeichen angesehen werden).<br />
Beispiel: Eingabe Kaufen Sie jede Woche vier gute und bequeme Pelze bei XY[Return]<br />
Ausgabe: Kaufen<br />
Sie<br />
jede<br />
Woche<br />
vier<br />
:<br />
:<br />
Erweiterung: Geben Sie die Worte alphabetisch sortiert aus.<br />
Aufgabe 44 'Häufigkeit' CFATPD ****<br />
Schreiben Sie ein Programm, das die Häufigkeit der einzelnen Worte einer Eingabezeile zählt.<br />
Beispiel: Eingabe Der, der dort geht, geht nun dorthin[Return]<br />
Ausgabe: der 2<br />
dort 1<br />
geht 2<br />
nun 1<br />
dorthin 1<br />
Erweiterung, geben Sie die Wortliste alphabetisch sortiert aus<br />
Aufgabe 45 'Ohne Grösste' CA **<br />
Schreibe ein Programm, bei dem man angeben kann, wieviele Zahlen eingegeben werden sollen, das<br />
anschliessend soviel Zahlen wie angegeben einliest, und dann alle Zahlen ausser der grössten ausgibt.<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 7
Aufgabe 46 'Gerade-Ungerade' CA **<br />
Schreibe ein Programm, bei dem man angeben kann, wieviele Zahlen eingegeben werden sollen, das<br />
anschliessend soviel Zahlen wie angegeben einliest, und dann zuerst alle geraden Zahlen und dann alle ungeraden<br />
Zahlen ausgibt.<br />
Aufgabe 47 'Sortiert ausgeben' CA ***<br />
Schreibe ein Programm, bei dem man angeben kann, wieviele Zahlen eingegeben werden sollen, das<br />
anschliessend soviel Zahlen wie angegeben einliest, und dann die Zahlen in aufsteigend sortierter Reihenfolge<br />
ausgibt.<br />
Aufgabe 48 'Längste Sequenz' CAF ****<br />
Schreiben Sie eine Funktion FindMaxSequence() die in einem Array von Werten die längste Sequenz<br />
aufeinanderfolgender gleicher Werte findet. Die Funktion soll die Länge der längsten Sequenz zurückgeben,<br />
sowie bei *Pos die Position (Index) des ersten Wertes der Sequenz abspeichern. In Length wird die Länge des<br />
Arrays übergeben.<br />
Prototyp:<br />
int FindMaxSequence(int *Pos, int Werte[], int Length);<br />
Beispiel zur Anwendung der Funktion:<br />
int Messreihe[15] = {0, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0};<br />
int Length;<br />
int Start;<br />
SequenzeLength = FindMaxSequence(&SequenzeStart, Messreihe, 15);<br />
printf("Sequenz der Laenge %d ab %d gefunden", Length, Start);<br />
/* gibt Sequenz der Laenge 4 ab 5 gefunden aus*/<br />
Aufgabe 49 'Komplex addieren'<br />
CFS **<br />
Schreiben Sie eine Funktion AddComplex(..), die zwei komplexe Zahlen addiert und das Resultat an den<br />
Aufrufer der Funktion zurückgibt. Schreiben Sie ein kleines Testprogramm main() für diese Funktion.<br />
Prototyp:<br />
dCmplx AddComplex( dCmplx c1, Cmplx c2 );<br />
Der Typ dCmplx ist eine Struktur und ist wie folgt definiert:<br />
typedef struct {<br />
int re;<br />
int im;<br />
}dCmplx;<br />
Aufgabe 50 'Uhrzeitdifferenz' CFS **<br />
Schreiben Sie ein Program, das zwei Uhrzeiten (hh, mm, ss) einliest, die Differenz (hh, mm, ss) zwischen den<br />
beiden Zeiten bestimmt und ausgibt. Die Berechnung der Differenz soll in einer Funktion erfolgen. Die Uhrzeiten<br />
sollen in einer Struktur abgelegt sein.<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 8
Aufgabe 51 'Studentenverwaltung' CFATDSLP ****<br />
Diese Aufgabe wird sie während mehreren Lektionen beschäftigen. Ihr Programm wird im Laufe der Zeit ständig<br />
erweitert und umfangreicher, versuchen Sie deshalb von Anfang sauber zu Programmieren. Kommentare und<br />
Struktogramme gehören grundsätzlich ebenfalls zur Lösung der Aufgaben.<br />
Aufgabe 1<br />
Definieren sie eine Struktur, in welcher folgende Studentendaten abgelegt werden können:<br />
Name (String bis 30 Zeichen), Vorname (String bis 30 Zeichen), Notendurchschnitt (float) und<br />
Geburtsdatum (Tag, Monat, Jahr). Auch das Datum soll in einer (unter-) Strukturvariablen abgelegt werden.<br />
Schreiben Sie ein Programm, das die zwei Funktionen ReadStudentData() und WriteStudentData()<br />
enthält. Die Funktion ReadStudentData() soll die Daten eines Studenten von der Tastatur einlesen, und an<br />
den Aufrufer (in einer Strukturvariablen) zurückliefern. Zudem soll sie dem Aufrufer mitteilen, ob die<br />
Eingabe korrekt erfolgt ist, oder ob die Eingabe vom Benutzer abgebrochen wurde. (Z. B. indem der<br />
Notendurchschnitt auf -1 gesetzt wird).<br />
Die Funktion WriteStudentData() erhält als Argument eine Studentenstrukturvariable und soll Name,<br />
Vorname, Notendurchschnitt und Geburtsdatum des Studenten auf dem Bildschirm ausgeben.<br />
Schreiben Sie ein Hauptprogramm main(), das die Informationen zu einem Studenten einliest und<br />
anschliessend wieder ausgibt. Dazu sollen die beiden oben beschriebenen Funktionen verwendet werden.<br />
Wenn die Eingabe abgebrochen wurde, soll auf die Ausgabe verzichtet werden, und eine entsprechende<br />
Fehlermeldung ausgegeben werden.<br />
Aufgabe 2<br />
Erweitern Sie das Programm aus Aufgabe 1 so, dass bis zu 10 Studenten verwaltet werden können. Die<br />
Studentendaten sollen in einem Array abgelegt werden. Es sollen die Daten von bis zu 10 Studenten<br />
eingegeben werden können. Bei der Ausgabe sollen entweder alle Studenten, oder nur die Studenten<br />
unterhalb eines bestimmten, vom Benutzer einzugebenden Notendurchschnitts ausgegeben werden.<br />
Erweitern Sie das Programm um ein kleines Menu, in welchem der Benutzer auswählen kann ob er<br />
Studenten eingeben, alle Studenten ansehen, nur Studenten unterhalb eines bestimmten Schnitts ansehen,<br />
alle Einträge löschen oder das Programm verlassen will. (Denken Sie daran, das Menu wird im weiteren<br />
Verlauf dieser Aufgabe ständig erweitert)<br />
Aufgabe 3<br />
Erweitern Sie das Programm um die Möglichkeit, nach einem bestimmten Eintrag zu suchen, und diesen<br />
Anzuzeigen, wenn er gefunden wird.<br />
Aufgabe 4<br />
Erweitern Sie das Programm um die Möglichkeit, die Einträge nach Namen oder nach Notendurchschnitt zu<br />
sortieren und sortiert auszugeben. Erweitern Sie das Programm um die Möglichkeit, bestimmte Einträge zu<br />
löschen oder zu ändern. Verwenden Sie Zeiger um Einträge im Array zu suchen (Z. B. Beim Sortieren).<br />
Aufgabe 5<br />
Erweitern Sie das Programm um Funktionen zum Laden und Abspeichern von Studentendaten (Load und<br />
Save). Es sollen jeweils alle Daten in eine Datei abgespeichert werden und zu einem späteren Zeitpunkt<br />
wieder eingelesen werden können. Teilen Sie das Programm sinnvoll in Module auf. (Ein-Ausgabe,<br />
Laden/Speichern...)<br />
Aufgabe 6<br />
Erweitern Sie das Programm um dynamische Funktionen. Die Studenten sollen nicht mehr in einem Array,<br />
sondern in einer Liste verwaltet werden. Die Listenelemente sollen nach bedarf alloziert und wieder<br />
freigegeben werden. (Ein Modul mit Listenfunktionen wird zur Verfügung gestellt). Einträge sollen beliebig<br />
gelöscht oder hinzugefügt werden können.<br />
Aufgabe 7<br />
Erweitern Sie das Programm mit eigenen Ideen.<br />
Aufgabe 52 'Zeilen drehen'<br />
CFATD ****<br />
Schreiben Sie ein Programm, das eine beliebige Anzahl Zeilen einliest, und diese anschliessend in umgekehrter<br />
Reihenfolge ausgibt. (Das Ende der Eingaben wird durch eine Leere Zeile angezeigt).<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 9
Beispiel: Eingabe Hallo Welt [Return]<br />
Guten Abend, liebe Leute [Return]<br />
Auf Wiedersehen! [Return]<br />
[Return]<br />
Ausgabe: Auf Wiedersehen<br />
Guten Abend, liebe Leute<br />
Hallo Welt<br />
Variante 1: Rekursion benutzen Dynamisch<br />
Variante 3: Array Benutzen Maximale Anzahl Zeilen ist begrenzt<br />
Variante 2: Liste Benutzen Dynamisch<br />
Aufgabe 53a 'Pytagoras' CFL **<br />
Schreiben Sie ein Programm, welches alle pytagoräischen Zahlentrippel (a, b, c) findet, für die gilt: a 2 + b 2 = c 2<br />
und a < 100, b < 100 und c < 100 sowie a, b, c ist ganze Zahl.<br />
Hinweis: Schreiben Sie zuerst eine Funktion, die erkennt ob drei Zahlen ein Pytagoräisches Trippel sind, also<br />
TRUE (1) zurückliefert wenn a 2 + b 2 = c 2 ist. Benutzen Sie anschliessend diese Funktion um<br />
pytagoräische Zahlentrippel zu finden.<br />
Das Programm soll die gefundenen Zahlen schön formatiert ausgeben. Doppelte Einträge müssen nicht<br />
unterdrückt werden. Erstellen Sie einen Programmdesign (Struktogramm), bevor Sie mit dem Programmieren<br />
beginnen.<br />
Beispiel einer möglichen Ausgabe:<br />
Gefundene Trippel:<br />
1. 3, 4, 5 ( 9 + 16 = 25)<br />
2. 4, 3, 5 ( 16 + 9 = 25)<br />
3. 5, 12, 13 ( 25 + 144 = 169)<br />
Aufgabe 53b 'Pytagoras II' CFAL ***<br />
Ändern Sie das Programm aus Aufgabe 53a so, dass keine Vielfachen bereits gefundener Lösungen ausgegeben<br />
werden. Es sollen also alle Trippel der Form k*a 2 + k*b 2 = k*c 2 für k > 1 und k ist ganze Zahl weggefiltert<br />
werden.<br />
Hinweis: Verwenden Sie Arrays und Strukturen.<br />
Beispiele:<br />
3, 4, 5 ( 9 + 16 = 25) OK<br />
6, 8, 10 ( 36 + 64 = 100) Ausfiltern<br />
9, 12, 15 ( 81 + 144 = 225) Ausfiltern<br />
5, 12, 13 ( 25 + 144 = 169) OK<br />
10, 24, 26 ( 100 + 576 = 676) Ausfiltern<br />
Aufgabe 53c 'Pytagoras III'<br />
CFAL ***<br />
Schreiben Sie das Programm aus Aufgabe 53a so um, dass nur Trippel, bei welchen die Zusatzbedingung b = a+1<br />
oder c = b+1 zutrifft ausgegeben werden.<br />
Beispiele:<br />
3, 4, 5 ( 9 + 16 = 25) OK<br />
5, 12, 13 ( 25 + 144 = 169) OK<br />
6, 8, 10 ( 36 + 64 = 100) Ausfiltern<br />
8, 15, 17 ( 64 + 225 = 289) Ausfiltern<br />
10, 24, 26 ( 100 + 576 = 676) Ausfiltern<br />
20, 21, 29 ( 400 + 441 = 841) OK<br />
Aufgabe 53d 'Pytagoras IV'<br />
Schreiben Sie ein Programm welches herausfindet, welche Zahl(en) am häufigsten in den Trippeln gemäss<br />
Aufgabe 53a vorkommen und diese (mit der Häufigkeit) ausgibt.<br />
Aufgabe 53e 'Pytagoras V' CFAL ***<br />
Schreiben Sie ein Programm welches die pytagoräischen Zahlentrippel gemäss Aufgabe 53a und 53b in eine<br />
Textdatei schreibt, der Dateiname soll durch den Benutzer eingegeben werden können. (Datei-)Fehler sollen<br />
abgefangen und dem Benutzer mitgeteilt werden. Die Datei soll dabei alle Trippel gemäss Aufgabe 53a<br />
enthalten, und daran anschliessend alle Trippel gemäss Aufgabe 53 b<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 10
Aufgabe 54 'Dateien' CFATSL **<br />
Schreiben Sie die Programme aus Aufgabe 43, 44 und 52 so um, dass sie die Daten nicht von der Tastatur,<br />
sondern aus einer Datei lesen, und die Ausgabe ebenfalls in eine Datei erfolgt.<br />
Aufgabe 55 'Worthäufigkeit' CFATL ****<br />
Erstellen Sie ein Programm, welches alle Worte in einem Textfile zählt und am Schluss eine Gesamtstatistik über<br />
die Häufigkeit der einzelnen Worte ausgibt. Das Programm soll sauber dokumentiert und implementiert werden.<br />
(Analyse, Design und Implementation).<br />
Aufgabe 56 'Münzwurf' CFDL ***<br />
Schreiben Sie ein Programm, das eine Serie von Münzwürfen simuliert. Bei jedem Wurf wird die Anzahl der<br />
Kopf zeigenden Münzen gezählt. Die Anzahl Würfe und die Anzahl Münzen soll vom Benutzer eingegeben<br />
werden. Als Ausgabe soll die statistische Verteilung der Kopfhäufigkeiten dargestellt werden. Benutzen sie die<br />
Zufallsfunktion rand() zur Simulation eines Münzwurfes.<br />
Beispiel:<br />
Aufgabe 57 'Sortieren'<br />
Anzahl Münzen = 10 Anzahl Würfe = 1000<br />
Resultate der Muenzwuerfe<br />
0 mal Kopf: 0<br />
1 mal Kopf: 7<br />
2 mal Kopf: 29<br />
3 mal Kopf: 135<br />
4 mal Kopf: 202<br />
5 mal Kopf: 239<br />
6 mal Kopf: 218<br />
7 mal Kopf: 114<br />
8 mal Kopf: 49<br />
9 mal Kopf: 6<br />
10 mal Kopf: 1<br />
CFAD ***<br />
Unter 'public\Labor\Info\1_Semester\data\aufgaben\Sortieren' finden Sie das Ausgangsprojekt für diese Aufgabe.<br />
Es besteht aus drei Sortierfunktionen im Modul Sortfun.c, die noch nicht implementiert sind, und Testcode im<br />
Hauptprogramm. Den Testcode sollen Sie nicht verändern, sie sollen nur eine der Sortierfunktionen im Modul<br />
Sortfun.c implementieren. Der Testcode wird Ihnen anschliessend miteilen, ob ihre Routine korrekt arbeitet.<br />
Aufgabe 58 'Labyrinth'<br />
CFAD ***<br />
Im Verzeichnis 'public\Labor\Info\1_Semester\data\aufgaben\Labyrinth' finden Sie ein Projekt, welches ein<br />
Labyrinth erstellt, und anschliessend den Ausgang sucht. Im Moment funktioniert das Suchen des Ausgangs noch<br />
nicht, Ihre Aufgabe ist es, eine Funktion FindExit() zu schreiben, welche den Ausgang aus dem Labyrinth findet.<br />
(Am einfachsten geht es mit einer Rekursion. Im Verzeichnis 'WorkingDemo' finden Sie ein funktionierendes<br />
Beispiel (Aber nur die .exe Datei). Sie müssen nur die Funktion FindExit() in der Datei Labmain.c anpassen,<br />
alles andere sollen Sie so belassen wie es ist. Die Funktion FindExit() erhält in Map ein 2-Dimensionales Array,<br />
in dem das Labyrinth abgespeichert ist, und in X und Y die Grösse des Arrays.<br />
Die Labyrintwände sind als 1 abgespeichert, und freie Wege sind als 0 abgespeichert. Der Ausgang ist mit -1<br />
markiert.<br />
Sie haben die Funktion PrintMap() zur Verfügung, welche das Labyrinth auf den Bildschirm zeichnet (0 wird leer<br />
gezeichnet, 1 als Wand, -1 als Ziel, 2 als roter Stern (Aktueller Weg), 3 als gelber Punkt (z.B. für bereits besucht)<br />
und für alles andere wird ein Fragezeichen gezeichnet. Die Funktion GoHome() setzt den Cursor auf Anfang des<br />
Bildschirms, dies Funktion sollte vor dem Zeichnen des Labyrinthes aufgerufen werden.<br />
Damit sich der Ablauf besser verfolgen lässt, können sie nach jeder Ausgabe mit Delayms() noch eine<br />
Verzögerung einbauen.<br />
Hinweis: Wenn Sie deutlich mehr als 20 Codezeilen (Schön strukturiert, aber Kommentar nicht mitgezählt)<br />
benötigen, könnte es eine kürzere Lösung geben. (Dies ist aber keine Vorgabe).<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 11
Aufgabe 59 'Hanoi' CFD ***<br />
Implementieren Sie ein Programm, welches das Problem des Turmes von Hanoi für beliebige Turmhöhen löst.<br />
Das Ausgangsprojekt finden Sie unter 'public\Labor\Info\1_Semester\data\aufgaben\Hanoi'. Sie müssen nur die<br />
Funktion MoveTower() in der Datei hanoi.c implementieren.<br />
Aufgabe 60 'Parser' CFATLE *****<br />
Erstellen Sie ein Formelauswerteprogramm. Der Benutzer soll eine beliebige mathematische Formel oder<br />
Funktion eingeben können, welche anschliessend vom Programm berechnet wird. Das Programm soll alle<br />
gängigen mathematischen Funktionen verstehen wie: Die vier Grundrechenarten, Potenzieren und Radizieren,<br />
Exponentialfunktionen, trigonometrische Funktionen und Spezialfunktionen wie Betrag und Signum, und<br />
selbstverständlich auch Klammern berücksichtigen.<br />
In einer Erweiterung könnte das Programm zu einem Funktionsplottprogramm ausgebaut werden. Die Formel<br />
müsste dann als (beliebige) Funktion von x eingegeben werden.<br />
Aufgabe 61 'Funktionsplotter' CFATLE *******<br />
Erstellen Sie ein Funktionsplottprogramm. Der Benutzer soll eine beliebige mathematische Funktion eingeben<br />
können, deren Funktionsverlauf anschliessend graphisch dargestellt wird. Der Benutzer soll den darzustellenden<br />
Wertebereich definieren können, als Option kann eine automatische Bereichsauswahl hinzugefügt werden. Die<br />
Skalierung der Y-Achse soll automatisch oder durch den Benutzer erfolgen. Das Programm kann später um die<br />
Darstellung von Ableitungen und Berechnung der Ableitung von Funktionen erweitert werden.<br />
Das Programm soll alle gängigen mathematischen Funktionen verstehen wie: Die vier Grundrechenarten,<br />
Potenzieren und Radizieren, Exponentialfunktionen, trigonometrische Funktionen und Spezialfunktionen wie<br />
Betrag und Signum.<br />
Das Programm soll sauber dokumentiert und implementiert werden. (Analyse, Design und Implementation).<br />
Hinweis: Implementieren Sie das Programm Schritt für Schritt.<br />
Aufgabe 62 'Vier gewinnt' CFATLE *******<br />
Entwickeln Sie ein Computerprogramm, mit dem Sie Vier Gewinnt spielen können. Der Benützer kann dabei<br />
gegen den Computer spielen. Der Spieler kann wählen, wer beginnt. Auch der Schwierigkeitsgrad soll eingestellt<br />
werden können. Auf Wunsch soll der Spielverlauf in einem File dokumentiert werden. Vier Gewinnt wird in<br />
einem 7*6 (Breite mal Höhe) grossen Feld gespielt, die Spieler ziehen abwechslungsweise, wer zuerst vier Steine<br />
in einer Reihe hat gewinnt.<br />
Das Programm soll sauber dokumentiert und implementiert werden. (Analyse, Design und Implementation).<br />
Hinweis: Implementieren Sie das Programm Schritt für Schritt. Lassen Sie zum Testen den Computer gegen sich<br />
selbst spielen<br />
Aufgabe 63 'Sudoku' CFAD ****<br />
Entwickeln Sie ein Computerprogramm, welches Lösungen für SUDOKU Probleme findet. SUDOKU sind 9*9<br />
grosse Quadrate, welche mit den Ziffern 1-9 gefüllt werden müssen. Das 9*9 Quadrat ist zudem noch in 9 3*3<br />
Quadrate unterteilt. Beim Einfüllen der Ziffern sind folgende Regeln einzuhalten:<br />
-In jeder Zeile und jeder Spalte dürfen die Ziffern 1-9 nur je einmal vorkommen.<br />
-In jedem der 9 Teilquadrate dürfen die Ziffern 1-9 nur je einmal vorkommen.<br />
Bei einem SUDOKU-Problem sind bereits einige Zahlen vorgegeben, die restlichen müssen selbst platziert<br />
werden.<br />
Aufgabe 64 'Damenproblem' CFAD ***<br />
Schreiben sie ein Programm, welches 8 Damen auf einem Schachbrett (8*8) so plaziert, dass sie sich nach den<br />
Schachregeln nicht gegenseitig bedrohen. (Das heisst, auf jeder Spalte, jeder Zeile und jeder Diagonalen darf<br />
höchstens eine Dame stehen).<br />
<strong>Uebungsaufgaben</strong> Informatik (23.09.2010, I. Oesch) 12
Aufgabe 65 'Funktionsapproximation' Cl ***<br />
Schreiben und testen Sie ein Programm, welche den 2er-Logarithmus approximiert.<br />
Mit dem Polynom P(x) = 0.1540*x 3 +-0.5679*x 2 +1.4136*x + 0.0013 kann log2(z) approximiert werden, wenn für<br />
x der Wert (z-1) eingesetzt wird. Dabei muss z im Bereich von 1 bis 2 sein.<br />
Das heisst, um log2(a) zu berechnen, muss man a sooft mit 2 multiplizieren oder dividieren, bis es im Bereich<br />
von 1…2 liegt. Anschliessend P(a-1) auswerten, und beim Resultat die Anzahl der benötigten Divisionen resp<br />
Multiplikationen dazuzählen, resp. davon subtrahieren. [ Wegen log2(2 n *a) = log2(a) + n ]<br />
Das ganze etwas mathematisch formuliert:<br />
Zum Approximieren von log2(a):<br />
Finde einen Wert s so, dass 1