2009-06-04 4 views
4

Я пытаюсь написать простую программу, которая просит пользователя ввести номер, а затем я буду использовать этот номер, чтобы решить, какова будет стоимость билета для их определенного возраста. У меня возникают проблемы при попытке конвертировать строку в int. В противном случае макет программы прекрасен. Какие-либо предложения? благодаряПреобразование String в int

using System; 

class ticketPrice 
{  
    public static void Main(String[] args) 
    { 
     Console.WriteLine("Please Enter Your Age"); 
     int input = Console.ReadLine(); 
     if (input < 5) 
     { 
      Console.WriteLine("You are "+input+" and the admisson is FREE!"); 
     } 
     else if (input > 4 & input < 18) 
     { 
      Console.WriteLine("You are "+input+" and the admission is $5"); 
     } 
     else if (input > 17 & input < 56) 
     { 
      Console.WriteLine("You are "+input+" and the admission is $10"); 
     } 
     else if (input > 55) 
     { 
      Console.WriteLine("You are "+input+" and the admission is $8"); 
     } 
    } 
} 
+1

Помимо моего ответа подумайте об использовании < 5 | > = 5 && < 18 | > = 18 && < 56 | > = 56. Это кажется мне более понятным. –

+1

Возможный дубликат [Как преобразовать String в Int?] (Http://stackoverflow.com/questions/1019793/how-can-i-convert-string-to-int) – crashmstr

ответ

1
int number = int.Parse(Console.ReadLine()); 

Имейте в виду, что это будет сгенерировано исключение, если они ввести неверный номер.

11

Попробуйте метод int.TryParse(...). Это не исключение.

http://msdn.microsoft.com/en-us/library/f02979c7.aspx

Кроме того, вы должны использовать && не & в ваших условиях. && является логическим И и & побитовым И.

+0

&& и & являются логическими символами AND. (См. Комментарий на ответ TheTXI тоже.) –

2
  • Для облегчения разбора строк в intgers (и другие типов номеров) использует метод .TryParse(inputstring, yourintegervariable) того типа числа. Этот метод выведет логическое значение (True/False), дающее вам знать, прошла или не прошла операция. Если результат является ложным, вы можете дать сообщение об ошибке, прежде чем идти дальше (не нужно беспокоиться о сбое вашей программы).

  • Предыдущий текст относительно заявления переключатель был удален

  • В C#, вы должны использовать оператор в & & для логического AND. & не то же самое и может не работать так, как вы полагаете.

+0

Я не вижу, как здесь применим коммутатор, поскольку он не может использоваться для диапазонов (вы думаете о Visual Basic?). Конечно, вы можете использовать провал с пустым случаем, но, учитывая, что в примерной программе для этого требовалось бы 55 case-заявлений плюс значение по умолчанию, вы действительно говорите, что это лучший подход? –

+0

Я мог бы поклясться, что оператор switch разрешен для диапазонов. После некоторой двойной проверки, похоже, это не так. Спасибо, что привлекли к моему вниманию :) – TheTXI

+1

Оба оператора - & и && - являются своего рода логическим оператором AND. & является «реальным» логическим оператором AND && является условным логическим И. В то время как & всегда вычисляет оба операнда && evalutes правый операнд, только если левый операнд оценивается как true. Таким образом, это зависит от того, что вы должны использовать. Если операнды не имеют побочных эффектов, и между операндами нет зависимостей, они являются функциональными эквивалентами (но && может сэкономить некоторые операции). –

0

Первое, что вам нужно сделать, это изменить input переменную в строку:

string input = Console.ReadLine(); 

После того, как у вас есть, что есть несколько способов, чтобы преобразовать его в целое число. См. Этот ответ для получения дополнительной информации:
Better way to cast object to int

1

Предлагаю использовать метод Int32.TryParse(). Далее я предлагаю реорганизовать ваш код - вы можете сделать его намного чище (при условии, что это не только пример кода). Одним из решений является использование списка пары ключевых значений для сопоставления от возраста к поступлению.

using System; 
using System.Collections.Generic; 
using System.Linq; 

static class TicketPrice 
{ 
    private static readonly IList<KeyValuePair<Int32, String>> AgeAdmissionMap = 
     new List<KeyValuePair<Int32, String>> 
      { 
       new KeyValuePair<Int32, String>(0, "FREE!"), 
       new KeyValuePair<Int32, String>(5, "$5."), 
       new KeyValuePair<Int32, String>(18, "$10."), 
       new KeyValuePair<Int32, String>(56, "$8.") 
      }; 

    public static void Main(String[] args) 
    { 
     Console.WriteLine("Please Enter Your Age!"); 

     UInt32 age; 
     while (!UInt32.TryParse(Console.ReadLine(), out age)) { } 

     String admission = TicketPrice.AgeAdmissionMap 
      .OrderByDescending(pair => pair.Key) 
      .First(pair => pair.Key <= age) 
      .Value; 

     Console.WriteLine(String.Format(
      "You are {0} and the admission is {1}", 
      age, 
      admission)); 
    } 
} 

Я использовал целое число без знака для предотвращения ввода отрицательных возрастов и ввода ввода в цикл. Таким образом, пользователь может исправить недопустимый ввод.

+0

Да, хорошо сделано для того, чтобы указать на необходимость реорганизации кода в OP. – Noldorin

 Смежные вопросы

  • Нет связанных вопросов^_^