C Schleifen

schleife

Schleifen

um Wiederholungen in Programmen zu realisieren

jede Schleife hat eine Durchlauf- bzw. Abbruch-Bedingung,
damit sie nicht endlos läuft! Endlose Schleife = Bedingung nie wahr!

kopfgesteuerte Schleifen: while, for
Bedingung wird vor jedem Durchlauf geprüft

fußgesteuerte Schleifen: do-while,
Bedingung wird nach dem Durchlauf geprüft

while

while (Bedingung) { Anweisung; }  
int i = 0;  
while(i < 10) {  
    printf("i = %d\n", i);  
    i++;  
}  

do-while

für mindestens ein Durchlauf

do { Anweisung; } while (Bedingung);  
int i = 0;  
do {  
    printf("i = %d\n", i);  
    i++;  
} while(i < 5);  

z.B. typische Nutzung: Benutzer-Eingaben

int summe = 0;  
do {  
    printf("Summe = %d\n", summe);  
    printf("Eingabe von Summand zwischen 1 und 50: ");  
    scanf("%d", &summand);  

    if(summand < 1 || summand > 50) {  
        printf("Ungueltige Eingabe!\n");  
        continue;  
    }  

    summe += summand; // nur bei gueltiger eingabe ...  

} while(summe < 100);  

for

for (Initialisierung; Bedingung; Inkrement) { Anweisung; }  
int i;  
for (i = 0; i < 10; i++) {  
    printf("i = %d\n", i);  
}  

seit C99 (Standard / Version):

for (int i = 0; i < 10; i++) {  
    printf("i = %d\n", i);  
}  

break / continue

break um Schleife unmittelbar ( sofort) zu beenden

continue um den aktuellen Durchlauf zu überspringen und nächste Iteration zu beginnen

int i = 0;  
while (i < 10) {  
    if (i == 5) break; // vorzeitiges schleifen ende ...  
    printf("%d\n", i);  
    i++;  
}  
for (int i = 0; i < 10; i++) {  
    if (i % 2 == 0) continue; // nur ungerade ausgeben  
    printf("%d\n", i);  
}  

goto

sog. Sprungmarke, die Sprung an jede markierte Stelle ermöglicht

kein guter Stil! sofortiger Sprung kann Code unlesbar machen, sog. Spaghetticode!

für Programmieraufgaben / bei Testarbeiten nicht erlaubt! ... automatisch 0 Punkte!


goto label; ... label: ... ;  
int i = 0;  
start:  
if (i >= 5) goto end;  
printf("%d\n", i);  
i++;  
goto start;  
end:  

Übungen:

📋 1 x 1

Schreibe ein Programm für die Berechnung und Ausgabe des 1x1 einer eingegeben Zahl.

Fertige 3 Versionen mit den unterschiedlichen Schleifentypen an.

1 x 3 = 3  
2 x 3 = 6  
...  
10 x 3 = 30  


📋 Erweiterung für "Fläche und Umfang eines Rechtecks"

Erweitere dein Programm zur Berechnung der Fläche und Umfang eines Rechtecks, indem du die Benutzereingabe mit einer do-while Schleife auf ihre Korrektheit hin überprüfst / absicherst.

📋 1er

Schreibe ein Programm für die Berechnung der Operation a + b, wobei b die Summe der enthaltenen 1er ist.

3 + 5 = 3 + 1+1+1+1+1  


📋 Fakultät

Schreibe ein Programm für die Berechnung der Fakultät einer bestimmten Zahl.

Fakultät von n bzw. n! = n * (n-1)! ... wobei 1! = 1 und 0! = 1 ist.

5! = 5 * 4 * 3 * 2 * 1 = 120  


📋 Potenz

Schreibe ein Programm für eine Potenzberechnung von xy / x^y.

Ohne der pow() Funktion aus <math.h> Bibliothek!

5^3 = 5 * 5 * 5  


📋 ggT (größter gemeinsamer Teiler)

Schreibe ein Programm für die Berechnung des ggT (größter gemeinsamer Teiler) zweier Zahlen.

