个人项目---四则运算题目生成器项目记录

本次作业是设计并实现一个四则运算题目随机生成器(支持分数运算),其功能包括生成题目文件,并自动生成对应的答案文件,以及根据输入的题目文件,对输入的答案文件进行批改打分。

时间表格


 

PSP2.1

Personal Software Process Stages

Time

Planning

计划

 

  · Estimate

  · 估计这个任务需要多少时间

 24h

Development

开发

 

  · Analysis

  · 需求分析 (包括学习新技术)

 2h 

  · Design Spec

  · 生成设计文档

 2h 

  · Design Review

  · 设计复审 (和同事审核设计文档)

 1h

  · Coding Standard

  · 代码规范 (为目前的开发制定合适的规范)

 1h

  · Design

  · 具体设计

 2h

  · Coding

  · 具体编码

 5h

  · Code Review

  · 代码复审

 1h

  · Test

  · 测试(自我测试,修改代码,提交修改)

 10h

Reporting

报告

 

  · Test Report

  · 测试报告

 3h

  · Size Measurement

  · 计算工作量

 1h

  · Postmortem & Process Improvement Plan

  · 事后总结, 并提出过程改进计划

 1h

 

合计

 29h

从表中可以看出我的实际花费时间比预估时间多了许多,而且在编码和测试Debug上花费了巨大的时间,原因很简单,设计阶段设计考虑的不周全、不细致。

需求分析及设计方案


需求大体分为三个部分:

  1.根据参数随机生成题目

  2.计算出所生成题目的答案

  3.对给定的题目和答案进行批改

仔细一点分析一下的话,可以得出一下几个功能需求:

  1.使用命令行参数来对程序输入相关参数

  2.实现分数、整数之间的四则运算

  3.生成的题目保证不重复

  4.生成的题目在每一步计算的时候都不会出现负数

  5.输出时,所有的分数转化为真分数或者带分数

  6.对读入的表达式进行分析和计算

针对上述的几点功能,很容易的想到利用一个分数类(class fraction),来统一表示题目中的数,并且重载四则运算实现计算功能以及输出为string。

fraction类定义:

class fraction {
private:
    long long ups; 
    long long downs;
public:
  //构造函数
    fraction();
    fraction(int max);
    fraction(long long u, long long d);
    fraction(string s);
  //重载运算符
    friend fraction operator+(const fraction &f1, const fraction &f2);
    friend fraction operator-(const fraction &f1, const fraction &f2);
    friend fraction operator*(const fraction &f1, const fraction &f2);
    friend fraction operator/(const fraction &f1, const fraction &f2);
    friend bool operator==(const fraction &f1, const fraction &f2);
  //toStirng转化函数
    string output() const;
};
View Code

对于生成的题目,我设计了problem类来进行管理,处理题目的所有需求,包括判重、计算、合法性判断以及输出为string

problem类定义:

class problem{
private:
    vector<char> ops;
    vector<fraction> numbers;
public:
        //构造函数
    problem::problem();
    problem(int opn, int r);
    problem(vector<char> ops, vector<fraction> n);
        //比较和计算
    bool compare(const problem &p) const;
    bool calculate(fraction &a) const;
        //toString转化函数
    string output() const;
};
View Code

数据结构设计好了之后,剩下的设计“似乎”就“水到渠成”了(然而这个自以为是的想法给我后面Debug,留下了好多坑)。只需要利用生成随机数,一步一步的生成题目即可。

测试


 

代码写完以后,我在测试上花了巨大的时间代价。。。修补之前的逻辑bug,

TestCase 1

PersonApplication.exe -n 10

TestCase 2

PersonApplication.exe -n 10 -r 10

TestCase 3

PersonApplication.exe -n 5000 -r 10

TestCase 4

PersonApplication.exe -n 10000 -r 10

TestCase 5

PersonApplication.exe -n 10000 -r 100

