收藏 分销(赏)

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

上传人:a199****6536 文档编号:10601279 上传时间:2025-06-04 格式:DOC 页数:34 大小:423.54KB 下载积分:12 金币
下载 相关 举报
一元多项式计算实验报告.doc_第1页
第1页 / 共34页
一元多项式计算实验报告.doc_第2页
第2页 / 共34页


点击查看更多>>
资源描述
一元多项式计算实验报告 计算机学院 工程实践 一元多项式的计算 总 报 告 小组序号: 编 撰 人: 年 级 班 级: 指导教师: 提交日期: 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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 初中数学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服