Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » c99 while-Schleife doppelte Ausgabe beheben » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen c99 while-Schleife doppelte Ausgabe beheben
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Anni
Grünschnabel


Dabei seit: 06.06.2021
Beiträge: 1

c99 while-Schleife doppelte Ausgabe beheben Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo Alle smile

ich habe folgendes Menübasiertes Programm zur berechnung verschiedener Flächen geschrieben. (c99)
Leider gibt es bei der Wiederholung der While-Schleife die erste print Ausgabe immer (min) doppel an bzw. Wirft mir die erste print-Ausgabe und das else (oft mehrfach) vor die Füße bevor es nochmal die erste print-Ausgabe ausgibt und dann den Nutzer die Eingabe tätigen lässt.

code:
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:
#include <stdio.h>
#include <math.h>

int main() {

    float a, b, c, s,  Flaeche;
    char temp;


    while (temp != 'X')
    {
            printf("Waehlen Sie einen Objekttyen:\n"
               "(R) Rechteck\n"
               "(E) Ellipse\n"
               "(D) Dreieck\n"
               "(X) Exit\n");

            scanf("%c", &temp);
            
            if (temp == 'R') {
                printf("Geben Sie bitte die Seitenlaengen a und b ein:\n");
                scanf("%f %f", &a, &b);

                Flaeche = a * b;

                printf("Flaeche = %.6f\n", Flaeche);
            }

            else if (temp == 'E') {
                printf("Geben Sie bitte die Halbachsen a und b ein:\n");
                scanf("%f %f", &a, &b);

                Flaeche = a * b * 3.14159265359;

                printf("Flaeche = %.6f\n", Flaeche);
            }

            else if (temp == 'D') {
                printf("Geben Sie bitte die Seitenlaengen a und b und c ein:\n");
                scanf("%f %f %f", &a, &b, &c);

                s = (a + b + c) / 2;
                Flaeche = sqrt(s * (s - a) * (s - b) * (s - c));

                printf("Flaeche = %.6f\n", Flaeche);
            }

            else if (temp == 'X')
                return 0;

            else
                printf("Ungueltige Eingabe!\n\n");


        }
}


Meine Ideen:
Mir sind die Ideen ausgegangen wie ich dies beheben kann. Ich würde mich deswegen sehr über eure Hilfe freuen! smile
06.06.2021 17:55 Anni ist offline E-Mail an Anni senden Beiträge von Anni suchen Nehmen Sie Anni in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Das Problem ist, dass er nach der Abfrage der Zahlenwerte in den einzelnen else if-Zweigen, also nach dem scanf, immer noch eine Return-Zeichen im stdin-Puffer hat. Er nimmt das als Zeichen für das scanf beim erneuten Schleifendurchlauf, was ja weder R, E, D noch X entspricht, dann gibt er die "ungültiges Zeichen"-Meldung aus und fängt wieder von vorne die while-Schleife an, gibt also nochmal den Text aus.

Normalerweise verwendet keiner scanf in einem echten Programm mehr, weil es ziemlich unsicher ist und man keine Möglichkeit hat, zu überprüfen, ob die Eingabe syntaktisch korrekt war (also ob z. B. wirklich Zahlen eingegeben wurden und so). Normalerweise würde man mit fgets eine komplette Zeile als String einlesen und danach dann analysieren. Aber das ist viel mehr Aufwand, weshalb man sich das bei solchen Übungsaufgaben schenkt und lieber scanf() verwendet.

Hier:
https://stackoverflow.com/questions/5240...r-in-the-buffer
Steht einiges drüber drin und es bringt wohl was, wenn man vor dem %c ein Leerzeichen schreibt.

Gruß
Marco
07.06.2021 13:36 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ach, was ich noch vergessen habe: Die Variable temp ist noch nicht initialisiert, wenn Du das erste Mal den Wert im "while" überprüfst. Das solltest Du nicht tun, wenn zufällig ein 'X' in temp wäre, dann würde das Programm direkt abbrechen.

Gruß
Marco
07.06.2021 14:03 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » c99 while-Schleife doppelte Ausgabe beheben