一元多项式计算实验报告.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 计算 实验 报告
- 资源描述:
-
一元多项式计算实验报告 计算机学院 工程实践 一元多项式的计算 总 报 告 小组序号: 编 撰 人: 年 级 班 级: 指导教师: 提交日期: 1. 项目组成员分工 表 1 项目组成员分工 2. 程序功能 (程序实现的功能,功能结构图) 实现功能:一元多项式的加、减、乘运算 功能结构图: 3. 程序设计简介 (包括:类及其属性和方法、类之间关系、关键代码等的说明) 1. class Node { public: Node(); Node(float c, int e, Node* next); ~Node(){}; float coef; //系数 int exp; //指数 Node* Next; //指向下一项的指针 friend class Polynominal; }; 节点类,储存一元多项式每一项的信息。该内含有两个构造函数,一个析构函数及存储系数、指数和Next指针等成员变量。及Polynominal是友元关系,允许Polynominal的访问。 具体成员函数如下: 1) Node::Node(){} 默认构造函数。 2) Node::Node(float c, int e, Node* next){ coef = c; exp = e; Next = next; } 重载的自定义构造函数,用于给成员变量coef、exp和Next存入数据,Next指向传参来的next指针指向的地址,用于构造链表。 2. class Polynominal{ public: Polynominal(); Polynominal(Polynominal &a); //拷贝构造函数 void GetMSG(CString TempPloy); //获取由对话框输入的字符串并处理 CString Output_Node(); //输出最后结果 void PolyAdd(Polynominal &a, Polynominal &b); //加法 void PolySubtract(Polynominal &a, Polynominal &b); //减法 void PolyMultiply(Polynominal &a, Polynominal &b); //乘法 void PolySort(); //排序函数,用于乘法之后的按指数排序 void OutFile(); //文本输出函数 void Out &a, Polynominal &b, string ch); //重载文本输出函数 void OpposeCoef(Polynominal &a, Node *temp); //系数取反,用于减法运算 Node theList; //头节点 ofstream FOut; //输出流 }; 此类用于构造一元多项式。包括加、减、乘各各功能函数,还有两个帮助运算的辅助函数,以及界面输入输出和文本输出函数。成员变量有头节点和输出流。 具体成员函数如下: 1) Polynominal::Polynominal(){} 默认构造函数 2) Polynominal::Polynominal(Polynominal &a){ Node* temp = a.theList.Next; Node* tempNode = &theList; for (; temp != NULL;){ tempNode->Next = new Node(temp->coef, temp->exp, NULL); temp = temp->Next; tempNode = tempNode->Next; } } 拷贝构造函数,用于计算时对象间的赋值,防止误改数据。 3) void Polynominal::GetMSG(CString TempPoly){ TempPoly.Remove(_T('^')); Node* TempNode = &theList; int i = 0; for (i;i<TempPoly.GetLength(); ){ CString temp1 ; CString temp2 ; int j = 1; if (TempPoly.GetAt(i) ==_T('-')){ temp1 = temp1 + TempPoly.GetAt(i); i++; } if (TempPoly.GetAt(i) == _T('+')){ i++; } if (TempPoly.GetAt(i) == _T('x') ){ temp1 = temp1 +_T('1'); } while(j==1){ if (TempPoly.GetAt(i) != _T('x')){ temp1 = temp1 + TempPoly.GetAt(i); i++; } else j=0; } i++; if (i <(TempPoly.GetLength()-1) && TempPoly.GetAt(i) == _T('-')){ temp2 = temp2 + TempPoly.GetAt(i); i++; } if (i == (TempPoly.GetLength()-1) && TempPoly.GetAt(i) == _T('x')) temp2 = temp2 + _T('1'); else{ if (i == TempPoly.GetLength() && TempPoly.GetAt(i-1) == _T('x')) temp2 = temp2 + _T('1'); else{ while (i < TempPoly.GetLength() && TempPoly.GetAt(i) != _T('+') && TempPoly.GetAt(i) != _T('-')){ temp2 = temp2 + TempPoly.GetAt(i); i++; } } } TempNode->Next = new Node(_ttof(temp1), _ttoi(temp2), NULL); //链表构建 TempNode = TempNode->Next; } } 此函数用于把从对话框获取的字符串进行处理,截取出多项式各项系数和指数,并转换为float型和int型,构造一元多项式链表。 4) CString Polynominal::Output_Node(){ int first = 0; CString temp; CString temp_coef; CString temp_exp; Node* TempNode = theList.Next; for (; TempNode != NULL; TempNode = TempNode->Next){ if (first == 1 && TempNode->coef > 0) temp = temp + _T("+") ; temp_coef.Format(_T("%g"), TempNode->coef); temp_exp.Format(_T("%d"),TempNode->exp); switch (TempNode->exp){ case 0:temp = temp + temp_coef; break; //指数为0则推出 case 1:if (TempNode->coef==1) //指数为1则直接输出X temp = temp + _T("x"); else temp = temp + temp_coef + _T("x"); break; default:if (TempNode->coef == 1) //其余指数输出“X^”形式 temp = temp + _T("x")+temp_exp; else temp = temp + temp_coef + _T("x^")+temp_exp; break; } first = 1; } return temp; } 输出函数,将计算所得结果输出到对话框。 5) void Polynominal::PolyAdd(Polynominal &a, Polynominal &b){ Node *p, *q, *temp; temp = &theList; p = a.theList.Next; q = b.theList.Next; while (p != NULL && q != NULL){ if ((p->exp) > (q->exp)){ temp->Next = new Node(p->coef, p->exp, NULL); temp = temp->Next; p = p->Next; } else if ((p->exp) == (q->exp)){ temp->Next = new Node(p->coef + q->coef, p->exp, NULL); temp = temp->Next; p = p->Next; q = q->Next; } else if ((p->exp) < (q->exp)){ temp->Next = new Node(q->coef, q->exp, NULL); temp = temp->Next; q = q->Next; } } if (q != NULL){ while (q != NULL){ temp->Next = new Node(q->coef, q->exp, NULL); temp = temp->Next; q = q->Next; } } if (p != NULL){ while (p != NULL){ temp->Next = new Node(p->coef, p->exp, NULL); temp = temp->Next; p = p->Next; } } } 加法函数,实现多项式的相加。在其中需要判断各项指数的关系,已实现按指数大小关系构建链表。 6) void Polynominal::OpposeCoef(Polynominal &a, Node *temp){ temp = a.theList.Next; while (temp != NULL){ temp->coef = -(temp->coef); temp = temp->Next; } } 在执行减法操作时,用此函数将被减多项式各位系数取反,之后可直接调用加法函数进行运算; 7) void Polynominal::PolySubtract(Polynominal &a, Polynominal &b){ Node* temp = NULL; Polynominal aa = b; OpposeCoef(aa, temp); PolyAdd(a, aa); } 减法函数。先调用系数取反函数,再调用加法函数,可直接实现减法功能。其中为了不改变被减多项式的各项值,在此调用拷贝构造函数创建临时对象用于计算。 8) void Polynominal::PolyMultiply(Polynominal &a, Polynominal &b){ Node *p, *q, *temp; temp = &theList; p = a.theList.Next; q = b.theList.Next; while (p != NULL){ while (q != NULL){ temp->Next = new Node((p->coef*q->coef), (p->exp + q->exp), NULL); q = q->Next; temp = temp->Next; } p = p->Next; q = b.theList.Next; } PolySort(); } 乘法函数。按项相乘,运算完之后,再调用排序函数,实现同指数项系数相加,并按照指数大小输出。 9) void Polynominal::PolySort(){ Polynominal temp; int i = 1; float temp_coef = 0; int temp_exp = 0; Node* tempNode = theList.Next; Node* tempNode2 = &theList; Node* tempNode3 = &temp.theList; while (i == 1){ tempNode = theList.Next; tempNode2 = &theList; for (; tempNode != NULL;){ if (tempNode->exp > temp_exp) temp_exp = tempNode->exp; tempNode = tempNode->Next; } tempNode = theList.Next; if (tempNode != NULL){ for (; tempNode != NULL;){ if (tempNode->exp == temp_exp){ temp_coef = temp_coef + tempNode->coef; tempNode2->Next = tempNode->Next; tempNode = tempNode->Next; } else{ tempNode = tempNode->Next; tempNode2 = tempNode2->Next; } } tempNode3->Next = new Node(temp_coef, temp_exp, NULL); tempNode3 = tempNode3->Next; temp_coef = 0; temp_exp = 0; } else{ i = 0; } } Node* temp2 = &theList; Node* temp3 = temp.theList.Next; for (; temp3 != NULL;){ temp2->Next = new Node(temp3->coef, temp3->exp, NULL); temp2 = temp2->Next; temp3 = temp3->Next; } } 实现相乘之后的排序,是最后的链表按照指数大小排列,并且每个指数只有一项。 10) void Polynominal::OutFile(){ FOut.open("PolynominalList.txt", ofstream::app); int first = 1; Node* temp = theList.Next; FOut << " ( "; for (; temp != NULL; temp = temp->Next){ if (!first&&temp->coef > 0) FOut << "+"; FOut << temp->coef; switch (temp->exp){ case 0:break; //指数为0则推出 case 1:FOut << "x"; break; //指数为1则直接输出X default:FOut << "x^" << temp->exp; break; //其余指数输出“X^”形式 } first = 0; } FOut << " ) "; FOut.close(); } 文本输出函数,用于两个多项式的文本输出。 11) void Polynominal::Out &a, Polynominal &b, string ch){ FOut.open("PolynominalList.txt", ofstream::app); int first = 1; Node* temp = theList.Next; a.OutFile(); FOut << ch; b.OutFile(); FOut << " = ( "; for (; temp != NULL; temp = temp->Next){ if (!first&&temp->coef > 0) FOut << "+"; FOut << temp->coef; switch (temp->exp){ case 0:break; //指数为0则推出 case 1:FOut << "x"; break; //指数为1则直接输出X default:FOut << "x^" << temp->exp; break; //其余指数输出“X^”形式 } first = 0; } FOut << " ) "; FOut << "\n\n"; FOut.close(); } 重载文本输出函数,用于最后结果的一次性文本输出。 3.1. 类设计 表 2 类表 序号 类名 属性 方法 1 Node float coef; int exp; Node* Next; Node(); Node(float c, int e, Node* next); 2 Polynominal Node theList; ofstream FOut; Polynominal(); Polynominal(Polynominal &a); void GetMSG(CString TempPloy); CString Output_Node(); void PolyAdd(Polynominal &a, Polynominal &b); void PolySubtract(Polynominal &a, Polynominal &b); void PolyMultiply(Polynominal &a, Polynominal &b); void PolySort(); void OutFile(); void Out &a, Polynominal &b, string ch); void OpposeCoef(Polynominal &a, Node *temp); 3.2. 类关系图 3.3. 数据结构设计 数据成员: 1. Class Node: float coef; //系数 int exp; //指数 Node* Next; //指向下一项的指针 2. class Polynominal Node theList; //头节点 ofstream FOut; //输出流 此类中theList是头节点,其成员变量Next指向新建节点,构造成链表。 3.4. 关键代码及运行界面 关键代码: #ifndef POLYNOMINA_H #define POLYNOMINA_H #include "Node.h" #include <string> #include <afxstr.h> #include <fstream> #include <iostream> using namespace std; class Polynominal{ public: Polynominal(); Polynominal(Polynominal &a); //拷贝构造函数 void GetMSG(CString TempPloy); //获取由对话框输入的字符串并处理 CString Output_Node(); //输出最后结果 void PolyAdd(Polynominal &a, Polynominal &b); //加法 void PolySubtract(Polynominal &a, Polynominal &b); //减法 void PolyMultiply(Polynominal &a, Polynominal &b); //乘法 void PolySort(); //排序函数,用于乘法之后的按指数排序 void OutFile(); //文本输出函数 void Out &a, Polynominal &b, string ch); //重载文本输出函数 void OpposeCoef(Polynominal &a, Node *temp); //系数取反,用于减法运算 Node theList; //头节点 ofstream FOut; //输出流 }; #endif 函数实现: #include "stdafx.h" #include "Polynominal.h" #include "conio.h" Polynominal::Polynominal(){} Polynominal::Polynominal(Polynominal &a){ Node* temp = a.theList.Next; Node* tempNode = &theList; for (; temp != NULL;){ tempNode->Next = new Node(temp->coef, temp->exp, NULL); temp = temp->Next; tempNode = tempNode->Next; } } void Polynominal::GetMSG(CString TempPoly){ TempPoly.Remove(_T('^')); Node* TempNode = &theList; int i = 0; for (i;i<TempPoly.GetLength(); ){ CString temp1 ; CString temp2 ; int j = 1; if (TempPoly.GetAt(i) ==_T('-')){ temp1 = temp1 + TempPoly.GetAt(i); i++; } if (TempPoly.GetAt(i) == _T('+')){ i++; } if (TempPoly.GetAt(i) == _T('x') ){ temp1 = temp1 +_T('1'); } while(j==1){ if (TempPoly.GetAt(i) != _T('x')){ temp1 = temp1 + TempPoly.GetAt(i); i++; } else j=0; } i++; if (i <(TempPoly.GetLength()-1) && TempPoly.GetAt(i) == _T('-')){ temp2 = temp2 + TempPoly.GetAt(i); i++; } if (i == (TempPoly.GetLength()-1) && TempPoly.GetAt(i) == _T('x')) temp2 = temp2 + _T('1'); else{ if (i == TempPoly.GetLength() && TempPoly.GetAt(i-1) == _T('x')) temp2 = temp2 + _T('1'); else{ while (i < TempPoly.GetLength() && TempPoly.GetAt(i) != _T('+') && TempPoly.GetAt(i) != _T('-')){ temp2 = temp2 + TempPoly.GetAt(i); i++; } } } TempNode->Next = new Node(_ttof(temp1), _ttoi(temp2), NULL); TempNode = TempNode->Next; } } CString Polynominal::Output_Node(){ int first = 0; CString temp; CString temp_coef; CString temp_exp; Node* TempNode = theList.Next; for (; TempNode != NULL; TempNode = TempNode->Next){ if (first == 1 && TempNode->coef > 0) temp = temp + _T("+") ; temp_coef.Format(_T("%g"), TempNode->coef); temp_exp.Format(_T("%d"),TempNode->exp); switch (TempNode->exp){ case 0:temp = temp + temp_coef; break; //指数为0则推出 case 1:if (TempNode->coef==1) //指数为1则直接输出X temp = temp + _T("x"); else temp = temp + temp_coef + _T("x"); break; default:if (TempNode->coef == 1) //其余指数输出“X^”形式 temp = temp + _T("x")+temp_exp; else temp = temp + temp_coef + _T("x^")+temp_exp; break; } first = 1; } return temp; } void Polynominal::PolyAdd(Polynominal &a, Polynominal &b){ Node *p, *q, *temp; temp = &theList; p = a.theList.Next; q = b.theList.Next; while (p != NULL && q != NULL){ if ((p->exp) > (q->exp)){ temp->Next = new Node(p->coef, p->exp, NULL); temp = temp->Next; p = p->Next; } else if ((p->exp) == (q->exp)){ temp->Next = new Node(p->coef + q->coef, p->exp, NULL); temp = temp->Next; p = p->Next; q = q->Next; } else if ((p->exp) < (q->exp)){ temp->Next = new Node(q->coef, q->exp, NULL); temp = temp->Next; q = q->Next; } } if (q != NULL){ while (q != NULL){ temp->Next = new Node(q->coef, q->exp, NULL); temp = temp->Next; q = q->Next; } } if (p != NULL){ while (p != NULL){ temp->Next = new Node(p->coef, p->exp, NULL); temp = temp->Next; p = p->Next; } } } void Polynominal::OpposeCoef(Polynominal &a, Node *temp){ temp = a.theList.Next; while (temp != NULL){ temp->coef = -(temp->coef); temp = temp->Next; } } void Polynominal::PolySubtract(Polynominal &a, Polynominal &b){ Node* temp = NULL; Polynominal aa = b; OpposeCoef(aa, temp); PolyAdd(a, aa); } void Polynominal::PolyMultiply(Polynominal &a, Polynominal &b){ Node *p, *q, *temp; temp = &theList; p = a.theList.Next; q = b.theList.Next; while (p != NULL){ while (q != NULL){ temp->Next = new Node((p->coef*q->coef), (p->exp + q->exp), NULL); q = q->Next; temp = temp->Next; } p = p->Next; q = b.theList.Next; } PolySort(); } void Polynominal::PolySort(){ Polynominal temp; int i = 1; float temp_coef = 0; int temp_exp = 0; Node* tempNode = theList.Next; Node* tempNode2 = &theList; Node* tempNode3 = &temp.theList; while (i == 1){ tempNode = theList.Next; tempNode2 = &theList; for (; tempNode != NULL;){ if (tempNode->exp > temp_exp) temp_exp = tempNode->exp; tempNode = tempNode->Next; } tempNode = theList.Next; if (tempNode != NULL){ for (; tempNode != NULL;){ if (tempNode->exp == temp_exp){ temp_coef = temp_coef + tempNode->coef; tempNode2->Next = tempNode->Next; tempNode = tempNode->Next; } else{ tempNode = tempNode->Next; tempNode2 = tempNode2->Next; } } tempNode3->Next = new Node(temp_coef, temp_exp, NULL); tempNode3 = tempNode3->Next; temp_coef = 0; temp_exp = 0; } else{ i = 0; } } Node* temp2 = &theList; Node* temp3 = temp.theList.Next; for (; temp3 != NULL;){ temp2->Next = new Node(temp3->coef, temp3->exp, NULL); temp2 = temp2->Next; temp3 = temp3->Next; } } void Polynominal::O展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




一元多项式计算实验报告.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/10601279.html