第二个功能的测试用例一样,但是会对答案以及题目文件进行一些改动。由于文件太大,就不展示了。

性能分析


 

 

通过分析图表可以看出,我的程序调用最频繁的是vector容器的申请和size()成员函数,是由于我在编程中经常进行压入元素和弹出元素的操作导致的。

另外compare()函数调用的也非常多,因为我的查重算法只能通过两两比较的暴力算法进行。没时间去思考和实现更好的算法了Orz......

问题、总结、收获


 

完成此次个人项目以下几个问题及体会。

首先是对于C++语言以及VS2012编程环境的不熟悉,导致我初期上手编码时,效率非常低,经常是一边编码,一边搜索各种小问题。

然后再编码过程中遇到的最头疼的问题是C++中的字符串处理问题。C++中,需要区分char *,Cstring,string这三种不同的字符串数据结构。由于C++对于C的继承性,有许多库函数的接口都只接受char *的参数,所以在我想要的string和各种其他类型的变量之间的转换是我花了许多时间的地方。虽然在网上查到了<sstream>中的stringstream类能很方便的构建string,但是我一开始用的方法错误......Orz....(好想念Java的string~~~)。不过我最后还是很高兴的学会了使用这个类。

最后一个问题就是不写详细设计文档的恐怖。我进行设计的时候并没有形成真正意义上的设计文档,导致我一边在思考,一边进行编码,导致后来在Debug的时候花了巨大的精力来修补之前代码中留下的各种稀奇古怪的逻辑漏洞或者笔误。不做设计累死人!!!

 