📋 Umrechner: Dezimal <> Binär

Schreibe ein Programm, damit der Benutzer zwischen zwei Modi wählen kann:
Eine Dezimalzahl zu einer Binärzahl umzurechnen
oder/und umgekehrt, eine Binärzahl zu einer Dezimalzahl.

Der Rechenweg soll dem Benutzer angezeigt werden!

Waehle Modus (1 = Dezimal -> Binaer, 2 = Binaer -> Dezimal): 1   
Gib Dezimalzahl ein: 13   
Rechenweg (Dezimal -> Binaer):   
13 / 2 => Quotient 6, Rest 1   
 6 / 2 => Quotient 3, Rest 0   
 3 / 2 => Quotient 1, Rest 1   
 1 / 2 => Quotient 0, Rest 1   
Dezimal: 13 entspricht Binaer: 1101  


verschachtelte Schleifen

eine Schleife in einer anderen Schleife

für jede Iteration der äußeren Schleife, wird die innere Schleife vollständig durchlaufen

for (int i = 0; i < 3; i++) {           // auessere schleife  
    for (int j = 0; j < 2; j++) {       // innere schleife  
        printf("i: %d, j: %d\n", i, j);  
    }  
}  
#include<stdio.h>  

int main() {  
    int zeilen = 3;  
    int spalten = 3;  
    for(int z = 0; z < zeilen; z++){  
        printf("___ ZEILE %d ", z + 1);  
        for(int s = 0; s < spalten; s++){  
            printf("| Spalte %d  ", s + 1);  
        }  
        printf("\n");  
    }  
    return 0;  
}  

Übungen:

📋 n * n Tabelle

Der Benutzer soll eine Zahl n eingeben können.
Das Programm soll eine n * n Tabelle der eingegebenen Zahl berechnen und ausgeben.

z.B. n * n Tabelle für die Zahl 6

Tabelle

📋 geometrische Figuren

Schreibe ein Programm das folgende geometrischen Figuren auf der Konsole ausgibt.

Die Größe der Figuren kann der Benutzer selbst bestimmen, mit der Eingabe von den Wert von n.

geometrische Figuren

📋 Code analysieren

Versuche die Funktionsweise der einzelnen Codebeispiele nachzuvollziehen und herauszufinden, wie der Ablauf bzw. die genaue Ausgabe am Ende aussieht.

Code 1 Code 2 Code 3

Zufallszahlen generieren

rand() Funktion aus <stdlib.h> für Pseudo-Zufallszahlen zwischen 0 und RAND_MAX (meist min. 32767)
d.h. ist nicht wirklich zufällig, sondern Algorithmus erzeugt Zahlen die nur zufällig wirken ...

srand() Funktion um Zufallszahlengenerator mit Startwert (seed) zu initalisieren

wird srand() nicht aufgerufen, liefert rand() immer denselben Standard-Startwert!

aktuelle Zeit als Startwert, mit time() Funktion aus <time.h>

#include<stdio.h>  
#include<stdlib.h>  // fuer rand() und srand()  
#include<time.h>    // fuer time()  

int main() {  
    srand(time(NULL)); // initialisierung (nur 1x)  

    for(int i = 0; i < 10; i++){  
        rand(); // aufrufen und verwerfen (um "zufall" zu verbessern)   
    }  

    int zufallszahl = rand();  

    printf("Eine Zufallszahl: %d\n", zufallszahl);  

    return 0;  
}  

Zufallszahlen beschränken mit Hilfe von Modulo %, z.B.

int zahlVon1Bis10 = rand() % 10 + 1;   
// % 10, zahlen von 0-9 => +1 um zahl (bereich) zu verschieben  

📋 Statistik von Zufallszahlen 1-10

Schreibe ein Programm, das zufällige Zahlen von 1-10 generiert, und erstelle ein Statistik darüber, wie oft jeweils eine Zahl vorkommt (Anzahl und in Prozent), bei 100 (1.000, 10.000, ...) generierten Zahlen.