0

以前にこの質問をしたことがありますが、どこにも行けなかったので、もう一度質問すると、コードの別の部分が機能するようになったので、誰かが助けてくれるかもしれません。そのため、エントリを更新および削除する方法を知る必要があります。ユーザー入力のみでこれを行いたいことを明確にしたいと思います。

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

namespace PlayerSystem6
{
    class Program
    {
        static void Main(string[] args)
        {
            //The MAXPLAYERS constant is the physical table size
            const Int32 MAXPLAYERS = 23;

            //Declare the player tables
            Int32[] playerNumbers = new Int32[MAXPLAYERS];
            String[] playerLastNames = new String[MAXPLAYERS];
            Int32[] playerPoints = new Int32[MAXPLAYERS];

            //Keep track of the actual number of players (i.e. logical table size)
            Int32 playerCount = 0;

            //Main Driver
            char menuItem;
            Console.WriteLine("Welcome to the player system...\n");
            menuItem = GetMenuItem();
            while (menuItem != 'X')
            {
                ProcessMenuItem(menuItem, playerNumbers, playerLastNames, playerPoints, ref playerCount, MAXPLAYERS);
                menuItem = GetMenuItem();
            }
            Console.WriteLine("\nThank you, goodbye");
            Console.ReadLine();
        }

        //Returns either a 'C', 'R', 'U', 'D', 'L', or 'X' to the caller
        static char GetMenuItem()
        {
            char menuItem;
            DisplayMenu();
            menuItem = char.ToUpper(char.Parse(Console.ReadLine()));
            while (menuItem != 'C' && menuItem != 'R' //JG
                && menuItem != 'L' && menuItem != 'X' && menuItem != 'U')
            {
                Console.WriteLine("\nError - Invalid menu item");
                DisplayMenu();
                menuItem = char.ToUpper(char.Parse(Console.ReadLine()));
            }
            return menuItem;
        }

        static void DisplayMenu()
        {
            Console.WriteLine("\nPlease pick an item:");
            Console.WriteLine("C - Create Player");
            Console.WriteLine("R - Retrieve Player");
            Console.WriteLine("U - Update Player");
            Console.WriteLine("D - Delete Player");
            Console.WriteLine("L - List Players");
            Console.WriteLine("X - Exit");
        }

        //Routes to the appropriate process routine based on the user menu choice
        static void ProcessMenuItem(Char menuItem, Int32[] playerNumbers, String[] playerLastNames,
            Int32[] playerPoints, ref Int32 playerCount, Int32 MAXPLAYERS)
        {
            switch (menuItem)
            {
                case 'C':
                    ProcessCreate(playerNumbers, playerLastNames, playerPoints, ref playerCount, MAXPLAYERS);
                    break;
                case 'L':
                    ProcessList(playerNumbers, playerLastNames, playerPoints, playerCount);
                    break;
                case 'R': //JG
                    ProcessRetrieve(playerNumbers, playerLastNames, playerPoints, ref playerCount, MAXPLAYERS);
                    break;
                case 'U':
                    ProcessUpdate(playerNumbers, playerLastNames, playerPoints, playerCount, MAXPLAYERS);
                    break;

            }
        }

        //Creates a player in the tables if the array is not already full and the name is not a duplicate
        static void ProcessCreate(Int32[] playerNumbers, String[] playerLastNames,
            Int32[] playerPoints, ref Int32 playerCount, Int32 MAXPLAYERS)
        {
            Int32 number, points;
            String lastName;
            if (playerCount < MAXPLAYERS)
            {
                number = GetPositiveInteger("\nCreate Player: please enter the player's number");
                if (GetPlayerIndex(number, playerNumbers, playerCount) == -1)
                {
                    lastName = GetString("\nCreate Player: please enter the player's last name");
                    points = GetPositiveInteger("\nCreate Player: please enter the player's points");
                    InsertPlayer(number, lastName, points, playerNumbers, playerLastNames, playerPoints, ref playerCount);
                    Console.WriteLine("\nCreate Player: Number - {0}, Name - {1}, Points - {2}, created successfully", number, lastName, points);
                    Console.WriteLine();
                }
                else
                    Console.WriteLine("\nCreate Player: the player number already exists");
            }
            else
                Console.WriteLine("\nCreate Player: the player roster is already full");

        }

