程序最终功能介绍
1、可进行多元多项式的加减乘运算
2、多项式的输入输出完全符合人类书写习惯(系数1、-1、0 指数1、0时)
3、输入无升降幂要求,交叉项内字母无顺序要求
4、支持区分大小写的52种字母作为变元
5、指数最大32767, 系数最大2^32
6、结果以升幂输出,交叉项内字母按ASCII表排列
7、输入两个多项式可进行多次运算
8、支持合并同类项、合并同底数幂功能
示例:
加法:
减法:
乘法:
最多52元 + 交叉项自动字母排序:
自动升幂输出 + 合并同类项:
立方差公式:
较大指数系数容量:
输入一组式子可多次运算:
错误指令自动识别:
以下是程序各文件内容
main.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXASC 127
#define MAXINT 32767
#define min(a,b) ((a)>(b)?(b):(a))
typedef struct Poly{
int coef;
int exp;
struct Part* self;
struct Poly* next;
} Poly;
typedef struct Part{
char letter;
int exp;
struct Part* next;
} Part;
void ReadTwoPoly(Poly** addhead1, Poly** addhead2);
void PrintPoly(Poly* head);
void PrintTable();
int ReceiveCommand(Poly* head1, Poly* head2);
int Count(Poly* L);
void Free(Poly** addhead1, Poly** addhead2);
int JudgeFirstJian(char* a);
int IsSign(char q);
int IsLetter(char q);
void PastePart(Poly* newpoly, Poly* oldpoly);
int Findwei(int n);
int TestHe(Poly* p, Poly* q);
int FindPartMin(Part* u);
int FindPolyMin(Poly* u);
void PolyHe(Poly* head);
void SortPartsofPoly(Poly* head);
void SortPart(Poly* p);
Poly* SortPoly(Poly* yuanhead);
Poly* Plus(Poly* head1, Poly* head2);
Poly* Subtract(Poly* head1, Poly* head2);
Poly* Multiple(Poly* head1, Poly* head2);
main.c
#include "main.h"
int main(void)
{
int command;
Poly *result, *head1=NULL, *head2=NULL;
while(1)
{
PrintTable();
while(1)
{
command = ReceiveCommand(head1, head2);
if(command==5)
{
goto ouk;}
else if(command==1)
{
//if( head1!=NULL && head2!=NULL )
//{
// Free(&head1,&head2);
//}
ReadTwoPoly(&head1, &head2); //之后head12存在空头结点
head1=head1->next; head2=head2->next;
head1=SortPoly(head1); head2=SortPoly(head2);
SortPartsofPoly(head1); SortPartsofPoly(head2);
}
else if(command==2)
{
result = Plus(head1,head2); break;}
else if(command==3)
{
result = Subtract(head1,head2); break; }
else if(command==4)
{
result = Multiple(head1,head2); break;}
}
PolyHe(result);
PrintPoly(result);
}
ouk:
return 0;
}
other functions.c
#include "main.h"
void PrintTable()
{
printf("\n");
printf(" ________________________\n");
printf(" | |\n");
printf(" | 多元多项式运算控制台 |\n");
printf(" | |\n");
printf(" | [1]输入两个多项式 |\n");
printf(" | [2]做加法 |\n");
printf(" | [3]做减法 |\n");
printf(" | [4]做乘法 |\n");
printf(" | [5]退出 |\n");
printf(" |________________________|\n");
return ;
}
int ReceiveCommand(Poly* head1, Poly* head2)
{
int command;
repeat:
scanf("%d", &command);
if( command!=1 && head1==NULL && head2==NULL && command!=5 )//未输入1 且 还未输入多项式
{
printf("请先按[1]输入两个多项式\n");
goto repeat;
}
else
{
return command;}
}
int Count(Poly* L)
{
int cnt=0;
Poly* p=L;
while(p!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
int Count2(Part* L)
{
int cnt=0;
Part* p=L;
while(p!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
void Free(Poly** addhead1, Poly** addhead2)
{
int i,j,cnt;
Poly* head, *p;
for(i=1; i<=2; i++)
{
if(i==1) {
head=*addhead1; p=head;}
if(i==2) {
head=*addhead2; p=head;}
cnt = Count(head);
for(j=0; j<=cnt; j++,p=p->next)
{
free(p); }
}
*addhead1 = *addhead2 = NULL;
return ;
}
int JudgeFirstJian(char* a)
{
if(*a=='-'){
return 1;}
else return 0;
}
int IsSign(char q)
{
if(q=='+'||q=='-'||q=='\0'){
return 1;}
else return 0;
}
int IsLetter(char q)
{
if(q>='a'&&q<='z'||q>='A'&&q<='Z'){
return 1;}
else return 0;
}
void PastePart(Poly* newpoly, Poly*