Преобразуйте Array в примитивный метод для выражения того же результата, не используя LINQ только int. - PullRequest
0 голосов
/ 15 января 2012

моя программа записывает количество бутылок, которые четыре комнаты собрали в накопителе для бутылок.Когда пользователь вводит команду quit, отображается количество бутылок, собранных в каждой комнате, а также распечатывается комната, в которой больше всего бутылок.Я использовал массив для отслеживания номера комнаты.Как можно изменить метод вместо использования массива, я хотел бы инициировать room1, room2, room3, room4.Смогу ли я использовать вызовы зацикленного массива для записи строк, если я не буду использовать массив?Есть строки, которые я имею в виду.

            int room = int.Parse(quit);
            Console.Write("Bottles collected in room {0}: ", room);
            // This line adds the count of bottles and records it so you can continuously count the bottles collected.
            rooms[room - 1] += int.Parse(Console.ReadLine());

И эта строка:

           }//Writes the bottles collected by the different rooms
            Console.WriteLine("Bottles collected in room {0} = {1}", i + 1, rooms[i]);

Вот мой код:

         namespace BottleDrive
   {
    class Program
   {
    static void Main(string[] args)
    {//Initialize array of rooms to 4
        int[] rooms = new int[4];
        //Start of while loop to ask what room your adding into. 
        while (true)
        {
            Console.Write("Enter the room you're in: ");
            //If user enters quit at anytime, the code will jump out of while statement and enter for loop below
            string quit = Console.ReadLine();
            if (quit == "quit")
                //Break statement allows quit to jump out of loop
                break; 


           //Variable room holds the number of bottles collect by each room. 
            int room = int.Parse(quit);
            Console.Write("Bottles collected in room {0}: ", room);
            // This line adds the count of bottles and records it so you can continuously count the bottles collected.
            rooms[room - 1] += int.Parse(Console.ReadLine());

        }

        int maxValue = 0;//initiates the winner, contructor starts at 0
        int maxRoomNumber = 0;//initiates the room number that wins
        for (int i = 0; i < rooms.Length; ++i)//This loop goes through the array of rooms (4)
        {
            if (rooms[i] > maxValue)//Makes sure that the maxValue is picked in the array
            {//Looking for room number for the 
                maxValue = rooms[i];
                maxRoomNumber = i + 1;
            }//Writes the bottles collected by the different rooms
            Console.WriteLine("Bottles collected in room {0} = {1}", i + 1, rooms[i]);
        }
        //Outputs winner
        Console.WriteLine("And the Winner is room " + maxRoomNumber + "!!!");

    }
}
 }

И спасибо, я ценю, насколько это сообщество помогло мне узнатьс острым.

Ответы [ 4 ]

0 голосов
/ 15 января 2012

Я думаю, что ваша логика правильная (то есть использование переменной для максимального значения и максимального пространства и сравнение каждый раз).Были ли какие-либо ограничения на использование массивов?Казалось бы, использование 4 переменных потребует больше строк кода.

Мне нравится ответ с использованием класса.Но вы вполне могли бы сделать это со стандартным c с массивом.

Какое требование?инкапсуляция?Надежность?

0 голосов
/ 15 января 2012

Вы могли бы сделать это, но это было бы шагом назад от хорошего программирования к написанию плохого кода.

Сначала это раздуло бы ваш код, так как вам всегда приходилось делать что-то вроде этого:

// this is the code you have now (3 lines for 4 rooms):
int room = int.Parse(quit);
Console.Write("Bottles collected in room {0}: ", room);
rooms[room - 1] += int.Parse(Console.ReadLine());


// and this is the code you'll have when you refrain from using arrays
// (17 lines for 2 rooms, ignoring empty lines and ones with only brackets):
int room = int.Parse(quit);
Console.Write("Bottles collected in room {0}: ", room);
switch(room)
{
    case 1:
        Console.WriteLine(room1);
        break;
    case 2:
        Console.WriteLine(room2);
        break;
    // other cases...
}

int count = int.Parse(Console.ReadLine());
switch(room)
{
    case 1:
        room1 += count;
        break;
    case 2:
        room2 += count;
        break;
    // other cases...
}

И второе (и далеко более важно):

