C# while (bedingung 1 ll bedingung 2 ll bedingung 3 usw) möglich?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
while(true)
{
Console.WriteLine("Falsche Eingabe. Bitte Eingabe wiederholen: ");
zahl = Int32.Parse(Console.ReadLine());
if(zahl == 1 || zahl == 2 || zahl == 3 || zahl == 9)
break;      
}

oder

while (zahl != 1 && zahl != 2 && zahl != 3 && zahl != 9)
        {
            Console.WriteLine("Falsche Eingabe. Bitte Eingabe wiederholen: ");
            zahl = Int32.Parse(Console.ReadLine());            
        }

Marbuel  07.01.2014, 21:26

Ich würde außerdem ein

if(!int.TryParse(Console.ReadLine(), out zahl))
Console.WriteLine("das ist keine Ganzzahl, du DAU")

verwenden, sonst raucht dir die Applikation ab, wenn ich keinen Integer eingebe.

1
AnitaBach 
Fragesteller
 07.01.2014, 21:29
@Marbuel

Danke, ich werds beherzigen. Im O-Ton :)

0
Toraka  18.01.2014, 15:20
@Marbuel

Sehr schöne Antwort. Wenn aber ein Int.TryParse verwendet wird, so sollte auch der Erfolg des Parsing ausgewertet werden. TryParse gibt eine boolesche Variabel zurück. Wird also 'false' zurückgegeben, weil etwa "XYZ" anstatt einer erlaubten Zahl eingegeben wurde, sollte die Eingabemöglichkeit erneut erscheinen, die Schleife wiederholt werden.

0
AnitaBach 
Fragesteller
 07.01.2014, 21:27

Hallo Marbuel!

Vielen Dank! :) Das && war das, was mir gefehlt hat.

Kann man den gleichen Effekt auch mit einer Case-Abfrage erreichen?

Liebe Grüße Anita

0
Marbuel  07.01.2014, 21:43
@AnitaBach

Nein, du brauchst eine Schleife. Sonst kommst du, wie du selbst erkannt hast, nicht mehr nach oben. Das ist der einzige Weg, vom GoTo abgesehen. Ein GoTo verwendet man aber eigentlich nicht, weil es sonst sehr schnell unübersichtlich wird. Du kannst natürlich sowas machen:

bool bValid = false;
while(!bValid)
{
    Console.WriteLine("Falsche Eingabe. Bitte Eingabe wiederholen: ");
    if(!int.TryParse(Console.ReadLine(), out zahl))
        continue;
    switch(zahl)
    {
        case 1:
        bValid = true;
        break;
        case 2:
        bValid = true;
        break;
        case 3:
        bValid = true;
        break;
        case 9:
        bValid = true;
        break;
    }

}

Aber das ist nur ein anderer Weg nach Rom. Eine Schleife ist eine Schleife und ein Switch-Case ist halt ein Switch-Case. :) Das eine hat mit dem anderen nichts zu tun.

1
AnitaBach 
Fragesteller
 07.01.2014, 21:59
@Marbuel

Danke!

Und ich dachte, ich wüsste vielleicht nur einfach nicht, wie man in einer Case- Schleife wieder "nach oben" kommt.

:)

Hast mir total geholfen. Ich bleibe also bei der While-Schleife mit den &&s.

LG und schönen Abend! Anita

0
AnitaBach 
Fragesteller
 07.01.2014, 22:07
@AnitaBach

Edit: natürlich nicht "Case-Schleife" sondern "Switch-Case" :D ....Case ist ja keine Schleife ;)

0

Deine erste Bedingung wird immer wahr außer wenn die Zahl 1 ist. Die zweite wird immer wahr außer wenn die Zahl 2 ist. Beides logisch oder-verknüpft bedeutet dass die Gesamtbedingung wahr wird wenn eine der Teilbedingungen wahr werden. Und das ist IMMER der Fall (weil wenn die erste falsch ist die zweite wahr ist und umgekehrt).

Du möchtest alle Zahlen erlauben, bis auf ein paar bestimmte. D.h. du arbeitest nach dem Blacklist-Verfahren. Du checkst auf alles was "böse" ist:

while (zahl == 1 || zahl == 2 || zahl == 3 || zahl == 9)
{   
}

Wie gesagt, sobald 1 Bedingung wahr wird wird die Gesamtbedingung wahr (und er betritt die Schleife / bleibt in der Schleife). Und das ist nur dann der Fall wenn die Zahl eine von denen ist die du nicht haben willst.

Alternativ könntest du es auch so machen:

int[] notallowed = new int[] { 1, 2, 3, 9 } ;

