一个交互多项式计算器的实现

一个交互多项式计算器的实现

                                         

----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接copy,关于这部分的代码,有不清楚或者有错误的地方,还请评论或者私聊指正,一起学习

 

 

摘要

为实现多项式的一些运算求解问题,包括加法,减法,乘法,判断是否相等,求导,代入x的值求解共六种运算,同时实现与用户之间的交互,提供便于输入和查找的菜单和,输入输出。主要使用typedef pair<int, int> term; typedef vector<term> polynomial; struct P{char x;polynomial p;}; 三种新定义的类型,以vector为主要的数据结构,构造多个函数,并重载了运算符,最终达成了实验的目标。

 

一 问题说明

首先要解决的是如何输入并使程序理解所输入的多项式,并为多项式找到一种表示方法,以便能够在之后的运算中读取和计算。考虑到多项式的主要性质为不同项的系数和指数,即多组数对,于是采用了vector< pair<int, int>> polynomial 这个类型来储存多项式的重点要素系数和指数。

其次是运算的部分,仿照数学中计算的方式方法,构造相应的函数,并重载了’ + ’ 、’ - ’、’ * ’  三个运算符,这样就解决了运算的问题。

最后为了使结果输出能够符合一般的多项式的表示形式,重载了’<<’,使其输出的形式为ax^b-cx^d+x-1来表示。

这样实现了功能之后,为了更好的用户体验,还额外添加了初始界面和菜单项以及结束项,成功解决了问题,实现了要求的功能。

二 设计与实现

图1为该程序的大致流程图,其余细节的判断和处理,以及具体的函数实现步骤方法,在这里就不赘述了,只列出了所用的函数头和其实现的作用(不包括用于选择order的viod fx()系列函数):

polynomial getPoly(string s);//从输入的字符串中得到表示多项式的polynomial数据类型,不接受空格或其他非标准的输入。将‘(’到‘,’间的字符转换为int类型存储为系数,‘,’到‘)’的内容转换成int存储为指数,一个括号内为一个pair,构成了pair的组合输出。

polynomial operator +(const polynomial &p, const polynomial &q); //重载双目运算符‘+’,同样的还有‘-’和‘*’,详细说明在之后

bool equal(const polynomial &p, const polynomial &q);//判断多项式p和q是否相等,判断每一项对应的值是否一致,如果不,false,判断完所有数据,没有false输出,则输出true

polynomial der(const polynomial &p);//求多项式p的导数,模拟多项式求导的数学方法,指数与系数相乘作为新的系数,指数减1作为新的指数

int value(int x, polynomial& p);//给定x的值int x;代入求p的结果,系数乘以x的指数次幂,把每一项的结果相加

ostream& operator <<(ostream& out, const polynomial &q);//重载输出运算符,详细说明在之后

ostream& operator <<(ostream& out, const P &q);//同上,调用多项式的重载,循环输出

bool inter(polynomial x);//判断输入的多项式是否合法(按降幂输入)逐个判断是否后一位大于等于前一位,是则输出false,全部判断后未输出,则输出true;

bool rename(char x);//判断多项式是否重命名,逐个查找,如果P[i].x与x一致,则输出true,全部判断后未输出,则输出false;

      

 

                                图1.程序流程图

 

 

              这里具体对加法和乘法以及输出运算符的重载三个个主要的函数的实现进行一下说明:

   首先是加法,对于两个多项式的加法,考虑到多项式加法的基本流程,和已经确定的降幂输入,采用了merge类似的方法来对两个多项式进行处理,指数大的排序在前,小的在后,相同时执行系数的加法后排序,所得的polynomial类型所储存的pair的组合,就是两个多项式相加后的结果。

其次是乘法,模拟一般的人工求多项式相乘的步骤会方式方法,使第一个多项式的每一项分别与第二个多项式的所有项相乘,存为新的多项式,再全部相加,就得到了两个多项式相乘后的结果。

最后是输出运算符,按顺序输出每一项,如果是第一项系数为0,判断是否只有一项,是则输出0,不是则令下一项变成第一项;如果第一项系数为1,再判断指数是否为1,为1则输出x,是否为0,为0则输出系数,都不是则输出系数x^指数;如果第一项系数为-1,同上;第一项不为1,0,-1,判断指数,执行结果类似;然后逐个输出之后的项,类似第一项,但是预先判断正负,正数前加‘+’。

 