Код полностью не расширяемый.Если вы хотите добавить пятую комнату для сбора бутылок, вы должны пройти всю программу и настроить каждый оператор switch, который не только занимает много времени, но и чрезвычайно подвержен ошибкам.

0 голосов
/ 15 января 2012

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

отдельные комнаты теперь содержатся в списке, а не в массиве, просто чтобы показать другую конструкцию.

Вот новый класс комнат:

public class Room
{
    public int Number { get; set; }
    public int BottleCount { get; set; }

    public Room(int wNumber)
    {
        Number = wNumber;
    }
}

А вот и новая версия программы,Обратите внимание, что добавлена ​​дополнительная проверка значений, введенных конечным пользователем, чтобы исключить исключения при попытке получить текущую комнату или проанализировать int значение, введенное пользователем:

    static void Main(string[] args)
    {
        const int MAX_ROOMS = 4;
        var cRooms = new System.Collections.Generic.List<Room>();

        for (int nI = 0; nI < MAX_ROOMS; nI++)
        {
            // The room number is 1 to 4
            cRooms.Add(new Room(nI + 1));
        }

        // Initializes the room that wins
        //Start of while loop to ask what room your adding into. 
        while (true)
        {
            Console.Write("Enter the room you're in: ");
            //If user enters quit at anytime, the code will jump out of while statement and enter for loop below
            string roomNumber = Console.ReadLine();
            if (roomNumber == "quit")
            {
                //Break statement allows quit to jump out of loop
                break;
            }
            int room = 0;
            if (int.TryParse(roomNumber, out room) && (room < MAX_ROOMS) && (room >= 0)) {
                Room currentRoom;

                currentRoom = cRooms[room];

                Console.Write("Bottles collected in room {0}: ", currentRoom.Number);

                int wBottleCount = 0;

                if (int.TryParse(Console.ReadLine(), out wBottleCount) && (wBottleCount >= 0))
                {
                    // This line adds the count of bottles and records it so you can continuously count the bottles collected.
                    currentRoom.BottleCount += wBottleCount;
                }
                else
                {
                    Console.WriteLine("Invalid bottle count; value must be greater than 0");
                }
            }
            else
            {
                Console.WriteLine("Invalid room number; value must be between 1 and " + MAX_ROOMS.ToString());
            }
        }

        Room maxRoom = null;

        foreach (Room currentRoom in cRooms) //This loop goes through the array of rooms (4)
        {
            // This assumes that the bottle count can never be decreased in a room
            if ((maxRoom == null) || (maxRoom.BottleCount < currentRoom.BottleCount))
            {
                maxRoom = currentRoom;
            }
            Console.WriteLine("Bottles collected in room {0} = {1}", currentRoom.Number, currentRoom.BottleCount);
        }
        //Outputs winner
        Console.WriteLine("And the Winner is room " + maxRoom.Number + "!!!");
    }
0 голосов
/ 15 января 2012

Вы не можете легко заменить массив отдельными переменными. Если у вас есть объявление типа

int room1 = 0, room2 = 0, room3 = 0, room4 = 0;

и хотите получить доступ к номеру комнаты i, тогда вы должны написать

switch (i) {
    case 1:
        Console.WriteLine(room1);
        break;
    case 2:
        Console.WriteLine(room2);
        break;
    case 3:
        Console.WriteLine(room3);
        break;
    case 4:
        Console.WriteLine(room4);
        break;
}

С массивом вы можете просто написать

Console.WriteLine(rooms[i]);

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

private void SetRoom(int room, int value)
{
    switch (room) {
        case 1:
            room1 = value;
            break;
        case 2:
            room2 = value;
            break;
        case 3:
            room3 = value;
            break;
        case 4:
            room4 = value;
            break;
    }
}

public int GetRoom(int room)
{
    switch (room) {
        case 1:
            return room1;
        case 2:
            return room2;
        case 3:
            return room3;
        case 4:
            return room4;
        default:
            return 0;
    }
}

Вы должны объявить переменные room1 - room4 как члены класса, чтобы сделать эту работу.

Теперь вы можете написать:

Console.WriteLine(GetRoom(i));

или вместо rooms[i] += n;

SetRoom(i, GetRoom(i) + n);
...