        //Inserts the player at the correct location in the tables based on order of 
        //ascending player number. Unless the insert location is at the end, this 
        //requires shifting existing players down in order to make room 
        static void InsertPlayer(Int32 number, String lastName, Int32 points,
            Int32[] playerNumbers, String[] playerLastNames, Int32[] playerPoints,
            ref Int32 playerCount)
        {
            /* PUTS DATA IN NEXT AVALIABLE SLOT
            playerNumbers[playerCount] = number;
            playerLastNames[playerCount] = lastName;
            playerPoints[playerCount] = points;
            playerCount++;
            */

            // PUTS DATA IN PLAYER ASECENDING ORDER
            Int32 insertIndex, shiftCount;
            insertIndex = GetInsertIndex(number, playerNumbers, playerCount);
            for (shiftCount = playerCount; shiftCount > insertIndex; shiftCount--)
            {
                playerNumbers[shiftCount] = playerNumbers[shiftCount - 1];
                playerLastNames[shiftCount] = playerLastNames[shiftCount - 1];
                playerPoints[shiftCount] = playerPoints[shiftCount - 1];
            }
            playerNumbers[insertIndex] = number;
            playerLastNames[insertIndex] = lastName;
            playerPoints[insertIndex] = points;
            playerCount++;

        }
        //Returns the index of the first player number in the table that is greater
        //than the player number to be inserted
        static Int32 GetInsertIndex(Int32 playerNumber, Int32[] playerNumbers,
            Int32 playerCount)
        {
            Int32 index = 0;
            bool found = false;
            while (index < playerCount && found == false)
                if (playerNumbers[index] > playerNumber)
                    found = true;
                else
                    index++;
            return index;
        }

        //Returns the index of the player number in the table 
        //or -1 if the number is not found
        static Int32 GetPlayerIndex(Int32 playerNumber,
            Int32[] playerNumbers, Int32 playerCount)
        {
            Int32 index = 0;
            bool found = false;
            while (index < playerCount && found == false)
                if (playerNumbers[index] == playerNumber)
                    found = true;
                else
                    index++;
            if (found == false)
                index = -1;
            return index;
        }

        //Lists the players in the tables
        static void ProcessList(Int32[] playerNumbers, String[] playerLastNames,
            Int32[] playerPoints, Int32 playerCount)
        {

            if (playerCount > 0)
            {
                Console.WriteLine("\n{0,7}   {1,-25}{2,6}\n", "Number", "Last Name", "Points");
                for (Int32 player = 0; player < playerCount; player++)
                    Console.WriteLine("{0,7}   {1,-25}{2,6}", playerNumbers[player], playerLastNames[player], playerPoints[player]);
            }
            else
                Console.WriteLine("\nList Players: the roster is empty");
        }

        //Returns a positive integer
        static Int32 GetPositiveInteger(String prompt)
        {
            Int32 n;
            Console.WriteLine(prompt);
            n = Int32.Parse(Console.ReadLine());
            while (n < 0)
            {
                Console.WriteLine("\nError: enter positive value");
                Console.WriteLine(prompt);
                n = Int32.Parse(Console.ReadLine());
            }
            return n;
        }

        //Returns a non-empty string
        static String GetString(String prompt)
        {
            String returnString;
            Console.WriteLine(prompt);
            returnString = Console.ReadLine();
            while (returnString == "")
            {
                Console.WriteLine("\nError: must enter keyboard data");
                Console.WriteLine(prompt);
                returnString = Console.ReadLine();
            }
            return returnString;
        }
        // retrieve single value from an array

        //static void ProcessRetrieve(Int32[] playerNumbers, String[] playerLastNames
        //, Int32[] playerPoints, Int32 playerCount)
        //{

        //}

したがって、ここで、機能する単一のエントリを取得するプロセスを開始します。これは、次の 2 つの関数で動作するように変更することで再利用できる関数です。

