Завершение цикла с помощью часового и разбор входной строки как целого числа
Я пытаюсь постоянно спрашивать пользователя о числе между 300-850. Когда пользователь введет действительное число, добавьте его к итогу и спросите снова. Если номер недействителен, отобразите ошибку. Перед завершением программы отобразите среднее общее количество по количеству вводимых данных. Завершить программу, если пользователь вводит значение часового. Я не знаю, как проверить, вводит ли пользователь значение часового.
using System;
class CreditScores
{
static void Main()
{
var iterations = 0;
double total = 0;
int sum = 0;
double average = 0;
int count = 0;
Console.WriteLine("Enter value between 300 to 850.");
int first = int.Parse(Console.ReadLine());
//trying to get it to stop when sentinel value reached.
while (iterations < 1000)
{
iterations++;
Console.WriteLine("Enter value between 300 to 850.");
int input = int.Parse(Console.ReadLine());
//not sure how to check if input is a number or not
if(input == integer)
{
if( input < 850 && input > 300 )
{
total +=input;
}
}
else
{
break;
}
}
total = sum + total;
Console.WriteLine("Total is {0}", total);
average = total / count;
Console.WriteLine("The average is {0}", average);
}
}
4 ответа
Модификация / исправление вашего метода
Кроме того, я бы прочитал весь путь до конца для более надежного метода, который вы могли бы использовать.
Первое, что я хотел бы изменить:
while (iterations < 1000)
{
...
}
Для этого (что мы еще не сделали, прочитайте до конца):
while (input != "calculate") // or some other string
{
...
}
Затем, прежде чем while
начинается, сделать input
string
,
string input = "";
while (input != "calculate") // or some other string
{
...
}
Теперь мы объявили input
переменная, которая уже int
позже. Давайте это исправим.
Console.WriteLine("Enter value between 300 to 850.");
input = Console.ReadLine();
int value = 0;
if (int.TryParse(input, out value))
{
// Clearly it's a valid integer at this point
if (value < 850 && value > 300)
{
total += value;
}
}
else
{
// Wasn't a number, might be our sentinel.
if (input == "calculate")
break;
else
{
// Throw an error or something.
}
}
Теперь нам нужно собрать это вместе и сделать уборку.
int total = 0;
int numbersEntered = 0;
string input = "";
while (input != "calculate")
{
Console.WriteLine("Enter value between 300 to 850.");
input = Console.ReadLine();
int value = 0;
if (int.TryParse(input, out value))
{
// Clearly it's a valid integer at this point
if (value < 850 && value > 300)
{
total += value;
numbersEntered++;
}
}
else
{
// Wasn't a number, might be our sentinel.
if (input == "calculate")
break;
else
{
// Throw an error or something.
}
}
}
Console.WriteLine("Total is {0}", total);
double average = (double)total / numbersEntered;
Console.WriteLine("The average is {0}", average);
(Я знаю, длинный ответ. Но это должно помочь вам разобраться с проблемой в будущем. Кроме того, я написал все это по памяти, я не могу гарантировать, что это скомпилируется.)
Обновление: только что проверил, работает как положено.
Более надежный метод
Наконец, и это действительно самый крутой метод, на мой взгляд, использовать List<int>
и некоторые методы расширения.
List<int> values = new List<int>();
string input = "";
while (input != "calculate")
{
Console.WriteLine("Enter value between 300 to 850.");
input = Console.ReadLine();
int value = 0;
if (int.TryParse(input, out value))
// Clearly it's a valid integer at this point
if (value < 850 && value > 300)
values.Add(value);
else
{
// Was outside our range
}
else
// Wasn't a number, might be our sentinel.
if (input == "calculate")
break;
else
{
// Throw an error or something.
}
}
Console.WriteLine("Total is {0}", values.Sum());
Console.WriteLine("The average is {0}", values.Average());
Преимущества этого метода? Сохраняет список введенных значений, что позволяет вам делать больше с ними, чего вы не можете сделать с помощью метода, который вы используете в настоящее время. Он также использует int.Sum()
а также int.Average()
методы расширения, а не ваша собственная математика.
Что это int.TryParse(string, out int)
колдовство?
int.TryParse(string, out int)
метод (как определено в MSDN) будет принимать вход string
и возвращает логическое значение, которое указывает, будет ли оно сделано действительным int
структура или нет.
В случае, если string
является действительным int
тогда int
Параметр заполняется целочисленным представлением string
,
То есть:
string myString = "100";
int value = 0;
if (int.TryParse(myString, out value))
Console.WriteLine("myString was a valid int: {0}", value);
else
Console.WriteLine("myString was not a valid int.");
Эта версия вернется true
и распечатать: myString was a valid int: 100
,
Пример 2:
string myString = "blah";
int value = 0;
if (int.TryParse(myString, out value))
Console.WriteLine("myString was a valid int: {0}", value);
else
Console.WriteLine("myString was not a valid int.");
Эта версия вернется false
и распечатать myString was not a valid int.
, value
переменная также будет 0
,
Предупреждение:
Когда используешь int.TryParse(string input, out int value)
, не полагайтесь на value
параметр как 0
указать на неудачу. Если input
является "0"
тогда value
также будет 0
и метод вернется true
,
Вы хотите установить состояние вашего while
цикл к чему-то, что пользователь может вызвать как ложное (страж).
Затем положить for
Цикл внутри, если вы хотите выполнить заданное количество итераций, циклы for лучше подходят для ситуаций, когда вы знаете, сколько итераций вы делаете.
НО, если вы хотите придерживаться только циклов while, вот небольшой фрагмент кода, который вы можете использовать:
while (input != 0 && iterations < 1000) //or some sentinel value you choose
{
//Your logic here, now the loop will quit if if the user enters 0
//OR you run out of iterations
}
using System;
class CreditScores
{
static void Main()
{
double total = 0;
int sum = 0;
int count = 0;
Console.WriteLine("Enter value between 300 to 850.");
int first = int.Parse(Console.ReadLine());
//trying to get it to stop when sentihel value reached.
for (iterations = 0; iterations < 1000; iterations++)
{
Console.WriteLine("Enter value between 300 to 850.");
int input;
// Check number is integer
if (int.TryParse(Console.ReadLine(), out input)
{
if(input > 300 && input < 850)
{
total +=input;
}
}
else
{
break;
}
count++;
}
total = sum + total;
Console.WriteLine("Total is {0}", total);
double average = total/count;
Console.WriteLine("The average is {0}", average);
Console.ReadLine(); // Either this or run with Ctrl-F5
}
}
Поведением будет добавление итогов, пока пользователь не введет что-то, что не может быть проанализировано, и затем выход.
Это работает?
string sentinalValue = "done";
string input = "";
while (iterations < 1000 && input != sentinalValue)
{
iterations++;
Console.WriteLine("Enter value between 300 to 850.");
input = Console.ReadLine();
int value;
if (int.TryParse(input, out value))
{
if( value < 850 && value > 300 )
{
total +=input;
}
}
else
{
Console.WriteLine("That is not a number!");
}
}