繁体   English   中英

用Java调试面向对象的编程代码输出

[英]Debugging Object Oriented Programming code output in java

我在他的书中一直关注Tony Gaddis的编程挑战,并且尝试了“元音和辅音程序”。 该程序将要求用户输入任何字符串,然后将计算该字符串中的元音或辅音数量。 我可以编写大部分代码,但是输出出现问题。 希望你们能帮我这个忙。

问题是这样的:

************************ ||

1-元音

2-辅音计数

3-退出

进入模式:1

**** VO ********

输入词:abracadabra

人数:5

是否要再次输入(y / n):n

************************ ||

1-元音

2-辅音计数

3-退出

进入模式:1

(然后就到这里结束)

首先,我选择了模式1来计数元音,然后输入任何字符串。 然后,它确实成功计算了元音的数量,并询问我是否要再次输入,我输入了n否。 代码返回到选择模式,然后再次输入1以计算元音。 这次,它什么也没做。 它刚刚停止,据称我应该在其中再次输入字符串,依此类推。当我选择2来计数辅音时,也会发生相同的情况。

这是我的代码:

第1部分:

package Test;

public class VowelMain {
private String words;
private int vowel = 0;

public VowelMain(String w){
    words = w;
    setVowel(words);
}

public void setVowel(String words){
    char[]chunks = words.toCharArray();
    for(int x = 0;x < chunks.length;x++){
        if(chunks[x]=='a' || chunks[x]=='e' || chunks[x]=='i' || chunks[x]=='o' || chunks[x]=='u'){
            vowel += 1;
        }
    }
}

public int getVowel(){
    return vowel;
}

}

第二部分:

package Test;

public class ConsonantMain {
private String words;
private int consonant = 0;

public ConsonantMain(String w){
    words = w;
    setConsonant(words);
}

public void setConsonant(String words){
    char[]chunks = words.toCharArray();
    for(int x = 0;x < chunks.length;x++){
        if(chunks[x]=='a' || chunks[x]=='e' || chunks[x]=='i' || chunks[x]=='o' || chunks[x]=='u'){

        }else{
            consonant += 1;
        }
    }
}

public int getConsonant(){
    return consonant;
}
}

第三部分:

package Test;
import java.util.Scanner;

public class TestMain {

public static void main(String[]args){
    int mode = getMode();
    operation(mode);
}

public static void operation(int mode){
    Scanner hold = new Scanner(System.in);
    String words;
    String response;
    while(mode == 1 || mode == 2 || mode == 3){
        switch(mode){
            case 1:
                System.out.print("****VOWELS****\n");
                do{
                    System.out.print("Enter words:");
                    words = hold.nextLine();

                    VowelMain t = new VowelMain(words);
                    System.out.println("NUMBER OF VOWELS: " + t.getVowel());

                    System.out.print("Do you want to input again(y/n):");
                    response = hold.nextLine();
                    if(response.equalsIgnoreCase("n")){
                        mode = -1;
                        getMode();
                    }
                }while(response.equalsIgnoreCase("y"));
                break;

            case 2:
                System.out.print("****CONSONANTS****\n");
                do{
                    System.out.print("Enter words:");
                    words = hold.nextLine();

                    ConsonantMain c = new ConsonantMain(words);
                    System.out.println("NUMBER OF CONSONANTS: " + c.getConsonant());

                    System.out.print("Do you want to input again(y/n):");
                    response = hold.nextLine();
                    if(response.equalsIgnoreCase("n")){
                        mode = -1;
                        getMode();
                    }
                }while(response.equalsIgnoreCase("y"));
                break;

            case 3:

                System.exit(0);
                break;
            default:
                System.out.println("ERROR!");
                break;
        }
    }
}

public static int getMode(){
    Scanner hold = new Scanner(System.in);
    int mode;
    System.out.println("************************");
    System.out.println("1 - Count Vowels");
    System.out.println("2 - Count Consonants");
    System.out.println("3 - Exit");
    System.out.print("Enter mode:");
    mode = hold.nextInt();
    return mode;
}
}

每次放

mode = -1;
getMode();

您应该将其替换为:

mode = getMode();

这就是为什么。 如RealSkeptic所说, getMode()返回一个临时 mode值,而不是循环中使用的mode值。 通过将循环mode分配给临时模式(通过return语句),您的代码可以正常工作。

当我们输入"n"并调用用户在输入"n"之后需要的getMode函数时,您的函数将在循环之后终止。

您要做的就是在case 2:case 3:if语句中删除getMode()行,如下所示:

if(response.equalsIgnoreCase("n")){
                    mode = -1;
                    getMode();
}

并将其更改为

if(response.equalsIgnoreCase("n")){
                    mode = getMode();
}

我建议仅删除将-1的值分配给mode变量的行:

if(response.equalsIgnoreCase("n")){
                        //mode = -1;
                        getMode();
 }

每次您运行getMode()方法并选择一个选项时,您都将mode变量的值更改为所选值,直到下一次您运行getMode()方法并选择一个不同的值之前,它都保持这种状态。 通过选择将值更改为-1,您将中断循环,因为该值不在切换条件下考虑的范围内。 切换条件中未考虑的模式变量的任何其他值都会中断循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM