2015-12-02 4 views
0

Недавно я начал «кодирование», и я действительно в самом начале, и это один из моих первых «проектов». Он должен быть преобразователем SI, где вы можете ввести значение, его блок и блок, который вы хотите преобразовать.Если условие/else в C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Program 
{ 
    class Program 
    { 
     static void Main() 
     { 
      decimal one = 1; 
      decimal two = 0.001m; 
      decimal three = 0.000001m; 
      decimal four = 0.000000001m; 
      decimal five = 0.000000000001m; 
      decimal answer; 


     begn: Console.WriteLine("SI converter!\nPlease, enter value: ");    
      decimal value = Convert.ToInt32(Console.ReadLine()); 

      Console.WriteLine("\nFactors: \n1.One \n2.Milli(m)\n3.Micro(µ)\n4.Nano(n)\n5.Pico(p)\nEnter factor: "); 
      decimal factor = int.Parse(Console.ReadLine()); 

      if (factor == 1) 
      { 
       factor = one; 
      }else if (factor == 2) 
      { 
       factor = two; 
      }else if (factor == 3) 
      { 
       factor = three; 
      }else if (factor == 4) 
      { 
       factor = four; 
      }else if (factor == 5) 
      { 
       factor = five; 
      } 


      Console.WriteLine("\nFactors: \n1.One \n2.Milli(m)\n3.Micro(µ)\n4.Nano(n)\n5.Pico(p)\nEnter the second factor: "); 
      decimal factor2 = Convert.ToInt32(Console.ReadLine()); 

      if (factor2 == 1) 
      { 
       factor2 = one; 
       answer = value * factor; 
       Console.WriteLine("The answer is : " + answer); 
      } 
      else if (factor2 == 2) 
      { 
       factor2 = two; 
      } 
      else if (factor2 == 3) 
      { 
       factor2 = three; 
      } 
      else if (factor2 == 4) 
      { 
       factor2 = four; 
      } 
      else if (factor2 == 5) 
      { 
       factor2 = five; 
      } 



       answer = value * factor/factor2;      
       Console.WriteLine("The answer is : " + answer); 


      Console.WriteLine("Go again?\nY/N");   
      char ans =char.Parse(Console.ReadLine()); 
      if (ans == 'y') 
      { 
       Console.Clear(); 
       goto begn; 

      } 
      if(ans=='n') 
      { 

       Console.ReadKey(); 
      } 


     } 


     } 
    } 

Таким образом, проблема в том, что мне не очень нравится эта часть, и я не имею никакого представления, как это сделать:

if (factor == 1) 
      { 
       factor = one; 
      }else if (factor == 2) 
      { 
       factor = two; 
      }else if (factor == 3) 
      { 
       factor = three; 
      }else if (factor == 4) 
      { 
       factor = four; 
      }else if (factor == 5) 
      { 
       factor = five; 
      } 

PS Да, я знаю его, вероятно, на самом деле очень плохо, но мой первый try.And, если вы можете дать мне какие-либо советы я буду очень счастлив :)

+0

Я не понимаю ... что не так с кодом? – bitwise

+6

Первый совет начинающему программисту: сделайте себе одолжение и забудьте о ключе 'goto';). Вместо этого используйте цикл. –

+0

Лучше совет, проигнорируйте вышеуказанный комментарий и сделайте то, что вам нужно сделать. Стиль и утонченность наступает позже – bitwise

ответ

1

Использование переключателя условие

switch (factor) 
     { 
      case 1: 
       factor = one; 
       break; 
      case 2: 
       factor = two; 
       break; 
      case 3: 
       factor = three; 
       break; 
      case 4: 
       factor = four; 
       break; 
       default: 
       //default when nothing happens in switch 
       factor = one; 
       break; 
     } 
+0

Спасибо! Я попробую это прямо сейчас. –

0

вы можете сделайте это более «динамичным», создавая массив с разными значениями и соответствующим текстом. Затем просто напечатайте связанный текст со значением столбца массива.

string[] arrayText = { "one", "two", "three", "four", "five"}; 
//Remember than your array start at 0 
factor= factor - 1; 
System.console.WriteLine(arrayText[factor]); 

