链表实现多项式运算(加减)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可视化的计算器界面的数据输入输出,当然方法肯定很多,代码比较糙,将就着看吧,希望有对你有用的部分。
样子差不多就是这样:

输入

输出

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

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

  1. 多项式相加减【数据结构实验报告】

    实验名称:实验一 多项式加减法 学号:*** 姓名:gnosed 实验日期:2017.10.16 一.实验目的 通过实现多项式的加减法,对链表有更深入的了解 二.实验具体内容 1.实验题目1: (1) ...

  2. 链表应用之多项式相加

    题目来源:Wejudge#3988 题目 首先输入2个整数m和n(0<m, n<=1000000000)分别代表2个多项式的项数. 然后,输入m+n行数据,前m行表示第一个多项式,后n行表 ...

  3. 已知稀疏多项式C语言版,一元稀疏多项式计算器C语言课程设计

    <一元稀疏多项式计算器C语言课程设计>由会员分享,可在线阅读,更多相关<一元稀疏多项式计算器C语言课程设计(26页珍藏版)>请在人人文库网上搜索. 1.学号2014-2015学 ...

  4. 【数据结构笔记07】不带头结点链表实现多项式相加、相乘

    本次笔记内容: 2.4 多项式的加减运算实现 P24 1.题意理解与多项式表示 P25 2.程序框架及读入多项式 P26 3.加法.乘法运算及多项式输出 文章目录 多项式加法运算 采用不带头结点的单项 ...

  5. 链表应用——多项式相加

    f(X)=1+x+x2+x5 g(X)=x3+x6+x8+x100 f(X)+g(X)=1+x+x2+x3+x5+x6+x8+x100 两个有序多项式相加合并问题: 显然第一个想到的是用数组解决,可仔 ...

  6. c++用模板实现稀疏多项式_用线性表实现一元多项式及相加运算

    " 本文主要讨论线性表在多项式计算中的应用,讨论内容涉及到一元n次多项式在计算机中的表示,及多项式相加运算." 01 在数学上,一个一元n次多项式可以按照升幂写成 Pn(x)= p ...

  7. 链表应用 多项式相加

     用链表实现多项式相加 #include<iostream> #include<cstdio> #include<malloc.h> #define flag -1 ...

  8. 数据结构(Java):用单链表实现多项式相加

    要求: 1.已知有两个多项式Pn(x)和Qm(x),并且在Pn(x)和Qm(x)中指数相差很多,设计算法,求Pn(x)+Qm(x) 2.进行加法运算时不重新开辟存储空间. //定义节点类 class ...

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

    目录 1.题目 2.需求分析 3.程序设计 4.测试结果 5.源码 1.题目 [问题描述] 设计一个一元稀疏多项式简单计算器. [基本要求] (1)输入并建立两个多项式: (2)多项式a与b相加,建立 ...

最新文章

  1. 7.1 函数的一般形式
  2. 【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结
  3. 达梦数据库查看当前执行的查询并杀死session
  4. slq2000数据库升级到sql2012
  5. 理解Java里面的必检异常和非必检异常
  6. c#面向对象与程序设计第三版第三章例题代码_C#程序设计教程 | 教与学(教学大纲)...
  7. c语言期终试卷,谁有c语言的往年期中试卷么
  8. 如何设置视频的帧率、分辨率、码率来调节音视频即时通讯的质量
  9. 计算机打印怎样添加PDF格式,将PDF打印机添加到计算机后如何将Excel打印为PDF
  10. 安装mysql数据库出现问题_安装mysql数据库及问题解决方法
  11. MPI(Massage Passing Interface)
  12. 蒙特卡罗(洛)模拟——手把手教你数学建模
  13. 2019大数据未来七大发展方向
  14. WINVNC源码分析(四)——IO之rdr库
  15. iVMS-4200 Vs区别_45466足球推荐分析 法甲 21:00 安格斯 VS 梅斯
  16. 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能(转)
  17. 知识分享-博客公众号推荐
  18. python signal模块_Python signal 信号模块和进程
  19. jvectormap的自定义地图和区域上色、图片标记
  20. 建设工程法规专科【7】

热门文章

  1. rc mysql common_RR与RC隔离级别下MySQL不同的加锁解锁方式
  2. 远程WEB控制MP3播放器设计(基于mini2440)
  3. 关于 not enough actual parameters for macro ...
  4. [react] 你最不喜欢React的哪一个特性(说一个就好)?
  5. [react] 需要把keys设置为全局唯一吗?
  6. React开发(235):document.body.clientHeight
  7. react学习(44)----只更新它需要更新的部分
  8. [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?
  9. [html] 你有了解HTML5的地理定位吗?怎么使用?
  10. [css] 设置字体时为什么建议设置替换字体?