0

配列の長さに基づいて計算を行う必要があるメソッドがあります。計算に .length メソッドを使用していますが、このメソッドは配列の最大長 (10 と宣言しました) を使用して演算を行っています。これは、ユーザーからデータを取得するために使用しているループです。配列データを並べ替えるのが理想的な方法ではないことはわかっていますが、これは宿題のためであり、.Split メソッドを正しく使用することを中心に展開しています (これは私が抱えている問題ではありません)。

for (int i = 0; i < MAX; i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        // If nothing is entered, it will break the loop.
        break; 
    }

    // Splits the user data into 2 arrays (integer and string).
    string[] separateInput = input.Split();
    name [i] = separateInput[0];
    score [i] = int.Parse(separateInput[1]);
}

平均スコアを計算するために使用している方法は次のとおりです。

static void CalculateScores(int[] score)
{
    int sum = 0;
    int average = 0;
    for (int i = 0; i < score.Length; i++)
    {
        sum += score[i];
        average = sum / score.Length;
    }

    Console.WriteLine("The average score was {0}", average);

私は次のようにメソッドを呼び出しています:

    CalculateScores(score);

編集:私の配列は宣言されています:

    int[] score = new int[MAX]; //MAX == 10.
    string[] name = new string[MAX];

CalculateScores メソッドは、スコアの異なる組み合わせをコンソールにいくつ入力しても、score.Length が常に 10 であるかのように計算を行っています。入力を収集するためのループが正しく行われていないためなのか、CalculateScores メソッドに欠陥があるためなのかはわかりません。前もって感謝します。

編集:明確にするために、CalculateScoresから正しい値を取得できない理由に混乱しています。

4

3 に答える 3

5

Length常に配列のサイズを表します。10 としてインスタンス化した場合、埋めたアイテムの数に関係なく、常に 10 になります。

問題を解決する方法はたくさんありますが、計算に長さを使用せず、アイテムの数を別の変数に格納するという単純な方法を使用します。

int numItems = 0;
for(int i=0;i<MAX;i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        break; // if nothing is entered, it will break the loop
    }
    numItems++;
    ...
}

static void CalculateScores(int[] score, int numItems)
{
    // don't use Length at all, use numItems instead
}
于 2013-03-25T17:26:58.023 に答える
2

配列は通常、固定サイズのデータ​​に使用されるため、Lengthプロパティは、配列内の要素の量ではなく、配列が保持できるアイテムの数を反映します。最も簡単な修正はList(T)、代わりに可変長データに使用される を使用することです。

// A nice abstraction to hold the scores instead of two separate arrays.
public class ScoreKeeper
{
    public string Name { get; set; }
    public int Score { get; set; }
}

var scores = new List<ScoreKeeper>();

for (int i = 0; i < MAX; i++)
{
    Console.Write("Enter a name and a score for player #{0}: ", (i + 1));
    string input = Console.ReadLine();
    if (input == "")
    {
        // If nothing is entered, it will break the loop.
        break; 
    }

    // Splits the user data into 2 arrays (integer and string).

    string[] separateInput = input.Split();

    scores.Add(new ScoreKeeper { Name = separateInput[0], Score = int.Parse(separateInput[1]) });
}

static void CalculateScores(ICollection<ScoreKeeper> scores)
{
    // We take advantage of Linq here by gathering all the
    // scores and taking their average.
    var average = scores.Select(s => s.Score).Average();
    Console.WriteLine("The average score was {0}", average);
}
于 2013-03-25T17:35:43.697 に答える
0

手動でチェック:

int sum = 0;
int average = 0;
int length;
for (int i = 0; i < MAX; i++) {
    if(name[i]!=string.empty) {
        sum += score[i];
        length=i+1;
    }       
}
average = sum / length;
Console.WriteLine("The average score was {0}", average);
于 2013-03-25T17:33:51.837 に答える