2017-07-08 1 views
0

Ich versuche Divide durch Null mit GOTO in C# zu implementieren. Ich habe das Ergebnis, aber hier möchte ich zuerst fnum/snum berechnen und das Ergebnis ausdrucken und dann, wenn ich snum zero gebe, sollte es mich fragen, snum anders als Null einzugeben. Dann sollte das goto start label anfangen zu arbeiten. Aber hier konnte ich standardmäßig nur fnum/snum ausführen.Verwenden von Goto-Anweisung

Console.WriteLine("Enter fnum"); 
i = Convert.ToDouble(Console.ReadLine()); 
start: 
Console.WriteLine("Enter snum"); 
j = Convert.ToDouble(Console.ReadLine()); 

hier, wenn ich eintrete snum Null sollte es mich nehmen Label zu gründen und mich fragen „eingeben zweite Zahl andere Null“

Kann jemand mir helfen?

+4

Die 'goto'-Anweisung wird heutzutage nicht empfohlen. –

+4

Sie wollen also eine andere Nachricht? Dann lege es in das "if" vor dem "goto" und lege das Label nach der ursprünglichen Nachricht. Alternativ können Sie stattdessen eine "do while" -Schleife verwenden. – juharr

+0

@ S.Akbari Wurde es _ever_ empfohlen? –

Antwort

2
if(j==0) 
{ 
    Console.WriteLine("snum cannot be 0!!"); 
    goto start; 
} 

Es ist nicht goto Aussagen oder in die Gewohnheit der Verwendung von ihnen bekommen zu verwenden, empfohlen.

Sie neigen dazu, die Komplexität zu erhöhen und Spaghetti-Code zu erstellen, sie beeinflussen auch die Lesbarkeit, wenn Sie mehr und mehr davon hinzufügen. Ein Fehler, der durch eine goto-Anweisung verursacht wird, kann schwierig zu beheben sein. usw. usw. Andere können mehr Gründe bearbeiten, um keine goto Anweisungen zu verwenden, wenn sie dies wünschen.

+1

Was ist der Grund? –

+1

https://xkcd.com/292/ – jAC

2

Sie sollten unbedingt NICHT verwenden goto. Verwenden Sie eine einfache while loop statt:

static void Main(string[] args) 
{ 
    double i, j = 0; 
    Console.Write("Enter fnum: "); 
    double.TryParse(Console.ReadLine(), out i); 

    Console.Write("Enter snum: "); 
    while (j == 0) 
    { 
     double.TryParse(Console.ReadLine(), out j); 

     if(j==0) 
      Console.WriteLine("Enter a number that is not 0"); 
    } 


    Console.ReadLine(); 
    Console.WriteLine("Div result is {0}/{1}={2}", i, j, i/j); 
} 

Zusätzlich habe ich den Code geändert Double.TryParse statt Convert.ToDouble() zu verwenden, wie es allgemein empfohlen wird. Damit können Sie überprüfen, ob der Benutzer tatsächlich eine Nummer eingegeben hat. Ich habe auch Console.WriteLine zu Console.Write für die Eingänge geändert, die den Fluss des Programms überhaupt nicht beeinflussen, aber zu mir macht es ästhetisch besser.

+0

Dies ist keine "einfache" 'while' Schleife. Eine Schleife, die durch ihren konstanten Zustand vorgibt, unendlich zu sein, aber tatsächlich eine Pause hat; in der Mitte ist eine komplexe Schleife. Eine einfache Schleife würde hier ausreichen, indem ein bisschen Code in eine Funktion verschoben wird. – hvd

+0

@hvd Ich benutzte das Wort "einfach", um anzuzeigen, dass die Schleife einfach zu schreiben und zu verstehen ist. Sie haben jedoch Recht, dass eine einfache Schleife auch ohne eine Funktion genügen würde, wie ich es bei der Bearbeitung getan habe. – stybl

+0

Sie haben sich gezwungen, die Schleifenbedingung zu duplizieren, was eine separate Funktion vermieden hätte, aber angesichts der Tatsache, wie trivial diese Schleifenbedingung ist, nehme ich an, dass das nicht so schlimm ist. – hvd