2016-11-27 2 views
-1

1番目の平均が2次の平均よりも高くないか少し下回る前に、いくつかの整数をArrayListに追加する必要があります。しかし、最終的に、私はすべての要素を出力する必要がある私はそれを行うことはできません。私はArrayListの代わりにList<>を使用しようとしましたが、出力に問題がありました。リストから要素を出力できません

ここに私のコードです:私は、テストプログラムに使用

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メソッド内のループで大きな問題が発生することがあります。 _NewMarkList_は最初の反復では空です。これは、AverageOfArrayList(Sum/Array.Count)の除算が0/0であり、NaNを生成することを意味します。それでも、ここで何を達成しようとしているのかは完全には分かりません。したがって、おそらくあなたはこのコードの目的が何であるかをよりよく説明するべきです。 – Steve

答えて

0

あなたが入力のためにも例を与えることができればそれはあなたが期待したもの、eaiserだったと何がで起こります現実。

これは私がパラメータを初期化する方法である:

CountOfMarks = 3 
CurrentAverage = 4 
MissedAverage = 5 

ところで関数に空のリストを渡してから、新しいリストを返す必要はありません。
関数内の空のリストをローカル変数として宣言できます。

GetVariables(...)内部ゼロ

によって数を割るあなたが AverageOfArrayList(NewMarksList)使用:このコードを持つ2つの大きな問題があり

です。
空の配列をこの関数に渡しているという問題があります。
空の配列の数が0であり、(Sum/Array.Count)の数値をに分割した場合、が違法です。

したがって、空の配列をAverageOfArrayList(...)に送信することはできません。

forループの前にo_NewMarksList.Add(...)を追加するだけで解決し、インデックスをi = 1に変更することもできます。
これは、リスト1の要素を持つ配列を送信し続けるでしょう。
空リストをローカル変数として宣言しました。あなたがforループ常に同じになります平均の状態に置かループ原因無限ループ

の場合で

変更不可状態。
最初のループで平均値は常に2になり、2番目のループでは常に5になります。
これにより、ループが無限に実行されます。
これを解決するには、あなたが本当にやりたいことを理解する必要があります。 (ゼロによる除算のみを解く)

代替ソリューション

EDIT(30.11。2016):
2回目の試行:

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問題を修正しますが、問題はさらに悪化しています。 2つの入力に対して12と42のようなもっと大きなものを使用すると、コードは無限ループに入ります。あなたはここでOPが何をしたいのか考えていますか?私はいません。 – Steve

+0

つまり、空の配列に値5の100倍を挿入すると、平均は何ですか?そして、この平均がループ状態からコードを終了させることを許すでしょうか? – Steve

+0

はい。そうです。 問題は、彼はいつも同じになる平均を条件に入れていることです。 最初のループでは、平均は常に2になり、第二のループにそれは常に私も彼が何をしたいのか知らないが、forループの条件は変更でなければなりません5. になります。 – E235

関連する問題