Я думаю, что это то, что вы хотите! Надеюсь, что я помогу тебе.

0

На месте if/else блока, вы можете использовать Dictionary<string, decimal> где key (строка) ваши ожидаемые входы и value (десятичный) переменная вход соответствует.

Вы можете создать этот словарь по отдельному методу при запуске приложения, так как эти значения не изменятся. Сделайте словарь доступным для остальной части вашей программы (например, с помощью public), и вы можете повторно использовать эту информацию в любом месте, где вам нужно, с той же простой проверкой.

После словаря построен, все, что вам нужно сделать, это проверить, если словарь содержит значение входного сигнала и установите factor1 (или factor2) соответственно:

string input; 
decimal factor1; 

Dictionary<string, decimal> factors = new Dictionary<string, decimal>(); 

factors.Add("1", one); 
factors.Add("2", two); 
factors.Add("3", three); 
factors.Add("4", four); 
factors.Add("5", five); 

input = Console.ReadLine(); 

if (factors.ContainsKey(input)) 
{ 
    factor1 = factors["input"]; 
} 

Вы должны также рассмотреть вопрос о добавлении else состояния где-то строки you screwed up, try again, чтобы побудить пользователя повторно ввести значение.

Кроме того, в вашем текущем коде не используйте повторно переменную factor для ввода и вычисления. Просто возьмите ввод как строку и проверьте на конкретные значения.

За дополнительной помощью я предлагаю CodeReview, как было рекомендовано в комментариях.

1
using System; 

namespace Program 
{ 
    class Program 
    { 
     static decimal[,] factors = new decimal[4, 4] { 
      /*    To Milli  To Micro To Nano, To Pico */ 
      /* From Milli */ { 1m,   1000m,  1000000m, 1000000000m }, 
      /* From Micro */ { 0.001m,  1m,   1000m, 1000000m }, 
      /* From Nano */ { 0.000001m, 0.001m,  1m,  1000m  }, 
      /* From Pico */ { 0.000000001m, 0.000001m, 0.001m, 1m   } 
     }; 

     static void Main() 
     { 
      Console.WriteLine("SI converter!"); 

      while(true) 
      { 
       Console.Write("Please, enter value: "); 
       decimal value = Convert.ToInt32(Console.ReadLine()); 

       Console.Write("\n1) Milli(m)\n2) Micro(µ)\n3) Nano(n)\n4) Pico(p)\nFrom Units: "); 
       int fromUnits = int.Parse(Console.ReadLine()) - 1; 

       Console.Write("To Units: "); 
       int toUnits = int.Parse(Console.ReadLine()) - 1; 

       decimal factor = factors[fromUnits, toUnits]; 
       decimal answer = factor * value; 
       Console.WriteLine("The answer is : " + answer); 

       Console.Write("Go again? (Y/N): ");  
       string ans = Console.ReadLine(); 

       if(ans.ToUpper() == "N") 
        break; 
      } 
     } 
    } 
} 
+0

отчаянно сопротивляется желанию переписать мой пример с помощью goto ...;) – bitwise

0

Вы можете использовать код, подобный этому:

decimal answer; 
decimal[] factorArray = new decimal[] { 1, 0.001m, 0.000001m, 0.000000001m, 0.000000000001m }; 

Console.WriteLine("SI converter!\nPlease, enter value: "); 
decimal value = Convert.ToInt32(Console.ReadLine()); 

Console.WriteLine("\nFactors: \n1.One \n2.Milli(m)\n3.Micro(µ)\n4.Nano(n)\n5.Pico(p)\nEnter factor: "); 
decimal factor = int.Parse(Console.ReadLine()); 
if (factor >= 1 && factor <= factorArray.Length) 
{ 
    factor = factorArray[(int)factor - 1]; 
} 

Console.WriteLine("\nFactors: \n1.One \n2.Milli(m)\n3.Micro(µ)\n4.Nano(n)\n5.Pico(p)\nEnter the second factor: "); 
decimal factor2 = Convert.ToInt32(Console.ReadLine()); 
if (factor2 >= 1 && factor2 <= factorArray.Length) 
{ 
    factor2 = factorArray[(int)factor2 - 1]; 
} 
Смежные вопросы