三 程序使用和测试说明

在使用程序的时候,会出现如下的一些界面,用户需要安装对应的提示来输入,并通过输入order的序号来执行对应的操作。

打开程序,得到如图2的开始界面

 

图2.开始界面

 

       输入0得到如图3的菜单列表

 

 

图3.输入0,得到菜单列表

 

       输入1得到如图4的输入多项式的命令空间

 

 

 

图4.输入1,转到输入多项式

 

 

输入的多项式为:

 

q (2,6)(5,5)(-9,4)(6,3)(0,2)(-1,1)(1,0)

o (0,2)(-1,1)(-1,0)

w (3,6)(1,1)(9,2)(0,1)

e (-5,7)(9,5)(0,0)

x (9,9)(6,5)(-1,3)

d (9,9)(6,5)(-1,3)

f (0,0)

t (-1,1)

时,输入order 2得到了多项式列表如图5。

可以看出,各项输出均正确且符合多项式的一般形式规则。

 

                          图5.输出2时的多项式列表

 

       输入3时,转到两个多项式相加的界面如图6,结果正确;

       输入4时,转到两个多项式相减的界面,如图6结果正确.

 

图6.分别输入3和4,转到多项式的加法和减法界面

    输入5,转到多项式相乘的界面,如图7,结果正确;

       输入6,转到判断多项式相等的界面,如图7,结果正确;

 

图7.输入5和6,分别为多项式相乘和判断是否相等

       输入7,转到多项式求导,如图8,结果正确;

       输入8,转到多项式代入求值界面,如图8,结果正确。

 

图8.输入7和8,分别为多项式求导和代入求值

       输入9时程序终止退出。

除此之外,每个命令都测试了多组带有特殊数值,如(0,0)(1,0)(-1,0)(a,1)(0,a)(1,1)等的多项式,并两两进行每一个测试,均正确输出得到相应的结果。数据太过繁琐,在这里就不一一例举了。

需要注意的是,程序对应有一些格式错误的值,不能处理,所以会输出报错的语句。在测试时,使每一个输入都产生不同的错误,查看输出的报错提示。比如:重命名多项式时会报错;输入多项式的名称,但该多项式不存在时会报错;输入order不规范时会报错等等,这也体现了程序的强壮性。

而且在任何一个输入order的时间输入0时,出现菜单;输入9时,退出程序;输入对应的order,实现对应的运算;非规定输入时输出报错,重新输入。

但是程序在输入时不能判别空格和数字以及括号以外的内容,所以请按照举例和说明的样例输入输入多项式,否则程序就会出现错误,这一点还需要继续改进。

 

四 总结和讨论

这次的project大致完成要求的任务,遇到的困难除了一些编译器能检查得出来的错误之外,在写函数的算法以及实现的时候,也遇到了一些问题。

比如重载‘*’的时候,就出现了算法上的错误,最开始的时候是每一项分别相乘得到pair,按顺序push至新的多项式时,如果有系数一致的就合并。但是在测试的时候发现,逐个相乘并不一定是降幂的结果,会导致错误的出现,于是修改了算法,使第一个多项式的每一项分别与第二个多项式的所有项相乘,存为新的多项式,再全部相加;修改后的算法成功地实现了乘法的功能。

之后,同样是在重载函数时出现了问题。在重载‘<<’时,因为考虑的时候,顺序有一些颠倒,if语句和接下来的else的条件考虑不是很完善,先后出现了多个错误,包括(0,0)的问题、首项系数为0不输出的问题和不输入时的i的变化等等。在多次输入带有0,1,-1的特殊条件的检测,和推敲下,最终写出了正确的重载函数。

而且在完成value函数时,因为将一个if语句里的‘==’错打成了‘=’,导致了程序输出的不正确,而这个错误,编译器并没有报错而是正常地运行了。查找的时候,并没有认真回看代码,以为编译器没有报错,代码的书写就是正确的,一直在算法上思考,第二天的时候再回过头看代码时才发现了这个问题。这种“幼稚”的问题,在一个相对不小的程序设计中,可以说是致命的,以后一定要多加注意!

