2016-11-27 3 views
-1

Мне нужно добавить некоторые целые числа в ArrayList, прежде чем 1-й средний не будет выше или немного ниже, чем во 2-м среднем. Но в конце концов, когда мне нужно выводить все элементы, я не могу этого сделать. Я попытался использовать List<> вместо ArrayList, но у меня были проблемы с выходом.Невозможно вывести элементы из списка <int>

Вот мой код:

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

namespace Marks 
{ 
    internal class Program 
    { 
     public static float AverageOfArrayList(ArrayList Array) 
     { 
      float AverageOfArrayList = 0; 
      float Sum = 0; 

      foreach (int item in Array) 
      { 
       Sum += item; 
      } 
      AverageOfArrayList = Sum/Array.Count; 
      return AverageOfArrayList; 
     } 
     public static ArrayList GetVariables(ArrayList NewMarksList, float CurrentAverage, double MissedAverage) 
     { 
      if (CurrentAverage > MissedAverage) 
      { 
       for (int i = 0; MissedAverage < AverageOfArrayList(NewMarksList) ; i++) 
       { 
        NewMarksList.Add(2); 
       } 
      } 

      if (CurrentAverage < MissedAverage) 
      { 
        for (int i = 0; AverageOfArrayList(NewMarksList) < MissedAverage; i++) 
        { 
        NewMarksList.Add(5); 
        } 
      } 
      return NewMarksList; 
     } 
     static void Main(string[] args) 
     { 
      float CurrentAverage = 0; 
      double MissedAverage = 0; 
      ArrayList CurrentMarksList = new ArrayList(); 


      Console.WriteLine("Enter how much marks have you got"); 
      int CountOfMarks = Convert.ToInt16(Console.ReadLine()); 

      Console.WriteLine("Enter the 1-st average"); 
      CurrentAverage = float.Parse(Console.ReadLine()); 

      Console.WriteLine("Enter the 2-nd average"); 
      MissedAverage = Convert.ToDouble(Console.ReadLine()); 

      ArrayList newList = GetVariables(CurrentMarksList, CurrentAverage, MissedAverage); 
      List<int> OutputArray = newList.Cast<int>().ToList(); 

      Console.WriteLine("Marks to add :"); 

      for (int OutputCounter = 0; OutputCounter < OutputArray.Count; OutputCounter++) 
      { 
       Console.Write(OutputArray[OutputCounter] + " "); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 

входы, которые я использовал для тестирования программы:

CountOfMarks = 5; 
CurrentAverage = 3,4; 
MissedAverage = 3,8; 

Output = Nothing 
+1

Вы можете добавить то, что входы приведены в этой программе и что ожидаемый выход? – Steve

+0

«Были проблемы с», можете ли вы быть более конкретным? Какая проблема? –

+1

Я вижу большую проблему в ваших циклах внутри метода GetVariables. На первой итерации _NewMarksList_ пуст. Это означает, что деление в AverageOfArrayList (Sum/Array.Count) равно 0/0 и дает NaN. Тем не менее, совершенно неясно, чего вы пытаетесь достичь здесь. Поэтому, возможно, вам следует лучше объяснить, какова цель этого кода. – Steve

ответ

0

Это было eaiser, если вы могли бы дать также пример для ввода, что вы ожидали, и что происходит в реальность.

Это, как я инициализируюсь параметры:

CountOfMarks = 3 
CurrentAverage = 4 
MissedAverage = 5 

Кстати нет необходимости передавать пустой список в функцию, а затем возвращает новый список.
Вы можете объявить пустой список внутри функции локальной переменной.

Есть две большие проблемы с этим кодом:

Разделительные на ноль

Внутри GetVariables(...) вы использовали AverageOfArrayList(NewMarksList).
Проблема в том, что вы передаете пустой массив этой функции.
Счет пустого массива равен нулю и Вы разделили число с нулевым номером ( Sum/Array.Count), которое составляет незаконно..

Таким образом, вы не можете отправить пустой массив в AverageOfArrayList(...).

Я решил это, просто добавив o_NewMarksList.Add(...) перед циклом for и увеличив индекс до i = 1 в качестве альтернативы.
Это позволит вам отправить массив, содержащий в списке один элемент.
Я также объявил пустой список локальной переменной.

Unchangeable условие для цикла вызывают бесконечный цикл


Вы положили в состоянии for цикла в среднем, который всегда будет то же самое.
В первом цикле среднее значение всегда будет 2, а во втором цикле оно всегда будет 5.
Это приведет к тому, что циклы будут работать бесконечно.
Чтобы решить это, нам нужно понять, что вы действительно хотели сделать.

Альтернативное решение (решение только деление на ноль):

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

namespace Marks 
{ 
    internal class Program 
    { 
     public static float AverageOfArrayList(ArrayList Array) 
     { 
      float AverageOfArrayList = 0; 
      float Sum = 0; 

      foreach (int item in Array) 
      { 
       Sum += item; 
      } 
      AverageOfArrayList = Sum/Array.Count; 
      return AverageOfArrayList; 
     } 
     public static ArrayList GetVariables(float CurrentAverage, double MissedAverage) 
     { 
      ArrayList o_NewMarksList = new ArrayList(); 
      if (CurrentAverage > MissedAverage) 
      { 
       o_NewMarksList.Add(2); 
       for (int i = 1; MissedAverage < AverageOfArrayList(o_NewMarksList); i++) 
       { 
        o_NewMarksList.Add(2); 
       } 
      } 

      if (CurrentAverage < MissedAverage) 
      { 
       o_NewMarksList.Add(5); 
       for (int i = 1; AverageOfArrayList(o_NewMarksList) < MissedAverage; i++) 
       { 
        o_NewMarksList.Add(5); 
       } 
      } 
      return o_NewMarksList; 
     } 
     static void Main(string[] args) 
     { 
      float CurrentAverage = 0; 
      double MissedAverage = 0; 



      Console.WriteLine("Enter how much marks have you got"); 
      int CountOfMarks = Convert.ToInt16(Console.ReadLine()); 

      Console.WriteLine("Enter the 1-st average"); 
      CurrentAverage = float.Parse(Console.ReadLine()); 

      Console.WriteLine("Enter the 2-nd average"); 
      MissedAverage = Convert.ToDouble(Console.ReadLine()); 

      ArrayList newList = GetVariables(CurrentAverage, MissedAverage); 
      List<int> OutputArray = newList.Cast<int>().ToList(); 

      Console.WriteLine("Marks to add :"); 

      for (int OutputCounter = 0; OutputCounter < OutputArray.Count; OutputCounter++) 
      { 
       Console.Write(OutputArray[OutputCounter] + " "); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 

РЕДАКТИРОВАТЬ (30.11.2016):
Вторая попытка:

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

namespace Marks 
{ 
    internal class Program 
    { 
     public static float AverageOfArrayList(ArrayList Array) 
     { 
      float AverageOfArrayList = 0; 
      float Sum = 0; 

      foreach (int item in Array) 
      { 
       Sum += item; 
      } 
      AverageOfArrayList = Sum/Array.Count; 
      return AverageOfArrayList; 
     } 
     public static ArrayList GetVariables(float CurrentAverage, double MissedAverage) 
     { 
      ArrayList o_NewMarksList = new ArrayList(); 
      if (CurrentAverage >= MissedAverage) 
      { 
       o_NewMarksList.Add(2); 
       for (int i = 1; MissedAverage < AverageOfArrayList(o_NewMarksList); i++) 
       { 
        o_NewMarksList.Add(2 + i); 
       } 
      } 

      if (CurrentAverage <= MissedAverage) 
      { 
       o_NewMarksList.Add(5); 
       for (int i = 1; AverageOfArrayList(o_NewMarksList) < MissedAverage; i++) 
       { 
        o_NewMarksList.Add(5 + i); 
       } 
      } 
      return o_NewMarksList; 
     } 
     static void Main(string[] args) 
     { 
      float CurrentAverage = 0; 
      double MissedAverage = 0; 

      //Console.WriteLine("Enter how much marks have you got"); 
      //int CountOfMarks = Convert.ToInt16(Console.ReadLine()); 

      Console.WriteLine("Enter the 1-st average"); 
      // CurrentAverage = float.Parse(Console.ReadLine()); 

      Console.WriteLine("Enter the 2-nd average"); 
      // MissedAverage = Convert.ToDouble(Console.ReadLine()); 


      //ArrayList newList = GetVariables(CurrentAverage, MissedAverage); 
      ArrayList newList = GetVariables(3, 3); 
      List<int> OutputArray = newList.Cast<int>().ToList(); 

      Console.WriteLine("Marks to add :"); 

      for (int OutputCounter = 0; OutputCounter < OutputArray.Count; OutputCounter++) 
      { 
       Console.Write(OutputArray[OutputCounter] + " "); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
+0

Ну, это исправит проблему NaN, но проблема сейчас еще хуже. Код вводится в бесконечный цикл, если вы используете что-то более крупное, например 12 и 42 для двух входов. Есть ли у вас какие-либо идеи относительно того, что OP хочет сделать здесь? Я нет. – Steve

+0

Другими словами. Если вы вставляете в пустой массив в 100 раз значение 5, то какое среднее значение? И когда это среднее позволит коду выйти из условия цикла ?. – Steve

+0

Да. Вы правы. Проблема в том, что он ставит условие в среднем, которое всегда будет одинаковым. В первом цикле среднее значение всегда будет равно 2, а во втором цикле всегда будет 5. Я также не знаю, что он хочет сделать, но условие циклов for должно быть изменено. – E235

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