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("回答错误,还需要努力呀");
}
}
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/8a5d8e838744f68769298d989a9d3942.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee1c33821d711df809c020ac095225b9.png)