一元稀疏多项式简单计算器 ----综合题2

高级功能里面有几个没有做 ...


二、一元稀疏多项式简单计算器

问题描述

设计一个一元稀疏多项式简单计算器

基本要求

一元稀疏多项式简单计算器的基本功能是:

(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

实现提示

用带表头结点的单链表存储多项式。

选作内容

  1. 计算多项式在X处的值。
  2. 计算多项式a的导函数a’。
  3. 多项式a和b相乘,建立乘积多项式ab。
  4. 多项式的输出形式为类数学表达式。例如,多项式-3x8+6x3-18的输出形式为-3x^8+6x^3-18。注意,系数为1的非零次项的输出形式中略去系数1,如1x8的输出形式为x^8。
  5. 计算器的仿真界面。

 


 界面


源码

#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.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值