0

我需要制作一个程序,其中容器的层数及其直径是从用户那里获取的。然后用户在程序中插入一个一定直径的圆盘。然后磁盘移动通过所有可能的层,可以重复该过程,直到容器被填满或用户停止向其中添加更多磁盘。最后,程序应该给出容器中包含的磁盘总数及其层数。我被严重卡住了,现在我的大脑一片空白。请帮忙!

[更新代码]问题仍然是容器永远不会填满,程序不断插入磁盘。我想不出一种合乎逻辑的方法来让它知道容器何时已满。

  namespace ConsoleApplication1
  {
  class Program
   {
     static void Main(string[] args)
     {
        Console.Write("Number of Layers ? ");
        int layers = int.Parse(Console.ReadLine());
        int[] container = new int[layers];
        int disk_number = 0;
        for (int i = 0; i < layers; i++)
        {
            Console.Write("\nLayer num {0} : ",1+i);
            container[i] = int.Parse(Console.ReadLine());
        }

        Console.Write("\nPress 1 to Insert disk? ");
        int insert = int.Parse(Console.ReadLine());

        while (insert == 1)
        {
            Console.Write("\nDiameter of Disk? ");
            int disk_diameter = int.Parse(Console.ReadLine());


           if (disk_diameter <= container[0])
            {

                for (int i = 0; i < layers;) {
                    if (disk_diameter <= container[i])
                    {
                        i++;
                    }
                    else { if (i == layers - 1) break; layers = i+1; }

                }

                disk_number++;

                Console.Write("\nPress 1 to Insert more disk(s)? ");
                insert = int.Parse(Console.ReadLine());
                if (insert != 1) { Console.Write("\nNumber of disks contained in container are : {0}", disk_number); }
            }
            else
            {
                Console.Write("\nDisc blocked the surface opening of the container , no further input could be processed! \nNumber of disks contained in container are : {0}",disk_number);
                break;
            }
        }

        Console.ReadLine();



    }

    //static int inserting_disk(int a);
}
}
4

1 回答 1

1

你没有向我解释你到底想要什么,但是这里有一个大大改进的(在不同方面)你的代码版本,希望你能把它当作一个很好的学习练习。整体结构非常糟糕,但我打算在您的原始代码中模拟一个,这样您就可以完全理解正在发生的事情。“输入流”仍然很差,因此可能很容易停止工作(如果没有引入正确的输入),但至少,我已经ParseTryParse考虑不同类型的输入(例如, astring而不是a integer)替换了你。

测试代码,看看它做了什么。习惯新的变量(我已经重命名/重新定义了其中的一些,因为在其原始版本中太混乱了)并构建一个代码,提供你所追求的(并且,理想情况下,正确编写)。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Number of Layers ? ");
            int input0 = 0;
            bool right0 = int.TryParse(Console.ReadLine(), out input0);
            if (right0 && input0 > 0)
            {
                int tot_layers = input0;
                int[] maxDiamLayer = new int[tot_layers + 1]; //better maintain the indexing as displayed to the user: starting from 1
                bool[] layerDone = new bool[tot_layers + 1]; //This boolean array will make sure that you don't use the same layer more than once
                int disk_number = 0;
                for (int i = 1; i <= tot_layers; i++)
                {
                    Console.Write("\nIntroduce the maximum diameter for the layer num {0} : ", i);
                    maxDiamLayer[i] = int.Parse(Console.ReadLine());
                }

                Console.Write("\nPress 1 to Insert disk? ");
                input0 = 0;
                right0 = int.TryParse(Console.ReadLine(), out input0);

                while (right0 && input0 == 1)
                {

                    Console.Write("\nDiameter of Disk? ");
                    int input = 0;
                    bool right = int.TryParse(Console.ReadLine(), out input);
                    if (!right || input <= 0)
                    {
                        Console.Write("\nWrong Diameter. ");
                        continue;
                    }
                    int disk_diameter = input;

                    bool oneInserted = false;
                    for (int i = 1; i <= tot_layers; i++)
                    {
                        if (disk_diameter <= maxDiamLayer[i] && !layerDone[i])
                        {
                            layerDone[i] = true;
                            oneInserted = true;
                            disk_number++;
                            Console.Write("\nNumber of disks contained in container are : {0}", disk_number);
                            Console.Write("\nPress 1 to Insert more disk(s)? ");
                            int input2 = 0;
                            bool right2 = int.TryParse(Console.ReadLine(), out input2);
                            if (!right2 || input2 != 1 || disk_number >= tot_layers) break;

                            Console.Write("\nDiameter of Disk? ");
                            input = 0;
                            right = int.TryParse(Console.ReadLine(), out input);
                            if (!right || input <= 0)
                            {
                                Console.Write("\nWrong Diameter. ");
                                break;
                            }
                            disk_diameter = input;
                        }
                    }

                    if (disk_number >= tot_layers)
                    {
                        Console.Write("\nAll the layers are filled");
                        break;
                    }
                    else
                    {
                        Console.Write("\nWrong diameter. Try again.");
                    }

                    if (!oneInserted)
                    {
                        Console.Write("\nThe disk couldn't be inserted");
                        Console.Write("\nPress 1 to continue ");
                        int input3 = 0;
                        bool right3 = int.TryParse(Console.ReadLine(), out input3);
                        if (!right3 || input3 != 1) break;
                    }
                }
            }

            Console.ReadLine(); 

        }

    }
}
于 2013-09-07T16:59:43.423 回答