        static void ProcessRetrieve(Int32[] playerNumbers, String[] playerLastNames,
            Int32[] playerPoints, ref Int32 playerCount, Int32 MAXPLAYERS)
        {
            int player;// Player number to find
            int playerindex;//index of the player number in Array
            if (playerCount < MAXPLAYERS)
            {
                player = GetPositiveInteger("\nRetrieve Player: please enter the player's number"); //JG I used the same mechanism when you are creating the record, when you create yu check if it exists
                /** If it exists you say record exists in this case I said display the existing record**/
                playerindex = GetPlayerIndex(player, playerNumbers, playerCount);
                if (playerindex != -1)// !-1 means Does not exist JG
                {

                    Console.WriteLine("{0,7}   {1,-25}{2,6}", playerNumbers[playerindex], playerLastNames[playerindex], playerPoints[playerindex]);
                    Console.WriteLine();
                }
                else
                    Console.WriteLine("\nRetrieve Player: the player number does not exists");
            }
            else
                Console.WriteLine("\nRetrieve Player: the player does not exist in the roster");
        }

ここで私は問題を抱えています。取得する代わりにこのコードを更新するにはどうすればよいですか

        static void ProcessUpdate(Int32[] playerNumbers,
        string[] playerLastnames, Int32[] playerpoints, Int32 playerCounts, Int32 MAXPLAYERS)
        {
            int player;// Player number to find
            int playerindex;//index of the player number in Array
            if (playerCounts < MAXPLAYERS || playerCounts == MAXPLAYERS)
            {
                player = GetPositiveInteger("\nUpdate Player: please enter the player's number");
                playerindex = GetPlayerIndex(player, playerNumbers, playerCounts);
                if (playerindex != -1)
                {

                    Console.WriteLine("{0,7}   {1,-25}{2,6}", playerNumbers[playerindex], playerLastnames[playerindex], playerpoints[playerindex]);
                    Console.WriteLine();
                }
                else
                    Console.WriteLine("\nUpdate Player: the player number does not exists");
            }
            else
                Console.WriteLine("\nUpdate Player: the player does not exist in the roster");
        }

    }
}
4

4 に答える 4

1

コードには、更新関数を作成するために必要な構成要素が既に含まれています。これらが何であるかを見てみましょう。

  1. 最初にプレイヤー番号を尋ねる必要があります。これはすでに ProcessUpdate メソッドに実装されています。

            player = GetPositiveInteger("\nUpdate Player: please enter the player's number");
    
  2. プレイヤー番号に一致する配列インデックスを見つける必要があります。これは、ProcessUpdate メソッドにも既に実装されています。

            playerindex = GetPlayerIndex(player, playerNumbers, playerCounts);
    
  3. ユーザーに新しいプレーヤー データを要求する必要があります。これはすでに ProcessCreate メソッドに実装されています。文字列のみを変更して、更新されたデータを要求していることを明確にします。

                lastName = GetString("\nUpdate Player: please enter the player's updated last name");
                points = GetPositiveInteger("\nUpdate Player: please enter the player's updated points");
    
  4. 最後に、ユーザーから取得したデータを配列に入れる必要があります。これはすでに InsertPlayer に実装されています。ここでは、正しい変数名を使用することに注意を払います。

        playerLastNames[playerindex] = lastName;
        playerPoints[playerindex] = points;
    


これをすべて (変数宣言とサニティ チェックを含めて) まとめると、ProcessUpdate メソッドは次のようになります。

    static void ProcessUpdate(Int32[] playerNumbers,
    string[] playerLastnames, Int32[] playerpoints, Int32 playerCounts, Int32 MAXPLAYERS)
    {
        int player;// Player number to find
        int playerindex;//index of the player number in Array

        String lastName;
        int points;

        if (playerCounts < MAXPLAYERS || playerCounts == MAXPLAYERS)
        {
            player = GetPositiveInteger("\nUpdate Player: please enter the player's number");
            playerindex = GetPlayerIndex(player, playerNumbers, playerCounts);
            if (playerindex != -1)
            {
                lastName = GetString("\nUpdate Player: please enter the player's updated last name");
                points = GetPositiveInteger("\nUpdate Player: please enter the player's updated points");

                playerLastNames[playerindex] = lastName;
                playerPoints[playerindex] = points;

            }
            else
                Console.WriteLine("\nUpdate Player: the player number does not exists");
        }
        else
            Console.WriteLine("\nUpdate Player: the player does not exist in the roster");
        }
    }

