C程序可以扩大二次方程式 [英] C program that can expand quadratics
问题描述
我想有一个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 * EXP;
的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 * EXP;
字符的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 * EXP;
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 * EXP;
字符的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屋!