我无法在Deitel Visual C#2010中解决这个简单的练习

时间:2014-06-19 21:24:35

标签: c# arrays

我一直在研究Deitel的Visual C#2010。我在关于数组的章节中坚持练习。它已经困扰了我好几天了,而且我现在已经多次编写代码并且每次都出错了。

该演习要求为一家小型航空公司开发一个新的预订系统。飞机的容量是10个座位。因此,您要求客户输入1表示头等舱,2表示经济舱。 1至5个座位是头等舱。 6到10个座位是为了经济。

我必须使用bool类型的一维数组来表示飞机的座位字符。将数组的所有元素初始化为false以表示空位(无论如何,幸运的是bool初始化为false,因为我不知道如何初始化数组)。在分配每个座位时,将平面中的相应元素设置为true。

应用程序永远不应指定已经坐过的座位。当经济舱满员时,应用程序应询问客户是否想要乘坐头等舱(反之亦然)。如果客户回答是,请在经济舱中指派他(如果那里有空座位)。如果经济舱没有空座位或客户拒绝乘坐头等舱,那么只需向他显示"下一班航班是在三小时后!)。

我自学这本书。这不是作业或作业。我真的不想发布我写的代码,因为我想要一个全新的方法来解决问题,但我很确定我会被问到代码,所以这里是

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

namespace Craps_Game
{
    class AirlineReservation
    {
        private static bool[] seats = new bool[10];


    private static void FirstClass(ref bool[] seats)
    {
        for(int i = 0; i < 5; i++)
        {
            if (seats[i] == false)
            {
                seats[i] = true;
                Console.WriteLine("Your seat number is " + i);
                break;
            }
            else
            {
                Console.WriteLine("First Class is full. Would you like to fly Economy?");
                if (Console.ReadLine().ToLower() == "y")
                    Economy(ref seats);
                else
                    Console.WriteLine("The next flight is in three hours!. Good bye");
            }
        }
    }


    private static void Economy(ref bool[] seats)
    {
        for (int i = 5; i < 10; i++)
            if (seats[i] == false)
                seats[i] = true;
            else
            {
                Console.WriteLine("Economy class is full. Would you like to fly First Class");
                if (Console.ReadLine().ToLower() == "y")
                    FirstClass(ref seats);
                else
                    Console.WriteLine("The next flight is in three hours!. Good Bye");
            }

    }


    public static void Reservation()
    {
        do
        {
            Console.WriteLine("Enter 1 to fly First Class");
            Console.WriteLine("Enter 2 to fly Economy Class");
            if (Convert.ToInt32(Console.ReadLine()) == 1)
                FirstClass(ref seats);
            else
                Economy(ref seats);
        } while (true);
    }
}

}

请记住,我宁愿采用完全不同的方式解决问题,而不是解决这个问题:)

3 个答案:

答案 0 :(得分:4)

我不想在你学习的过程中解决代码中的整个问题,但我会告诉你我在你的代码中看到的主要内容是一个bug。

  • 如果发现a,Economy方法没有退出循环 座位是可用的。它需要打破。
  • 当您找不到座位时,else未检查所有座位是否已被占用。检查i == 9是否会这样做,只有在没有座位的情况下才会转到FirstClass,而不是之前。


private static void Economy(ref bool[] seats)
{
    for (int i = 5; i < 10; i++)
    {   // <---- Added the brackets
        if (seats[i] == false)
        {
            seats[i] = true;
            break;  // <----- You forgot to break when you reserved a seat.
        }
        else if (i == 9)  // <---- You weren't checking if all seats are taken.
        {
            Console.WriteLine("Economy class is full. Would you like to fly First Class");
            if (Console.ReadLine().ToLower() == "y")
                FirstClass(ref seats);
            else
                Console.WriteLine("The next flight is in three hours!. Good Bye");
        }
     }
}

答案 1 :(得分:3)

我喜欢你接近编程和你的任务以及这个网站的方式!

