zoukankan      html  css  js  c++  java
  • 多项式_计算 动态内存存储

    #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!
    ");
                        while(getchar()!='
    ')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
    ",terms[i].coef,terms[i].expon, a,k);
    	}
    }
    start readPoly(polynomial **terms)
    {
    	start size;
    	printf("输入两个多项式
    ");
    	printf("多项式A(X)项数
    ");
    	scanf("%d", &size.A_);
    	
    	getchar();
    	size.A=0;
    	printf("多项式B(X)项数
    ");
    	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
    ",size.B_);
    
    	
    	for(int k=0,g=size.A_, i=0; k<2;k++)
    	{
    		printf("%d:
    ", k+1);
    		for(i; i<=g; i++)
    		{
    			printf("coef 
    ");
    		    scanf("%f", &(*terms)[i].coef);
    		    getchar();
    		    printf("expon 
    ");
    		    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
    ",terms[num[g]].coef, 
    			              terms[num[g]].expon);
    	}
    }
    char Menu(void)
    {
        char menu;
       for(;;)
    	{
    		printf("先输入多项式在进行计算
    ");
            for(int i=0;i<80;i++)
                putchar('*');
            printf("
    1) add                         2) multiply
    ");
            printf("3) readPoly                    4) printPoly 
    ");
            printf("5) quit
    ");
            for(int i=0;i<80;i++)
                putchar('*');
            putchar('
    ');
            menu=getchar();
            
            while(getchar()!='
    ') 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
    ");
    //		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 
    ",terms[i].coef,terms[i].expon);
    //			printf("%f %d 
    ",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
    ",terms[i].coef,terms[i].expon, a,k);
    	}
    }
    

  • 相关阅读:
    【java】定时任务@Scheduled
    20180513 实参 形参 数组
    20180513 实参 形参
    20180513 数组 实参 形参
    <转载>二维数组回形遍历
    20180318 代码错题(8)
    20180318 代码错题(7)
    20180318 代码错题(6)
    20180318 代码错题(5)
    20180318 bit置0
  • 原文地址:https://www.cnblogs.com/WALLACE-S-BOOK/p/9732302.html
Copyright © 2011-2022 走看看