2013-12-04 4 views
0

В этом случае: Индекс находился за пределами массива. Назначение: Напишите программу, которая определяет количество студентов, которые все еще могут зарегистрироваться в данном классе. Разработайте решение с помощью параллельных массивов. Проверьте свое решение, извлекая следующие данные из текстового файла. Определите класс исключения для этой проблемы, если текущая регистрация превышает максимальную регистрацию более чем на три. Остановите программу и покажите сообщение о том, какой курс переубежден.C# Параллельные массивы данных из текстового файла

Вот исходный код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 

     private static string[] classes = { "CS150", "CS250", "CS270", "CS300", "CS350" }; 

     private static int[] currentEnrolled = { 18, 11, 9, 4, 20 }; 

     private static int[] maxEnrollment = { 20, 20, 20, 20, 20 }; 

     private static int currentEnrollment() 
     { 
      int enrolled = 0; 
      foreach (int i in currentEnrolled) 
      { 
       enrolled += i; 
      } 
      return enrolled; 
     } 
     private static void listClasses() 
     { 
      foreach (string i in classes) 
      { 
       Console.WriteLine("Class: {0}", i); 
      } 
     } 

     private static void ClassStatus() 
     { 
      for (int i = 0; i < currentEnrolled.Length; i++) 
      { 
       Console.WriteLine("Class: {0}, Max: {1}, Current: {2}, remaining: {3}", classes[i], maxEnrollment[i], currentEnrolled[i], maxEnrollment[i] - currentEnrolled[i]); 
      } 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Currently Enrolled: {0}", currentEnrollment()); 
      ClassStatus(); 
      Console.ReadKey(false); 
     } 
    } 
} 

Теперь я редактировал код выше, чтобы взять текстовый файл, а, тем не менее я получаю сообщение об ошибке. Вот что я работаю с:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     private static string[] classes = new string[900]; 
     private static int[] currentEnrolled = new int[900]; 
     private static int[] maxEnrollment = new int[900]; 

     private static int currentEnrollment() 
     { 
      int enrolled = 0; 
      foreach (int i in currentEnrolled) 
      { 
       enrolled += i; 
      } 
      return enrolled; 
     } 
     private static void listClasses() 
     { 
      foreach (string i in classes) 
      { 
       Console.WriteLine("Class: {0}", i); 
      } 
     } 

     private static void ClassStatus() 
     { 
      for (int i = 0; i < currentEnrolled.Length; i++) 
      { 
       Console.WriteLine("Class: {0}, Max: {1}, Current: {2}, remaining: {3}", classes[i], maxEnrollment[i], currentEnrolled[i], maxEnrollment[i] - currentEnrolled[i]); 
      } 
     } 

     static void Main(string[] args) 
     { 
      string[] lines = File.ReadAllLines("classes.txt"); 
      int i = 0; 

      foreach (string line in File.ReadAllLines("classes.txt")) 
      { 

       string[] parts = line.Split(','); 
       while (i < 900 && i < parts.Length) 
       { 
         classes[i] = parts[1]; 
        currentEnrolled[i] = int.Parse(parts[2]); 
        maxEnrollment[i] = int.Parse(parts[3]); 
       } 
        i++; 
      } 

      Console.WriteLine("Currently Enrolled: {0}", currentEnrollment()); 
      ClassStatus(); 
      Console.ReadKey(false); 
     } 
    } 
} 

Некоторые из компонентов, используемых в приведенном выше коде были взяты из этой статьи: Splitting data from a text file into parallel arrays

Текстовый файл выглядит следующим образом:

CS150,18,20 
CS250,11,20 
CS270,32,25 
CS300,4,20 
CS350,20,20 

Любая помощь будут оценены. И да, это задание. Программирование - это, безусловно, не мой сильный костюм.

+0

ли вы попробуйте использовать отладчик для пошагового выполнения кода ? –

+0

Да. Отладчик остановит и выведет вышеуказанную ошибку в следующей строке: 'maxEnrollment [i] = int.Parse (части [3]);' @DanielMann – zordon

+0

Массивы в .NET основаны на нулевом значении: 'parts [0] parts [1 ] parts [2] ', также неверно ваш цикл while. Проверьте индекс 'i'! –

ответ

1

Кажется, что существует много проблем с циклом while.

Во-первых, parts.Length всегда будет 3, так как у вас есть две запятые и разделить на них. Таким образом, состояние i < 900 && i < parts.Length на самом деле не имеет смысла, это как i < 900 and i < 3, поэтому он всегда будет останавливаться на 3. Намерение здесь не совсем понятно. Я думаю, вы хотели бы зацикливать на каждые 900 значений, но fi foreach уже делает это для вас ,

Далее, так как есть 3 части, а массивы C# основаны на 0, это должно быть parts[0], parts[1] и parts[2]. Это то, что вызывают исключение «вне диапазона».

И, наконец, i++; должен находиться в вашей петле while. Если вы оставите его снаружи, вы будете навеки навсегда, поскольку индекс никогда не будет увеличиваться.

В принципе, это должно быть что-то вроде этого:

  while (i < 900) 
      { 
       classes[i] = parts[0]; 
       currentEnrolled[i] = int.Parse(parts[1]); 
       maxEnrollment[i] = int.Parse(parts[2]); 
       i++; 
      } 

Опять же, 900 не совсем понятно, так как вы не имеете 900 значений в каждой строке (помните, что вы в foreach). По-моему, вы могли бы все это поцарапать и тщательно переделать.

Что вам нужно сделать, заключается в следующем:

Read the file and store all the lines 
Foreach line do: 
    Split the line in 3 parts 
    Store each separate part 
Write results 

Для «пользовательского исключения» часть, вы можете добавить:

For the length of currentEnrollment do: 
    If currentEnrollment at current index is superior than maxEnrollment at current index do: 
     Throw a new exception with the className at current index 
+0

Я внесла следующие изменения. Я также изменил 900 на 9. Однако, когда я запускаю программу, она в основном выводит первую строку текстового файла 9 раз. – zordon

+0

Да, потому что вы зацикливаетесь на одной линии. Foreach дает вам каждую линию отдельно, затем вы снова зацикливаетесь с каждой частью. Я добавлю псевдокод, чтобы помочь. –

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