MFC版链表实现稀疏多项式相加减

链表实现多项式运算(加减)MFC可视化版

题目

设计一个一元稀疏多项式简单计算器。

基本要求

(1)输入并建立两个多项式;
(2)多项式a与b相加,建立和多项式c;
(3)多项式a与b相减,建立差多项式d;
(4)输出多项式a, b, c, d。输出格式:比如多项式a为:A(x)=c1xe1+ c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。

实现提示

(1)用带头结点的单链表存储多项式。
(2)每个多项式链表中都只存储非零系数项。若多项式a与b中指数相等的两项相加/减后,系数为零,则在和/差多项式中不存储该指数项。

思路

其实说真的,看到链表就烦,没办法了,只能写了,无奈自己太菜,大部分代码还是用的书上的,不过再运算符重载的时候自己改动了一下,因为要MFC可视化的缘故,就把输入输出的重载删掉了。
大致就和老师说的一样,重点在于建立多项式类,难点在于MFC可视化的计算器界面的数据输入输出,当然方法肯定很多,代码比较糙,将就着看吧,希望有对你有用的部分。
样子差不多就是这样:
bsYCN6l.png
输入
uYOKSLI.png
输出
lniru1w.png

1)输入数据处理

输入时,用CString变量存编辑框的内容,同时具备按钮输入和键盘输入两种方法,时间比较急,没有检测非法输入,必须是合法输入才能运算。不过这个写起来也不难,完成作业就先这样吧,到时候要是她还有要求再说。先把所有输入存在串里,然后用函数分割开,存进多项式对象里,在分割时写了一个函数,感觉蛮好用的,这里还有一个操作可能比较多于,先用CString存,在取数据的时候又转换为string,对string熟一点。
按键输入代码:

