2015-01-22 3 views
2

Я пытаюсь создать простую программу для вычисления среднего значения. Пользователь должен ввести положительное число, затем я создаю цикл для суммирования от 0 до введенного числа. Тогда среднее - это сумма, деленная на введенное число.C# переменная int принимает другое значение

Проблема: когда я ввожу число, например, 10, переменная становится 58. Для любого значения, которое я вводил, оно всегда добавляет 48. У кого-нибудь есть ключ к этой проблеме?

Вот код:

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

namespace inClass1 
{ 
    class Loops 
    { 
     static void Main(string[] args) 
     { 
      int total = 0; 
      int num; 
      Console.Write("Enter a positive number: "); 

      num = Convert.ToInt32(Console.Read()); 

      for (int i = 0; i <= num; i++) 
      { 
       total = total + i; 
      } 

      double average = total/(double)num; 
      Console.WriteLine("The average is = " + average); 
      Console.ReadLine(); 
     } 
    } 
} 
+5

Хорошая возможность узнать о [кодах ASCII] (https://en.wikipedia.org/wiki/ASCII), о чем должен знать каждый программист. –

+1

Это сделало бы отличный вопрос для интервью ... – Ryan

+0

@HansPassant Я почтительно не согласен. Я не думаю, что многие программисты должны знать об ASCII. Но почти все нужно знать о [Unicode] (http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF). –

ответ

5

Это потому, что Console.Read метод читает первый char и возвращает его значение ASCII. И он только читает один char, поэтому вы не можете читать более одного номера одновременно. Чтобы исправить это просто использовать Console.ReadLine взять string в качестве входных данных:

um = Convert.ToInt32(Console.ReadLine()); 

В случае, когда пользователь вводит неверный номер это будет ошибкой. Чтобы предотвратить это, вы можете изучить метод int.TryParse.

+0

Спасибо @ Selman22, это сработало! Я посмотрю на метод int.Parse! –

1

Проблема в том, что вы используете Console.Read.

Этот метод возвращает int, а не string. Этот int является кодом символа Unicode символа чтения. Перегрузка Convert.ToInt32, которая принимает Int выглядит следующим образом:

public static int ToInt32(int value) { 
     return value; 
    } 

(Reference Source)

Это означает, что его просто возвращая переданное значение (вместо разбора). Unicode «1» является числом 49.

Вместо этого используйте Console.ReadLine, которые в дополнении к получению всего входа (а не только первый символ) возвращает строку, так что int.Parse называется на ней вместо литья при использовании Convert.ToInt32.

+0

нет, Чтение возвращает int char. –

+0

@ Selman22 Ничего себе, это то, что я получаю не для того, чтобы тщательно * читать документы. Исправлена. – BradleyDotNET

+0

Не ASCII; Unicode (после перевода на консоль.InputEncoding). –

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