多项式_计算 动态内存存储

#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);
	}
}

posted on 2018-01-09 16:01  MACHINE_001  阅读(84)  评论(0编辑  收藏  举报

导航