Java 无意中在开关盒内部连续填充的阵列

Java 无意中在开关盒内部连续填充的阵列,java,arrays,switch-statement,do-while,Java,Arrays,Switch Statement,Do While,我最近在做的事情上遇到了麻烦。为了保持简洁,我希望我的程序能如下运行: 用户输入一个数字,然后检查该数字是否为有效选项。如果该选项无效,将显示一条错误消息,并再次显示主菜单 如果选择了有效的选项,则switch case将接受所选的选项并运行每个case语句中的代码 一旦代码在switch case部分运行完毕,它将循环回到顶部并重新显示主菜单,进程1-3将继续运行,直到用户选择选项4退出程序 我似乎遇到的问题是,当我进入案例1时,它喜欢循环通过一段不需要循环的代码,并继续向数组中添加一个

我最近在做的事情上遇到了麻烦。为了保持简洁,我希望我的程序能如下运行:

  • 用户输入一个数字,然后检查该数字是否为有效选项。如果该选项无效,将显示一条错误消息,并再次显示主菜单

  • 如果选择了有效的选项,则switch case将接受所选的选项并运行每个case语句中的代码

  • 一旦代码在switch case部分运行完毕,它将循环回到顶部并重新显示主菜单,进程1-3将继续运行,直到用户选择选项4退出程序

  • 我似乎遇到的问题是,当我进入案例1时,它喜欢循环通过一段不需要循环的代码,并继续向数组中添加一个三角形对象,这段代码就是:

    if((side1 == 0 || side2 == 0 || side3 == 0)) 
    {
            // Problem with do-while loop begins here
            triangleArray[trianglesAdded] = new Triangle();
            System.out.println("Default triangle created");
            trianglesAdded += 1;
    }
    
    其中triangleArray是一个大小为100的三角形对象数组,trianglesAdded跟踪实际添加到数组中的三角形数量,并作为该数组索引的变量。因为它一直在向这个数组中添加三角形对象,所以我得到了一个错误,因为数组一旦达到极限就不能再容纳任何三角形对象,这意味着我也不能循环回到主菜单

    所以我的问题是:我怎样才能使它停止在这一部分循环(因为它只会发生一次,并且一次只能向数组中添加一个三角形对象),并使它在运行完之后能够完整循环并再次显示主菜单

    完整代码如下:

    do 
        {
            while(validMenuOption == false) 
            {
                System.out.println("1. Enter data for a new triangle.");
                System.out.println("2. Print all triangles sorted by area, smallest to largest.");
                System.out.println("3. Print only triangles with a specific color.");
                System.out.println("4. Exit the program.");
                System.out.print("\nPlease enter in a number to select an option: ");
                menuOption = sc.nextInt();
                
                if(menuOption >= 1 && menuOption <= 4) 
                {
                    validMenuOption = true;
                }
                
                else 
                {
                    System.out.println("Invalid menu choice. Please try again.\n");
                    validMenuOption = false;
                }
                
                if(menuOption == 1 && trianglesAdded == triangleArray.length - 1)
                {
                    System.out.println("The triangle array has hit the max. You are unable to add more triangles.");
                    validMenuOption = false;
                }
            }
            
            switch(menuOption) 
            {
                case 1:
                    ... 
                    
                    // If one, two, or all of the side lengths given are zero and the color of the triangle is 1, creates a default triangle
                    // with the sides being 1 and the color being 1
                    if((side1 == 0 || side2 == 0 || side3 == 0)) 
                    {
                        // Problem begins here
                        triangleArray[trianglesAdded] = new Triangle();
                        System.out.println("Default triangle created");
                        trianglesAdded += 1;
                    }
                    
                    // If side lengths greater than zero were given, creates a triangle with the side lengths and color given
                    else 
                    {
                        triangleArray[trianglesAdded] = new Triangle(side1, side2, side3, color);
                        System.out.println("Triangle created with specified size and color");
                    }
                    
                    break;
                    
                case 2:
                    ...
                    break;
                    
                case 3:
                    ...
                    break;
                    
                case 4:
                    ...
                    break;
                    
                default:
                    ...
                    break;
            }
        } while(true);
    
    do
    {
    while(validMenuOption==false)
    {
    System.out.println(“1.输入新三角形的数据”);
    System.out.println(“2.打印所有按面积排序的三角形,从最小到最大。”);
    System.out.println(“3.仅打印具有特定颜色的三角形”);
    System.out.println(“4.退出程序”);
    System.out.print(“\n请输入一个数字以选择一个选项:”);
    menuOption=sc.nextInt();
    
    如果(menuOption>=1&&menuOption那么,你有一个bug。因此,当你遇到bug时,你会做每个人都会做的事情:你在头脑中一行一行地计算你的程序应该做什么。然后你将它与计算机告诉你它认为你的代码意味着什么进行比较。如果你的大脑和计算机不一致,你就会发现一个bug

  • 你的程序说“validMenuOption”是假的
  • 我输入'1'
  • validMenuOption设置为true,我们循环“输入while块”
  • vMO现在是真的,所以while循环结束后,我们继续
  • 开关运行,我们执行“添加三角形”部分
  • 外部环路
  • validMenuOption仍然为true
  • 所以..当循环运行零次时,整个“获取一些输入”

  • 您可能希望首先重置validMenuOption,或者希望它是一个d
    o{}while()
    循环。

    好吧,你有一个bug。所以当你遇到bug时,你会做每个人都会做的事情:你在头脑中一行一行地计算你的程序应该做什么。然后你将它与计算机告诉你它认为你的代码意味着什么进行比较。如果你的大脑和计算机不一致,你就会发现一个bug

  • 你的程序说“validMenuOption”是假的
  • 我输入'1'
  • validMenuOption设置为true,我们循环“输入while块”
  • vMO现在是真的,所以while循环结束后,我们继续
  • 开关运行,我们执行“添加三角形”部分
  • 外部环路
  • validMenuOption仍然为true
  • 所以..当循环运行零次时,整个“获取一些输入”

  • 您可能希望首先重置validMenuOption,或者希望它是一个d
    o{}while();
    循环。

    您可以尝试以下代码

    while(true){
    
                System.out.println("1. Enter data for a new triangle.");
                System.out.println("2. Print all triangles sorted by area, smallest to largest.");
                System.out.println("3. Print only triangles with a specific color.");
                System.out.println("4. Exit the program.");
                System.out.print("\nPlease enter in a number to select an option: ");
                menuOption = sc.nextInt();
    
                    switch(menuOption){
                    case 1:
                        if(trianglesAdded == triangleArray.length - 1)
                            {
                                System.out.println("The triangle array has hit the max. You are unable to add more triangles.");
                                return;
                            } 
                                        
                        // If one, two, or all of the side lengths given are zero and the color of the triangle is 1, creates a default triangle
                        // with the sides being 1 and the color being 1
                        if((side1 == 0 || side2 == 0 || side3 == 0)) 
                        {
                            // Problem begins here
                            triangleArray[trianglesAdded] = new Triangle();
                            System.out.println("Default triangle created");
                            trianglesAdded += 1;
                        }
                        
                        // If side lengths greater than zero were given, creates a triangle with the side lengths and color given
                        else 
                        {
                            triangleArray[trianglesAdded] = new Triangle(side1, side2, side3, color);
                            System.out.println("Triangle created with specified size and color");
                        }
                        
                        break;
                        
                    case 2:
                        ...
                        break;
                        
                    case 3:
                        ...
                        break;
                        
                    case 4:
                        ...
                        break;
                        
                    default:
                        System.out.println("Invalid menu choice. Please try again.\n");
                        break;
                }
    
            }
        
    

    您可以尝试以下代码

    while(true){
    
                System.out.println("1. Enter data for a new triangle.");
                System.out.println("2. Print all triangles sorted by area, smallest to largest.");
                System.out.println("3. Print only triangles with a specific color.");
                System.out.println("4. Exit the program.");
                System.out.print("\nPlease enter in a number to select an option: ");
                menuOption = sc.nextInt();
    
                    switch(menuOption){
                    case 1:
                        if(trianglesAdded == triangleArray.length - 1)
                            {
                                System.out.println("The triangle array has hit the max. You are unable to add more triangles.");
                                return;
                            } 
                                        
                        // If one, two, or all of the side lengths given are zero and the color of the triangle is 1, creates a default triangle
                        // with the sides being 1 and the color being 1
                        if((side1 == 0 || side2 == 0 || side3 == 0)) 
                        {
                            // Problem begins here
                            triangleArray[trianglesAdded] = new Triangle();
                            System.out.println("Default triangle created");
                            trianglesAdded += 1;
                        }
                        
                        // If side lengths greater than zero were given, creates a triangle with the side lengths and color given
                        else 
                        {
                            triangleArray[trianglesAdded] = new Triangle(side1, side2, side3, color);
                            System.out.println("Triangle created with specified size and color");
                        }
                        
                        break;
                        
                    case 2:
                        ...
                        break;
                        
                    case 3:
                        ...
                        break;
                        
                    case 4:
                        ...
                        break;
                        
                    default:
                        System.out.println("Invalid menu choice. Please try again.\n");
                        break;
                }
    
            }
        
    

    我会完全删除
    validMenuOption
    变量,并将其移动到单独的函数中,如下所示:

    public int getMenuOption() {
            Scanner sc = new Scanner(System.in);
            int menuOption = 0;
    
            System.out.println("1. Enter data for a new triangle.");
            System.out.println("2. Print all triangles sorted by area, smallest to largest.");
            System.out.println("3. Print only triangles with a specific color.");
            System.out.println("4. Exit the program.");
            System.out.print("\nPlease enter in a number to select an option: ");
            
            menuOption = sc.nextInt();
    
            if(menuOption < 1 || menuOption > 4) {
                return 0;
            } else {
                return menuOption;
            }
        }
    
            boolean run = true;
            int[] triangleArray = new int[100];
            int trianglesAdded = 0;
    
            while (run) {
                menuOption = getMenuOption();
                switch(menuOption) {
                    case 0:
                        System.out.println("Invalid menu choice. Please try again.\n");
                        break;
                    case 1:
                        if(trianglesAdded == triangleArray.length - 1) {
                            System.out.println("The triangle array has hit the max. You are unable to add more triangles.");
                            run = false;
                        } else {
                            triangleArray[trianglesAdded] = 1; // or whatevery number or object you want
                            System.out.println("Default triangle created");
                            trianglesAdded += 1;
                        }
                        break;
                    default:
                        break;
                }
            }
    
    为了简单起见,我将
    triangleArray
    设置为
    int
    数组。 我还添加了一个
    boolean
    变量
    run
    ,该变量在设置为
    true
    时运行,并在输入
    while
    时从
    getMenuOption()
    函数中获取
    menuOption

    现在,如果它得到
    0
    ,它将打印菜单选项为false
    break
    s并返回循环的开头,然后再次返回
    getMenuOption()
    。如果输入
    1
    ,它将进入
    案例1

    你提到的问题是:

    我得到一个错误,因为数组一旦达到极限就不能再容纳任何三角形对象

    通过添加
    条件来解决此问题,该条件在添加之前检查长度,就像我所做的那样

    要退出它,您需要添加另一个
    案例
    ,该案例将
    运行
    设置为
    错误

    case 4:
         run = false;
    
    等等


    这里是供您立即测试的。我已将数组的大小更改为
    2
    ,这样您可以看到它在达到极限时停止运行。

    我将完全删除
    validMenuOption
    变量,并将其移动到单独的函数,类似这样:

    public int getMenuOption() {
            Scanner sc = new Scanner(System.in);
            int menuOption = 0;
    
            System.out.println("1. Enter data for a new triangle.");
            System.out.println("2. Print all triangles sorted by area, smallest to largest.");
            System.out.println("3. Print only triangles with a specific color.");
            System.out.println("4. Exit the program.");
            System.out.print("\nPlease enter in a number to select an option: ");
            
            menuOption = sc.nextInt();
    
            if(menuOption < 1 || menuOption > 4) {
                return 0;
            } else {
                return menuOption;
            }
        }
    
            boolean run = true;
            int[] triangleArray = new int[100];
            int trianglesAdded = 0;
    
            while (run) {
                menuOption = getMenuOption();
                switch(menuOption) {
                    case 0:
                        System.out.println("Invalid menu choice. Please try again.\n");
                        break;
                    case 1:
                        if(trianglesAdded == triangleArray.length - 1) {
                            System.out.println("The triangle array has hit the max. You are unable to add more triangles.");
                            run = false;
                        } else {
                            triangleArray[trianglesAdded] = 1; // or whatevery number or object you want
                            System.out.println("Default triangle created");
                            trianglesAdded += 1;
                        }
                        break;
                    default:
                        break;
                }
            }
    
    为了简单起见,我将
    triangleArray
    设置为
    int
    数组。 我还添加了一个
    boolean
    变量
    run
    ,该变量在设置为
    true
    时运行,并在输入
    while
    时从
    getMenuOption()
    函数中获取
    menuOption

    现在,如果它得到
    0
    ,它将打印菜单选项为false
    break
    s,并返回循环的开始,然后返回
    getMen