Ubungspaket 11 ¨ Schleifen
Ubungsziele: ¨
1. Umgang mit den Schleifen in C 2. Wahl des richtigen Schleifentyps
3. Umwandlung der Schleifen ineinander Skript:
Kapitel: 26 bis 28 Semester:
Wintersemester 2021/22 Betreuer:
Thomas, Tim und Ralf Synopsis:
Gegenstand dieses ¨ Ubungspakets ist das Ein¨ uben der Schleifenkon-
strukte, die in der Vorlesung erl¨ autert wurden. Dabei verfolgen die
Aufgaben zwei Ziele: erstens, das Automatisieren und routinierte An-
wenden der Schleifen-Befehle, und zweitens, das Erarbeiten grundle-
gender Entwurfs- bzw. Programmiermuster.
Teil I: Stoffwiederholung
Aufgabe 1: Syntax der Schleifenbefehle
Wie lauten die drei unterschiedlichen Schleifenkonstrukte/-befehle, wie lautet deren Syntax und wie sehen ihre zugeh¨ origen Struktogramme aus?
Befehl:
Struktogramm:
Syntaxdiagramm:
Befehl:
Struktogramm:
Syntaxdiagramm:
Befehl:
Struktogramm:
Syntaxdiagramm:
Aufgabe 2: Detailfragen zu Schleifen
1. Wann m¨ ussen die Anweisungen des Schleifenblocks, also diejenigen Anweisungen, die wiederholt werden sollen, in geschweifte Klammern {} gesetzt werden? Wann k¨ onnen diese Klammern entfallen?
2. Wie viele Anweisungen m¨ ussen mindestens im Anweisungsblock stehen?
Mindestens:
Hinweis:: Auch die Leeranweisung ist eine Anweisung. Wie wird diese Leeranweisung in C geschrieben? Leeranweisung:
3. Wo steht in den Schleifenbefehlen jeweils die Bedingung? Unterstreiche jeweils in der ersten Teilaufgabe.
4. Bei welchen Werten der Schleifenbedingung wird die Schleife beendet?
Ende wenn:
5. Bei welchen Werten der Schleifenbedingung wird die Schleife nicht abgebrochen?
Weiter wenn:
6. Erl¨ autere kurz, wann welche Teile der for-Schleife ausgef¨ uhrt werden?
1. Teil:
2. Teil:
3. Teil:
7. Wie viele Wertzuweisungen d¨ urfen im dritten Teil der for-Schleife stehen?
8. Wandle die Schleife for( exp1 ; exp2; exp3 ) Anweisung; in eine entsprechende while bzw. do-while-Schleife um:
while-Schleife: do-while-Schleife:
Teil II: Quiz
Aufgabe 1: Formatierte Ausgabe
Gegeben sei folgendes Programm:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j , end ;
6 s c a n f ( " % d " , & end ) ;
7 for ( i = 0; i < end ; i = i + 1 )
8 {
9 for ( j = 0; j < end * 2; j = j + 1 )
10 p r i n t f ( " * " ) ; 11 p r i n t f ( " \ n " ) ;
12 }
13 r e t u r n 0;
14 }
In dieser Quizaufgabe sollt ihr herausfinden, was obiges Programmst¨ uck eigentlich macht;
ist also die ¨ ubliche Aufgabe eurer Betreuer ;-) F¨ uhre f¨ ur obiges Programm f¨ ur die Eingabe 1 eine Handsimulation durch:
Zeile Variablen Aktion Resultat/Effekt
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Im Folgenden werden wir schrittweise, von innen nach außen, versuchen, uns die Funkti- onsweise des Programms zu erschließen. Beantworte dazu der Reihe nach folgende Fragen.
Beschreibe zun¨ achst, was die innere Schleifen macht, die sich in den Zeilen 9-11 befindet.
Beschreibe kurz, was die ¨ außere Schleife macht, die sich von Zeile 7-12 erstreckt.
Fasse die beiden obigen Erkl¨ arungen in einem kurzen, pr¨ agnanten Satz zusammen.
Warum wurden die for()-Schleifen gew¨ ahlt?
Aufgabe 2: Eingabeverarbeitung
Gegeben sei folgendes Programm:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int in , cnt = 0;
6 s c a n f ( " % d " , & in ) ;
7 w h i l e ( in != 10 && in > 0 )
8 {
9 cnt = cnt + 1;
10 s c a n f ( " % d " , & in ) ;
11 }
12 p r i n t f ( " cnt = % d \ n " , cnt ) ;
13 r e t u r n 0;
14 }
Eingabe: 20 1 13 9 -1 2 10
Zeile Variablen Aktion Resultat/Effekt
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Beschreibe zun¨ achst, was die Schleife macht, die sich von Zeile 7 bis Zeile 11 erstreckt.
Beschreibe nun, was das ganze Programm macht.
Fasse die beiden obigen Erkl¨ arungen in einem kurzen, pr¨ agnanten Satz zusammen.
Warum wurde die while()-Schleife gew¨ ahlt?
Teil III: Fehlersuche
Aufgabe 1: Erstellen einer Ausgabezeile
Das folgende Programm soll eine Zeile ausgeben, in der genau zehn Sternchen zu sehen sind. Finde die Fehler und korrigiere direkt im Programm:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i ;
6 for ( i = 2 , i <= 10; i ++ ) ;
7 p r i n t f ( " * " ) ; 8 p r i n t f ( " \ n " ) ;
9 }
Das folgende Programm soll solange Zahlen einlesen, wie diese ungleich 0 sind. Dabei soll gez¨ ahlt und ausgegeben werden, wie viele negative Zahlen im Eingabestrom vorkamen:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int n , cnt ;
6 s c a n f ( " % d " ; n ) ;
7 w h i l e ( n = 0 )
8 {
9 if ( n < > 0 )
10 cnt + 1;
11 s c a n f ( % d , & n ) ;
12 }
13 p r i n t f ( % d n e g a t i v e Z a h l e n g e f u n d e n \ n " , cnt ) ;
14 }
Teil IV: Anwendungen
Aufgabe 1: Eine erste, einfachste Schleife
1. Aufgabenstellung
Schreibe ein Programm, das 46 mal den Satz Nur Uebung macht den Meister aus- gibt. ¨ Uberlege und begr¨ unde (bei der Implementierung), welche der obigen drei Schlei- fenkonstrukte problemad¨ aquat ist.
2. Pflichtenheft: Aufgabe, Eingabe, Ausgabe, Sonderf¨ alle
3. Testdaten
Entf¨ allt, da keine Daten eingelesen werden m¨ ussen.
4. Implementierung
5. Kodierung
Aufgabe 2: Eine zweite, einfachste Schleife
1. Aufgabenstellung
Schreibe ein Programm, das die Zahlen von 1 bis 100 in einer Zeile ausgibt, wo- bei zwischen den Zahlen immer genau ein Leerzeichen stehen soll. ¨ Uberlege und begr¨ unde (bei der Implementierung), welche der obigen drei Schleifenkonstrukte pro- blemad¨ aquat ist.
2. Pflichtenheft: Aufgabe, Eingabe, Ausgabe, Sonderf¨ alle
3. Testdaten
Entf¨ allt, da keine Daten eingelesen werden m¨ ussen.
4. Implementierung
5. Kodierung
Aufgabe 3:
” Rechnen“ mit Schleifen
Die folgenden Aufgaben ¨ ahneln sehr den beiden ersten kleinen Aufgaben. Daher kannst du i.d.R. gleich mit der Implementierung oder bei gen¨ ugend Sicherheit gleich mit der Kodierung anfangen. ¨ Uberlege auch, inwiefern du die einzelnen
” Grenzen“ fest kodierst oder mittels einer geeigneten Eingabeanweisung interaktiv vom Benutzer abforderst. F¨ uhre dies an mindestens zwei Aufgaben exemplarisch durch. Auf dieser und der n¨ achsten Seite ist hierf¨ ur gen¨ ugend Platz.
1. Schreibe ein Programm, das mittels einer Schleife die Summe der Zahlen von 1 bis 100 ermittelt; aus ¨ Ubungsgr¨ unden soll nicht die Gaußsche Formel verwendet werden.
2. Gib alle nat¨ urlichen Zahlen zwischen 1 und 100 aus, die durch 4 teilbar sind.
3. Gib alle nat¨ urlichen Zahlen zwischen 1 und 100 aus, die durch 3 und 16 teilbar sind.
4. Schreibe ein Programm, dass alle Schaltjahre zwischen 1900 und 2100 (jeweils ein- schließlich) ausgibt. Die Ausgabe sollte je Zeile eine Jahreszahl enthalten. Zur Erinne- rung: Schaltjahre lassen sich durch vier dividieren. Ein Jahr ist aber kein Schaltjahr, wenn es sich durch 100 teilen l¨ asst. Ausgenommen davon sind alle Jahre, die sich aber durch 400 teilen lassen.
5. Gib alle nat¨ urlichen Zahlen zwischen 1 und 100 aus, die durch 6 oder 8 teilbar sind.
Erweitere das Programm so, dass es nach jeweils 6 gedruckten Zahlen auf den Anfang der n¨ achsten Zeile springt.
Implementierung der Aufgabe . . . :
Kodierung der Aufgabe . . . :
Implementierung der Aufgabe . . . :
Kodierung der Aufgabe . . . :
Aufgabe 4:
” Formatierte“ Ausgabe
In vielen Anwendungen ist es unumg¨ anglich, dass die erzielten Ergebnisse geeignet auf- bereitet werden. Ein Teil der zur Verf¨ ugung stehenden M¨ oglichkeiten haben wir bereits in ¨ Ubungspaket 8 kennengelernt. Manchmal reichen diese M¨ oglichkeiten aber nicht aus, sodass man einige Details selbst programmieren muss. In diesem ¨ Ubungspaket besch¨ afti- gen wir uns mit einigen ausgew¨ ahlten Standardelementen. Bearbeite mindestens zwei der folgenden Aufgaben. Die eigentlichen Algorithmen sind wieder so einfach, dass ihr direkt mit der Implementierung bzw. Kodierung anfangen k¨ onnt.
1. Schreibe ein Programm, das die Zahlen von 0 bis 99 in Form einer 10×10 Matrix ausgibt. Die Ausgabe sollte also wie folgt aussehen:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Hinweis: Die Formatierungsanweisung %2d sorgt daf¨ ur, dass eine nat¨ urliche Zahl mit
zwei Stellen ausgegeben wird. Sollte die Zahl einstellig sein, wird ihr ein Leerzeichen
vorangestellt.
2. Schreibe ein Program, das mittels einer Schleife acht Zeilen druckt, in der jeweils drei Sternchen stehen. Dabei sollen diese drei Sternchen aber in jeder Zeile um ein Leerzeichen mehr als in der vorangehenden Zeile einger¨ uckt werden. Die Ausgabe soll also wie folgt aussehen:
***
***
***
***
***
***
***
***
Implementierung:
Kodierung:
3. Schreibe ein Programm, das mittels mehrerer Schleifen folgendes
” Dreieck“ ausgibt:
**********
*********
********
*******
******
*****
****
***
**
*
Implementierung:
Kodierung:
Aufgabe 5: Eingabeverarbeitung
Bei Programmen, die interaktive Eingaben eines Nutzers verarbeiten, entsteht immer fol- gendes
” Problem“: Als Programmierer weiß man in der Regel nicht, wie viele Eingaben kommen. Daher muss man sich ein geeignetes
” Abbruchkriterium“ ¨ uberlegen, das das En- de der Eingabeverarbeitung angibt. Manchmal folgt so ein Abbruchkriterium unmittelbar aus der Ausgabenstellung, beispielsweise durch Eingabe eines Wertes, der außerhalb des G¨ ultigkeitsbereiches liegt, manchmal aber muss man dieses Abbruchkriterium als Pro- grammierer einfach sinnvoll definieren. Ferner sollte man vor einer Eingabeanweisung eine entsprechende Ausgabe machen, damit der Nutzer weiß, was das Programm von ihm will.
1. Aufgabenstellung
Entwickle ein Programm, das nat¨ urliche Zahlen (also Zahlen gr¨ oßer null) einliest und am Ende die Summe dieser Zahlen ohne das Abbruchkriterium ausgibt.
2. Pflichtenheft
Das Pflichtenheft: Aufgabe, Eingabe, Ausgabe, Sonderf¨ alle
Definiere und begr¨ unde die Wahl eines geeigneten Abbruchkriteriums:
W¨ ahle und begr¨ unde ein Schleifenkonstrukt, das dir problemad¨ aquat erscheint:
3. Testdaten
Testreihe Zahlenfolge Summe Kommentar
1
. . . .2
. . . .3
. . . .4. Implementierung
5. Kodierung
Aufgabe 6: Bestimmung eines indirekten Parameters
1. Aufgabenstellung
Entwickle ein Programm, das folgende Funktion hat: Der Nutzer muss eine ganze Zahl z eingeben. Das Programm soll dann denjenigen Index i bestimmen, f¨ ur den gilt: P i i 3 ≤ z. Neben dem Index soll das Programm auch die Kubikzahlen und deren Summe ausgeben.
Beispiel: Eingabe: 105
Ausgabe: Index= 4 Kubikzahlen= 1 8 27 64 Summe= 100
2. Pflichtenheft: Aufgabe, Eingabe, Ausgabe, Sonderf¨ alle
3. Testdaten
Zahl z Index i Kubiksumme s
. . . . . . . . . . . .
Zahl z Index i Kubiksumme s
. . . . . . . . . . . .