完成的函数没有什么特别突出的优点或者特点,但是尽可能地使整个程序更加清楚,清晰,用户的界面也做了一些小小的装饰,与代码和程序没有什么太大的关系,但是能够给用户更舒适开心的体验。

相对的存在的问题,突出的就是对输入的要求比较多,不允许输入非降幂的多项式,也不允许输入空格和其他非数字、逗号以及小括号以外的字符,同时还要保证括号和逗号位置的一定顺序。这一点还是需要改进,但是考虑到,这样的输入有益于用户的理解,所以衡量了一下,决定输入还是就这样规定了,今后也可以再对其进行改进。

完成这次的project,再一次让我了解到了正确的算法的重要性,认真细心,严密的逻辑思维,和耐心是身为一个程序员,在书写代码的时候,不可或缺的要素,在今后的学习和实验里,要吸取教训,耐心冷静,仔细思考,先想好算法再动手。

 

五 致谢和参考文献

http://www.sgi.com/tech/stl/

http://soj.sysu.edu.cn/

http://sist.sysu.edu.cn/~lh/cplusplus.html

C++程序设计 Y. Daniel Liang 著 (第3版)

Introduction to Programming with C++ (Third Edition)

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <cstring>
  5 #include <cstdlib>
  6 #include <sstream>
  7 #include <utility>
  8 #include <cmath>
  9 
 10 using namespace std;
 11 /*这份编程实验是15年9月编写的,编写实验时没有添加过多的注释,但是所幸命名比较友善,如果有不清楚或有错误的地方,欢迎指正,一起学习~!*/
 12 typedef pair<int, int> term;
 13 typedef vector<term> polynomial;
 14 struct P
 15 {
 16     char x;
 17     polynomial p;
 18 };
 19 vector <P> polys;
 20 polynomial getPoly(string s);
 21 polynomial operator +(const polynomial &p, const polynomial &q);
 22 polynomial operator -(const polynomial &p, const polynomial &q);
 23 polynomial operator *(const polynomial &p, const polynomial &q);
 24 bool equal(const polynomial &p, const polynomial &q);
 25 polynomial der(const polynomial &p);
 26 int value(int x, polynomial& p);
 27 ostream& operator <<(ostream& out, const polynomial &q);
 28 ostream& operator <<(ostream& out, const P &q);
 29 bool inter(polynomial x);
 30 bool rename(char x);
 31 void f();
 32 void f1_push();
 33 void f2_print();
 34 void f3_plus();
 35 void f4_sub();
 36 void f5_mul();
 37 void f6_equal();
 38 void f7_der();
 39 void f8_value();
 40 void f0_menu();
 41 
 42 polynomial getPoly(string s)
 43 {
 44 
 45     int f, g, h;
 46     polynomial x;
 47     for (unsigned int i = 0; i<s.size(); i++)
 48     {
 49         if (s[i] == '(')
 50             f = i;
 51         else if (s[i] == ',')
 52             g = i;
 53         else if (s[i] == ')')
 54         {
 55             h = i;
 56             int a = atoi((s.substr(f + 1, g - 1)).c_str());
 57             int b = atoi((s.substr(g + 1, h - 1)).c_str());
 58             x.push_back(make_pair(a, b));
 59         }
 60     }
 61     return x;
 62 }
 63 
 64 polynomial operator +(const polynomial &p, const polynomial &q)
 65 {
 66     polynomial w;
 67     if (p.size() == 0)
 68     {
 69         for (int i = 0; i<q.size(); i++)
 70             w.push_back(q[i]);
 71     }
 72     else if (q.size() == 0)
 73     {
 74         for (int i = 0; i<p.size(); i++)
 75             w.push_back(p[i]);
 76     }
 77     else
 78     {
 79         int j = 0;    int i = 0;
 80         while (j <p.size() && i <q.size())
 81         {
 82             if (p[j].second >q[i].second)
 83             {
 84                 w.push_back(p[j]);      j++;
 85             }
 86             else if (p[j].second == q[i].second)
 87             {
 88                 if (p[j].first + q[i].first != 0)
 89                     w.push_back(make_pair(p[j].first + q[i].first, q[i].second));
 90                 i++;
 91                 j++;
 92             }
 93             else
 94             {
 95                 w.push_back(q[i]);      i++;
 96             }
 97         }
 98         while (j >= p.size() && i <q.size())
 99         {
100             w.push_back(q[i]);    i++;
101         }
102         while (j <p.size() && i >= q.size())
103         {
104             w.push_back(p[j]);    j++;
105         }
106     }
107 
108     return w;
109 }
110 polynomial operator -(const polynomial &p, const polynomial &q)
111 {
112     polynomial w, x;
113     for (int i = 0; i<q.size(); i++)
114     {
115         x.push_back(make_pair(-q[i].first, q[i].second));
116     }
117     return p + x;
118 }
119 
120 polynomial operator *(const polynomial &p, const polynomial &q)
121 {
122     polynomial x;
123     term t;
124     vector<polynomial> w;
125     polynomial v;
126     for (int i = 0; i<p.size(); i++)
127     {
128         for (int j = 0; j<q.size(); j++)
129         {
130             t = make_pair(p[i].first*q[j].first, p[i].second + q[j].second);
131             v.push_back(t);
132         }
133         w.push_back(v);
134         v.clear();
135     }
136     x.push_back (make_pair(0,0));
137     for (int i = 0; i<w.size(); i++)
138     {
139         x=w[i]+x;
140     }
141     return x;
142 }
143 
144 bool equal(const polynomial &p, const polynomial &q)
145 {
146     int n = p.size();
147     if (n != q.size()) return false;
148     for (int i = 0; i<n; i++)
149     {
150         if (q[i].first != p[i].first || p[i].second != q[i].second)
151             return false;
152     }
153     return true;
154 }
155 
156 polynomial der(const polynomial &p)
157 {
158     polynomial w;
159     for (int i = 0; i<p.size(); i++)
160     {
161         if (p[i].second == 0) w.push_back(make_pair(0, 0));
162         else w.push_back(make_pair(p[i].first*p[i].second, p[i].second - 1));
163     }
164 
165     return w;
166 }
167 
168 int value(int x, polynomial& p)
169 {
170     int a = 0;
171     for (int i = 0; i<p.size(); i++)
172     {
173         a = a + (p[i].first*(pow(x, p[i].second)));
174     }
175     return a;
176 }
177 
178 ostream& operator <<(ostream& out, const polynomial &q)
179 {
180     int x = 0;
181     for (int i=0; i<q.size(); i++)
182     {
183         if (i == x)
184         {
185              if (q[i].first == 0)
186             {
187                  if (q.size() == 1) out << 0;
188                  else x++;
189             }
190             else if (q[i].first == 1)
191             {
192                 if (q[i].second == 1)
193                     out << "x";
194                 else if (q[i].second == 0)
195                     out << q[i].first;
196                 else out << "x^" << q[i].second;
197 
198             }
199             else if (q[i].first == -1)
200             {
201                 if (q[i].second == 1)
202                     out << "-x";
203                 else if (q[i].second == 0)
204                     out << q[i].first;
205                 else out << "-x^" << q[i].second;
206 
207             }
208             else if (q[i].second == 1)
209                 out << q[i].first << "x";
210             else if (q[i].second == 0)
211                 out << q[i].first;
212             else
213                 out << q[i].first << "x^" << q[i].second;
214         }
215         else if (q[i].first == 0) continue;
216         else if (q[i].first == 1)
217         {
218             if (q[i].second == 1)
219                 out << "+x";
220             else if (q[i].second == 0)
221                 out << "+" << q[i].first;
222             else out << "+x^" << q[i].second;
223         }
224         else if (q[i].first == -1)
225         {
226             if (q[i].second == 1)
227                 out << "-x";
228             else if (q[i].second == 0)
229                 out << q[i].first;
230             else out << "-x^" << q[i].second;
231         }
232         else if (q[i].second == 1)
233         {
234             if (q[i].first>0)
235                 out << "+" << q[i].first << "x";
236             else out << q[i].first << "x";
237         }
238 
239         else if (q[i].second == 0)
240         {
241             if (q[i].first>0)
242                 out << "+" << q[i].first;
243             else out << q[i].first;
244         }
245         else if (q[i].first<0)
246             out << q[i].first << "x^" << q[i].second;
247         else if (q[i].first>0)
248             out << "+" << q[i].first << "x^" << q[i].second;
249     }
250     return out;
251 }
252 
253 ostream& operator <<(ostream& out, const P &q)
254 {
255     out << q.x << " " << q.p;
256     return out;
257 }
258 
259 bool inter(polynomial x)
260 {
261     for (int i = 1; i < x.size(); i++)
262     {
263         if (x[i].second >x[i - 1].second || x[i].second == x[i - 1].second)
264             return false;
265     }
266     return true;
267 }
268 
269 bool rename(char x)
270 {
271     if (polys.empty()) return false;
272     for (int i = 0; i<polys.size(); i++)
273     {
274         if (x == polys[i].x)
275             return true;
276     }
277     return false;
278 }
279 void f()
280 {
281     cout << "\n       *******************************************************\n" ;
282     cout << "           ****************你好,我是多项式计算器*****************\n" ;
283     cout << "       *******************************************************\n" ;
284     cout << "        ^_^ 很高兴认识你~~~~~你可以用我来计算多项式YO~~~~~~\n\n" ;
285     cout << "下面是功能列表以及相应的order序号,\n"
286         << "输入对应的序号就可以开始计算了 ^_^ \n\n" ;
287     cout << "1.输入一个多项式\n" ;
288     cout << "2.显示一个多项式\n" ;
289     cout << "3.两个多项式相加\n" ;
290     cout << "4.两个多项式相减\n" ;
291     cout << "5.两个多项式相乘\n" ;
292     cout << "6.判断两个多项式是否相等\n" ;
293     cout << "7.求多项式的导数\n" ;
294     cout << "8.求多项式代入某点的值\n" ;
295     cout << "9.退出系统\n" ;
296     cout << "0.显示菜单\n\n" ;
297 
298 }
299 
300 void f1_push()
301 {
302     cout << endl;
303     cout << "请输入多项式的名称,最好用一个小写的英文字母命名:   ";
304     char x;
305     cin >> x;
306     if (rename(x))
307         cout << "您输入的多项式有误或有重名,请确认之后再从菜单的命令重新输入!\n";
308     else
309     {
310         cout << "请输入多项式,形如(1,3)(2,2)(6,1)代表 x^3+2x^2+6x ,请按降幂输入并不要使用空格键:  ";
311         string y;
312         cin >> y;
313         polynomial p = getPoly(y);
314         if (inter(p)==true)
315         {
316             P P1 = { x, p };
317             polys.push_back(P1);
318                         cout << "已成功输入,可进行下一步操作或退出~!\n";
319         }
320         else cout << "您输入的多项式必须按照降幂排列! \n";
321     }
322 }
323 
324 void f2_print()
325 {
326     cout << endl;
327     cout << "如下是您添加过的多项式:\n" ;
328     for (int i = 0; i<polys.size(); i++)
329     {
330         cout << i << " " << polys[i] << endl;
331     }
332     cout << "请输入您要输出的多项式的名称,例如 p :   ";
333     int ap = -1;
334     char x;
335     cin >> x;
336     for (int i = 0; i<polys.size(); i++)
337     {
338         if (x == polys[i].x)
339             ap = i;
340     }
341     if (ap == -1) cout << "您输入的该多项式不存在,请确认之后再从菜单的命令重新输入!\n";
342     else cout << polys[ap] << endl;
343 }
344 
345 void f3_plus()
346 {
347     cout << endl;
348     cout << "请输入两个您要相加的多项式,形如p+q,或r=p+q:   ";
349     string x;
350     cin >> x;
351     int a = -1, ap = -1, bp = -1;
352     for (int i = 0; i<x.size(); i++)
353     {
354         if (x[1] == '+') a = 0;
355         else if (x[1] == '='&&x[3] == '+') a = 1;
356     }
357     if (a == 0)
358     {
359         for (int i = 0; i<polys.size(); i++)
360         {
361             if (x[0] == polys[i].x)
362                 ap = i;
363         }
364         for (int i = 0; i<polys.size(); i++)
365         {
366             if (x[2] == polys[i].x)
367                 bp = i;
368         }
369         if (ap == -1 || bp == -1) cout << "您输入的该多项式不存在,请确认之后再从菜单的命令重新输入!\n";
370         else cout << polys[ap].p + polys[bp].p << endl;
371     }
372     if (a == 1)
373     {
374         if (rename(x[0]))
375             cout << "您新命名的多项式有误或有重名,请确认之后再从菜单的命令重新输入!\n";
376         else
377         {
378             for (int i = 0; i<polys.size(); i++)
379             {
380                 if (x[2] == polys[i].x)
381                     ap = i;
382             }
383             for (int i = 0; i<polys.size(); i++)
384             {
385                 if (x[4] == polys[i].x)
386                     bp = i;
387             }
388             if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
389             else
390             {
391                 cout << x[0] << " " << polys[ap].p + polys[bp].p << endl;
392                 P P1 = { x[0], polys[ap].p + polys[bp].p };
393                 polys.push_back(P1);
394             }
395         }
396 
397     }
398     if (a == -1) cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
399 }
400 
401 void f4_sub()
402 {
403     cout << endl;
404     cout << "请输入两个您要相减的多项式,形如p-q,或r=p-q:   ";
405     string x;
406     cin >> x;
407     int a = -1, ap = -1, bp = -1;
408     for (int i = 0; i<x.size(); i++)
409     {
410         if (x[1] == '-') a = 0;
411         else if (x[1] == '='&&x[3] == '-') a = 1;
412     }
413     if (a == 0)
414     {
415         for (int i = 0; i<polys.size(); i++)
416         {
417             if (x[0] == polys[i].x)
418                 ap = i;
419         }
420         for (int i = 0; i<polys.size(); i++)
421         {
422             if (x[2] == polys[i].x)
423                 bp = i;
424         }
425         if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
426         else cout << polys[ap].p - polys[bp].p << endl;
427     }
428     if (a == 1)
429     {
430         if (rename(x[0]))
431             cout << "您的输入的多项式有误或有重名,请确认之后再从菜单的命令重新输入!\n";
432         else
433         {
434             for (int i = 0; i<polys.size(); i++)
435             {
436                 if (x[2] == polys[i].x)
437                     ap = i;
438             }
439             for (int i = 0; i<polys.size(); i++)
440             {
441                 if (x[4] == polys[i].x)
442                     bp = i;
443             }
444             if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
445             else
446             {
447                 cout << x[0] << " " << polys[ap].p - polys[bp].p << endl;
448                 P P1 = { x[0], polys[ap].p - polys[bp].p };
449                 polys.push_back(P1);
450             }
451         }
452     }
453     if (a == -1) cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
454 }
455 
456 void f5_mul()
457 {
458     cout << endl;
459     cout << "请输入两个您要相乘的多项式,形如p*q,或r=p*q:   ";
460     string x;
461     cin >> x;
462     int a = -1, ap = -1, bp = -1;
463     for (int i = 0; i<x.size(); i++)
464     {
465         if (x[1] == '*') a = 0;
466         else if (x[1] == '='&&x[3] == '*') a = 1;
467     }
468     if (a == 0)
469     {
470         for (int i = 0; i<polys.size(); i++)
471         {
472             if (x[0] == polys[i].x)
473                 ap = i;
474         }
475         for (int i = 0; i<polys.size(); i++)
476         {
477             if (x[2] == polys[i].x)
478                 bp = i;
479         }
480         if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
481         else cout << polys[ap].p*polys[bp].p << endl;
482     }
483     if (a == 1)
484     {
485         if (rename(x[0]))
486             cout << "您的输入的多项式有误或有重名,请确认之后再从菜单的命令重新输入!\n";
487         else
488         {
489 
490             for (int i = 0; i<polys.size(); i++)
491             {
492                 if (x[2] == polys[i].x)
493                     ap = i;
494             }
495             for (int i = 0; i<polys.size(); i++)
496             {
497                 if (x[4] == polys[i].x)
498                     bp = i;
499             }
500             if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
501             else
502             {
503                 cout << x[0] << " " << polys[ap].p*polys[bp].p << endl;
504                 P P1 = { x[0], polys[ap].p*polys[bp].p };
505                 polys.push_back(P1);
506             }
507 
508         }
509     }
510     if (a == -1) cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
511 }
512 
513 void f6_equal()
514 {
515     cout << endl;
516     cout << "请输入您要判断的两个多项式,形如p==q:   ";
517     string x;
518     cin >> x;
519     int ap = -1, bp = -1;
520     if (x[1] != '=' || x[2] != '=') cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
521     else
522     {
523         for (int i = 0; i<polys.size(); i++)
524         {
525             if (x[0] == polys[i].x)
526                 ap = i;
527         }
528         for (int i = 0; i<polys.size(); i++)
529         {
530             if (x[3] == polys[i].x)
531                 bp = i;
532         }
533         if (ap == -1 || bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
534         else
535         {
536             if (equal(polys[ap].p, polys[bp].p))
537                 cout << "true" << endl;
538 
539             else cout << "false" << endl;
540 
541         }
542     }
543 }
544 
545 void f7_der()
546 {
547     cout << endl;
548     cout << "请输入您要求导的多项式的名称,形如 p` 或 r=p` :   ";
549     string x;
550     cin >> x;
551     int a = -1, ap = -1, bp = -1;
552     for (int i = 0; i<x.size(); i++)
553     {
554         if (x[1] == '`') a = 0;
555         else if (x[1] == '='&&x[3] == '`') a = 1;
556     }
557     if (a == 0)
558     {
559         for (int i = 0; i<polys.size(); i++)
560         {
561             if (x[0] == polys[i].x)
562                 ap = i;
563         }
564         if (ap == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
565         else cout << der(polys[ap].p) << endl;
566     }
567     if (a == 1)
568     {
569         if (rename(x[0]))
570             cout << "您的输入的多项式有误或有重名,请确认之后再从菜单的命令重新输入!\n";
571         else{
572 
573             for (int i = 0; i<polys.size(); i++)
574             {
575                 if (x[2] == polys[i].x)
576                     bp = i;
577             }
578             if (bp == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
579             else
580             {
581                 cout << x[0] << " " << der(polys[bp].p) << endl;
582                 P P1 = { x[0], der(polys[bp].p) };
583                 polys.push_back(P1);
584             }
585         }
586     }
587     if (a == -1) cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
588 
589 }
590 
591 void f8_value()
592 {
593     cout << endl;
594     cout << "请输入要求的多项式和x的值,形如 p[x=3] :   ";
595     string x;
596     cin >> x;
597     int ap = -1;
598     if (x[1] != '[' || x[2] != 'x' || x[3] != '=' || x[x.size() - 1] != ']') 
599         cout << "输入格式有误,请确认之后再从菜单的命令重新输入!\n";
600     else
601     {
602         for (int i = 0; i<polys.size(); i++)
603         {
604             if (x[0] == polys[i].x)
605                 ap = i;
606         }
607         int a = atoi((x.substr(4, x.size() - 4)).c_str());
608         if (ap == -1) cout << "您输入的多项式不存在,请确认之后再从菜单的命令重新输入!\n";
609         else cout << value(a, polys[ap].p) << endl;
610     }
611 
612 }
613 
614 void f0_menu()
615 {
616     cout << "\n\n1.输入一个多项式\n" ;
617     cout << "2.显示一个多项式\n" ;
618     cout << "3.两个多项式相加\n" ;
619     cout << "4.两个多项式相减\n" ;
620     cout << "5.两个多项式相乘\n" ;
621     cout << "6.判断两个多项式是否相等\n" ;
622     cout << "7.求多项式的导数\n" ;
623     cout << "8.求多项式代入某点的值\n" ;
624     cout << "9.退出系统\n" ;
625     cout << "0.显示菜单\n\n" ;
626 }
627 
628 
629 int main()
630 {
631     f();
632 
633     string order;
634     cin >> order;
635 
636     while (1)
637     {
638         if (order != "1"&&order != "2"&&order != "3"&&order != "4"&&order != "5"
639             &&order != "6"&&order != "7"&&order != "8"&&order != "9"&&order != "0")
640             cout << "您输入的是非法order,请重新输入!\n" ;
641 
642         if (order == "1")  f1_push();
643         if (order == "2")  f2_print();
644         if (order == "3")  f3_plus();
645         if (order == "4")  f4_sub();
646         if (order == "5")  f5_mul();
647         if (order == "6")  f6_equal();
648         if (order == "7")  f7_der();
649         if (order == "8")  f8_value();
650         if (order == "9")
651         {
652             cout << "感谢您的使用,与您下次再见~\n" ;
653             return 0;
654         }
655         if (order == "0")  f0_menu();
656 
657         cin >> order;
658     }
659 
660     return 0;
661 }

 

posted @ 2017-04-10 17:09  nanashi  阅读(947)  评论(0编辑  收藏  举报