关于四则运算表达式生成和答案校验的笔记

软件工程的个人项目是写一个面向小学生的四则运算题目生成和校验工具。主要功能有两个,一是生成四则运算题目,二是对给定的题目和答案,校验其中答案的正确性。

时间表格



前期构思的时间比较多,但是在编码和测试中还是花费了不少的时间。

由于采用的c语言,在字符串的处理和内存管理上花费了较多的时间。


PSP2.1


Personal Software Process Stages


Time


Planning


计划


· Estimate


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


20h


Development


开发


· Analysis


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


6h


· Design Spec


· 生成设计文档


1h


· Design Review


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


1h


· Coding Standard


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


0.5h


· Design


· 具体设计


2h


· Coding


· 具体编码


7h


· Code Review


· 代码复审


1h


· Test


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


4h


Reporting


报告


· Test Report


· 测试报告


1h


· Size Measurement


· 计算工作量


0.5h


· Postmortem & Process Improvement Plan


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


0.5h

 
合计


24.5

题目分析和思路



主要问题:

1.算式查重
     非等价去重
     如果两个表达式的数和操作符都一样,我们认为这两个表达式重复。
2.对大量数据的支持,支持1w个算式,考虑到查重需要顺序检索,使用结构体和链表

3.答案校对需要支持对中缀表达式的计算

  1)中缀表达式转后缀表达式——调度场算法

  2)后缀表达式的计算

4.真分数的四则运算(a!=0,b!=0)

获取操作数:a,b,m,n

计算结果:k,l(k/l的形式)

1)加减法:m/a + n/b -> (bm+an)/ab

乘法:m/a × n/b ->mn/ab

除法:m/a ÷ n/b ->mb/na(n!=0)

2)辗转相除法求得最大公约数,化简分数(k/l)

if(k>l)
    x=gcd(k,l);
else
    x=gcd(l,k);
int gcd(int k, int l){
    if(k%l==0)
        return l;
    else
        return gcd(l,k%l);
}

另:另记得处理化简之后分母为1的情况

5.括号问题——生成带括号的算式

左括号:第一个数/每一个操作符(不含最后一个),若没有生成过左括号,随机一次是否生成左括号。

右括号:每一个操作符,若生成过左括号没有生成过右括号,随机一次是否生成右括号。

结尾处:若已经有左括号但是没有右括号,则补上右括号。

备注:先检测右括号,后检测左括号。

6.c语言带来的需要注意的问题:c风格式字符串处理,内存管理。

代码中遇到的问题


1.生成过程中的算式结果合法性检查花费了大量的时间。很多时间花在对生成到一半的表达式进行处理使其成为能够计算的表达式。

2.处理c风格式字符串与生俱来的麻烦,这点在上一点中也有很大影响。

3.内存管理问题。为了简化代码,构写了不少函数,传参和返回值基本采用char*类型,释放内存的过程中产生了不少问题。

性能分析



ArithmeticProducer.exe -r 50 -n 20000


名称


非独占样本数


独占样本数


非独占样本数百分比


独占样本数百分比


-  ArithmeticProducer.exe


1,159


624


100.00


53.84


produce


969


532


83.61


45.90


_strcmp


18


18


1.55


1.55


gcd


18


18


1.55


1.55


calc


152


16


13.11


1.38


convert


25


13


2.16


1.12


transToVulgarFrac


59


8


5.09


0.69


getRand


16


7


1.38


0.60


getGcd


22


4


1.90


0.35


_RTC_CheckEsp


2


2


0.17


0.17


getIntResult


109


2


9.40


0.17


@ILT+230


1


1


0.09


0.09


@ILT+240


1


1


0.09


0.09


_RTC_CheckStackVars


1


1


0.09


0.09


checkRange


91


1


7.85


0.09


__tmainCRTStartup


1,159


0


100.00


0.00


main


1,159


0


100.00


0.00


mainCRTStartup


1,159


0


100.00


0.00

其中produce()是用于生成算式的函数。

从上述性能分析数据来看,占据CPU时间最多的produce()函数,占比高达45.90%。

其它函数中,CPU时间主要耗费在计算上(gcd()用于递归计算最大公约数,clac()用于计算后缀表达式的值,convert()用于将中缀表达式转换为后缀表达式以便计算)。

根据分析数据,produce()函数有很大的优化空间。

时间: 2024-10-16 01:23:53

关于四则运算表达式生成和答案校验的笔记的相关文章

四则运算表达式网页版

在网页上面生成一个四则运算表达式,用户可以输入表达式的值,然后系统提示结果是否正确.这个网页程序比本机程序来说容易一点,一是因为表达式中运算符的个数不超过三个,表达式容易获得.还有就是javascript自带了一个计算表达式的值的函数,我们可以调用这个函数来完成对表达式值的计算. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% Str

四则运算表达式生成器(C语言)

结对项目:四则运算表达式生成器(C语言) GitHub:https://github.com/peter-ye-code/Question-Builder 合作者:叶学涛(3118005024) 温德华(3118005021) 一.需求 四则运算表达式生成器的全部功能: 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 将生成10个题目. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)

四则运算表达式总结

四则运算表达式总结 这两周完成了第一个个人项目--四则运算表达式.在整个开发的过程中我有一些收获也发现了自身的一些问题.下面就分条简述一下. 完成情况 1.实现随机生成任意长度的四则表达式(+.-.*./.括号). 2.实现四则表达式的计算(包括分数). 3.实现接收用户对某四则运算表达式计算的结果并判断正确性. 4.实现结合1.2.3功能的MFC应用程序 总结 整个的设计与实现过程中,收获颇多.首先就是我发现在实现之前能够有一个比较良好的设计思路以及程序流程的重要性(最好是能够记录下来而不是存

【个人项目总结】C#四则运算表达式生成程序

S1&2.个人项目时间估算 PSP表格如下: PSP2.1 Personal Software Process Stages Time(Before) Time(After) Planning 计划   · Estimate · 估计这个任务需要多少时间 2 4 Development 开发   · Analysis · 需求分析 (包括学习新技术) 3 5 · Design Spec · 生成设计文档 8 11 · Design Review · 设计复审 (和同事审核设计文档) 1 0 ·

程序输出小学四则运算表达式,支持真分数四则运算

程序设计思路: 1.运算式的输出格式可以为 数字 运算符 数字,也可以为 数字 运算符 数字 运算符 数字,还可以是更复杂的式子,在此只实现了2-3个数字的运算式. 2.将式子分为两类,第一类为20个,第二类为10个,分别用FOR循环控制输出. 3.第一类式子稍简单,只需通过随机函数将两个数字赋值,中间运算符通过数组下标的随机赋值实现随机性,再通过格式输出即可 4.此时还要考虑运算符为 ‘/’,并且除数为0的情况,这时用if语句设置条件排除即可 5.计算第一类式子结果可以参考计算器的功能代码,用

利用Python实现四则运算表达式生成程序

一. 项目基本信息 项目成员:梁华超.林贤杰 项目仓库:Github 二. PSP2.1表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 25 · Estimate · 估计这个任务需要多少时间 20 25 Development 开发 1200 1740 · Analysis · 需求分析 (包括学习新技术) 40 55 · Design Spec · 生成设计文档 40 41 · Desig

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

计算四则运算表达式(Java语言实现)

计算四则运算表达式主要是分两步运算  第一步是把 中缀表达式 转换成 后缀表达式.参考大一下期学的 <数据结构与算法分析--C语言描述>3.3.3 教材,完成下列代码: static String mid_to_suf(String str){ Stack<Character> s = new Stack<Character>(); String suf = new String(); HashMap<Character, Integer> map = ne