Могу ли я использовать выходные параметры tryParse для заполнения массива в цикле for?

У меня есть домохозяйка, для которой мне нужен еще один набор глаз. Назначение - создать программу, которая запрашивает имя Студента, затем выполняет итерацию через массив дней (String[] days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};), в течение которого каждый день изучается несколько часов. Наконец, программа должна отображать среднесуточное количество часов, изученных за неделю.

Я застрял в методе ввода данных:

public void EnterHours()
 {
 // entry area header
 Console.WriteLine("Enter study hours for {0} ", name);
 for (int i = 0; i < days.Length; i++) 
 {
 Console.Write("{0} study hours: ", days[i]);
 string dailyHours = Console.ReadLine();
 int.TryParse(dailyHours, out hours[i]); // problematic statement
 }
 SumHours(hours);
 }

В настоящее время переменная name является уже установленным свойством; days является String[] выше, и я создавал hours как int[] hours; с тем же объемом, что и days. SumHours - это еще один метод, который принимает int[] hours в качестве параметра и выполняет итерацию через массив, суммирующий значения.

Когда я запускаю программу, отображается консоль

Enter study hours for John Doe

Sunday study hours:

но независимо от того, во что я вхожу, я получаю Null Reference Exception. Я также получаю следующее предупреждающее сообщение:

Warning 1 Field 'Midterm.StudentHour.hours' is never assigned to, and will always have its default value null C:\Users\Dan\Dropbox\_MATC\ITDEV115\Assignments\Midterm\StudentHour.cs 11 15 Midterm

Я пробовал экземпляры hours как int[] hours = new int[7]; но получить ту же ошибку, поэтому я подозреваю, что это что-то с тем, как я выводя синтаксическое целое число, но я не уверен, что посмотреть дальше, чем решить проблему. Идеи? Советы?

5 ответов

Я думаю, это поможет вам:

String[] days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
 Dictionary<string, int=""> hours = new Dictionary<string, int="">();
 for (int i = 0; i < days.Length; i++)
 {
 int dailyHours;
 Console.Write("{0} study hours: ", days[i]);
 while (int.TryParse(Console.ReadLine(), out dailyHours) != true)
 {
 Console.WriteLine("Wrong input,must be only numbers!!!");
 Console.Write("{0} study hours: ", days[i]);
 }
 //if(int.TryParse(Console.ReadLine(),out dailyHours))
 hours.Add(days[i], dailyHours);
 }
</string,></string,>

Вместо строкового массива вы можете использовать перечисление с этими значениями.


Должна быть некоторая ошибка с вашей декларацией, так как int[] hours = new int[7] не должен давать вам исключение с нулевой ссылкой. Используйте возврат TryParse чтобы проверить, был ли вход действителен. Для меня работает следующий код:

string[] days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
string name = "JLe";
int[] hours = new int[7];

Console.WriteLine("Enter study hours for {0} ", name);
for (int i = 0; i < days.Length; i++) {
 Console.Write("{0} study hours: ", days[i]);
 string dailyHours = Console.ReadLine();

 while (!int.TryParse(dailyHours, out hours[i])) {
 Console.Write("Please try again: ");
 dailyHours = Console.ReadLine();
 }
}
SumHours(hours);


Вы не инициализировали массив "часов", прежде чем назначать ему значение.


Ваш код работает нормально. Вот доказательство.


var hours= new strinh[7];
public void EnterHours()
 {
 // entry area header
 Console.WriteLine("Enter study hours for {0} ", name);
 for (int i = 0; i < days.Length; i++) 
 {
 Console.Write("{0} study hours: ", days[i]);

 hours[i]= = Console.ReadLine();
 }
 SumHours(hours);
 }

public void SumHours(string[] hrs)

{
 int i=0;
 foreach(string s in hrs)
 {
 i=i+ParseInt(s);
 }
Console.WriteLine("Total Weekly hours study= "+i);
}

private int ParseInt(string s)
{
 int i =0;
 if(!int.TryParse(s, out i))
 {
 return 0;
 }
 return i;
}

licensed under cc by-sa 3.0 with attribution.