将盘插入每个级别具有不同直径的容器中

时间:2013-09-06 12:43:54

标签: c#

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

[更新的代码]问题仍然是容器永远不会填充,程序继续插入磁盘。我想不出一个合理的方法让它知道什么时候容器已满。

  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);
}
}

1 个答案:

答案 0 :(得分:1)

你没有完全解释我想要的东西,但是你的代码版本(在不同的方面)得到了很大改进,希望你能把它作为一个很好的学习练习。总体结构非常糟糕,但我打算模仿原始代码中的那个,以便您可以完全理解正在发生的事情。 “输入流”仍然很差,因此可能很容易停止工作(如果没有引入正确的输入)但是,至少,我已经用Parse代替了不同类型的输入TryParse (例如,string代替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(); 

        }

    }
}