个人项目小总结

终于完成了“简单”的个人项目,我内心稍有拨动。由于各种因素,我的个人项目启动稍晚,后来因电脑不好使借了室友的电脑,着实命途多舛。我的开发大概分为两个阶段。第一个阶段是实现读入算式,切分文字,中缀转后缀并计算结果。当然,是小数结果。以算法知识尚在,而一气呵成。第二阶段是写分数类,并实现之。本以为更易,然遇难于实现。我自以为分数类编的十分规范完备,然而想了一整天才想明白如何实现。经测试之后终于完成。

这个是我的分数类:

  1 //分数类
  2 class fraction
  3 {
  4 private:
  5     int numerator;            //分子
  6     int denominator;        //分母
  7 public:
  8     fraction()
  9     {
 10         numerator = 0;
 11         denominator = 1;
 12     }
 13     fraction(int n, int d)
 14     {
 15         if (d == 0)
 16         {
 17             cout << "输入有误,分母不能为0!" << endl;
 18         }
 19         else
 20         {
 21             numerator = n;
 22             denominator = d;
 23         }
 24     }
 25     int getN()
 26     {
 27         return numerator;
 28     }
 29     int getD()
 30     {
 31         return denominator;
 32     }
 33     void setN(int n)
 34     {
 35         numerator = n;
 36     }
 37     void setD(int d)
 38     {
 39         if (d == 0)
 40         {
 41             cout << "输入有误,分母不能为0!" << endl;
 42             return;
 43         }
 44         else
 45         {
 46             denominator = d;
 47         }
 48     }
 49     //约分
 50     void yuefen()
 51     {
 52         int bufn, bufd, buf;
 53         bufn = this->numerator;
 54         bufd = this->denominator;
 55         if (bufn < bufd)
 56         {
 57             buf = bufn;
 58             bufn = bufd;
 59             bufd = buf;
 60         }
 61         while (buf = bufn%bufd)
 62         {
 63             bufn = bufd;
 64             bufd = buf;
 65         }
 66         if (bufd != 1)
 67         {
 68             this->numerator /= bufd;
 69             this->denominator /= bufd;
 70         }
 71         if (this->denominator < 0)
 72         {
 73             this->numerator *= -1;
 74             this->denominator *= -1;
 75         }
 76     }
 77     //加法
 78     fraction operator+(fraction &f)
 79     {
 80         fraction fra(this->numerator*f.denominator + f.numerator*this->numerator, this->denominator*f.denominator);
 81         fra.yuefen();
 82         return fra;
 83     }
 84     //减法
 85     fraction operator-(fraction &f)
 86     {
 87         fraction fra(this->numerator*f.denominator - f.numerator*this->numerator, this->denominator*f.denominator);
 88         fra.yuefen();
 89         return fra;
 90     }
 91     //乘法
 92     fraction operator*(fraction &f)
 93     {
 94         fraction fra(this->numerator*f.numerator, this->denominator*f.denominator);
 95         fra.yuefen();
 96         return fra;
 97     }
 98     //除法
 99     fraction operator/(fraction &f)
100     {
101         if (f.numerator == 0)
102         {
103             cout << "除数不能为0!" << endl;
104             return f;
105         }
106         else
107         {
108             fraction fra(this->numerator*f.denominator, this->denominator*f.numerator);
109             fra.yuefen();
110             return fra;
111         }
112
113     }
114     //显示分数
115     void printfrac()
116     {
117         if (denominator == 1)
118         {
119             cout << numerator;
120         }
121         else
122         {
123             cout << numerator << "/" << denominator;
124         }
125     }
126     //判断相等的三个类,可拿分数和分数,int,double比较
127     bool operator==(fraction &f)
128     {
129         if (this->numerator == f.numerator&&this->denominator == f.denominator)
130         {
131             return true;
132         }
133         else
134         {
135             return false;
136         }
137     }
138     bool operator==(int &i)
139     {
140         if (i == (this->numerator / this->denominator))
141         {
142             return true;
143         }
144         else
145         {
146             return false;
147         }
148     }
149     bool operator==(double &d)
150     {
151         if (d == ((double)this->numerator / this->denominator))
152         {
153             return true;
154         }
155         else
156         {
157             return false;
158         }
159     }
160     //赋值
161     void operator=(fraction &f)
162     {
163         this->numerator = f.numerator;
164         this->denominator = f.denominator;
165     }
166 };

其中约分用了更好的方法,是网上查的,“辗转相除”法,《九章算术》中的招数。

堆栈类应该都差不多,所以就不贴了。

这个是中缀转后缀:

