#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
#define CALLOC(P, N, S)\
if(!((P)=calloc(N, S))){\
printf( stderr, "Insufficient memory");\
exit(EXIT_FAILURE);\
}
#define REALLOC(P, S)\
if(!((P)=realloc(P, S))){\
printf( stderr, "Insufficient memory");\
exit(EXIT_FAILURE);\
}
typedef struct{
float coef; //系数
int expon; //指数
}polynomial;
typedef struct{
int A;
int A_;
int B;
int B_;
size_t c;
}start;
void pmult(int startA, int finishA,
int startB, int finishB,
polynomial *terms, size_t *size);
char Menu(void);
void padd(int startA, int finishA,
int startB, int finishB,
polynomial *terms, size_t *size);
//void pmult(int startA, int finishA,
// int startB, int finishB,
// int startD, int finishD
// polynomial *terms,size_t size);
void attach(float coefficient, int exponent, polynomial *terms, size_t *size);
// D=A(x)+B(x)
int COMPARE(int A,int B);
//A>B return 1 A<B return -1 A==B return 0
start readPoly(polynomial **terms);
void printPoly(polynomial *terms, start s);
int main(void)
{
polynomial *terms=NULL;
bool Continue=true;
start size;
while(Continue)
{
switch(Menu())
{
case '1':
if(terms==NULL)
break;
padd(size.A,size.A_,size.B,size.B_, terms, &size.c);
break;
case '2':
if(terms==NULL)
break;
pmult(size.A,size.A_,size.B,size.B_, terms, &size.c);
break;
case '3':
if(terms!=NULL)
{
free(terms);
size=readPoly(&terms);
break;
}
size=readPoly(&terms);
break;
case '4':
if(terms==NULL)
break;
printPoly(terms,size);
break;
case '5':
Continue=false;
break;
default:
{
printf("Enter Again!\n");
while(getchar()!='\n')continue;
}
}
}
free(terms);
return 0;
}
int COMPARE(int A,int B)
{
//A>B return 1 A<B return -1 A==B return 0
if(A<B) return -1;
else if(A==B) return 0;
else if(A>B)return 1;
}
void padd(int startA, int finishA,
int startB, int finishB,
polynomial *terms, size_t *size)
{
// D=A(x)+B(x)
float coefficient; //系数
while(startA<=finishA && startB<=finishB)
{
switch(COMPARE(terms[startA].expon, terms[startB].expon))
{
case -1:
attach(terms[startB].coef, terms[startB].expon, terms, size);
startB++;
break;
/* a expon < b expon */
case 0:
coefficient=terms[startA].coef+terms[startB].coef;
if(coefficient)
attach(coefficient, terms[startA].expon, terms, size);
startA++;
startB++;
break;
/* equal exponents */
case 1:
attach(terms[startA].coef, terms[startA].expon, terms, size);
startA++;
break;
/* a expon > b expon */
}
}
/* add in remaining terms of A(x) */
for(; startA<=finishA; startA++)
attach(terms[startA].coef, terms[startA].expon, terms, size);
/* add in remaining terms of B(x) */
for(; startB<=finishB; startB++)
attach(terms[startB].coef, terms[startB].expon, terms, size);
double k=0;
for(int i=6,a;i<*size; i++)
{
a=pow(2,terms[i].expon);
k+=terms[i].coef*a;
printf("%f %d %d %f\n",terms[i].coef,terms[i].expon, a,k);
}
}
start readPoly(polynomial **terms)
{
start size;
printf("输入两个多项式\n");
printf("多项式A(X)项数\n");
scanf("%d", &size.A_);
getchar();
size.A=0;
printf("多项式B(X)项数\n");
scanf("%d", &size.B_);
getchar();
size.c=size.A_+size.B_;
size.B=size.A_--;
size.B_+=size.A_;
CALLOC(*terms, size.c, sizeof(polynomial));
printf("输入多项式A,B %d\n",size.B_);
for(int k=0,g=size.A_, i=0; k<2;k++)
{
printf("%d:\n", k+1);
for(i; i<=g; i++)
{
printf("coef \n");
scanf("%f", &(*terms)[i].coef);
getchar();
printf("expon \n");
scanf("%d", &(*terms)[i].expon);
getchar();
}
g=size.B_;
}
return size;
}
void printPoly(polynomial *terms,
start s)
{
int num[6];
num[0]=s.A;
num[1]=s.A_;
num[2]=s.B;
num[3]=s.B_;
num[4]=s.B_+1;
num[5]=s.c;
for( int k=0, i=1,g=0; k<3; k++,i+=2,g+=2)
{
printf("%d:", k);
for( ; num[g]<num[i]; num[g]++)
{
printf("%fx^%d+",terms[num[g]].coef,
terms[num[g]].expon);
}
printf("%fx^%d\n",terms[num[g]].coef,
terms[num[g]].expon);
}
}
char Menu(void)
{
char menu;
for(;;)
{
printf("先输入多项式在进行计算\n");
for(int i=0;i<80;i++)
putchar('*');
printf("\n1) add 2) multiply\n");
printf("3) readPoly 4) printPoly \n");
printf("5) quit\n");
for(int i=0;i<80;i++)
putchar('*');
putchar('\n');
menu=getchar();
while(getchar()!='\n') continue;
return menu;
}
}
void attach(float coefficient, int exponent, polynomial *terms, size_t *size)
{
/*add a new term to the polynomial */
// if(avail >= MAX_TERMS)
// {
// fprintf(stderr, "Too many terms in the polynomial\n");
// exit(EXIT_FAILURE);
// }
size_t k=*size;
*size+=1;
REALLOC(terms,(*size)*sizeof(polynomial));
terms[k].coef=coefficient;
terms[k].expon=exponent;
}
void pmult(int startA, int finishA,
int startB, int finishB,
polynomial *terms, size_t *size)
{
//A(X)*B(X)=D(X)
for(int i=0; i<=finishA; i++)
{
for(int k=startB; k<=finishB; k++)
{
// printf("%f %d \n",terms[i].coef,terms[i].expon);
// printf("%f %d \n",terms[k].coef,terms[k].expon);
attach(terms[i].coef*terms[k].coef,
terms[i].expon+terms[k].expon,
terms, size);
}
}
double k=0;
for(int i=6,a;i<*size; i++)
{
a=pow(2,terms[i].expon);
k+=terms[i].coef*a;
printf("%f %d %d %f\n",terms[i].coef,terms[i].expon, a,k);
}
}
多项式_计算 动态内存存储
最新推荐文章于 2024-07-07 23:12:23 发布