Arithmatic项目修改总结

github仓库 arithmatic3.0

一. 修改介绍

修改后类图

1.关于类的合并

可以发现相比右边(旧)的类,左边(新)的类少了很多,这是我这次大改的思路体现

1. equation类和calculatresult类

将原来的计算结果和算式初始放在一起,定为一个equation类,将所有的界面输出取出去,这个类的明确定义就是针对整数算式,外部函数为获取算式和获取结果

class equation                //算式及结果
{
public:
void initequation(); //初始算式
double result(); //获取答案 private:
void clean();
void printf(); //输出算式
double mid();
double high();
double low(); int digit_num,
bracket_num,
k1 = 1, //目前位于数字数组位置
k2 = 0, //目前位于符号数组位置
flag = 0, //是否已出括号
bracket_a, //括号a位置
bracket_b, //括号b位置
m[30]; //算式数字 double result_0; //结果
char sign,
n[30]; //算式符号 };

有了对这个类的明确定义之后,思路就清晰很多了,实现了对类的封装,这里没有get和set方法,因为用户只需要知道算式是什么,答案是什么就够了,而原来的思路关于单独将计算拿出来做一个类的方案,我认为也很好,但不适合我现在来用,一是因为分数的计算不用这种方法计算,二是因为不太会用数据结构的方法,所以导致要将算式存到两个数组里,这样的话传参就会很麻烦,不如将他们放在一起。

2. language类和interface类

interface类定义:处理界面。三个公有函数分别代表处理界面的三个部分,开始,中间,和结束

class Interface       //界面
{
public:
int first(); //开始界面(包括语言)
void mid(int, double ); //每一道题的结果
void finally(); //统计错题数 private:
string *initlanguage();
void languagelist(); int equation_num,
correct, //一共对了
wrong; //一共错了
string *l, //init后语言指针
lan[10];
char name[10],
str[100],//内容
strp[100];
};

interface类,除了算式的输出,其他的都方法都在这个类里,由于language的作业是新的作业,而按理来说language类是界面输出的前提,所以这次大改我就将language中的两个方法放进interface类李作为私有函数了,用户也不需要知道我怎么获取语言的。

3. Message类的删除

本次大改最重要的原因之一就是要去掉这个静态类

class Message            //  全局数据
{
public:
Message();
void clean();
static int s1[20], //算式数字数组
equation_num, //算式个数
wrong,
correct,
bracket_num,
bracket_a,
bracket_b,
digit_num; //算式数字个数
static char s2[20], //算式符号数组
s[10][200];//语言字符串
static double result;//计算结果
};

这个类本来是原来的全局变量类,将它删掉至少花了我2/3的时间,将所有的变量删除,安州他们本应该所在的类放进去,处理了一大堆因为没有了这些随时都可以调用的变量的问题,这是本次大改最核心的部分,结果是显而易见的,修改后我觉得程序的封装已经很完美了。

2.关于类的封装

这次我在去掉所有全局和静态变量的过程中,还顺便对类进行系统化的封装,就像我上面的类图一样,当然有很多方法是有参数的,类图中只是想表达有这么个方法,我将所有的属性定为private不是因为我觉得这样很好看,而是因为在对类有了明确的定义后,不需要在其他的类中调用本类的属性,就像上课讲的一样,这个节目的表演者不需要知道下一个节目的信息。而所有的类只会在主函数中被实例化。

#include "equation.h"
#include "Fraction.h"
#include "Interface.h"
int main()
{
Interface inter;
double result; int n = inter.first(); //多少题
srand((unsigned(time(NULL))));
for (int j = 0;j < n;j++)
{
int judge = rand() % 5; //出现分数运算的几率,目前1/5
if (judge != 0)
{
equation equ;
equ.initequation(); //初始化整数算式
result=equ.result(); //计算并返回答案
}
else
{
Fraction fra;
fra.initFraction(); //初始化分数算式
result=fra.result(); //计算并返回答案
}
int answer;
cin >>answer;
inter.mid(answer,result); //当前答案结果输出
cout << endl;
}
inter.finally();
return 0;
}

这个是修改前主函数和修改后的对比

3.计算方法改进

  1. 这次改动最重要的部分就是关于equation类的修改,本来计算方法并不是这次修改的规划之一,但是由于在去掉全局变量的过程中有了新的灵感,所以也花了很久的时间进行改进,效果也是显而易见的,由原来的两个类11个成员函数(6个公有)260行到现在的一个类7个成员函数(2个公有)160行,可以说我完成了一次很大很大的进步,这次修改也为我留下了大量修改一个大程序的经验(下面会介绍)。
  2. 关于计算方法,本来是第一次作业我的队友佘岳昕负责写的,我不太想弄明白她到底是怎么实现(我想这就是github分工合作的目的吧),所以在这次修改之前没有仔细了解这样的方法,但这次迫于修改的要求,我花了很久的时间将他们之间的关系弄明白,并减少了一个函数,现在的计算方法可以说比远了更易懂,也更清楚,这里我用了3个成员函数low,mid,high,和名字一样,它们代表着运算级别,结果就利用三个函数的互相调用实现。我知道用栈的方法很简单,但现在我还不想用,一是因为现在还没有学,而是因为用这样的方法很锻炼做题的思路,三是因为它是真正我自己写的代码,我是最了解的,这样复杂的调用关系能弄明白,也是对我解题思维的提升。



    这是个很简略的图,具体实现还得看代码

修改中的经验和感想

1.同步修改

在修改计算方法的时候我找到了一种可以避免失误,提高精确程度的方法,同步修改。因为目的是要将原来的修改得更完善,而不是重新写一份,所以说有很多地方需要注意不能随便定义,先上图。

