Das Schreiben eines einfachen Temperaturkonverters klingt trivial, bis man erkennt, wie leicht die grundlegende Logik kaputt geht. Sie beginnen mit einer „while“-Schleife, erstellen eine Fahrenheit-zu-Celsius-Tabelle und alles scheint in Ordnung zu sein. Aber dann benötigen Sie einen bestimmten Datenpunkt – wie die menschliche Körpertemperatur – und plötzlich wird Ihr sauberer Code zu einem Debugging-Albtraum.
Hier erfahren Sie aus der Praxis, wie Schleifen in C funktionieren, warum Präzision wichtig ist und wie Sie verhindern, dass Ihre Programme für immer hängen bleiben.
Die Grundlagen: Ganzzahlschleifen
Schauen wir uns die einfachste mögliche Version an. Sie möchten eine Tabelle von 0 bis 100 Grad Fahrenheit in 10-Sekunden-Schritten drucken. Sie verwenden eine Ganzzahl „int“ für den Zähler „a“.
„c
int main() {
int a;
a = 0;
while (a <= 100) {
printf("%4d Grad F = %4d Grad C\n", a, (a - 32) * 5 / 9);
a = a + 10;
}
0 zurückgeben;
}
„
Führen Sie Folgendes aus, und Sie erhalten ein sauberes Raster:
„Text
0 Grad F = -17 Grad C
10 Grad F = -12 Grad C
20 Grad F = -6 Grad C
30 Grad F = -1 Grad C
40 Grad F = 4 Grad C
50 Grad F = 10 Grad C
60 Grad F = 15 Grad C
70 Grad F = 21 Grad C
80 Grad F = 26 Grad C
90 Grad F = 32 Grad C
100 Grad F = 37 Grad C
„
Es ist funktional. Es ist schnell. Aber es ist hässlich. Warum? Weil die Ganzzahldivision Dezimalzahlen abschneidet. „(a – 32) * 5 / 9“ löscht den Bruchteil vor dem Drucken. Wenn Sie Genauigkeit benötigen, benötigen Sie Gleitkommazahlen.
Gleitkomma-Präzision
Der Wechsel zu „float“ ändert die Mathematik. Sie müssen auch den Formatbezeichner von „%d“ in „%f“ ändern. Der folgende Code verwendet „%6.2f“, was den Drucker anweist, sechs Leerzeichen zu reservieren und zwei Nachkommastellen beizubehalten.
„c
int main() {
float a;
a = 0;
while (a <= 100) {
printf("%6.2f Grad F = %6.2f Grad C\n", a, (a - 32.0) * 5.0 / 9.0);
a = a + 10;
}
0 zurückgeben;
}
„
Jetzt verfügt die Ausgabe über tatsächliche Dezimalstellen. Es sieht professionell aus. Was aber, wenn Sie einen bestimmten Wert benötigen, der nicht zum Muster passt?
Der Körpertemperaturfehler
Stellen Sie sich vor, Sie möchten 98,6 °F (normale menschliche Körpertemperatur) in diese Tabelle eingeben. Es landet nicht auf einem Vielfachen von 10. Sie fügen also eine „if“-Anweisung hinzu.
„c
int main() {
float a;
a = 0;
while (a <= 100) {
if (a > 98,6) {
printf(“%6.2f Grad F = %6.2f Grad C\n”, 98.6, (98.6 – 32.0) * 5.0 / 9.0);
}
printf(“%6.2f Grad F = %6.2f Grad C\n”, a, (a – 32.0) * 5.0 / 9.0);
a = a + 10;
}
0 zurückgeben;
}
„
Bei 100 funktioniert es. Aber ändern Sie das Schleifenlimit auf 200, und die Logik bricht zusammen. Die Bedingung „if (a > 98,6)“ bleibt für jede nachfolgende Iteration wahr. Sie werden immer wieder 98,6°F drucken.
Warum passiert das? Denn die Bedingung prüft, ob die aktuelle Zahl größer als 98,6 ist. Sobald „a“ 100 erreicht, wird es immer größer als 98,6 sein. Sie überprüfen nicht, ob Sie es gerade bestanden haben. Sie prüfen, ob Sie darüber hinaus sind.
Die Lösung: Tracking-Status
Um dies zu beheben, müssen Sie sich den vorherigen Wert merken. Sie führen eine zweite Variable ein, „b“, initialisiert auf -1.
„c
int main() {
schweben a, b;
a = 0;
b = -1;
while (a <= 100) {
if ((a > 98,6) && (b < 98,6)) {
printf("%6.2f Grad F = %6.2f Grad C\n", 98.6, (98.6 - 32.0) * 5.0 / 9.0);
}
printf("%6.2f Grad F = %6.2f Grad C\n", a, (a - 32.0) * 5.0 / 9.0);
b = a;
a = a + 10;
}
0 zurückgeben;
}
„
Jetzt ist die Logik fundiert. Die zusätzliche Zeile wird nur gedruckt, wenn „a“ aktuell über 98,6 liegt UND „b“ zuvor unter 98 lag



















