萌新自学Java,这道题有些功能实在写不出来,跪求大佬帮帮忙

2025-04-30 04:40:02
推荐回答(2个)
回答1:

public static void main(String[] arg)
{

test();
}

private  static  void test()
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入题目数量(1 ~ 100):");
int count = 0;
while (!(count > 0 && count <= 100))
{
if (sc.hasNextInt()) {
count = sc.nextInt();
if (count > 100 || count <= 0)
{
System.out.println("请输入1 ~ 100之间的数字");
}
} else {
System.out.println("不是数字");
}
}
System.out.println("请输入运算符的数量(1 ~ 3):");
int operatorNum = 0;
while (!(operatorNum > 0 && operatorNum <= 3))
{
if (sc.hasNextInt()) {
operatorNum = sc.nextInt();
if (count > 100 || count <= 0)
{
System.out.println("请输入1 ~ 3之间的数字");
}
} else {
System.out.println("不是数字");
}
}
int[] num = new int[operatorNum + 1];
int[] operator = new int[operatorNum];
Subject[] subjects = new Subject[count];
Random random = new Random();
int index = 0;

while (index < count)
{
String str = "";
double result = 0;
for (int i = 0 ;i < operatorNum;i++)
{
operator[i] = random.nextInt(4);
}

for (int i = 0 ;i < operatorNum + 1;i++)
{
num[i] = random.nextInt(100);
str += num[i];
if (i < operatorNum)
{
str += Operator(operator[i]);
}
}
result = getResult(str);

if (result > 0 && result != Double.NEGATIVE_INFINITY && result != Double.POSITIVE_INFINITY)
{
Subject subject = new Subject();
subject.setSubject(str);
subject.setResult(result);
subjects[index] = subject;
System.out.println("第" + (index + 1) + "题 : " + str + "=" );
double answer = sc.nextDouble();
subject.setAnswer(answer);
if (!subject.isTrue())
{
System.out.println("回答错误,正确答案是:"+ subject.getResult());
}
index++;
}
}
double rightNum  = 0;
for (int i =0;i < count;i++)
{
if (subjects[i].isTrue())
{

rightNum++;
}
}
System.out.println(rightNum);
System.out.println("回答正确率为:" + (rightNum / count * 100) + "%");
System.out.println("重新测试输入字母y,结束输入任意字符");
String ss = sc.next();
if (ss.equals("y"))
{
test();
}

}

public static String Operator(int operator)
{
switch (operator)
{
case 0 : return "+";
case 1 : return "-";
case 2 : return "*";
case 3 : return "/";
}
return "+";
}

/**
* 解析算式,并计算算式结果;
*
* @param str 算式的字符串
* @return double类型的算式结果
*/
public static Double getResult(String str) {
// 递归头
if (str.isEmpty() || isNumber(str)) {
return str.isEmpty() ? 0 : Double.parseDouble(str);
}

//递归体
if (str.contains(")")) {
// 最后一个左括号
int lIndex = str.lastIndexOf("(");
// 对于的右括号
int rIndex = str.indexOf(")", lIndex);
return getResult(str.substring(0, lIndex) + getResult(str.substring(lIndex + 1, rIndex)) + str.substring(rIndex + 1));
}
if (str.contains("+")) {
int index = str.lastIndexOf("+");
return getResult(str.substring(0, index)) + getResult(str.substring(index + 1));
}
if (str.contains("-")) {
int index = str.lastIndexOf("-");
return getResult(str.substring(0, index)) - getResult(str.substring(index + 1));
}
if (str.contains("*")) {
int index = str.lastIndexOf("*");
return getResult(str.substring(0, index)) * getResult(str.substring(index + 1));
}
if (str.contains("/")) {
int index = str.lastIndexOf("/");
return getResult(str.substring(0, index)) / getResult(str.substring(index + 1));
}

// 出错
return null;
}

/**
* 判断表达式是不是只有一个数字
*
* @param str 原值
* @return 数字非法性校验结果,失败返回false;
*/
private static boolean isNumber(String str) {

for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i)) && str.charAt(i) != '.' && str.charAt(i) != ' ') {
return false;
}
}
return true;
}

--------------------------------------------------------------------------------

public class Subject
{
private String subject;
private double result;
private double answer;

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public double getResult() {
return result;
}

public void setResult(double result) {
this.result = result;
}

public double getAnswer() {
return answer;
}

public void setAnswer(double answer) {
this.answer = answer;
}

public boolean isTrue() {

return result == answer;
}
}

回答2:


只做到了自动生成题目和记录答案,但要做到知道答案正确率,要在Question类添加个方法,计算str的值,才能做