一般的に言えば、プログラムの構造は正しい方法の例ではありません (申し訳ありません)。しかし、私はあなたのプログラミングコースについて知りません。コースでは、構造体、オブジェクト (オブジェクト指向プログラミング)、または辞書などのその他の "高度な" データ型を既にカバーしていますか? または、これらは将来のトピックになりますか? 3 つの配列を使用する必要があることはわかっていますが、すでに構造体だけを使用することで、要件を満たしながらコードを大幅にクリーンアップできます。

于 2013-10-19T03:08:23.117 に答える
0

以下に、ユーザー入力によってプレーヤーのスコアと名前を更新する方法の例を書きました。数字、名前、ポイントのインデックスをプレーヤーごとに同じインデックスに保持することで、それらを追跡できます。

// Make sure the indexes of the arrays are aligned with the player array 
// (to keep track which points are for which player)
int[] playerNums = new int[10];
string[] playerNames = new string[10];
int[] playerPoints = new int[10];

// We now add the user here (you do it somewhere from user input)
playerNums[0] = 1;
playerNames[0] = "Tim";
playerPoints[0] = 10;

char key = Console.ReadKey(true).KeyChar;
if (char.IsDigit(key))
{
    // We get the number from the char.
    int inputNum = int.Parse(key.ToString());

    // We make sure the user isn't giving an index past the length of our arrays
    // (which are 10 in size).
    if (inputNum > -1 && inputNum < playerNums.Length - 1)
    {
        playerNames[inputNum] = "John"; // Tim now becomes John.
        playerPoints[inputNum] += 5; // Increase John's score.
    }
}

これがあなたが探していた答えだったか教えてください。

于 2013-10-19T02:38:17.857 に答える
0

配列の代わりに、次のようにディクショナリを使用するため、すべての配列のインデックスを維持する必要がなく、特定の要素を検索する場合は非常に簡単です。また、プレーヤー番号はすべてのプレーヤー情報のキーであり、任意のキーを選択できます。詳細については、以下のリンクを参照してください http://www.dotnetperls.com/dictionary

名前空間プレーヤー{クラスプログラム{

    static void Main(string[] args)
    {
        Dictionary<string, PlayerInfo> info = new Dictionary<string, PlayerInfo>();
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Enter Player Number");
            string playerNumber = Console.ReadLine();
            info.Add(playerNumber, new PlayerInfo());
            Console.WriteLine("Enter Player Name");
            info[playerNumber].PlayerName = Console.ReadLine(); 
            Console.WriteLine("Enter Player Points");
            info[playerNumber].points = Console.ReadLine(); 
        }

        Console.WriteLine("Enter the player number to be deleted");
        string playerNumberToDelete = Console.ReadLine();
        info.Remove(playerNumberToDelete);

        Console.WriteLine("Enter a player number to update");
        string playerNumberToUpdate = Console.ReadLine();
        Console.WriteLine("Enter Player Name");
        info[playerNumberToUpdate].PlayerName = Console.ReadLine();
        Console.WriteLine("Enter Player Points");
        info[playerNumberToUpdate].points = Console.ReadLine();

        Console.WriteLine("Enter player number dispaly deatils");
        string playerNumberToDisplay = Console.ReadLine();
        Console.WriteLine("Name " + info[playerNumberToDisplay].PlayerName);
        Console.WriteLine("Points " + info[playerNumberToDisplay].points);
    }
}
class PlayerInfo
{
    public string PlayerName;
    public string points;
}

}

于 2013-10-19T03:08:28.353 に答える