2015-07-09 10 views
6

Mam problem z zapętleniem instrukcji if w moim kodzie. Spojrzałem na inne wątki na stackoverflow, ale nie mogłem go uruchomić wiele razy. Program, który próbuję stworzyć, jest podstawowym konwerterem dla firmy odlewniczej. Próbowałem zrobić to tak, aby użytkownik mógł wprowadzić rodzaj konwersji potrzebnej, a następnie waga wosku. Dałoby to użytkownikowi odpowiednią ilość gramów metalu szlachetnego do użycia. Problem polega na tym, że muszę go uruchamiać od początku, aż użytkownik skończy z niego korzystać. Próbowałem użyć instrukcji while, ale po prostu pętli inną część instrukcji if. Oto mój kod dla odniesienia:Jak zapętlić instrukcję if z wieloma innymi, jeśli warunki

static void Main(string[] args) 
    { 
     double waxWeight, bronzeWeight, silverWeight, fourteenkGoldWeight, 
      eighteenkGoldWeight, twentytwokGoldWeight, platinumWeight; 
     string wW; 

     bool doesUserWantToLeave = false; 

     Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
      + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):"); 

     string conversionType = Console.ReadLine(); 

     //bool B = conversionType == "Bronze"; 
     //bool S = conversionType == "Silver"; 
     //bool ftG = conversionType == "14k Gold"; 
     //bool etG = conversionType == "18k Gold"; 
     //bool ttG = conversionType == "22k Gold"; 
     //bool P = conversionType == "Platinum"; 

     while (!doesUserWantToLeave) 
     { 

      if (conversionType == "Bronze") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       bronzeWeight = waxWeight * 10; 
       Console.WriteLine("You need " + bronzeWeight + " grams of bronze."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "Silver") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       silverWeight = waxWeight * 10.5; 
       Console.WriteLine("You need " + silverWeight + " grams of silver."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "14k Gold") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       fourteenkGoldWeight = waxWeight * 13.5; 
       Console.WriteLine("You need " + fourteenkGoldWeight + " grams of 14 Karat gold."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "18k Gold") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       eighteenkGoldWeight = waxWeight * 15; 
       Console.WriteLine("You need " + eighteenkGoldWeight + " grams of 18 Karat gold."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "22k Gold") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       twentytwokGoldWeight = waxWeight * 17.3; 
       Console.WriteLine("You need " + twentytwokGoldWeight + " grams of 22 Karat gold."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "Platinum") 
      { 
       Console.WriteLine("What is the weight of the wax model?"); 
       wW = Console.ReadLine(); 
       waxWeight = double.Parse(wW); 

       platinumWeight = waxWeight * 21.5; 
       Console.WriteLine("You need " + platinumWeight + " grams of platinum."); 
       Console.ReadLine(); 
      } 

      else if (conversionType == "Exit") 
      { 
       doesUserWantToLeave = true; 
      } 

      else 
      { 
       Console.WriteLine("Sorry! That was an invalid option!"); 
       Console.ReadLine(); 
      } 
     } 
    } 

Zdaję sobie sprawę, że dobry programista nie wpisać ten sam kod dwa razy, ale po prostu nie jestem na tym poziomie jeszcze, po prostu chcę kod do pętli. Czy musiałbym zrobić duże zagnieżdżone instrukcje?

+3

Właściwie, jestem trochę zazdrosny, że to pytanie z łatwością może zdobyć trzy punkty. –

+1

@UweKeim Cóż, widząc odpowiedzi ... to niesamowite, jak łatwo jest tak wielu ludziom całkowicie przegapić punkt na tak proste pytanie i taki prosty kawałek kodu. – Luaan

Odpowiedz

5

Pytasz tylko o typ metalu raz. Przesuń dwie linie gdzie Pytaj o, i odbierać dane wejściowe użytkownika wewnątrz pętli while:

while (!doesUserWantToLeave) 
{ 
    Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
     + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):"); 

    string conversionType = Console.ReadLine(); 


    if (conversionType == "Bronze") 
    { 
... 

Możesz wspomnieć jesteś nowy w programowaniu i są świadomi, że powtarzają się. Poprawnie priorytetowo traktuje się pierwszeństwo działania kodu. To jest dobre. Po uruchomieniu, powinieneś spojrzeć na ulepszenie kodu.

pierwsze trzy następujące linie są powtarzane po każdym if i tak muszą być zadawane tylko raz na początku pętli:

Console.WriteLine("What is the weight of the wax model?"); 
wW = Console.ReadLine(); 
waxWeight = double.Parse(wW); 

Następnie ostatnie dwie linie w każdej if dużej mierze powtarzają, ale znana jest tylko część, która się zmienia (nazwa metalu). Więc mogą one być usunięte i zastąpione jednym egzemplarzu na koniec pętli:

Console.WriteLine("You need " + metalWeight + " grams of {0}.", 
        conversionType.ToLower()); 
Console.ReadLine(); 

To wtedy właśnie opuszcza jedną linię za if. Również on się powtarza, a potrzebne wartości można zapisać w Słowniku. Zrobić wszystko, i może skończyć się z roztworu, takich jak:

static void Main(string[] args) 
{ 
    bool userWantsToStay = true; 
    var conversions = new Dictionary<string, double> 
    { 
     { "Bronze", 10.0 }, 
     { "Silver", 10.5 }, 
     { "14k Gold", 13.5 }, 
     { "18k Gold", 15.0 }, 
     { "22k Gold", 17.3 }, 
     { "Platinum", 21.5 } 
    }; 

    while (userWantsToStay) 
    { 
     Console.WriteLine("Please specify the type of conversion you would like to accomplish:"); 
     Console.WriteLine("(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):"); 
     var metalType = Console.ReadLine(); 

     Console.WriteLine("What is the weight of the wax model?"); 
     var wW = Console.ReadLine(); 
     var waxWeight = double.Parse(wW); 

     if (conversions.ContainsKey(metalType)) 
     { 
      var metalWeight = waxWeight * conversions[metalType]; 
      Console.WriteLine("You need {0} grams of {1}.", metalWeight, metalType.ToLower()); 
      Console.ReadLine(); 
     } 
     else if (metalType == "Exit") 
     { 
      userWantsToStay = false; 
     } 
     else 
     { 
      Console.WriteLine("Sorry! That was an invalid option! Try again"); 
      Console.ReadLine(); 
     } 
    } 
} 

ten można poprawić dalej (wielu ReadLines mógłby prawdopodobnie być usunięte; nie testują czy wejście waga jest prawidłowa dwukrotnie przed parsowania) , ale ustawi cię na właściwej ścieżce.

+0

Naprawdę chciałbym dać ci więcej niż +1 za "Poprawnie nadałeś priorytetowi kod działający po raz pierwszy." Świetna odpowiedź :) – Luaan

