一个交互多项式计算器的实现
一个交互多项式计算器的实现
----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接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://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 }