Struktogramm dazu und welches Problem im Quelltext?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das Struktogramm überlasse ich mal dir.

Problem im Quelltext: Bei der Eingabe von c wird 1000 mal geprüft, ob die Zahl schon eingegeben wurde. Das führt einerseits dazu, dass der Rechner unnötig viele Wiederholungen der Prüfung macht und andererseits, dass man 1001 mal das Gleiche eingeben könnte und er dann trotzdem für c das Gleiche zulässt, wie für a oder b

Außerdem wird unten nicht ausgegeben, die wievielte Zahl jetzt die Größte war. Die Vorgabe, dass man drei unterschiedliche Zahlen eingeben muss, ist also unsinnig. Wenn du dreimal 50 eingibst, ist 50 eben die größte Zahl.


Bartosz11  05.02.2021, 14:17
Wenn du dreimal 50 eingibst, ist 50 eben die größte Zahl.

Nein, das geht nämlich nicht. Habs gerade getestet.

Sonst gebe ich dir mit deiner Antwort vollkommen Recht !🙂

1
daCypher  05.02.2021, 14:21
@Bartosz11

Ja, in dem Programm geht es nicht, weil das ja drei unterschiedliche Zahlen haben will. Ich meinte damit, dass die Vorgabe unsinnig ist. Also um die höchste von drei Zahlen zu ermitteln, ist es nicht unbedingt nötig, dass alle drei unterschiedlich sein müssen.

Was anderes wäre es, wenn du z.B. die älteste von drei Personen ermitteln willst und da dann mehrere mit dem gleichen Alter hast, dann kannst du nicht sagen "Dieter und Margarete sind beide 70, aber Dieter ist älter, weil er als erstes eingegeben wurde"

1
Bartosz11  05.02.2021, 14:24
@daCypher

Ok, jetzt verstehe ich deinen Punkt. 👍 "Dass die 3 Zahlen unterschiedlich zu sein haben", muss nicht sein.

1

Hallo!

Ich schließe mich @Samanthal an (1000 Durchläufe ist wirklich komisch) und sage außerdem, dass mir das etwas zu viel Code für so wenig Inhalt erscheint.

Ich habe das mal in C übertragen und alles durchgetestet.

#pragma warning (disable:4996) //Visual Studio will scanf_s sehen
#include "stdio.h"

int main(void)
{
    int a = 0, b = 0, c = 0;
    printf("1: Gib eine Ganzzahl ein\n");
    scanf("%d", &a);
    printf("2: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
    scanf("%d", &b);

    while (a == b)
    {
        printf("2: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
        scanf("%d", &b);
    }

    printf("3: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
    scanf("%d", &c);
    for (int i = 0; i < 1000; i++)
    {
        if (c == a || c == b)
        {
            printf("3: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
            scanf("%d", &c);
        }
        else
        {
            break;
        }
    }

    if (a > b)
    {
        if (a > c)
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", a);
        }
        else
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", c);
        }
    }
    else
    {
        if (b > c)
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", b);
        }
        else
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", c);
        }
    }

    getchar();
    return 0;
}

Ich würde lieber eine do-while-Schleife zum Prüfen nehmen. Der Grund ist, einmal muss sowieso eine Zahl eingegeben werden. Dann erst kommt die Prüfung. Wenn OK, dann weiter im Code, sonst nochmal! Du sparst dir die doppelten Eingaben.

Dies hier ist wesentlich kürzer:

#pragma warning (disable:4996) //Visual Studio will scanf_s sehen
#include "stdio.h"

int main(void)
{
    int a = 0, b = 0, c = 0;
    printf("1: Gib eine Ganzzahl ein\n");
    scanf("%d", &a);

    do
    {
        printf("2: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
        scanf("%d", &b);
    }
    while (a == b);

    do
    {
        printf("3: Gib eine bisher noch nicht eingegebene Ganzzahl ein\n");
        scanf("%d", &c);
    }
    while (c == a || c == b);


    if (a > b)
    {
        if (a > c)
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", a);
        }
        else
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", c);
        }
    }
    else
    {
        if (b > c)
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", b);
        }
        else
        {
            printf("Die gr\x94 \b\xE1 \bte eingegebene Zahl ist %d", c);
        }
    }

    getchar();
    return 0;
}
Woher ich das weiß:Studium / Ausbildung

Die eine Schleife wird nur 1000 Mal wiederholt. Dadurch kann es sein, dass der Nutzer 1000 Mal die selbe Zahl eingibt, die schon eingegeben wurde.