-1

Można wyodrębnić ten fragment kodu do metody oddzielnym która zostanie wywołana z wewnątrz pętli głównego programu, patrz pseudo-kod poniżej:

public void Main(string[] args) 
{ 
    while(!doesUserWantToLeave) { 
     Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
     + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):"); 
     string conversionType = Console.ReadLine(); 

     Console.WriteLine("What is the weight of the wax model?"); 
     double waxWeight = double.Parse(Console.ReadLine()); 

     double weight = ConvertMethod(conversionType, waxWeight); 

     Console.WriteLine(string.Format("You need {0} grams of {1}.", weight, conversionType)); 
    } 
} 

Metoda będzie wyglądać następująco. Można przekazać ciągi lub użyć wyliczenia, aby zdefiniować typy konwersji.

public double ConvertMethod(string type, double weight) 
{ 
    switch(type) { 
     case "Silver": 
     return weight * 10.5; 
     case "Bronze": 
     return weight * 10; 

    // etc... 
    } 
} 
3

Trzeba ponownie przypisać obsługi opcji na końcu pętli, w przeciwnym razie nigdy się nie zmieni:

while (!doesUserWantToLeave) 
{ 
    if (conversionType == "Bronze") 
    { 
     //.... 
    } 
    // ... 
    else if (conversionType == "Exit") 
    { 
     doesUserWantToLeave = true; 
    } 
    else 
    { 
     Console.WriteLine("Sorry! That was an invalid option!"); 
    } 
    conversionType = Console.ReadLine(); 
} 

Więc trzeba także usunąć wszelkie inne Console.ReadLine(); w pętli. Można również użyć break zamiast doesUserWantToLeave = true, która pozostawia pętlę.

-1

Bardziej prostym sposobem byłoby użycie instrukcji switch na "conversionType".

static void Main(string[] args) 
    { 
     double weight, waxWeight; 
     bool doesUserWantToLeave = false; 
     string conversionType = string.Empty; 

     while (!doesUserWantToLeave) 
     { 
      Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
      + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):"); 

      conversionType = Console.ReadLine(); 

      Console.WriteLine("What is the weight of the wax model?"); 
      waxWeight = double.Parse(Console.ReadLine()); 


      switch (conversionType.ToLower()) 
      { 
       case "bronze": 
        { 
         weight = waxWeight * 10; 
         Console.WriteLine("You need " + weight + " grams of bronze."); 
         break; 
        } 

       case "silver": 
        { 
         weight = waxWeight * 10.5; 
         Console.WriteLine("You need " + weight + " grams of silver."); 
         break; 
        } 

       case "14k gold": 
       case "14k": 
        { 
         weight = waxWeight * 13.5; 
         Console.WriteLine("You need " + weight + " grams of 14 Karat gold."); 
         break; 
        } 

       case "18k gold": 
       case "18k": 
        { 
         weight = waxWeight * 15; 
         Console.WriteLine("You need " + weight + " grams of 18 Karat gold."); 
         break; 
        } 

       case "22k gold": 
       case "22k": 
        { 
         weight = waxWeight * 17.3; 
         Console.WriteLine("You need " + weight + " grams of 22 Karat gold."); 
         break; 
        } 

       case "platinum": 
        { 
         weight = waxWeight * 21.5; 
         Console.WriteLine("You need " + weight + " grams of platinum."); 
         break; 
        } 

       case "exit": 
        { 
         doesUserWantToLeave = true; 
         break; 
        } 

       default: 
        { 
         Console.WriteLine("Sorry! That was an invalid option!"); 
         break; 
        } 
      } 
     } 
    } 

Metoda "ToLower" konwertuje dane wejściowe na wszystkie małe litery, eliminując konieczność dopasowania wielkości liter.

+0

Dla przypadku "22k złota": i inne podobne, czy dodaję ciało przypadek w "22k"? Na przykład "22k złota" miałby takie samo ciało jak przypadek "22k"? A może sposób, w jaki jest napisany w kodzie, działa dobrze? – Ninjatix

+0

@Ninjatix Sposób, w jaki to napisałem, jest w porządku. Wielokrotne instrukcje case ułożone jedna na drugiej uruchamiają ten sam blok kodu, zasadniczo mówiąc "if (conversionType.ToLower() ==" 22k "|| (conversionType.ToLower() ==" 22k gold ") – hashtagnatty

Powiązane problemy