因此我不想为你写出代码 - 所有的乐趣都是由你自己完成。但是既然你被困住了,我就给你一些提示:

  • 从底部开始,首先想到的是,即使一个或两个都已满,你也总是提供这两个课程。这是一个函数头,它可以帮助你将事情进一步分解:
public int getFirstVacantSeatIn(int classType)
// returns 1-5 for classType=1, 6-10 for classType=2, -1 if classType is full

您可以使用此功能使提示动态,如下所示:

Console.WriteLine( ( getFirstVacantSeatIn(1) >= 0 ?  
                     "Enter 1 to fly First Class") : "First Class is full");

当您尝试分配新席位时,您可以重复使用..:

  • 另一点是你提供了一个完整的课程之间的切换,而不检查另一个课程是否真的不满。我怀疑你面临的问题是什么?

所以你应该在提出升级或降级之前进行检查..上述功能也会有所帮助。如果您可以重复使用某些内容,那么创建该内容的可能性是正确的。

秘密经常是进一步打破你的问题直到它消失,总是使用/创建有用的名称来解决子问题。< / p>

答案 2 :(得分:2)

&#34;我必须使用bool类型的一维数组来表示飞机的座位字符&#34;

&#34;我想要一种全新的方法来解决问题&#34;

&#34;请记住,我宁愿用一种完全不同的方式解决问题,而不是修复这个问题&#34;

就这样吧!其他人已经给了你很好的建议,但是这里有新鲜的&#34;这样做的方式。

using System;

namespace FunnyConsoleApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            Airplane plane = new Airplane();
            bool reserve = true;

            while (reserve)
            {
                Console.Clear();
                Console.WriteLine("Enter [1] to fly First Class ({0} vacant)", plane.VacantFirstClassSeats());
                Console.WriteLine("Enter [2] to fly Economy Class ({0} vacant)", plane.VacantEconomySeats());

                string input = Console.ReadLine();

                switch (input)
                {
                    case "1":
                        if (plane.HasFirstClassSeats)
                        {
                            plane.ReserveFirstClassSeat();
                        }
                        else if (plane.HasEconomySeats)
                        {
                            if (IsOk("No vacancy, enter [y] to fly Economy instead?"))
                                plane.ReserveEconomySeat();
                            else
                                reserve = false;
                        }
                        else
                        {
                            reserve = false;
                        }
                        break;

                    case "2":
                        if (plane.HasEconomySeats)
                        {
                            plane.ReserveEconomySeat();
                        }
                        else if (plane.HasFirstClassSeats)
                        {
                            if (IsOk("No vacancy, enter [y] to fly First Class instead?"))
                                plane.ReserveFirstClassSeat();
                            else
                                reserve = false;
                        }
                        else
                        {
                            reserve = false;
                        }
                        break;
                }

                Console.WriteLine();
            }
            Console.WriteLine("No can do, good bye!");
            Console.ReadLine();
        }

        private static bool IsOk(string question)
        {
            Console.WriteLine(question);
            return string.Compare(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase) == 0;
        }
    }

    public class Airplane
    {
        private readonly bool[] _seats = new bool[10];

        public bool HasFirstClassSeats
        {
            get { return HasSeats(0); }
        }

        public bool HasEconomySeats
        {
            get { return HasSeats(5); }
        }

        public int VacantFirstClassSeats()
        {
            return GetVacant(0);
        }

        public int VacantEconomySeats()
        {
            return GetVacant(5);
        }

        public void ReserveFirstClassSeat()
        {
            Reserve(0);
        }

        public void ReserveEconomySeat()
        {
            Reserve(5);
        }

        private bool HasSeats(int index)
        {
            for (int i = index; i < index + 5; i++)
            {
                if (!_seats[i])
                    return true;
            }
            return false;
        }

        private int GetVacant(int index)
        {
            int count = 0;
            for (int i = index; i < index + 5; i++)
            {
                if (!_seats[i])
                    count++;
            }
            return count;
        }

        private void Reserve(int index)
        {
            for (int i = index; i < index + 5; i++)
            {
                if (!_seats[i])
                {
                    _seats[i] = true;
                    break;
                }
            }
        }
    }
}

哪个给你

funnyconsoleapp