首页 > 编程语言 >【JAVA】四则运算计算题生成及完成情况分析程序

【JAVA】四则运算计算题生成及完成情况分析程序

时间:2023-04-12 13:56:56浏览次数:41  
标签:JAVA String 计算题 int 分析程序 System result exercise out

第七周结对编程任务为给出一个300道四则运算计算题并能够完成和检查答案是否正确,我(2152113)邀请到了我计科专业的舍友(2152123)与我一同组队,编程语言选择了我们都较为熟悉的JAVA。

代码初现

先由我来进行了计算题生产器的代码编写

代码如下

import java.util.Random;

public class MathExerciseGenerator {
    private static final int MAX_NUM = 100;
    private static final int NUM_EXERCISES_PER_WEEK = 300;

    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(NUM_EXERCISES_PER_WEEK);
        for (String exercise : exercises) {
            System.out.println(exercise);
        }
    }

    public String[] generateExercises(int numExercises) {
        Random random = new Random();
        String[] exercises = new String[numExercises];
        for (int i = 0; i < numExercises; i++) {
            int numOperands = random.nextInt(2) + 1; // 1 or 2 operands
            String operator = "+";
            if (numOperands == 2) {
                operator = "-";
            }
            int operand1 = random.nextInt(MAX_NUM) + 1;
            int operand2 = random.nextInt(MAX_NUM) + 1;
            if (operator.equals("-")) {
                // ensure that the difference is positive
                while (operand2 > operand1) {
                    operand2 = random.nextInt(MAX_NUM) + 1;
                }
            }
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            exercises[i] = operand1 + " " + operator + " " + operand2 + " = ";
        }
        return exercises;
    }

    public boolean checkAnswer(String exercise, int answer) {
        String[] parts = exercise.split(" ");
        int operand1 = Integer.parseInt(parts[0]);
        String operator = parts[1];
        int operand2 = Integer.parseInt(parts[2]);
        int result = 0;
        if (operator.equals("+")) {
            result = operand1 + operand2;
        } else if (operator.equals("-")) {
            result = operand1 - operand2;
        }
        return answer == result && answer >= 0 && answer <= 100;
    }
}

然后由他来编写了答题器部分

代码如下

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (String exercise : exercises) {
            System.out.print(exercise);
            int answer = scanner.nextInt();
if (answer > 100)
               continue;           else if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
        }
        System.out.println("Score: " + numCorrect + " out of 300");
    }
}

此时我们已经得到了一个可以成功运行的题目自动生成,并可以完成和检测的程序,但在测试中发现,在对于答案超过100的计算题中,依然保留了算式,我认为这非常不合理,应当直接不显示该算式,跳过去显示下一题,于是我们着手修改这一非常不科学的问题。

 

 

 

 代码改进

研究过后,我们认为计算题生成器方面无需改动,而需要在答题器模块修改一下结构,首先在循环外部计算每个练习题的答案。然后,在循环内部,我们添加了一个新的条件来检查答案是否大于 100。如果是,则不显示该计算题,并继续进行下一个练习题。否则,显示该计算题并要求用户输入答案。

改进后的答题器代码

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (String exercise : exercises) {
            String[] parts = exercise.split(" ");
            int operand1 = Integer.parseInt(parts[0]);
            String operator = parts[1];
            int operand2 = Integer.parseInt(parts[2]);
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            if (result > 100) {
                continue; // skip the current exercise
            }
            System.out.print(exercise);
            int answer = scanner.nextInt();
            if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
        }
        System.out.println("Score: " + numCorrect + " out of 300");
    }
}

 进行了50道测试后,并没有再出现答案超过100的情况 ,问题得到解决。

 

代码完善

最后在队友的建议下,又决定添加做题速率和正确率模块,更直观地展现完成情况。

完善后的答题器代码最终版本

import java.util.Scanner;

public class MathExercisesApp {
    public static void main(String[] args) {
        MathExerciseGenerator generator = new MathExerciseGenerator();
        String[] exercises = generator.generateExercises(300);
        Scanner scanner = new Scanner(System.in);
        int numCorrect = 0;
        for (int i = 0; i < exercises.length; i++) {
            long timeStart = System.currentTimeMillis(); // start timing
            String exercise = exercises[i];
            String[] parts = exercise.split(" ");
            int operand1 = Integer.parseInt(parts[0]);
            String operator = parts[1];
            int operand2 = Integer.parseInt(parts[2]);
            int result = 0;
            if (operator.equals("+")) {
                result = operand1 + operand2;
            } else if (operator.equals("-")) {
                result = operand1 - operand2;
            }
            if (result > 100) {
                continue; // skip the current exercise
            }
            System.out.print(exercise);
            int answer = scanner.nextInt();
            if (generator.checkAnswer(exercise, answer)) {
                System.out.println("Correct");
                numCorrect++;
            } else {
                System.out.println("Incorrect");
            }
            double successRate = ((double)numCorrect / (i+1)) * 100;
            System.out.printf("Success rate: %.2f%%   ", successRate);
            long timeEnd = System.currentTimeMillis(); // end timing
            double timeElapsed = (timeEnd - timeStart) / 1000.0; // convert time to seconds
            System.out.printf("Time elapsed: %.2fs\n", timeElapsed);
        }
        double finalScore = ((double)numCorrect / exercises.length) * 100;
        System.out.printf("Final score: %.2f%% (%d out of %d)\n", finalScore, numCorrect, exercises.length);
    }
}

