Новое в C #, не все пути кода возвращают значение, программа подсчета бутылок, оператор switch - PullRequest
0 голосов
/ 15 января 2012

Здравствуйте, я достиг пня, который не могу вытащить.

Моя программа записывает количество бутылок, собранных четырьмя комнатами. Программа должна предложить мне ввести номер комнаты, а затем, сколько бутылок собрала эта комната. Когда пользователь вводит команду «выйти», программа выплевывает бутылки, собранные в каждой комнате, и рассчитывает комнату с наибольшим количеством собранных бутылок. Я должен иметь возможность добавлять бутылки в каждую комнату, пока я не набрал "выйти".

Я не могу заставить работать мой GetRoom (int room), это метод, который не возвращает значение. Как найти комнату с наибольшим количеством собранных бутылок? Math.max?

Я не могу использовать LINQ или массивы. Это часть правил присваивания. Вот мой код:

namespace BottleDrive1
{
    class Program
    {//Initialize 4 rooms. 
        int room1 = 0;

        int room2 = 0;

        int room3 = 0;

        int room4 = 0;

        static void Main(string[] args)
        {
            //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;
            }
        }

        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 void GetRoom(int room)
        {
            int count = int.Parse(Console.ReadLine());

            switch (room)
            {
                case 1:
                    room1 += count;
                    break;
                case 2:
                    room2 += count;
                    break;
                case 3:
                    room3 += count;
                    break;
                case 4:
                    room4 += count;
                    break;
                default:
                    throw new ArgumentException();
            }

        }
    }
}

Ответы [ 5 ]

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

Метод GetRoom не возвращает значение.Либо укажите значение по умолчанию в операторе switch, либо и после него оператор return.Кроме того, вы можете вызвать исключение в этих случаях.

Пример:

public int GetRoom(int room)
{
    int count = int.Parse(Console.ReadLine());
    switch (room)
    {
        case 1:
            room1 += count;
            break;
        case 2:
            room2 += count;
            break;
        case 3:
            room3 += count;
            break;
        case 4:
            room4 += count;
            break;
        default:
            throw new ArgumentException(); //either this
    }
    throw new ArgumentException(); //or this
}

Кстати, вы можете использовать массив из 4 элементов вместо 4 разных переменных, что упростит ваш существующий коди сэкономить вам время на написание нового.Например, GetRoom будет выглядеть так:

public int GetRoom(int room)
{
    int count = int.Parse(Console.ReadLine());
    rooms[room] += count;
    //return what you need to return here
}
1 голос
/ 15 января 2012

Проблема в том, что ваш метод GetRoom определен так, чтобы возвращать int, и, следовательно, он должен делать это на каждом пути кода. Этот конкретный пример не возвращает значение ни по какому пути.

Основано на логике в методе GetRoom, хотя кажется, что вы изменяете комнаты, а не возвращаете одну. Если это так, просто переключите метод для возврата void

public void GetRoom() {
  ...
}
1 голос
/ 15 января 2012

Вы должны убедиться, что ваша функция что-то возвращает.Вы пытались скомпилировать этот код?В нем есть ошибка компиляции, которая исправит ваш метод.

И Math.Max ​​- хороший способ найти максимум.

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

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

public int GetRoom(int room)
{
    int count = int.Parse(Console.ReadLine());
    int temp = 0;
    switch (room)
    {
        case 1:
            room1 += count;
            temp = room1;
            break;
        case 2:
            room2 += count;
            temp = room2;
            break;
        case 3:
            room3 += count;
            temp = room3;
            break;
        case 4:
            room4 += count;
            temp = room4;
            break;
        default:
            throw new ArgumentException();
    }

    return temp;

} 
...