C程序可以扩大二次方程式 [英] C program that can expand quadratics

查看:127
本文介绍了C程序可以扩大二次方程式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想有一个C程序,让我输入(X + 1)(X + 3)以及其他类似的东西,包括X ^ 2。到目前为止,我有使用链表一个非常复杂的系统,但我觉得应该有一个更简单的解决方案。 从输入输出,(X + 1)(X + 3)将为x ^ 2 + 4×+3打印出来。

到目前为止,我绕过一个结构_term用int,char和int对于系数,有利于数字和功率。所以2X ^ 4将被保存为| 2 |'X'| 3 |。

我还要提到的是,我只有16个,并且还在读高中。

解决方案

 的#include< stdio.h中>
#包括< stdlib.h中>

#定义BUFFSIZE 128

typedef结构_exp {//积分EX pression
    INT N;订单//最大
    INT * K; //系数表(阵列)#K表[0]为常数k [N]为x ^ N
}精通;


无效打印(实验* EXP);
为const char *提取物(为const char *海峡,字符* outbuff);
EXP * makeExp(为const char * STR);
无效freeExp(实验* EXP);
EXP *转换(为const char * STR);
EXP·穆尔(EXP *一,指数* B);
EXP *钙(为const char * expStr);

诠释的main(){
    字符的buff [BUFFSIZE]
    EXP * E​​XP;
    的printf(输入EX pression EG(X + 1)(X + 3)\ N'GT;。);
    与fgets(BUFF,的sizeof(BUFF)/的sizeof(char)的,标准输入);
    EXP =计算(BUFF);
    打印(EXP);
    freeExp(EXP);

    返回0;
}

无效打印(实验* EXP){
    INT I,N = EXP-将​​N;
    对于(I = N; I> = 0;  - 我){
        INT K = EXP-> k [I]
        如果(K == 0)继续;
        如果(K&小于0)
            的printf( - );
        如果(K大于0&安培;&安培;!i = N时)
            输出(+);
        如果(K&小于0)K * =  -  1; // K = | K |
        如果(ⅰ!= 0){
            如果(K!= 1)
                的printf(%DX,k)的;
            其他
                的printf(×);
        }
        如果(ⅰ→1)
            的printf(^%D,我);
        如果(我== 0)
            的printf(%D,K);
    }
    的printf(\ N);
}


为const char *提取物(为const char *海峡,字符* outbuff){
//拉出中括号outbuff,并删除空间
    而(isspace为(* STR))
        ++海峡;
    如果(* STR =='\ 0')返回NULL;
    而(*海峡='(')+ STR!;
    而(* ++海峡!=')')
        如果(!isspace为(* STR))
            * outbuff ++ = *海峡;
    * outbuff ='\ 0';
    返回++海峡;
}

EXP * makeExp(为const char * STR){
    EXP * E​​XP;
    字符的buff [BUFFSIZE]
    EXP =(实验*)malloc的(的sizeof(EXP));
    EXP-将​​N = 0;
    EXP-> K =(INT *)释放calloc(1,sizeof的(INT));
    而(* STR){
        INT K,N;
        字符* P;
        K =(int)的与strtol(海峡,&安培; P,10);
        如果(K == 0){//永远不变为零,如(X + 0)是无效的,有效的EG(X)
            如果(P [0] ==' - '){
                K = -1;
                ++磷;
            }否则如果(P [0] ==+){
                K = 1;
                ++磷;
            } 其他
                K = 1;
        }
        如果(* P =='\ 0'){
            EXP-> k [0] = K; //不变部分
            打破;
        }
        如果(* P =='X'){
            N =(P [1] =='^')? (INT)与strtol(安培; P [2],&安培; P,10):1;
            如果(EXP-将​​N n种){
                INT I;
                EXP-> K =(为int *)的realloc(EXP-> K,第(n + 1)*的sizeof(int)的);
                对于(i = N时; I> EXP-将​​N;  - 一)
                    EXP-> k [I] = 0;
                EXP-将​​N = N;
            }
            EXP-> k [N] = K;
            如果(* P =='\ 0'|| P [1] =='\ 0')破;
            其他{
                STR =(N!= 1)? P:P + 1;
            }
        } 其他 {
            EXP-> k [0] = K;
            海峡= P;
        }
    }
    返回EXP;
}

无效freeExp(实验* EXP){
    免费(EXP-> K);
    免费(EXP);
}

EXP *转换(为const char * STR){
    EXP * E​​XP;
    EXP = makeExp(STR);
    返回EXP;
}

EXP·穆尔(EXP *一,指数* B){
    EXP * RET;
    INT I,J;
    RET =(实验*)malloc的(的sizeof(EXP));
    ret-> N = A-> N + B-> N;
    ret-> K =(为int *)释放calloc(ret-将N + 1,sizeof的(INT));
    对于(I = 0; I&其中; = A-将N ++ⅰ){
        为(J = 0; J&其中; = B-将N ++ j)条{
            ret-> k [I + J] + = A-> k [我] * B-> K- [J]。
        }
    }
    返回RET;
}

EXP *钙(为const char * expStr){
    EXP * E​​XP;
    字符的buff [BUFFSIZE]
    为const char * p = expStr;
    EXP =(实验*)malloc的(的sizeof(EXP));
    EXP-将​​N = 0;
    EXP-> K =(INT *)malloc的(的sizeof(INT));
   * EXP-> K = 1;
    而(NULL!=(P =提取物(P,BUFF))){
        EXP * E​​ *周;
        WK = EXP;
        E =转换(BUFF);
        EXP = MUL(周,E);
        freeExp(周);
        freeExp(E);
    }
    返回EXP;
}
 

I want to have a C program that allows me to input (x+1)(x+3) and other stuff like that, including x^2. So far I have a very complex system using linked lists but I think that there should be an easier solution. The output from input, (x+1)(x+3) would be x^2+4x+3 printed out.

So far I'm passing around a struct _term with an int, char and int for coefficient,pro numeral and power. so 2x^4 would be saved as |2|'x'|3|.

I should also mention that I'm only 16, and still in high school.

解决方案

#include <stdio.h>
#include <stdlib.h>

#define BUFFSIZE 128

typedef struct _exp { //Integral expression
    int n; //Max of order
    int *k;//coefficient list(array)# k[0] as constant, k[n] as x^n
} Exp;


void print(Exp *exp);
const char *extract(const char *str, char *outbuff);
Exp *makeExp(const char *str);
void freeExp(Exp *exp);
Exp *convert(const char *str);
Exp *mul(Exp *a, Exp *b);
Exp *calc(const char *expStr);

int main(){
    char buff[BUFFSIZE];
    Exp *exp;
    printf("input expression Eg.(x+1)(x+3)\n>");
    fgets(buff, sizeof(buff)/sizeof(char), stdin);
    exp=calc(buff);
    print(exp);
    freeExp(exp);

    return 0;
}

void print(Exp *exp){
    int i, n = exp->n;
    for(i=n;i>=0;--i){
        int k = exp->k[i];
        if(k==0)continue;
        if(k<0)
            printf("-");
        if(k>0 && i!=n)
            printf("+");
        if(k<0) k*=-1;//k=|k|
        if(i!=0){
            if(k!=1)
                printf("%dx", k);
            else
                printf("x");
        }
        if(i>1)
            printf("^%d", i);
        if(i==0)
            printf("%d", k);
    }
    printf("\n");
}


const char *extract(const char *str, char *outbuff){
//pull out in parenthesis to outbuff, and remove space
    while(isspace(*str))
        ++str;
    if(*str=='\0') return NULL;
    while(*str!='(')++str;
    while(*++str!=')')
        if(!isspace(*str))
            *outbuff++=*str;
    *outbuff='\0';
    return ++str;
}

Exp *makeExp(const char *str){
    Exp *exp;
    char buff[BUFFSIZE];
    exp = (Exp*)malloc(sizeof(Exp));
    exp->n = 0;
    exp->k = (int*)calloc(1,sizeof(int));
    while(*str){
        int k,n;
        char *p;
        k=(int)strtol(str, &p, 10);
        if(k==0){//never constant zero e.g(x+0)is invalid, valid E.g (x)
            if(p[0]=='-'){
                k = -1;
                ++p;
            } else if(p[0]=='+') {
                k = 1;
                ++p;
            } else 
                k = 1;
        }
        if(*p=='\0'){
            exp->k[0]=k;//constant part
            break;
        }
        if(*p=='x'){
            n = (p[1]=='^') ? (int)strtol(&p[2], &p, 10):1;
            if(exp->n < n){
                int i;
                exp->k = (int*)realloc(exp->k, (n+1)*sizeof(int));
                for(i=n;i>exp->n;--i)
                    exp->k[i]=0;
                exp->n = n;
            }
            exp->k[n] = k;
            if(*p=='\0' || p[1]=='\0')break;
            else{
                str = (n!=1)? p:p+1;
            }
        } else {
            exp->k[0]=k;
            str = p;
        }
    }
    return exp;
}

void freeExp(Exp *exp){
    free(exp->k);
    free(exp);
}

Exp *convert(const char *str){
    Exp *exp;
    exp=makeExp(str);
    return exp;
}

Exp *mul(Exp *a, Exp *b){
    Exp *ret;
    int i,j;
    ret=(Exp*)malloc(sizeof(Exp));
    ret->n = a->n + b->n;
    ret->k = (int*)calloc(ret->n + 1, sizeof(int));
    for(i=0;i<=a->n;++i){
        for(j=0;j<=b->n;++j){
            ret->k[i+j] += a->k[i] * b->k[j];
        }
    }
    return ret;
}

Exp *calc(const char *expStr){
    Exp *exp;
    char buff[BUFFSIZE];
    const char *p=expStr;
    exp = (Exp*)malloc(sizeof(Exp));
    exp->n = 0;
    exp->k = (int*)malloc(sizeof(int));
   *exp->k = 1;
    while(NULL!=(p=extract(p, buff))){
        Exp *e,*wk;
        wk=exp;
        e=convert(buff);
        exp=mul(wk, e);
        freeExp(wk);
        freeExp(e);
    }
    return exp;
}

这篇关于C程序可以扩大二次方程式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