【实验三】类的继承

1、完成书上107页实验题目2。注意,由于check方法中的参数answer是字符型数组,那么我们在判断前需要将我们输入的字符串转换为字符型数组。

import java.util.Scanner;

import java.util.Arrays;



 //抽象父类

abstract class Question {

    String text;

    String[] options = new String[4];//建立数组

 

    Question() {

    }//无参函数

 

    Question(String text, String[] options) {

        this.text = text;//表示对当前对象的引用

        this.options = options;

    }

 

    abstract boolean check(char[] answers);//检查方法

 

    void print() {//定义抽象类、建立父类

        System.out.println(text);

        System.out.println(options[0] + " " + options[1] + " " + options[2] + " " + options[3]);

        System.out.println("请根据问题选择你认为正确的选项:");

    }

}

 

//单选子类继承父类

class SingleQuestion extends Question {//对父类方法的重写

    char answer;

 

    SingleQuestion(String text, String[] options, char answer) {

        this.text = text;

        this.options = options;

        this.answer = answer;//this将成员变量和形参区分

    }

 

    boolean check(char[] answer) {

        //判断单选数量

        if (answer.length == 1) {

            if (Character.toUpperCase(answer[0]) == this.answer)// toUpperCase() 方法用于把字符串转换为大写

                return true;

            else

                return false;

        } else

            return false;

    }

}

 

//多选子类继承父类

class MultiQuestion extends Question {

    char[] answer = new char[4];//构建答案数组

 

    MultiQuestion(String text, String[] options, char[] answer) {

        this.text = text;

        this.options = options;

        this.answer = answer;

    }

 

     boolean check(char[] answers)

    {                         //判断多选回答和答案的正确性对比

        if(answers.length==this.answer.length)   //this.answer是指正确答案,判断选项数目

        {                                  

            int m=0;                    //m作为计数器

            //判断答案数组类是否有相同的元素

            for(int i=0; i<answers.length; i++)

            {

                for(int j=i+1;j<answers.length;j++)

                {

                    if(answers[i]==answers[j])

                    {

                        return false;

                    }

                }

                int b=Arrays.binarySearch(this.answer, Character.toUpperCase(answers[i]));//二分查找法

                //目标值在目标数组内的,返回下标

               //目标值不在数组内的,返回 -(第一个大于目标值的元素的下标+1)

                if(b>=0 && b<answers.length)       //得出选项对应下标

                {

                    m+=1;      

                }  

            }

            if(m==answers.length)           //若计数器等于答案数组长度,则全对

            {

                return true;

            }

            else{

                return false;

            }

        }

        else{

            return false;

        }

    }

}

 

 

 //测试类

public class test3{

    public static void main(String[] args) {

        Question[] Wen_ti = new Question[2];//两个问题

        Wen_ti[0] = new SingleQuestion("最早向刘备推荐诸葛亮的是谁?", new String[] { "A.徐庶", "B.司马微", "C.鲁肃", "D.关羽" }, 'A');

        Wen_ti[1] = new MultiQuestion("三国演义中的三绝是谁?", new String[] { "A.曹操", "B.刘备", "C.关羽", "D.诸葛亮" }, new char[] { 'A', 'C', 'D' });

       

        try (Scanner scn = new Scanner(System.in)) {

            for(int i=0; i<Wen_ti.length; i++){

                Question question = Wen_ti[i];

                question.print();    //调用的print方法

                System.out.print("请输入你的答案:");

                String da_an = scn.nextLine();    //读取一行的输入,以回车键为结尾

                char[] answers = da_an.toCharArray();//check方法中的参数answer是字符型数组,那么我们在判断前需要将我们输入的字符串转换为字符型数组。

                //将输入的选项转换为一个字符数组

               

                if(question.check(answers)){ //调用check方法

                    System.out.println("恭喜你,回答正确");            

                }else{

                    System.out.println("回答错误,还需要努力呀");

                }

            }

        }

    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellenionia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值