//中缀转后缀
void infix_to_suffix(const char pre[], char post[], int &n)
{
    int i = 0, j = 0;
    Stack<char> stack;
    stack.init();

    stack.push(‘=‘);                                                // 首先把“=”放入栈底,结束标志

    while (pre[i] != ‘=‘)
    {
        if ((pre[i] >= ‘0‘ && pre[i] <= ‘9‘) || pre[i] == ‘.‘)        // 遇到数字和小数点直接写入后缀表达式
        {
            post[j++] = pre[i];
            n++;
        }
        else if (pre[i] == ‘(‘)                                        // 遇到“(”不用比较直接入栈
            stack.push(pre[i]);
        else if (pre[i] == ‘)‘)                                        // 遇到右括号将其对应左括号后的操作符(操作符栈中的)全部写入后缀表达式
        {
            while (stack.gettop() != ‘(‘)
            {
                post[j++] = stack.pop();
                n++;
            }
            stack.pop();                                            // 将“(”出栈,后缀表达式中不含小括号
        }
        else if (isoperator(pre[i]))
        {
            post[j++] = ‘ ‘;                                        // 用空格分开操作数
            n++;
            while (priority(pre[i]) <= priority(stack.gettop()))
            {
                // 当前的操作符小于等于栈顶操作符的优先级时,将栈顶操作符写入到后缀表达式,重复此过程
                post[j++] = stack.pop();
                n++;
            }

            stack.push(pre[i]);                                        // 当前操作符优先级大于栈顶操作符的优先级,将该操作符入栈
        }

        i++;
    }
    while (stack.top)                                                // 将所有的操作符加入后缀表达式
    {
        post[j++] = stack.pop();
        n++;
    }

}

这个是将double数转换成分数:

//Number to fraction
fraction Num_to_fra(double n)
{
    fraction f((int)(n * 1000), 1000);
    f.yuefen();
    return f;
}

紧接着就是将输入的玩意(字符串)转化成分数:

//将输入的数(字符形式)转化成分数fraction
fraction char_to_fraction(char str[])
{
    int j = 0;
    double x = read_number(str, &j);
    fraction f = Num_to_fra(x);
    return f;
}

其中有一些借鉴网上的代码,比如约分的方法。但除此之外的分数类及其实现完全是自己想的自己写的,这也给了我一种不错的体验。

经历了这次紧张的开发,我有点期待未来的小组开发了。

时间: 2024-10-11 05:32:03

个人项目小总结的相关文章

一些好用的项目小工具

sublime text 2代码编辑器 xmind思维导图 sourceinsight代码阅读器 一些好用的项目小工具,布布扣,bubuko.com

全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看出目前一本图书信息主要有: 图片字段 名称字段 作者字段 出版社字段 除了以上前端页面中可见的信息外,在服务器开发中还需要给每一条记录(数据)都加上下面的几个字段: 创建时间字段 更新时间字段 删除时间字段 最后完成的数据库表如下: ps:由于数据库是直接导入的,之前的数据库是没有时间字段的,所以前

全栈项目|小书架|服务器端-NodeJS+Koa2 实现书籍详情接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 书籍详情分析 书籍详情页面如下: 从上图可以分析出详情页面大概有以下几个接口: 获取书籍详情信息 获取用户对书籍的喜欢状态接口 喜欢/不喜欢书籍接口 获取评论列表 写评论接口 以上的接口,有的数据可以直接从已存在的数据表中去获取,比如:书籍详情信息,而其他新接口就需要创建对应的model,然后根据model创建相应的数据表. 比如 用户对书籍的喜欢操作,可以创建li

struts2学习笔记之六(Action访问servlet的API以及复制项目小技巧)

action和servlet分离使得action代码更加纯洁,与servlet的耦合性也降低了 但是有时候却不得不访问servlet API,比如把数据放到session,application里, 更甚至于添加cookie(response.addCookie()) strust2提供了两种方式访问servlet api 伪访问 借助于ActionContext类 Map<String ,Object > getApplication() 模拟访问http application Map&l

维护项目小感

现阶段我的主要工作是对项目的维护,一是对项目进行一些缝缝补补的工作,二是对客户提出的一些小的修改,进行修改,三是帮客户修改一些数据. 我发现项目的需求总是变动的,至少我们这边是这样的,虽然项目都已经上线使用一段时间了,不过一些小的变动总是不断的,而且同时也发现有时侯客户现在提的需求和原来的需求相差是比较大的,可能是客户自己当初没有思考清楚,也可能是当时调研时没有完全的搞清楚,当然也可能是因为事情就是在不断的变化的,所以面对变化,面对需求的变化一定要心平气和,我们本来就是来帮助客户解决问题的!再者

百度开放云java+tomcat部署web项目-小皇帝詹姆斯

加入部署 复制svn地址,在本地checkout出来,打包自己的web项目并改名为ROOT.war,svn提交上去后,点击快捷公布,公布成功后稍等1-3秒点击域名就能够直接訪问自己的小项目啦! 项目结构图: http://kingjames.duapp.com/这是一个小皇帝詹姆斯的一个介绍案例,部分截图例如以下

2016项目小总结

2016学习了python自动化测试 2016学习了http post flood 1.自动化测试,还有很多知识需要学习, 2.http post flood 我以后论文的写作方向,年前功能已经实现了,依然还有很大的优化空间,对这块业务理解的还不彻底 编写完v6代码的时候,已经渐渐的对这块有一定的掌握,由于只写了内核态的代码,所有对Flood框架还是有点模糊 项目小结: 这个项目是基于GET的代码来添加对POST Flood的支持 由于大量代码复用的缘由,实际我只写了差不多500行代码,对整个流

匿名App项目小总结

1.在项目的一开始就要先做好整个架构的准备,需要哪些类,放在哪些包下面一般可以这样子:有一个Aty包,一个net包,一个bean包,一个util包,一个db包,一个adapter包,然后把需要的先创建出来,之后再逐渐去完善. 2.判断一个Edittext是否为空的时候应该用TextUtils.isEmpty(xxx)方法而不是再用xxx=="" 3.定义为final static的好处:能够在未被实例化的时候就可以调用,而且还有一点如果多个地方调用到的话能够减少书写错误 4.进一步熟悉

值得2019年创业的互联网项目 小程序创业月入10万不是梦

如今移动互联网创业依然成为趋势,这让更多的创业者有更广泛的项目可以选择,整个国内都踊跃出一股创新创业氛围的感觉,从城市到乡镇都升腾着无法抑制的创业激情. 虽然现在互联网创业项目有很多,但是还是想分享下做互联网创业项目之前的一些建议: 1.千万不要刚入门就做资本性质太强的项目,这种项目资本相对投入较多,比如说,你想开个什么商铺,对于2019年的现在来说要开一个商铺的话需要花费大量租金(租金基本没有一个月一交),大量的转让费(少说好几千,多说几万上至几十万),装潢,进货,总体算下来的话最少则几万,多