2016-06-20 5 views
0

Ich habe ein einfaches Programm erstellt, in dem der Benutzer eine Frage beantworten muss und am Ende sieht, wie viel Kredit er bekommen hat. Die Antwort sollte "Ja" oder "Nein" lauten. Und kürzlich (nachdem ich mein Programm beendet habe und es gut funktionierte) habe ich festgestellt, dass es ein ToUpper() gibt. Also wollte ich es in meinem Programm eingeben. Ich habe if Anweisung für useranwer Ja oder Nein verwendet und da ich nicht so schreiben kann: Wenn (answer1 == ja), habe ich "Ja" in einer Zeichenfolge namens s gespeichert. Und es hat funktioniert, aber ich kann jetzt nicht s.ToUpper verwenden. Also musste ich von if-Anweisung zu switch-Anweisung wechseln und alles geht gut außer dieser nicht zugewiesenen lokalen Variable, die speichert, wie viel jede Frage Kredit hat. Das Falsche ist in g = i1 + i2 + i3 + i4 + i5. Diese "i" sind wertlos. Kann mir jemand helfen? Und wenn es eine Möglichkeit gibt, ToUpper mit if-Anweisung zu verwenden, macht es mir nichts aus, sie erneut zu verwenden. Hier ist mein Code:Warum bekomme ich "Verwendung von nicht zugewiesenen lokalen Variablen"?

int p = 0; 
     int i1; 
     int i2; 
     int i3; 
     int i4; 
     int i5; 
     int g; 
     int qu1 = 10; 
     int qu2 = 20; 
     int qu3 = 20; 
     int qu4 = 25; 
     int qu5 = 25; 
     Console.WriteLine("Calculating the probability of being diabete patient, please answer by yes or no"); 
     Console.Write("What is your name ? \n"); 
     string username = Console.ReadLine(); 
     Console.Write("Do you smoke ? \n"); 
     string answer1 = Console.ReadLine(); 
     switch(answer1.ToUpper()) 
     { 
      case "YES": 
       i1 = p + qu1; 
       break; 
      case "NO": 
       i1 = p + 0; 
       break; 
     } 

     Console.Write("do one of your parents have diabetes ? \n"); 
     string answer2 = Console.ReadLine(); 
     switch (answer2.ToUpper()) 
     { 
      case "YES": 
       i2 = p + qu2; 
       break; 
      case "NO": 
       i2 = p + 0; 
       break; 
     } 

     Console.Write("do u eat ? \n"); 
     string answer3 = Console.ReadLine(); 
     switch (answer3.ToUpper()) 
     { 
      case "YES": 
       i3 = p + qu3; 
       break; 
      case "NO": 
       i3 = p + 0; 
       break; 
     } 
     Console.Write("do u drink ? \n"); 
     string answer4 = Console.ReadLine(); 
     switch (answer4.ToUpper()) 
     { 
      case "YES": 
       i4 = p + qu4; 
       break; 
      case "NO": 
       i4 = p + 0; 
       break; 
     } 

     Console.Write("do u speak ? \n"); 
     string answer5 = Console.ReadLine(); 
     switch (answer5.ToUpper()) 
     { 
      case "YES": 
       i5 = p + qu5; 
       break; 
      case "NO": 
       i5 = p + 0; 
       break; 
     } 

     g = i1 + i2 + i3 + i4 + i5; 
     Console.WriteLine(username + "," + "your percentage of gtting diabetes is {0}", g + "%"); 
     if (g == 100) 
     { 
      Console.WriteLine("You need to take care, and try to follow a healthy lifestyle and stop smoking"); 
     } 
     if (g >= 50) 
     { 
      Console.WriteLine("Pay attention, you are no longer in the safe zone"); 
     } 
     if (g <= 50) 
     { 
      Console.WriteLine("You are in the safe zone, but you can decrease the percentage if you take a little bit care of your health"); 
     } 
     Console.ReadKey(); 
+0

Sie tun können:.. 'String answerX = Console.ReadLine() Trim() ToUpper()', dann 'if (answer1 == "YES") {...} else {...} ' –

Antwort

2

Keine Ihrer switch Aussagen haben Standardpfade so, wenn eine der answer s sind weder "YES" noch "NO" dann der jeweilige i nicht zugeordnet werden. Entweder geben die i s Standardwerte oder haben Sie Ihre Schalter haben default Klauseln als solche:

switch(answer){ 
    case "YES": 
    // case body 
    case "NO": 
    // case body 
    default: 
    i = 0; 
} 
+0

Danke! Das hat funktioniert. Ist es unmöglich, eine switch-Anweisung ohne einen Standardfall zu haben? –

+0

Nein, wenn die Variable jedoch nicht initialisiert ist.Der Compiler sucht nach jeder Möglichkeit, und wenn "YES" oder "NO" nicht an die case-Anweisung übergeben wurde und "int i;" deklariert wurde, aber keine Initialisierung erfolgte, könnte Ihr Code "i" gelesen haben und "ich" hätte keinen Wert gehabt. –

+0

Ok, danke für die Erklärung .. –

0

, die wahrscheinlich ist in den folgenden Codeteil kommt bewirken, dass die Variable i1 ist gar nicht so im Code int i1; zugeordnet.

 case "YES": 
      i1 = p + qu1; 
      break; 

Sie sollten vielmehr erklären, und weisen Sie auf den Standardwert und es dann in Switch Anweisung sagen

int i1 = 0; 

(OR)

int i1 = default(int); 
+0

Ihre dritte Lösung löst das Problem nicht, denn wenn die Antwort weder 'JA' noch 'NEIN' ist, wird 'i1' immer noch nicht zugewiesen . –

+0

(es ist technisch passiert, weil das OP Switch anstelle von If/Else verwendet, ohne Standardeinstellungen in den Switches). das Zuweisen von Standardwerten für diese wird nur das Problem verbergen, vor dem der Compiler sie tatsächlich warnt, dass es Pfade durch dieses Programm gibt, die nicht so funktionieren, wie sie denken, dass sie es sind. –

+0

@EliSadoff, Ja, schöner Fang. Danke für das Zeigen. – Rahul

1

Sie keine default: Aussagen können als in Ihren switch Anweisungen, so der Compiler Ihnen sagt, dass, wenn der Benutzer "NOPE" für Antwort 1 eingegeben hat, es nicht weiß, was zu tun ist.

sollten Sie entweder verwenden, wenn/sonst, oder Sie so etwas wie

default: 
case "NO": 

zu machen „Nein“ der Standard-Antwort, wenn jemand Typen etwas anderes hinzufügen müssen.

siehe bezogen werden: What should every programmer know about security? „Traue niemals Benutzereingaben“

Verwandte Themen