0

Splitボウリングのスコア (整数) とユーザーの名前をスペースで区切って収集し、メソッドを使用してそれぞれを配列に並べ替えるプログラムを作成するように指示されました。出力は、平均スコアを見つけてコンソールに出力し、スコア (および名前) を最低から最高の順に並べ替えるようにフォーマットする必要があります。

名前を対応するスコアでソートする方法を見つけることを除いて、私はすべてを行うことができました。

これが私がこれまでに持っているものです。明確にするために、名前の配列の並べ替えアルゴリズムを作成するのに助けが必要です。

using System;

class Program
{
    //class variables
    const int MAX = 10;

    static void Main()
    {
        //declare array
        int[] score = new int[MAX];
        string[] name = new string[MAX];

        //program prologue
        Console.WriteLine("****************Bowling Project****************");
        Console.WriteLine("Please enter a name and a score for each player. For example 'John 145'.\nHit enter when you are done.");

        //for loop to get input
        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
            }
            //split the user data into 2 arrays (integer and string)
            string[] separateInput = input.Split();
            name[i] = separateInput[0];
            score[i] = int.Parse(separateInput[1]);
        }

        Console.WriteLine("\n****************Input Complete****************");

        //calculate the average score and send to the console
        CalculateScores(score);

        Console.WriteLine("The scores for the game are:");

        //sort the scores
        BubbleSort(score);


        Console.ReadLine();
    }//End Main()
    //CalculateScores Method
    //Calculates the average score of an array of integers
    //Takes an array of integers as parameters
    //Returns void
    //Outputs the average to the console
    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);
    }//End calculateScores

    //Swap method
    //Takes 2 integers as parameters
    //Switches the value of 2 integers (a and b)
    static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }

    //BubbleSort method
    //Sorts an array of integers
    //Takes an array of integers as a parameter
    //Returns void
    //Outputs to the console
    static void BubbleSort(int[] score)
    {

        for (int j = 0; j < score.Length -1; j++)
        {
            for (int i = 0; i < score.Length - 1; i++)
            {
                if (score[i] > score[i + 1])
                {
                    Swap(ref score[i], ref score[i + 1]);
                }
            }
        }
        foreach (int a in score)
            Console.WriteLine("{0}", a);
        Console.ReadLine();
    }
}//End class Program
4

4 に答える 4

2

names[]が と1 対 1 で対応すると仮定するとscore[]:

メソッドを取得して、 と の両方をBubbleSort渡すだけですnames[]score[]

次に、操作を行うたびに、score[]それも行いnames[]ます。

このようなもの

static void BubbleSort(int[] score, string[] names)
{

    for (int j = 0; j < score.Length -1; j++)
    {
        for (int i = 0; i < score.Length - 1; i++)
        {
            if (score[i] > score[i + 1])
            {
                Swap(ref score[i], ref score[i + 1]);
                Swap(ref names[i], ref names[i + 1]);
            }
        }
    }
    foreach (int a in score)
        Console.WriteLine("{0}", a);
    Console.ReadLine();
}

swap文字列用のメソッドを作成する必要があるかもしれません

static void Swap(ref string a, ref string b)
{
    string temp = a;
    a = b;
    b = temp;
}
于 2013-03-25T16:12:08.127 に答える
1

プレーヤーとそのスコア配列を格納する別のクラスを作成する必要があります。

次に、それらに基づいて並べ替えることができるプレーヤーの配列を作成しますname

編集:元のコードに基づいて構築される実装されたプレーヤー クラスになるように回答を更新しました。これが大学のプロジェクト用である場合、盗作チェッカーに見られる可能性があるため、使用には注意が必要です。

public class Player
{
     public Player(){}
     public Player(string name, int score)
     {
         m_name = name;
         m_score = score;
     }
     public Player(Player p)
     {
         m_name = p.Name;
         m_score = p.Score;
     }
     public string Name
     {
         get{return m_name;}
     }
     public int Score
     {
         get{return m_score;}
     }
     private string m_name
     private int m_score
}

Player[] players = new Player[MAX];
static void BubbleSort(Player[] players)
{

    for (int j = 0; j < players.Length -1; j++)
    {
        for (int i = 0; i < players.Length - 1; i++)
        {
            if (players[i].Score > players[i + 1].Score)
            {
                Swap(ref players[i], ref players[i + 1]);
            }
        }
    }
    foreach (Player a in players)
        Console.WriteLine("{0}", a.Score);
    Console.ReadLine();
}
   static void Swap(ref Player a, ref Player b)
    {
        Player temp = a;
        a = b;
        b = temp;
    }
于 2013-03-25T16:11:11.403 に答える
0

プレーヤーの名前とそのスコアの間のセマンティックな意味が失われているため、2 つの配列を作成する必要はありません。しかし、そのために新しいクラスを作成する必要もありません。Tuple<...> や KeyValuePair<...> などの組み込みクラス/構造体を再利用できます。注文には、linq-extension メソッドを使用できます。

static void Main(string[] args)
{
    // just some sample players
    const string player1 = "David 100";
    const string player2 = "Jennifer 1430";
    const string player3 = "Eve 234";

    // the string-array with information about players
    var players = new[] { player1, player2, player3 };

    // initialize the array: a tuple is the name of the player and the score
    var scores = new List<Tuple<string, int>>(players.Length);

    foreach (string player in players)
    {
        // split by whitespace
        string[] info = player.Split(' ');

        // be failure tolerant: split must result in at least 2 entries and second one must be integer
        int score;
        if (info.Length <= 2 && int.TryParse(info[1], out score))
            scores.Add(new Tuple<string, int>(info[0], score));
    }

    // print average score
    Console.WriteLine("Average score for {0} players is: {1}{2}", scores.Count, scores.Select(t => t.Item2).Average(), Environment.NewLine);

    // print score of each single player (ordered from highest to lowest score)
    foreach (Tuple<string, int> score in scores.OrderByDescending(t=>t.Item2))
        Console.WriteLine("Player '{0}' => score: {1}", score.Item1, score.Item2);

    Console.WriteLine();
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
}
于 2013-03-25T17:11:32.790 に答える
0

緩やかに関連付けられた値の 2 つのコレクションを使用する代わりに、クラスの単一のコレクションを使用します。

public class BowlingScore {

  public string Name { get; private set; }
  public int Score { get; private set; }

  public BowlingScore(string name, int score) {
    Name = name;
    Score = score;
  }

}

コレクションには配列ではなくリストを使用します。

List<BowlingScore> scores = new List<BowlingScore>();

ループでは、クラスのインスタンスを作成してリストに追加できます。

BowlingScore item = new BowlingScore(separateInput[0], int.Parse(separateInput[1]);
scores.Add(item);

配列の代わりにリストを使用すると、実際に追加するアイテムのみが含まれます。現在のコードでは、配列内の実際に使用されたアイテムの数を追跡するために別の変数が必要になるため、最後に空のままにしたものを含めません。

これで、名前とスコアが 1 つの単位になったので、オブジェクトのプロパティを比較するだけで、配列の並べ替えに使用したのと同じ方法でリストを並べ替えることができます。オブジェクト全体を交換すると、スコアで並べ替えたときに名前がスコアに従います。その逆も同様です。

リスト内のアイテムは、配列と同じように index を使用してアクセスできます。リストの長さのみが のCount代わりにプロパティにありLengthます。

于 2013-03-25T16:18:17.950 に答える