当前位置: 首页 > 知识库问答 >
问题:

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

顾嘉纳
2023-03-14

我在托尼·加迪斯的书中一直在关注他的编程挑战,我试着做“元音和辅音程序”。程序将要求用户输入任何字符串,然后计算该字符串中的元音或辅音数。我能够编写大部分代码,但输出有问题。希望你们能帮我解决这个问题。

问题是这样的:

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

1-计算元音

2-计数辅音

3-退出

进入模式:1

****元音****

输入文字: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;
}
}

共有2个答案

任昊苍
2023-03-14

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

您所要做的就是从案例2和案例3中的if语句中删除行,如下所示:

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

并将其更改为,

if(response.equalsIgnoreCase("n")){
                    mode = getMode();
}
严开宇
2023-03-14

每次你把

mode = -1;
getMode();

您应该将其替换为:

mode = getMode();

原因如下。正如RealSkeptic所说,getMode()返回的是临时模式值,而不是循环中使用的模式值。通过将循环模式分配给临时模式(通过返回语句),您的代码将正常工作。

 类似资料:
  • 类 在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。 请看文件名为 account.lua 的源码: local _M = {} local mt = { __index = _M } function _M.deposit (self, v) self.balance = self.balance + v end functio

  • 编程的抽象 我们将问题空间中的元素以及它们在方案空间的表示物称作“对象”(Object)。当然,还有一些在问题空间没有对应体的其他对象。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。与现实世界的“对象”或者“物体”相比,编程“对 象”与它们也存在共通的地方:它们都有自己的状态(state)和行为(behavior)。比如,狗的状态有名字、颜色等,狗的行为有叫唤、摇尾等。 软件世

  • 在至今我们编写的所有程序中,我们曾围绕函数设计我们的程序,也就是那些能够处理数据的代码块。这被称作面向过程(Procedure-oriented)的编程方式。还有另外一种组织起你的程序的方式,它将数据与功能进行组合,并将其包装在被称作“对象”的东西内。在大多数情况下,你可以使用过程式编程,但是当你需要编写一个大型程序或面对某一更适合此方法的问题时,你可以考虑使用面向对象式的编程技术。 类与对象是面

  • 面向对象编程是一种命令式编程,主要有基于类和基于原型两种方式。 基于类的面向对象语言是建立于类和实例这两个不同实体的概念之上: 类定义了一些可使特定的对象集合特征化的属性,并且是抽象的,而不是其所描述的对象集合中的任何特定的个体; 实例是一个类实例化的结果,是其成员之一,并且具有和父类完全一致的属性,不多不少。 基于类和基于原型的面向对象语言之间的不同大致可以概括为: 对比项 基于类 基于原型 类

  • 实例对象与 new 命令 this 关键字 对象的继承 Object 对象的相关方法 严格模式

  • C语言面向对象编程 记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的