  1. 首先现将原来的equation类复制出来,添加主函数和输出函数,然后按照做题的思路将代码写正确,这时候不用去想类中该如何实现。
  2. 将源代码在复制粘贴出来一份,同样添加输出函数,主函数,然后按照已经调试正确的代码修改,这时同步修改源代码,将源代码的主函数进行修改,改的更适合调试这样能做到每一步都很精确,虽然有点慢,但总比一起修改,最后找不到是哪里错了强。

2.变量的设定

  1. 变量定义的时候都要尽量定为0,不要有-1,1之类的,这样会给以后的调试造成很大的麻烦,这次我在用同步修改的时候就遇到了这种情况,愣是着了一个小时,最后没办法将两个程序一起调试才找到问题。
  2. 关于循环使用一个变量或数组,最容易忘记的就是将他们初始化,所以针对他们我写了个clean的函数,专门负责初始化这些变量,写在for里面。当然,在写代码的时候就一定要对这些变量进行标注,要不然下一次打开就忘了他们是什么意思的了。
  3. 以类的思想设定变量,也就是属性,可以大大减少传参的使用,并可以进行完美的封装。

Arithmatic项目修改总结的更多相关文章

  1. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  2. eclipse 项目修改和更新项目,回退版本,解决分支的冲突的办法

    一个关于git的图 1.我在github建立了3个分支. 2.把其中一个分支拉到本地. 项目修改提交到远程库 3.修改完代码以后commit项目,点击项目右击->team->commit ...

  3. Laravel项目修改时区

    Laravel项目修改时区 最近做了一个支付宝支付的应用,现在还在开发过程中,今天早上起床之后先调试了一下项目,模拟支付了一笔(¥9999.00) 2333支付宝的沙箱环境啦,屌丝程序猿哪来这么多钱- ...

  4. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  5. 普通spring jsp+mybatis项目修改为springboot + jsp +mybatis项目

    概述 由于公司决定使用spring cloud,但是公司积累了大量的普通的jsp项目,老的项目直接全部修改为springboot成本过高,周期比较长,而且公司业务正在快速拓展,所以需要把之前的老项目修 ...

  6. idea git项目修改后无法提交 颜色都是灰色

    现象: idea git项目修改后无法提交   修改后的文件提交时不显示  颜色都是灰色 分析问题出现的原因: git未识别idea下项目. 排查: 发现是因为这个项目之前是基于svn的,然后直接导入 ...

  7. J2EE项目修改编码问题

    一:项目编码修改 新建项目后,右键项目-->Properties-->Resource,这时可以修改编码为UTF-8. 二:JSP页面编码修改 Window --> Preferen ...

  8. web项目修改名称问题

    第一步:鼠标点击项目按F2 ,然后修改名称 第二步:备份web.xml 第三步:鼠标点击项目右键  选properties(一般位于最后面)  再在弹出框中输入WEB 第四步:将备份的web.xml文 ...

  9. maven项目修改java编译版本的方式

    背景 使用 maven 3.x 安装到本地后,创建的项目一般都是基于JDK1.5版本.而目前大多数的项目已经升级到1.6或以上,尤其是Servlet3.0 已经要求Java6或以上版本的环境,往往需要 ...

随机推荐

  1. hive中文字符乱码 解决方法【转】

    一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为  j ...

  2. CoreText 关键性常用函数说明

    CoreText是专门进行文字绘制的函数集合 CoreText 将单个字符分为 · baseline(基线),一条假想的线,一行上的字形都以此线作为上下位置的参考,在这条线的左侧存在一个点叫做基线的原 ...

  3. 【数据结构与算法】002—树与二叉树(Python)

    概念 树 树是一类重要的非线性数据结构,是以分支关系定义的层次结构 定义: 树(tree)是n(n>0)个结点的有限集T,其中: 有且仅有一个特定的结点,称为树的根(root) 当n>1时 ...

  4. c语言输出控制符

    c语言格式输出 %d 10进制 %f 浮点型输出 %lf 长浮点型输出 %c 字符输出 %s 字符串输出 %o 八进制输出 %x 十六进制输出 %p 16进制,一般输出地址 %e 科学计数法输出 %m ...

  5. 求Read Depth

    如何划窗统计测序数据的reads数(depth):https://blog.csdn.net/shenshenwu666/article/details/80936374 方法1,用samtools ...

  6. SSM-CRUD入门项目——环境搭建

    一.项目概述 项目功能点: 1.分页 2.数据校验: jQuery前端校验+JSR303后端校验 3.ajax 4.RESTful风格的URI 技术点: 1.基础框架——SSM 2.数据库——MySQ ...

  7. FFT/NTT/MTT学习笔记

    FFT/NTT/MTT Tags:数学 作业部落 评论地址 前言 这是网上的优秀博客 并不建议初学者看我的博客,因为我也不是很了解FFT的具体原理 一.概述 两个多项式相乘,不用\(N^2\),通过\ ...

  8. 一维码EAN 13简介及其解码实现(zxing-cpp)

    一维码EAN 13:属于国际标准条码, 由13个数字组成,为EAN的标准编码型式(EAN标准码). 依结构的不同,EAN条码可区分为: 1.  EAN 13码: 由13个数字组成,为EAN的标准编码型 ...

  9. [SYZOJ279]滑♂稽♂树

    主♂席♂树♂裸♂题 https://syzoj.com/problem/279 https://oj.changjun.com.cn/problem/detail/pid/2425 // It is ...

  10. 【总结】详细说说Html.ActionLink的用法

    Html.ActionLink概述 在MVC的Rasor视图引擎中,微软采用一种全新的方式来表示从前的超链接方式,它代替了从前的繁杂的超链接标签,让代码看起来更加简洁,通过浏览器依然会解析成传统的a标 ...