Problemstellung bei einer C Do while Schleife

informatik123

Cadet 1st Year
Registriert
Mai 2022
Beiträge
9
Hallo, ich programmiere noch nicht so lange und habe mich aber leider an einer stelle festgeklemmt und würde mich freuen wenn mir jemand da raus zukommen helfen könnte. Ich schicke mein Code am besten hier rein damit alles nachvollziehbar sein kann.


#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define STDIN_LEEREN {setvbuf (stdin,NULL,_IONBF,0); \
setvbuf(stdin,NULL,_IOFBF,BUFSIZ);}
#define WARTEN_AUF_ENTER {STDIN_LEEREN; getchar();}



int main()
{
float SW;
float PZ;


printf("=== Programmbeginn ==\n\n");

printf("Willkommen bei der Skimeisterschaft in Ilheim \n\n");

do {
printf("Geben Sie die erreichte Sprungweite ein: ");
scanf("%f", &SW);

if (SW > 0.0)
printf("Ihre eigegebene Sprungweite ist %.2f \n", SW);

else if (SW <= 0.0)
{
printf("Geben Sie ein Sprungweite ein das groesser als 0.0 ist.\n\n");

}

} while (SW < 0.0);

if ( SW >= 110.0)
{
PZ = 60 + ((SW - 110.0)*2)*0.9;
}
else if (SW < 110.0)
PZ = 60 - ((110.0 - SW)*2)*0.9;

printf("Die erreichte Punktzahl %2.f \n\n", PZ);




// und zwar würde ich gerne in dieser Schleife die HN Werte zwischen 3 und 20 eingeben und danach aus der Schleife rausgehen bzw. weiter schreiben, das Problem ist nur obwohl ich für alle Haltungsnoten die Werte zwischen 3 und 20 eingebe, lässt er mich nicht aus der Schleife raus.
Als nächsten Schritt würde ich natürlich jede HN Zahl überprüfen ob dieser im diesem Bereich liegt oder nicht und dann ggf. den Nutzer dazu auffordern die Zahl im dem Bereich anzugeben, falls jemand da dazu eine Idee hätte wie man es machen könnte, wäre das super cool, aber in erster Linie würde ich schon gerne einfach ordentlich die Schleife verlassen zu wollen.



printf("Geben Sie bitte die 5 Haltungsnoten ein \n");

double HN[5];
int i;


do
{
printf("Die Haltungsnoten muessen wischen 3 und 20 sein werden! \n");

for(i=0; i<5; i++)
{
printf("Die %d Haltungsnote : ", i+1);
scanf("%lf", &HN);
}
}while((HN < 3) || (HN > 20));


ich danke euch schon mal im Voraus.

Mfg
Linas
 
Zur besseren Lesbarkeit die beiden Snippets mit richtigem CODE Tag:

C++:
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define STDIN_LEEREN {setvbuf (stdin,NULL,_IONBF,0); \
                      setvbuf(stdin,NULL,_IOFBF,BUFSIZ);}
#define WARTEN_AUF_ENTER {STDIN_LEEREN; getchar();}



int main()
{
    float SW;
    float PZ;


    printf("=== Programmbeginn ==\n\n");

       printf("Willkommen bei der Skimeisterschaft in Ilheim \n\n");

    do {
       printf("Geben Sie die erreichte Sprungweite ein: ");
       scanf("%f", &SW);

       if (SW > 0.0)
        printf("Ihre eigegebene Sprungweite ist %.2f \n", SW);

       else if (SW <= 0.0)
       {
        printf("Geben Sie ein Sprungweite ein das groesser als 0.0 ist.\n\n");

       }

       } while (SW < 0.0);

    if ( SW >= 110.0)
    {
        PZ = 60 + ((SW - 110.0)*2)*0.9;
    }
    else if (SW < 110.0)
        PZ = 60 - ((110.0 - SW)*2)*0.9;

    printf("Die erreichte Punktzahl %2.f \n\n", PZ);



    printf("Geben Sie bitte die 5 Haltungsnoten ein \n");

    double HN[5];
    int i;
&
C++:
        do
        {
        printf("Die Haltungsnoten muessen wischen 3 und 20 sein werden! \n");
 
        for(i=0; i<5; i++)
        {
        printf("Die %d Haltungsnote : ", i+1);
        scanf("%lf", &HN);
        }
        }while((HN < 3) || (HN > 20));
Ergänzung ()

HN ist ein Array mit 5 Werten. Deine for Schleife schreibt nicht an die jeweiligen Indices in diesem Array den eingegebenen Wert, sondern an die Adresse des Arraystarts.

Deine while Schleife fragt ebenso ab, ob das Array HN <3 oder >20 ist, nicht ob irgendein Wert darin dies erfüllt.
Ergänzung ()

Pack die do-while Schleife in die for Schleife und speicher bzw prüf dort den jeweils tatsächlichen Wert im Array HN an Index i, also HN[i ].
 
Zuletzt bearbeitet:
@Powl_0 Danke dir, es funktioniert jetzt. Zumindest geht der Code weiter. Könnte ich dich vielleicht noch etwas weiteres fragen. Hier wird mir zwar der max Wert angezeigt aber der min Wert nicht? Muss ich diese irgendwie extra speichern?

Hab da ein Kommentar in Gelb geschrieben wo ich ein Problem hab.

Danke dir schonmal im voraus.




C:
int main()
{
    float SW;
    float PZ;


    printf("=== Programmbeginn ==\n\n");

    printf("Willkommen bei der Skimeisterschaft in Ilheim \n\n");

    do {
        printf("Geben Sie die erreichte Sprungweite ein: ");
        scanf("%f", &SW);

        if (SW > 0.0)
            printf("Ihre eigegebene Sprungweite ist %.2f \n", SW);

        else if (SW <= 0.0)
        {
            printf("Geben Sie ein Sprungweite ein das groesser als 0.0 ist.\n\n");

        }

    } while (SW < 0.0);

    if (SW >= 110.0)
    {
        PZ = 60 + ((SW - 110.0) * 2) * 0.9;
    }
    else if (SW < 110.0)
        PZ = 60 - ((110.0 - SW) * 2) * 0.9;

    printf("Die erreichte Punktzahl %2.f \n\n", PZ);



    printf("Geben Sie bitte die 5 Haltungsnoten ein \n");

    double HN[5];
    int i;

    printf("Die Haltungsnoten muessen wischen 3 und 20 sein werden! \n");
    for (i = 0; i < 5; i++)
    {
        do
        {
            printf("Die %d Haltungsnote : ", i + 1);
            scanf("%lf", &HN[i]);
        } while ((HN[i] < 3) || (HN[i] > 20));
    }





    for (int i = 0; i < 5; i++)
    {
        printf("Die %d Haltungsnote = %.2lf \n ", i + 1, HN[i]);
    }

// Es geht um diesen Teil des Codes

    int s, b;
    double min, max;

    min = max = HN[0];

    for (i = 0; i <= 5; i++)
    {
        if (HN[i] > max) max = HN[i];
        if (HN[i] < min) min = HN[i];

     
    }
 
    printf("max Note: %lf \n ", max);
    printf("min Note: %lf \n ", min);
 
Wird gar kein Wert angezeigt? Oder ein falscher?
Überprüfe die Zählbedingungen der for-next-Schleife.
 
Achso, ist also bei Index i=5 abgestürzt. Hat deine Entwicklungsumgebung das nicht angezeigt? Oder kompilierst du immer im Release Modus?
 
Muss nicht abgestürzt sein, ein Lesezugriff außerhalb des definierten Bereichs kann auch einfach zufällige Werte zurückgeben.
 
True. Debugger würde es zumindest mit ner Exception abfangen.
 
Ja, na er hat mir für min Werte immer irgendwelche zufällige Zahlen gezeigt. Vielleicht habe ich auch eine Warnung übersehen, bin mir aber nicht sicher.
 
Zurück
Oben