while(notallowed.Contains(zahl)) 
{
}

Diese Variante bietet sich besonders dann an, wenn sich die Zahlen während der Laufzeit des Programms ändern können (neue kommen hinzu oder alte fallen weg)


Toraka  18.01.2014, 15:14

Im Grunde eine gute Antwort, jedoch mit einem Fehler, verglichen mit den Anforderungen der Fragestellerin, die den Anwender auffordern möchte, eine der folgenden Zahlen einzugeben: 1, 2, 3, 9. Das sind also nicht die ausgeschlossenen, sondern die erlaubten Zahlen.

0

zahl != 1 || zahl != 2

Wenn dier Zahl nicht 1 ist, oder nicht 2 ist. Wenn die Zahl also 1 ist, dann ergibt dieser Teil schonmal false. zahl!=2 wird dann aber auf jeden fall true.

Es ist also automatisch eine Endlosschleife.

Ich glaube, du kapierst gerade nicht, wie das logische ODER funktioniert.


AnitaBach 
Fragesteller
 07.01.2014, 21:02

Ich glaube, du kapierst gerade nicht, wie das logische ODER funktioniert.

Scheint mir auch so.

Wie schreibe ich also

"solange die zahl nicht 1, nicht 2, nicht 3 und nicht 9 ist..."

?

0
Frischmilch  08.01.2014, 08:07
@PerfectMuffin

Meist durch nichts, wenns ein Komma zur Trennung einer Auflistung ist, kommt es auf den Subtext an. Dein Kommentar ist leider nicht zielführend Muffin.

1

am besten überprüfen ob zahl zwischen 1 und 3 liegt und dann die 9

Dein Problem ist, dass du das mit der oder (||) Bedingung etwas falsch verstanden hast. Wenn zwei Bedingungen mit || verknüpft sind sagt das Programm dass die Bedingung erfüllt ist wenn auch nur eins der beiden Wahr ist. Beispiel:

Sagen wir du tippst die zahl 2 in dein Programm ein. Jetzt überprüft der Code zuerst: ist die zahl nicht 1. Da 2 nicht 1 ist, ist die Aussage wahr, und dein Code springt in die While Schleife. Gibst du beispielsweise 1 ein überprüft dein Code wieder: ist 1 nicht gleich 1? Das ist falsch, also geht dein Code durch die oder Verknüpfung hin und fragt jetzt: ist 1 nicht gleich 2? Das ist wieder wahr und dadurch ist die Bedingung erfüllt und der Code geht in die While Schleife.

Du musst dir da also eine etwas andere Methode überlegen. Tipp nimm eine Case Verzweigung.


AnitaBach 
Fragesteller
 07.01.2014, 21:14

hallo mmller,

danke schonmal!

eine case-verzweigung hatte ich mir auch schon überlegt, aber wie komme ich dann wieder "nach oben", also zu einer erneuten zahleneingabe/ einlesen von der tastatur?

die fälle, was bei 1,2,3 oder 9 passiert, kann ich so anweisen, aber wie komme ich bei default "zurück"?

lg anita

0
AnitaBach 
Fragesteller
 07.01.2014, 21:24
@AnitaBach

Aaaaa!

Ich habs: nicht ll sondern && ist das, was ich brauche:

        int zahl;

        Console.WriteLine("Bitte wählen Sie 1, 2, 3 oder 9 für Ende: ");
        zahl = Int32.Parse(Console.ReadLine());

        while (zahl != 1 && zahl != 2 && zahl != 3 && zahl != 9)
        {
            Console.WriteLine("Falsche Eingabe. Bitte Eingabe wiederholen: ");
            zahl = Int32.Parse(Console.ReadLine());            
        }

Jetzt gehts :)

Trotzdem würde mich interessieren, wie ich das mit einer Case-Abfrage lösen kann, dass man bei Falscheingabe eine neue Eingabe tätigen kann, die dann wiederum abgefragt und verarbeitet wird..

0
mmller31  07.01.2014, 21:51
@AnitaBach

ich kanns grad leider nicht testen, aber so könnte das funktionieren, du benutzt einfach eine Kombination von While und Case:

int zahl;
bool test = false;

while (test == false)
    {
    Console.WriteLine ("Bitte wählen Sie 1, 2, 3 oder 9: ");
    zahl = Int32.Parse(Console.ReadLine());

    switch (zahl)
        {
            case1:
            case2:
            case3:
            case9:
                Code für richtige Eingabe;
                test = true;
                break;
            default:
                Code für falsche Eingabe;
                test = false;
                break;
        }
    }

Gibt bestimmt aber noch ne schlauere Methode, aber so sollte's gehen.

0