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