2015-08-04 5 views
0

Я начинающий программист и пытаюсь создать базовую программу калькулятора. Калькулятор включает в себя циклы и TryParsing, потому что я хочу, чтобы программа записывала в консоль простое сообщение об ошибке, если пользователь решает ввести неправильный ввод.C# char/string Parsing issue

Все работает нормально, за исключением случаев, когда я пытаюсь создать переменную для Оператора.

В настоящее время я имею его как переменную char, названную: char arithmeticOperator;

Для ввода оператора части доступа пользователей, мой код это:

while (decision == false) 
{ 
    Console.Write("Choose an Operator (+ - * /) : "); 
    decision = char.TryParse(Console.ReadLine(), out arithmeticOperator); 

    if (decision == false) 
    { 
     Console.WriteLine("Not an Operator, try again..."); 
    } 
} 

Это работает для number1 и Number2 переменные, не вопрос.

Но я получаю ошибку во время «если» заявление части ...

if (arithmeticOperator == '+') 
{ 
    Console.WriteLine(num1 + num2); 
} 

arithmeticOperator имеет красную волнистую линию под говоря «Использование неназначенную локальной переменной».

Я посмотрел на это и понял, что символ не может быть пустым, поэтому я дал определенное значение для тестирования; когда программа запускается, если я использую действительные арифметические операторы, программа работает так, как должна; если я использую что-либо еще, например, любой другой символ, программа перезагружается.

Я попытался использовать строку вместо этого, но вы не можете TryParse строку, и я не могу найти решение для строки.

Мне не нужна ошибка исключения, поэтому я избегал использования Parse for string. Я также хочу сообщить пользователю, вставили ли они неправильный ввод, выписав на консоль «Invalid Input, try again».

У меня есть 2 вопроса ...

  1. Как я могу применить Char специально, чтобы использовать только арифметические операторы (+, -, *, /). Если введены какие-либо другие одиночные номера символов или текстовые буквы, он должен отображать текстовую ошибку в консоли.
    Возможно ли это?

  2. Если у меня есть переменная с именем: string choice = "YES";
    Как я могу использовать строку, чтобы, если пользователь вводит что-то другое, кроме «YES», для отображения ошибки на консоли без ошибки исключения?

Мне не нужно использовать оба символа и строку, но это было бы полезно знать в будущем. Надеюсь, это имело смысл, извините за столько информации.

+0

You знаю C не C# не C++ не Objective C не C ...? Не добавляйте теги для разных языков! – Olaf

+0

Простите, что не подумал. Больше не повторится. – YuriyKurri

ответ

0

Вот решение, которое может работать для вас:

static void Main(string[] args) 
{ 
    char arithmeticOperator; 
    bool decision = false; 
    while (decision == false) 
    { 
     Console.Write("Choose an Operator (+ - * /) : "); 
     char.TryParse(Console.ReadLine(), out arithmeticOperator); 


     switch (arithmeticOperator) 
     { 
      case '+': 
      case '-': 
      case '*': 
      case '/': 
       decision = true; 
       break; 
      case '\0': 
       Console.WriteLine("Error!!! Value is a string."); 
       decision = false; 
       break; 
      default: 
       decision = false; 
       break; 
     } 

     if (decision == false) 
     { 
      Console.WriteLine("Not an Operator, try again..."); 
     } 
    } 
} 

Некоторые примечания:

  • arithmeticOperator объявлен как символ только
  • использованием switch для проверки между случаями оператора (+ - * /)
  • переменная decision не зависит от результата char.TryParse() вместо switch-case условный поток

Для красной волнистой предупреждение , это состояние, при котором ваша переменная arithmeticOperator не назначено какое-либо значение, прежде чем она была использована. В приведенном выше примере кода декларация пуста ('\ 0' для символа), но вы увидите, что bool decision = false;, который всегда обрабатывает цикл while, следовательно, arithmeticOperator всегда будет иметь значение, чтобы оно не содержало никаких предупреждений. не назначенной локальной переменной).

1) Для вашего первого вопроса, чтобы проверить, введен ли символ, строка. Да, можно проверить через символ \0. Вы можете добавить этот случай:

case '\0': 
    Console.WriteLine("Error!!! Value is a string."); 
    decision = false; 
    break; 

2) Для вашего второго вопроса, то я не уверен, если я это ясно, но вот фрагмент кода, чтобы принять string и получить ответ YES, еще есть ошибка выводимый:

string choice = "YES"; 
string answer = null; 
while (true) 
{ 
    answer = Console.ReadLine(); 
    if (answer.Trim().ToUpper().Equals(choice)) 
    { 
     break; 
    } 
    else 
    { 
     Console.WriteLine("Error, say YES"); 
    } 
} 
+0

Я предлагаю держаться подальше от операторов switch, это может быть написано более элегантно с использованием словаря ' –

+0

@AydinAdn, в то время как я согласен, что' Словарь' можно использовать для написания его элегантно, тот, кто спрашивает, говорит, что он/она является программистом-новичком. Я бы предположил, что мы начнем с основ. –

+1

Я наконец-то справился, спасибо всем! Он работает, как кажется. Мне все еще нужно исправить разделяющую часть, чтобы она делилась правильно, а не делилась на 0. Но кроме этого она работает! Как добавить код в ответы? Могу ли я добавить его как «Ответ» ниже? – YuriyKurri

1

Не видя больше кода, это звучит, как вы случайно положили ваш код, чтобы проверить для «+» вне блока кода, в котором определяется 'arithmeticOperator. Либо переместите этот код внутри блока кода, где объявлен арифметическийоператор, либо переместите декларацию на более широкую область.

-1

Когда вы объявляете переменные, каждая переменная должна быть инициализирована первая:

char arithmeticOperator = '\0'; // this is the default value for char 
bool decision = false; 

Это делает каждую переменную что-то, которые затем могут быть использованы позже. Если вы не инициализирует их (вроде так):

char arithmeticOperator; 

, то они не могут быть назначены новые значения, потому что они не имеют никакого значения, которое может быть назначено.

Есть пути вокруг этого, как некоторые других ответов предоставляет, но это хорошая практика, чтобы попасть в - Всегда присваивает переменным значение , даже если это простоnull

+0

В C# переменные инициализируются значениями по умолчанию (null для ссылочных типов, меняется для типов значений), если не указано начальное значение. – neontapir

+0

Символ 'char' не может быть пустым в C#. –

+0

Согласовано, 'char' - это тип значения, а не ссылочный тип. Его значение по умолчанию - «\ 0». В документах: «Каждый тип значения имеет неявный конструктор по умолчанию, который инициализирует значение по умолчанию этого типа». https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx – neontapir