FH D FB 4 - Informatik
FH D FB 4 - Informatik
FH D FB 4 - Informatik
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>FH</strong> D<br />
Lehr- und Forschungsgebiet <strong>Informatik</strong> I<br />
<strong>FB</strong> 4<br />
Laborversuch Nr. 3<br />
Kontrollstrukturen 2 (Schleifen)<br />
for while do<br />
while<br />
Lin. 10/2010<br />
- 35 -
3 Zyklische Struktur (Schleife)<br />
Die zyklische Struktur erlaubt es, Programmteile mehrfach in Abhängigkeit einer<br />
Bedingung zu durchlaufen. Erst dadurch lassen sich viele Probleme mit einem vertretbaren<br />
Programmieraufwand lösen. Die folgende Abbildung zeigt die graphischen<br />
Darstellungsformen für die zyklische Struktur.<br />
Programmablaufplan<br />
Struktogramm<br />
Schleifenanfang<br />
Schleifenbereich<br />
Anweisung(en)<br />
Anweisung(en)<br />
Schleifenende<br />
Abb. 3.1: Schleifendarstellungen<br />
Die zyklische Struktur kann mit den Sprachmitteln aus Verzweigung und Rücksprung<br />
realisiert werden. Darüber hinaus gibt es noch weitere Schleifen-Anweisungen. Diese<br />
können unterteilt werden in Anweisungen für Zählschleifen und Anweisungen für<br />
Bedingungsschleifen.<br />
3.1 Zählschleifen<br />
Für Zählschleifen wird die Konstruktion mit for gewählt. Diese hat die allgemeine<br />
Form:<br />
for (Ausdruck1; Bedingung; Ausdruck3)<br />
Anweisung;<br />
Hierbei wird über den Ausdruck1 der Zählvariablen ein Anfangswert zugewiesen; die<br />
Bedingung prüft den Wert der Laufvariablen; Ausdruck3 bewirkt eine Veränderung<br />
des Wertes um die Schrittweite. Solange die Bedingung erfüllt ist, wird die angegebene<br />
Anweisung wiederholt ausgeführt.<br />
Lin. 10/2010<br />
- 36 -
Das Bild zeigt die graphische Darstellung in Form eines Programmablaufplans und<br />
Struktogramms.<br />
for (a1;b;a3)<br />
for (a1;b;a3)<br />
Abb. 3.2: Zählschleife<br />
Bei Zählschleifen muss die Zählervariable verändert werden. Beim Inkrementieren<br />
(incrementare (lat.) = um einen bestimmten Wert erhöhen) oder Dekrementieren wird<br />
der Wert um einen festen Betrag (oftmals eins) erhöht bzw. verringert. Als Anweisung<br />
geschrieben:<br />
z = z + x; oder z = z - x;<br />
In C läßt sich dieser Ausdruck vereinfachen zu:<br />
z += x ; oder z -= x;<br />
In C läßt sich dieser Ausdruck für den Zuwachs um 1 weiter vereinfachen zu:<br />
z++; oder z--;<br />
3.2 Sprachmittel für Bedingungsschleifen<br />
Bei Bedingungsschleifen ist die Anzahl der Schleifendurchläufe nicht bekannt. Für die<br />
bedingungsgesteuerten Schleifen gibt es zwei verschiedene Arten der Realisierung.<br />
3.2.1 Bedingungsschleife mit Bedingungstest am Anfang<br />
Bei der Bedingungsschleife mit der Bedingung am Anfang wird ein Ausdruck auf true<br />
oder false überprüft, bevor die Schleifenanweisung durchlaufen wird. Damit hat diese<br />
Form der Bedingungsschleife einen abweisenden Charakter.<br />
Die Schleife mit while hat grundsätzlich folgendes Aussehen:<br />
while (Bedingung)<br />
Anweisung;<br />
Lin. 10/2010<br />
- 37 -
Solange der Ausdruck (Bedingung) hinter while den Wert true hat, wird die Anweisung<br />
wiederholt ausgeführt. Liefert der angegebene Ausdruck den Wert false, wird<br />
im Programm fortgefahren.<br />
Statt einer einzelnen Anweisung können auch mehrere Anweisungen stehen, die in<br />
geschweifte Klammern gesetzt werden (Block).<br />
while (Bedingung)<br />
Anweisung(en);<br />
Abb. 3.3: Die Bedingungsschleife mit Bedingungstest am Anfang<br />
3.2.2 Bedingungsschleife mit Bedingungstest am Ende<br />
Im Gegensatz zur einfachen while-Schleife wird die Anweisung zunächst ausgeführt,<br />
dann erst wird geprüft, ob die Schleife wiederholt werden soll. Die Schleife wird also<br />
auf jeden Fall mindestens einmal durchlaufen, da die Abfrage erst am Ende steht. Sie<br />
hat also keinen abweisenden Charakter.<br />
Die allgemeine Form lautet:<br />
do<br />
Anweisung;<br />
while (Bedingung);<br />
Anweisung(en);<br />
while (Bedingung)<br />
Abb. 3.4: Bedingungsgesteuerte Schleife mit Bedingungstest am Ende<br />
Lin. 10/2010<br />
- 38 -
3.3 Folgen und Reihen<br />
3.3.1 Definition<br />
Gegeben sei eine Folge (a n<br />
) = a 1<br />
, a 2<br />
, a 3<br />
, ...<br />
Dann nennt man die Folge (s n<br />
) = s 1<br />
, s 2<br />
, s 3<br />
, ...,<br />
deren Elemente s n<br />
nach der Vorschrift:<br />
s n<br />
= a 1<br />
+ a 2<br />
+ ... + a n<br />
gebildet werden, die Reihe (s n<br />
) der Folge (a n<br />
).<br />
Anstatt Reihe sagt man auch Teilsummenfolge.<br />
Erläuterung der Definition<br />
Gegeben sei eine Folge (a n<br />
) = n·2 = 2, 4, 6, 8, 10, 12, ...<br />
Nur bilden wir die Summen s n<br />
aus den ersten n-Gliedern<br />
dieser Folge:<br />
Die Summe s 1<br />
besteht nur aus einem Summanden (2)<br />
Die Summe s 2<br />
entsteht durch Addition der ersten zwei Glieder<br />
Die Summe s 3<br />
entsteht durch Addition der ersten drei Glieder<br />
Die Summe s 4<br />
entsteht durch Addition der ersten vier Glieder<br />
s 1<br />
= 2 = 2<br />
s 2<br />
= 2 + 4 = 6<br />
s 3<br />
= 2 + 4 + 6 = 12<br />
s 4<br />
= 2 + 4 + 6 + 8 = 20<br />
s 5<br />
= 2 + 4 + 6 + 8 +10 = 30<br />
usw.<br />
Dann kann man die Summen s n<br />
als eine neue Folge (s n<br />
)<br />
betrachten: (s n<br />
) = 2, 6, 12, 20, 30, ...<br />
Diese Folge hat nun einen besonderen Namen: Weil sie aus den Teilsummen<br />
gebildet wird, nennt man sie Teilsummenfolge oder Reihe.<br />
3.3.2 Reihenentwicklung<br />
Eine Reihenentwicklung ermöglicht in der Mathematik die Berechnung einer<br />
nicht direkt mit elementaren Operationen (Addition, Subtraktion, Multiplikation<br />
und Division) darstellbaren mathematischen Funktion durch eine endliche oder<br />
unendliche Summe von elementaren Ausdrücken. Diese so genannte Reihe kann<br />
in der Praxis oft auf endliche viele Glieder reduziert werden, wodurch eine Näherung<br />
der exakten Funktion entsteht, die umso einfacher ist, je weniger Glieder genommen<br />
wurden, aber umso besser ist, je mehr genommen wurden. Häufig lässt sich die dadurch<br />
entstandene Ungenauigkeit (also die Größe des Restgliedes) formelhaft beschreiben.<br />
Bei einer erzeugenden Funktion erscheinen die Glieder einer unendliche<br />
Folge als Koeffizienten der Reihenentwicklung.<br />
In der Mathematik tauchen zum Beispiel folgende Reihenentwicklungen auf:<br />
Taylorreihe (Potenzreihe),Maclaurin-Reihe, Fourierreihe, Falkultätsreihe.<br />
Lin. 10/2010<br />
- 39 -
3.4 Beispiele für Schleifen-Struktur<br />
3.4.1 Aufgabenstellung<br />
Als Beispiel soll die Summe der natürlichen Zahlen von 1 bis n ermittelt werden.<br />
3.4.2 Problemanalyse<br />
Es handelt sich hierbei um das Problem, Folgenelemente zu erzeugen und diese<br />
arithmetisch zu verknüpfen. Die Betrachtung gilt also grundsätzlich für die Problemklasse<br />
Folgen und Reihen.<br />
Eingabe:<br />
Ausgabe:<br />
natürliche Zahl n<br />
Summe der natürlichen Zahlen s<br />
3.4.3 Algorithmus<br />
Die Aufgabe läßt sich mathematisch wie folgt formulieren:<br />
n<br />
s = ∑ i mit i, n ∈|N<br />
i=1<br />
Diese Formulierung läßt sich leider so nicht direkt umsetzen. Um den Algorithmus zu<br />
finden, sieht man sich am besten die Teilsummen an:<br />
s 0<br />
= 0<br />
s 1<br />
= 0+1 = s 0<br />
+ 1 = s 0<br />
+ m 1<br />
s 2<br />
= 0+1+2 = s 1<br />
+ 2 = s 1<br />
+ m 2<br />
s 3<br />
= 0+1+2+ 3 = s 2<br />
+ 3 = s 2<br />
+ m 3<br />
.<br />
.<br />
.<br />
s n<br />
= 0+1+2+... + n = n n-1<br />
+ n = s n-1<br />
+ m n<br />
Aus der Aufstellung erkennt man folgende Zusammenhänge als Bildungsgesetz für<br />
alle entsprechenden Aufgaben:<br />
1. Festlegen der Anfangswerte von m und s<br />
2. m i<br />
= m i-1<br />
+ 1 (Bildungsgesetz für Folgenelement)<br />
3. s i<br />
= s i-1<br />
+ m i<br />
(Teilsummenbildung, da arithmetische Reihe)<br />
4. Dieser Ablauf hat solange zu erfolgen, bis m i<br />
= n ist (Endekriterium)<br />
Lin. 10/2010<br />
- 40 -
3.4.4 Graphische Darstellung des Programms "Summe der natürlichen Zahlen":<br />
Programmablaufplan<br />
Anfang<br />
Eingabe: n<br />
s=0<br />
for(m=1;m
3.4.6 Die Ausführung<br />
3.4.7 N-Fakultät<br />
Die Fakultät ist in der Mathematik eine Funktion, die als das Produkt aller natürlichen<br />
Zahlen kleiner oder gleich dieser Zahl N definiert ist. Sie wird durch ein dem Argument<br />
nachgestelltes Ausrufezeichen („!“) abgekürzt.<br />
Für alle natürlichen Zahlen n ist:<br />
n! = 1 * 2 * 3 * 4 * ...........* (n-1) * n ; außerdem ist: 0!=1.<br />
Das folgende Listing zeigt dieses Programm.<br />
/*Fakultät*/<br />
/*Autor: A.Linder, Oktober 2010*/<br />
#include <br />
void main()<br />
{<br />
int n, m;<br />
double p;<br />
printf("*************************************\n");<br />
printf("* N-Fakultaet *\n");<br />
printf("* Autor: Alfred Linder *\n");<br />
printf("*************************************\n\n");<br />
printf("Bitte geben Sie n an! ");<br />
scanf ("%i", &n);<br />
p = 1;<br />
for(m = 1; m
3.5 Aufgabe<br />
Erstellen Sie je ein Schleifen-Programm zur Berechnung der Reihe, die der Endziffer<br />
Ihrer Matrikelnummer entspricht (siehe Seite 44). Hierzu verwenden Sie bitte nur die<br />
elementare Arithmetik und Logik, keine mathematischen Funktionen.<br />
Das Endekriterium für Programm 1 ist die Anzahl der Schleifendurchläufe n. Hierzu<br />
wählen Sie Ihre Matrikelnummer (n=Matrikelnummer). Zum Nachweis der Korrektheit<br />
zeigen Sie das Ergebnis der ersten drei Teilsummen und das Ergebnis für<br />
n=Matrikelnummer.<br />
Das Endekriterium für Programm 2 ist die Vorgabe eines relativen Fehlers rf. Hierzu<br />
wählen Sie den Kehrwert Ihrer Matrikelnummer (rf=1/Matrikelnummer).<br />
Diese Aufgabe ist eine Hausaufgabe. Sie sollen diese Hausaufgabe selbstständig<br />
bearbeiten und lösen. Alle Lösungen, die vermuten lassen, dass die Bearbeitung<br />
nicht eigenständig durch Sie selbst erfolgte, werden mit 0 Punkten bewertet oder<br />
zumindest stark abgewertet. Diese Abwertung betrifft auch diejenigen Lösungen, die<br />
als Quelle für andere abgegebene Lösungen vermutet werden können.<br />
Das Programm einschließlich vollständiger Dokumentation (auf Papier, nicht auf Datenträger)<br />
ist spätestens am 8.11.2010, 8.00 Uhr im Raum S4, oder Postfach<br />
von A. Linder) abzugeben.<br />
Zu einer vollständigen Dokumentation (angelehnt an DIN 66230) gehören:<br />
1. Deckblatt mit Name, Matrikelnummer und Gruppe.<br />
2. Kurzbezeichnung des Programmes<br />
Diese Kurzbezeichnung soll beim Start des Programmes u.a. erscheinen.<br />
3. Aufgabe des Programms<br />
Kurze anwendungsbezogene Beschreibung der Aufgabe, die mit dem Programm<br />
gelöst wird (inkl. Beschreibung der Programmeingaben und –Ausgaben)<br />
4. Aufgabenlösung<br />
Kurze Beschreibung der zur Lösung der Aufgabe verwendeten Methoden,<br />
Theorien und Berechnungsverfahren (Algorithmen).<br />
5. Grafische Darstellung des Programmablaufs<br />
Struktogramm (DIN 66261) oder Programmablaufplan (DIN 66001).<br />
6. Programmausdruck<br />
"Listing" der fehlerfreien C-Quellprogramme mit Angabe des Autors als Kommentar<br />
im Quellcode.<br />
7. Testlauf<br />
Screenshots der Konsolfenster für einen vollständigen Programmablauf (beim<br />
Starten muss das Programm u.a. den Namen und die Matrikelnummer des Autors<br />
ausgeben).<br />
Lin. 10/2010<br />
- 43 -
Gegebene Reihen:<br />
Lin. 10/2010<br />
- 44 -