高级功能里面有几个没有做 ...
二、一元稀疏多项式简单计算器
问题描述
设计一个一元稀疏多项式简单计算器
基本要求
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b。
测试数据
(1)(2x+5x3-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)
(2)(6x-3-X+4.4X2-1.2X9)-(-6X-3+5.4X2-X2+7.8X15)=(-7.8X15-1.2X9+12X-3-X)
(3)(1+X+X2+X3+X4+X5)+(-X3-X4)=(1+X+X2+X5)
(4)(X+X3)+(-X-X3)=0
实现提示
用带表头结点的单链表存储多项式。
选作内容
- 计算多项式在X处的值。
- 计算多项式a的导函数a’。
- 多项式a和b相乘,建立乘积多项式ab。
- 多项式的输出形式为类数学表达式。例如,多项式-3x8+6x3-18的输出形式为-3x^8+6x^3-18。注意,系数为1的非零次项的输出形式中略去系数1,如1x8的输出形式为x^8。
- 计算器的仿真界面。
界面
源码
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define MAX 101
#define STOP -12923966
void wait(){
cout << "\n请按任意键继续\n" << flush;
getch();
}
struct domath{
int c;
int x;
}LINEADD[MAX],LINESUB[MAX],LINE1[MAX],LINE2[MAX],LINE1b[MAX],LINE2b[MAX],LINE3[MAX];
void refreash();
void input_lines();
void show_pcline();
void test();
void show_pcline();
void ADD();
void backup();
void makeup(domath* LINE);
void SUB();
void math_UI(domath* LINE);
void math_out();
void calUI();
int main()
{
refreash();
char choice;
while (1)
{ system("cls");
cout << "\n\n\n\n";
cout << "\t\t 多项式计算器 \n";
cout << "\t\t ======================================\n";
cout << "\t\t 1:输入多项式 \n";
cout << "\t\t 2:输出多项式 \n";
cout << "\t\t 3:多项式a和b相加,建立多项式a+b \n";
cout << "\t\t 4:多项式a和b相减,建立多项式a-b \n";
cout << "\n";
cout << "\t\t =======================================pro \n";
cout << "\t\t 5:类数学表达式 \n";
cout << "\t\t 6:计算器的仿真界面 \n";
cout << "\t\t z:清空数据 \n";
cout << "\n";
cout << "\t\t 0:退出 \n";
cout << "\n";
cout << "\t\t请选择:" << flush;
choice = getch();
system("cls");
switch(choice)
{
case '1':
input_lines();
break;
case '2':
show_pcline();
break;
case '3':
ADD();
break;
case '4':
SUB();
break;
case '5':
math_out();
break;
case '6':
calUI();
break;
case 't':
test();
break;
case '0':
exit(0);
}
}
}
//refreash
void refreash(){
int i;
for(i=0;i<MAX;i++)
{
LINE1[i].c=LINE1[i].x=STOP;
LINE2[i].c=LINE2[i].x=STOP;
}
}
void refreash_one(domath *LINE){
int i;
for(i=0;i<MAX;i++)
{
LINE[i].c=LINE[i].x=STOP;
}
}
//in put
void doinput(domath* LINE)//for input_lines
{
int i;
char getstop[200];
cout<<"输入项数n(0<n<=100):"<<flush;
cin>>LINE[100].c; //this is n
for(i=0;i<LINE[100].c;i++)
{
cout<<"\n输入第"<<i+1<<"项的c:"<<flush;
scanf("%s",&getstop);
if(getstop[0]!='/') LINE[i].c=atoi(getstop);
else return;
cout<<"\n输入第"<<i+1<<"项的x^:"<<flush;
scanf("%s",&getstop);
if(getstop[0]!='/') LINE[i].x=atoi(getstop);
else return;
}
cout <<"输入完成"<<endl;
backup();
makeup(LINE);
}
void input_lines()
{
fflush(stdin);
char choice;
cout<<" !!!写入新的多项式会抹掉原来的内容!!!"<<endl;
cout<<" 1:写入多项式A"<<endl;
cout<<" 2:写入多项式B"<<endl;
cout<<" =========请选择: "<<endl;
choice = getch();
fflush(stdout);
switch(choice)
{
case '1':
refreash_one(LINE1);
doinput(LINE1);
break;
case '2':
refreash_one(LINE2);
doinput(LINE1);
break;
}
wait();
backup();
}
//backup+makeup
void backup(){
int i;
for(i=0;i<MAX;i++)
{
LINE1b[i].c=LINE1[i].c;
LINE1b[i].x=LINE1[i].x;
LINE2b[i].c=LINE2[i].c;
LINE2b[i].x=LINE2[i].x;
}
}
void makeup(domath* LINE)
{
int i,j,n,x_max=0;//x_max=0 is very important
for(i=0;LINE[i].c!=STOP;i++){
n =LINE[i].x;
x_max=x_max>n?x_max:n;
}//find x_max
for(i=0;i<MAX;i++)
{
LINE3[i].c=STOP;
LINE3[i].x=x_max-i;
}//a special kind of refreash
for(i=0;i<=x_max;i++)
{
LINE3[i].c=0;
for(j=0;j<LINE[100].c;j++)
{
if(LINE[j].x==LINE3[i].x){
LINE3[i].c+=LINE[j].c;//找到次数相同的项,相加;
}
}
}
LINE3[100].c=x_max+1;
for(i=0;i<MAX;i++)
{
LINE[i].c=LINE3[i].c;
LINE[i].x=LINE3[i].x;
}
cout<<"整理..."<<endl;
}//the hardest part i think
//show it
void show_a_line(domath* LINE)
{
int i;
for(i=0;(LINE[i].c)!=STOP;)
{
if(LINE[i].c==STOP)cout<<"0"<<","<<flush;
else
cout<<LINE[i].c<<","<<flush;
if(LINE[i].x==STOP)cout<<"0"<<","<<flush;
else
cout<<LINE[i].x<<","<<flush;
i++;
}
}
void show_pcline()
{
fflush(stdin);
cout<<"A: "<<flush;
show_a_line(LINE1);
cout<<"\nB: "<<flush;
show_a_line(LINE2);
wait();
}
//
void ADD()
{
cout<<"请事先保证两个表均不为空"<<endl;
int i,j,n,maxa=0,maxb=0;
for(i=0;LINE1[i].c!=STOP;i++){
n =LINE1[i].x;
maxa=maxa>n?maxa:n;
}
for(i=0;LINE2[i].c!=STOP;i++){
n =LINE2[i].x;
maxb=maxb>n?maxb:n;
}
maxa=maxa>maxb?maxa:maxb;//get max
for(i=0;i<MAX;i++) {
LINE3[i].c=STOP;
LINE3[i].x=maxa-i; }
for(i=0;i<=maxa;i++)
{
LINE3[i].c=0;
for(j=0;j<LINE1[100].c;j++)
{
if(LINE1[j].x==LINE3[i].x)
LINE3[i].c+=LINE1[j].c;//找到次数相同的项,相加;
}
for(j=0;j<LINE2[100].c;j++)
{
if(LINE2[j].x==LINE3[i].x)
LINE3[i].c+=LINE2[j].c;
}
}
LINE3[100].c=maxa+1;
cout<<"OK,这是结果:"<<flush;
show_a_line(LINE3);
cout<<"\n这是MATH显示法的:"<<flush;
math_UI(LINE3);
wait();
}
//
void SUB()
{
cout<<"请事先保证两个表均不为空"<<endl;
int i,j,n,maxa=0,maxb=0;
for(i=0;LINE1[i].c!=STOP;i++){
n =LINE1[i].x;
maxa=maxa>n?maxa:n;
}
for(i=0;LINE2[i].c!=STOP;i++){
n =LINE2[i].x;
maxb=maxb>n?maxb:n;
}
maxa=maxa>maxb?maxa:maxb;//get max
for(i=0;i<MAX;i++) {
LINE3[i].c=STOP;
LINE3[i].x=maxa-i; }
for(i=0;i<=maxa;i++)
{
LINE3[i].c=0;
for(j=0;j<LINE1[100].c;j++)
{
if(LINE1[j].x==LINE3[i].x)
LINE3[i].c+=LINE1[j].c;//找到次数相同的项,相加;
}
for(j=0;j<LINE2[100].c;j++)
{
if(LINE2[j].x==LINE3[i].x)
LINE3[i].c-=LINE2[j].c;
}
}
LINE3[100].c=maxa+1;
cout<<"OK,这是结果:"<<flush;
show_a_line(LINE3);
cout<<"\n这是MATH显示法的:"<<flush;
math_UI(LINE3);
wait();
}
//
void math_out()
{
fflush(stdin);
cout<<"A: "<<flush;
math_UI(LINE1);
cout<<"\nB: "<<flush;
math_UI(LINE2);
wait();
}
void math_UI(domath* LINE)
{
int i;
for(i=0;(LINE[i].c)!=STOP;i++)
{
if(LINE[i].c>1||LINE[i].c<0)
{
if(LINE[i].c>0&&i>0) cout<<"+"<<flush;
cout<<LINE[i].c<<flush;
if(LINE[i].x!=0) cout<<"x^"<<LINE[i].x<<flush;
}
else if(LINE[i].c==1)
{
if(LINE[i].c>0&&i>0) cout<<"+"<<flush;
if(LINE[i].x!=0) cout<<"x^"<<LINE[i].x<<flush;
}
}
cout<<" (空就是所有的和为0)"<<endl;
}
//calUI
void calUI(){
cout << "\n\n\n\n";
cout << "\t\t =*=*=*=*=*=*=*=*=*= \n";
cout << "\t\t * 一元多项式计算器 * \n";
cout << "\t\t =*=*=*=*=*=*=*=*=*= \n\n\n";
cout << "\t\t 1 2 3 + \n";
cout << "\t\t 4 5 6 - \n";
cout << "\t\t 7 8 9 ^ \n";
cout << "\t\t 0 . < c \n";
cout << "\t\t , = > x \n";
cout << "\t\t \n";
cout << "\n\n";
wait();
}
//test
void test()
{
refreash_one(LINE1);
LINE1[0].c=1;
LINE1[0].x=1;
LINE1[1].c=1;
LINE1[1].x=3;
LINE1[100].c=2;
refreash_one(LINE2);
LINE2[0].c=1;
LINE2[0].x=1;
LINE2[1].c=1;
LINE2[1].x=3;
LINE2[100].c=2;
backup();
makeup(LINE1);
cout<<"LINE1[100].c:"<<LINE1[100].c<<endl;
makeup(LINE2);
cout<<"rrrrrrrrrr-rrrrrrrrrr"<<endl;
wait();
}
老娘这回基本上没有写备注,,我好懒的其实----
makeup()函数比较难 因为我一开始小看这个题了 ,后来发现如果有沙雕输入1x+2x+3x这样的同类项还得合并,这就是全部难点了我认为
Thank you for reading my essay.