void CCalculatorDlg::OnBnClickedButton1()
{UpdateData(TRUE);m_Str += "1";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton0()
{UpdateData(TRUE);m_Str += "0";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonNod()
{UpdateData(TRUE);m_Str += ".";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton2()
{m_Str += "2";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton3()
{UpdateData(TRUE);m_Str += "3";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton4()
{UpdateData(TRUE);m_Str += "4";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton5()
{m_Str += "5";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton6()
{UpdateData(TRUE);m_Str += "6";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton7()
{UpdateData(TRUE);m_Str += "7";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton8()
{UpdateData(TRUE);m_Str += "8";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButton9()
{m_Str += "9";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonadd()
{UpdateData(TRUE);m_Str += "+";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonsub()
{UpdateData(TRUE);m_Str += "-";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonx()
{m_Str += "X";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonleft()
{UpdateData(TRUE);m_Str += "(";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonright()
{UpdateData(TRUE);m_Str += ")";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonmul()
{UpdateData(TRUE);m_Str += "^";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}void CCalculatorDlg::OnBnClickedButtonClear()
{m_Str = "";UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}

分割系数和指数函数:pos是开始时的串数组下标,exp是指数,返回系数

float Search_Num(string a,int &pos,int&exp) {float num = 0;int cap = 0;for (int i(pos); i < a.size(); i++) {if (a[i] >= '0'&&a[i] <= '9') {if (cap == 0)num = num * 10 + a[i] - '0';else num = num + (a[i] - '0')*pow(0.1, cap++);}else if (a[i] == '.') {cap = 1;}else {pos = i;break;}}exp = 0;int tag = 1;if (num == 0)num = 1;if (a[pos] == 'X') {if (pos > a.size() -1||a[pos+1]=='-'||a[pos+1]=='+') {exp = 1;pos++;return num;}if (a[pos + 2] == '-') {tag = -1;pos++;}for (int i(pos + 2); i < a.size(); i++) {if (a[i] >= '0'&&a[i] <= '9') {exp= exp* 10 + a[i] - '0';}else { pos = i;exp *= tag;return num;}}}else {exp = 0;return num;}
}

2)存进多项式对象中

类实现:

#include<iostream>
#include<string>
#include<cmath>
const double EXP = 1e-4;
using namespace std;
struct Term {float coef;int exp;Term *link;Term(float a, int b, Term* c = NULL) {coef = a;exp = b;link = c;}Term *insertAfter(float a, int b);
};
Term *Term::insertAfter(float a, int b) {link = new Term(a, b, link);return link;
}
class Poly {
private:Term *first;public:Poly() {first = new Term(0, -1);}Poly(Poly&R);int maxOrder();Term *GetHead() {return first;}string GetString();Poly operator+(Poly&);Poly operator-(Poly&);
};
Poly::Poly(Poly &R) {first = new Term(0, -1);Term *destptr = first, *srcptr = R.GetHead()->link;while (srcptr != NULL) {destptr->insertAfter(srcptr->coef, srcptr->exp);srcptr = srcptr->link;destptr = destptr->link;}
}
int Poly::maxOrder() {Term *current = first;while (current->link != NULL) {current = current->link;}return current->exp;
}
string Poly::GetString()
{string s;CString str;Term *p = GetHead()->link;bool flag = false;while (p != NULL) {str.Format(_T("%.5lf"), p->coef);if (flag == true) {if (p->coef >0) {s += '+';}}flag = true;while (str[str.GetLength() - 1] == '0') {str.Delete(str.GetLength() - 1, 1);}if (str[str.GetLength() - 1] == '.') {str.Delete(str.GetLength() - 1, 1);}if(p->exp==0||(str!=_T("1")&&str!=(_T("-1"))))s += (CT2A)str;else if (str == _T("-1")) {s += '-';}if (p->exp == 1) {s += 'X';}else if(abs(p->exp)>1)s += "X^";str.Format(_T("%d"), p->exp);if (abs(p->exp) > 1) {s += (CT2A)str;}p = p->link;}return s;
}
Poly Poly::operator+(Poly&R) {Term*pa, *pb, *pc, *p;Poly C;float temp;pc = C.first;pa = GetHead()->link;pb = R.GetHead()->link;while (pa != NULL && pb != NULL) {if (pa->exp == pb->exp) {temp = pa->coef + pb->coef;if (abs(temp) > EXP) {pc = pc->insertAfter(temp, pa->exp);}pa = pa->link;pb = pb->link;}else if (pa->exp < pb->exp) {pc = pc->insertAfter(pa->coef, pa->exp);pa = pa->link;}else {pc = pc->insertAfter(pb->coef, pb->exp);pb = pb->link;}}p = pa == NULL ? pb : pa;while (p != NULL) {pc = pc->insertAfter(p->coef, p->exp);p = p->link;}return C;
}
Poly Poly::operator-(Poly&R) {Term*pa, *pb, *pc, *p;Poly C;float temp;pc = C.first;pa = GetHead()->link;pb = R.GetHead()->link;while (pa != NULL && pb != NULL) {if (pa->exp == pb->exp) {temp = pa->coef - pb->coef;if (abs(temp) > EXP) {pc = pc->insertAfter(temp, pa->exp);}pa = pa->link;pb = pb->link;}else if (pa->exp < pb->exp) {pc = pc->insertAfter(pa->coef, pa->exp);pa = pa->link;}else {pc = pc->insertAfter(-pb->coef, pb->exp);pb = pb->link;}}p = pa == NULL ? pb : pa;int flag = pa == NULL ? -1 : 1;while (p != NULL) {pc = pc->insertAfter(flag*p->coef, p->exp);p = p->link;}return C;
}

按等于按钮开始读数据存进多项式A,B中:

void CCalculatorDlg::OnBnClickedButtonCal()
{UpdateData(TRUE);string s = (CT2A)m_Str;if (s.empty()) {AfxMessageBox(_T("请输入表达式!"));return;}Poly A, B,C;bool flag = false;float num = 0;int cap = 0;int v = 1;int pos_B;for (int i(0); i < s.size(); i++) {if (s[i] == ')') {pos_B = i;break;}}int p = 0;if (s[0] == '(')p++;bool real = true;Term *rear = A.GetHead();while (p < pos_B) {real = true;if (s[p] == '+') {real = true;p++;}else if (s[p] == '-'){real = false;p++;}int temp_e;num=Search_Num(s, p,temp_e);v = real == true ? 1 : -1;rear = rear->insertAfter(v*num, temp_e);}p += 3;rear = B.GetHead();while (p < s.size()-1) {real = true;if (s[p] == '+') {real = true;p++;}else if (s[p] == '-') {real = false;p++;}int temp_e;num = Search_Num(s, p, temp_e);v = real == true ? 1 : -1;rear = rear->insertAfter(v*num, temp_e);}if (s[pos_B + 1] == '+') {C = A + B;}else {C = A - B;}string temp = C.GetString();m_Str = temp.c_str();UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码
}

3)结果转换位字符串更新到Edit框中

转字符串的函数就在类定义里面,也费了不少功夫,因为样例给的情况太全面了,刚开始没考虑到负指数,不过不要紧,还是改好了。面向对象的特点体现以后更改代码也比较方便~

后记

代码没有写注释,故意的。对,故意的。能理解的小伙伴应该能看懂,完全不懂的就有点困难了,相比不可视化,可视化对于输入和输出需要转化一下,其他的和不普通的差不多,当然写按钮也比较烦,,,
界面很丑,之后可能会美化,再说吧,今天先睡了。
2018/11/13 23:42:48

转载于:https://www.cnblogs.com/Titordong/p/9955642.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WindTerm导出会话

WindTerm的session配置并无法被适用于其他软件中&#xff0c;所有的session保存在WindTerm安装路径下的profiles文件夹内&#xff0c;如果需要更新版本或回退&#xff0c;将所安装的版本覆盖即可&#xff0c;或是将profiles复制于新路径下。 图标闪烁设置、会话保存-导入导出 …

[官方] mysql 性能优化文档(中英文自译)

大家好&#xff0c;我是烤鸭&#xff1a; 根据官方文档翻译并精简部分内容。建议有时间的朋友下载原版查看&#xff0c;全文106页pdf&#xff0c;快的话1-2天就能看完。自己翻译的有些地方可能不完整&#xff0c;欢迎指正。官方pdf下载&#xff0c;需登录&#xff1a;https://w…

使用wiki.js部署团队知识库

1.安装NODE.JS 参考教程 https://xie.infoq.cn/article/6820ea5b625f4e163ccb76cec 1.1 下载nodejs安装包 http://nodejs.cn/download/ 1.2 上传到服务器soft目录后进行解压 # 解压 tar -xf node-v16.18.0-linux-x64.tar.xz # 删除安装包 rm -rf node-v16.18.0-linux-x64.ta…

[css] transition、animation、transform三者有什么区别?

[css] transition、animation、transform三者有什么区别&#xff1f; transition:比较简单的过度动画animation: 使用keyframe自定义动画,比较详细的动画过程transform: 2D或者3D的变形属性个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c…

mysql性能调优精简版

大家好&#xff0c;我是烤鸭&#xff1a; 这是根据官方文档提炼出的mysql性能优化总结。 想看完整翻译版的请看 https://blog.csdn.net/Angry_Mills/article/details/87720396 1. 成本优化 成本包含&#xff1a; IO 和 CPU 从硬盘读取的花费 模型包含&#xff1a; 全表…

Java面试总结

1. HashMap与HashTable的区别 Hashmap的key、value都可以为空&#xff0c;但key只能有一个为空&#xff0c;value可以有多个&#xff0c;非同步 HashTable的key、value都不能为空&#xff0c;是同步的&#xff0c;线程安全 因为hashtable,concurrenthashmap它们是用于多线程的&…

[css] 如何使用css3实现一个div设置多张背景图片?

[css] 如何使用css3实现一个div设置多张背景图片&#xff1f; background-image:url("1.jpg"),url("2.jpg"),url("3.jpg"); background-repeat: no-repeat, no-repeat, no-repeat; background-position: 0 0, 200px 0, 400px 201px;个人简介 我…

系统架构设计师-软件水平考试(高级)-理论-操作系统

系统架构设计师-操作系统 前言&#xff1a; 之前文章发布后&#xff0c;发现还是有一定阅读量的&#xff0c;所以决定继续发一些思维导图。 思维导图首先以思维结构为主&#xff0c;其次以考试的内容进行一定的改动&#xff08;如本次&#xff0c;将“嵌入系统”放在了“操作系…

Error: Cannot find module 'json-schema-faker' YAPI部署

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录。 安装 YAPI 接口项目时出现的这个问题&#xff0c;如果你不是这个情况出现的这个报错&#xff0c;就不用继续看了。 YAPI的 github 地址: https://github.com/YMFE/yapi 1.场景 安装 YAPI 接口项目。当时日志没找&#xff0c…

[css] 你有用过IE css的expression表达式吗?说说你对它的理解和它有什么作用呢?

[css] 你有用过IE css的expression表达式吗&#xff1f;说说你对它的理解和它有什么作用呢&#xff1f; 主要用来解决IE 低版本样式自适应的问题。 比如&#xff1a;height:expression(this.offsetHeight); 缺点&#xff1a;性能问题&#xff0c;会重复执行&#xff0c;可达 10…

Java 面试题(1)——java基础

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一些Java面试题和答案。 这些答案都是自己想的&#xff0c;如果有理解不一样的&#xff0c;欢迎交流。 部分原题来自&#xff1a; https://blog.csdn.net/qq_41790443/article/details/80694415 1. HashMap的源码&#xff0…

关于我的代码在课上第一时间没有运行出来这件事

日期&#xff1a;2018.11.15 博客期&#xff1a;024 星期四 今天上课老师又出题了&#xff0c;这次的题目是去利用文件的读写去完成文件的读写答题&#xff01;那为什么我没有第一时间做出来呢&#xff1f;原因我分析了以下几点&#xff1a; 1、我第一时间对题意没有准确的审视…

[css] 有哪些方式可以对一个DOM设置它的CSS样式?

[css] 有哪些方式可以对一个DOM设置它的CSS样式&#xff1f; 1.可以使用行内样式 2.可以使用style标签 3.可以使用link引入css文件 4.可以使用js动态修改个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

【Shiro】Unsatisfied dependency expressed through method 'securityManager' parameter 3

大家好&#xff0c;我是烤鸭&#xff1a; 采坑记录&#xff0c;springboot 整合 shiro。 环境&#xff1a; springboot 2.0.5.RELEASE shiro-spring 1.4.0 shiro-redis 3.1.0 1.问题 org.springframework.beans.factory.UnsatisfiedDependencyException: Error crea…

pytest+allure生成漂亮的报告+显示

一&#xff1a;环境准备 1.python3.62.windows环境3.pycharm4.pytest-allure-adaptor5.allure2.8.06.java1.8pytest-allure-adaptor快速安装 在cmd中输入 pip install pytest-allure-adaptor&#xff0c;回车 二&#xff1a;报告生成 第1步&#xff1a;下载allure.zip&#xff…

[css] 举例说明实现圆角的方式有哪些?

[css] 举例说明实现圆角的方式有哪些&#xff1f; 不使用 border-radius 的情况下只能用切图代替。此时非常有局限性&#xff0c;因为必须要定高定宽了。最常用的 border-radius 来实现。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; …

springboot项目 tomcat8.x 频繁宕机 原因分析

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一次线上tomcat宕机原因。 1 . 最近两次的宕机时间部分日志 1.1 2019-04-04 13:22:27.187 [Thread-10] INFO o.s.context.support.DefaultLifecycleProcessor - Stopping beans in phase 0 2019-04-04 13:22:27.188 [Thread…

Linux内核程序的编译:模块化编译

内核在编译的时候&#xff0c;可以支持单独模块化编译&#xff0c;只需要一个小小的Makefile即可搞定。 步骤如下&#xff1a; 1.在任意位置创建目录 vim Makefile 2.在Makefile中添加如下代码(我的kernel目录是/opt/kernel_xilinx_v4.4)&#xff1a; obj-m my_drv.oall:make …

[css] 有用过scss和sass吗?说说它们之间的区别是什么?

[css] 有用过scss和sass吗&#xff1f;说说它们之间的区别是什么&#xff1f; sass和scss其实是一样的css预处理语言&#xff0c;其后缀名是分别为 .sass和.scss两种。SASS版本3.0之前的后缀名为.sass&#xff0c;而版本3.0之后的后缀名.scss。两者是有不同的&#xff0c;继sa…

This subject is anonymous - it does not have any identifying principals and authorization operations

大家好&#xff0c;我是烤鸭&#xff1a; 最近使用shiro&#xff0c;遇到如下问题&#xff1a; 严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/etc] threw exception [Request processing failed; nested exception is org.apache.shiro.a…