运行截图展示

   

 

 项目完成心得

第一次体验结对编程任务就充分感受到了其与自己编程的巨大差别,两个人合作能够互相弥补对方的弱势,例如我的代码调整能力较弱,队友较强,他可以很好地将代码调整到我们想要的效果,我的想法比较多,可以提出很多改进意见,这一方面他就不如我。结对编程时,代码会经过更多的检查和审查,从而提高了代码的质量和可读性,并且两个人一起编写代码,可以相互纠正错误并及时发现难以察觉的错误,从而减少错误率。过程中也促进了知识分享和交流,使得团队成员可以在更短的时间内学习和掌握新技术,这也有助于增强团队合作精神,改善氛围。虽然结对编程需要两个人一起工作,但是它可以节省开发时间,并且生成更稳定、更高效的代码,从而提高生产力。

 

标签:JAVA,String,计算题,int,分析程序,System,result,exercise,out
From: https://www.cnblogs.com/b0bxu/p/17309141.html

相关文章

  • Java中ThreadLocal的用法和原理
    用法隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。packagecom.example.test1.service;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;imp......
  • Java:使用hutool工具类UrlBuilder、urlQuery构建url查询参数
    依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency>url查询参数构建packagecom.example;importcn.hutool.core.net.url.UrlQuery;im......
  • java事件处理机制
     事件源可以是一个键可以是一个鼠标可以是一个按钮.....发生了就是事件源事件就是事件的对象,当事件源发生了就会有事件对象(事件对象就会传递给事件监听者)事件监听者接受刀事件对象了之后会进行事件处理方法   ......
  • java项目 学生成绩管理系统 (源码+数据库文件)
    ​ 需要的私信我备注来意:项目名称来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码java项目  学生成绩管理(源码+数据库文件)技术框架:java+springboot+vue+mysql后端框系统共分为三种用户系统主要功能:系统设计三个角色,学生端,教师端,系统管理员端一、系统运行......
  • java判断字符串是否包含汉字工具类
       /***判断字符串中是否包含中文**@paramstr待校验字符串*@return是否为中文*@warn不能校验是否为中文标点符号*/publicstaticbooleanisContainsChinese(Stringstr){if(str==null){returnfalse;}P......
  • JavaScript Window.Location - 获取当前页面地址(URL)并重定向到新页面。
    JavaScriptWindow.Location-获取当前页面地址(URL)并重定向到新页面。1、常用:window.location.href//返回当前页面的href(URL)window.location.host//或window.location.hostname//返回web主机的域名或IP地址,window.location.pathname//返回当前页面的路径或......
  • java怎么样判断一个进程是否已近结束
    以记事本程序为例Processp=Runtime.getRuntime().exec("notepad.exe");try{p.waitFor();//等待notepad.exe的结束}catch(InterruptedExceptionex){System.err.println("ERROR");System.exit(1);}//继续自己的程序参见http://zhidao.baidu.com/qu......
  • 如何将oracle.sql.TIMESTAMP 转换为 java date
    privateStringgetDate(Objectvalue){Timestamptimestamp=null;try{timestamp=(Timestamp)value;}catch(Exceptione){timestamp=getOracleTimestamp(value);}if(timestamp!=null)return(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss.S&......
  • 带你揭开神秘的javascript AST面纱之AST 基础与功能
    作者:京东科技周明亮AST基础与功能在前端里面有一个很重要的概念,也是最原子化的内容,就是AST,几乎所有的框架,都是基于AST进行改造运行,比如:React/Vue/Taro等等。多端的运行使用,都离不开AST这个概念。在大家理解相关原理和背景后,我们可以通过手写简单的编译器,简单实现......
  • Java实验八
    //SortTestpublicclassSortTest{publicstaticvoidmain(String[]args){Sortupsup=newSortup();sup.sortup();Sortdownsup2=newSortdown();sup2.sortdown();}}  //Sortdownimportjava.util.Scanner;p......