转载于:https://www.cnblogs.com/nightcool/p/4830205.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以为您提供一个参考的 Java 四则运算考试系统代码。这个代码可以帮助生成一些四则运算题目,并让用户在规定时间内作答。 ``` import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { int numQuestions = 5; // 生成的题目数量 int timeLimit = 30; // 答题时限(秒) int numCorrect = 0; // 用户答对的题目数量 // 创建一个随机数生成器 Random rand = new Random(); // 创建一个扫描器来读取用户的输入 Scanner scan = new Scanner(System.in); // 开始计时 long startTime = System.currentTimeMillis(); // 生成并解决 numQuestions 个四则运算题目 for (int i = 1; i <= numQuestions; i++) { // 生成两个随机整数 int x = rand.nextInt(10); int y = rand.nextInt(10); // 选择一个随机的运算符 char op = getRandomOperator(rand); // 打印题目 System.out.printf("%d. %d %c %d = ", i, x, op, y); // 读取用户的答案 int userAnswer = scan.nextInt(); // 判断答案是否正确 if (isCorrect(x, y, op, userAnswer)) { numCorrect++; } // 判断时间是否已用完 long elapsedTime = (System.currentTimeMillis() - startTime) / 1000; if (elapsedTime >= timeLimit) { System.out.println("时间已用完!"); break; } } // 打印结果 System.out.printf("你答对了%d道题!", numCorrect); } // 获取一个随机的运算符 public static char getRandomOperator ### 回答2: Java四则运算考试系统代码主要包括三个模块:题目生成模块、答题模块和成绩统计模块。 1. 题目生成模块: - 通过随机数生成算术题目,包括加法、减法、乘法和除法。 - 可以设置题目数量和题目难度,难度包括简单、中等和困难。 - 题目的数字和运算符根据难度和题目数量进行生成,同时保证题目的正确性。 2. 答题模块: - 根据生成的题目,显示题目内容并等待用户输入答案。 - 接受用户输入的答案。 - 判断用户答案是否正确,并给予相应的提示。 - 记录用户的答题情况,并在最后统计成绩。 3. 成绩统计模块: - 统计用户答对的题目数量和答错的题目数量。 - 根据答对的题目数量计算得分,并给出评价。 - 最后显示用户的得分和评价。 考试系统代码示例: ```java import java.util.Random; import java.util.Scanner; public class ExamSystem { public static void main(String[] args) { int difficulty = 1; // 设置题目难度 int count = 10; // 设置题目数量 int correctCount = 0; // 答对的题目数量 int wrongCount = 0; // 答错的题目数量 // 生成题目 String[] questions = generateQuestions(difficulty, count); // 答题 for (int i = 0; i < questions.length; i++) { String question = questions[i]; System.out.print("第" + (i + 1) + "题:" + question + " = "); Scanner scanner = new Scanner(System.in); int answer = scanner.nextInt(); if (isCorrect(question, answer)) { System.out.println("回答正确!"); correctCount++; } else { System.out.println("回答错误!"); wrongCount++; } } // 成绩统计 int score = calculateScore(correctCount, count); String evaluation = getEvaluation(score); // 显示结果 System.out.println("答题完成!"); System.out.println("正确数量:" + correctCount); System.out.println("错误数量:" + wrongCount); System.out.println("得分:" + score); System.out.println("评价:" + evaluation); } public static String[] generateQuestions(int difficulty, int count) { String[] questions = new String[count]; Random random = new Random(); for (int i = 0; i < count; i++) { int num1 = random.nextInt(difficulty * 10) + 1; int num2 = random.nextInt(difficulty * 10) + 1; int operator = random.nextInt(4); String question; switch (operator) { case 0: question = num1 + " + " + num2; break; case 1: question = num1 + " - " + num2; break; case 2: question = num1 + " * " + num2; break; case 3: question = num1 + " / " + num2; break; default: question = ""; } questions[i] = question; } return questions; } public static boolean isCorrect(String question, int answer) { String[] parts = question.split(" "); int num1 = Integer.parseInt(parts[0]); int num2 = Integer.parseInt(parts[2]); String operator = parts[1]; int result = 0; switch (operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; } return result == answer; } public static int calculateScore(int correctCount, int count) { return correctCount * 100 / count; } public static String getEvaluation(int score) { if (score >= 90) { return "优秀"; } else if (score >= 80) { return "良好"; } else if (score >= 60) { return "及格"; } else { return "不及格"; } } } ``` 以上是一个简单的java四则运算考试系统代码示例,其中通过题目生成模块生成题目,答题模块进行答题,成绩统计模块统计成绩并给出评价。 ### 回答3: 要实现一个Java四则运算考试系统,可以按照以下步骤进行: 1. 首先,创建一个主类,命名为ExamSystem。在该类中,定义一个静态方法main,作为程序的入口点。 2. 在main方法中,提示用户输入参加考试的学生人数,并根据输入创建相应数量的学生对象。可以使用Scanner类来获取用户的输入。 3. 创建一个名为Question的类,该类用于生成随机的四则运算题目,并计算正确答案。 4. 在Question类中,定义一个静态方法generateQuestion,该方法生成一个随机的四则运算题目,并返回一个包含题目和正确答案的字符串。 5. 在Question类中,定义一个静态方法checkAnswer,该方法用于检查学生输入的答案是否正确。该方法接受两个参数:题目字符串和学生答案。在该方法中,首先将题目字符串解析为具体的题目和运算符,然后计算正确答案,并与学生答案进行比较,返回一个布尔值来表示答案是否正确。 6. 在ExamSystem类的main方法中,使用一个循环来遍历每一个学生对象,针对每个学生生成一道题目,并提示学生输入答案。然后,调用Question类的checkAnswer方法来检查学生的答案是否正确,并根据检查结果打印相应的信息。 7. 在循环结束后,统计并打印出答对题目最多的学生的信息,以及答题情况统计(如平均分、及格率等)。 8. 最后,使用try-catch语句块来处理可能出现的异常,如用户输入非法字符或计算过程中的异常,以保证程序的稳定性。 通过以上步骤,就可以实现一个简单的Java四则运算考试系统代码。通过随机生成题目、检查答案等功能,可以方便地进行考试并统计学生成绩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值