Code:
#include "expression.h" #include <stdlib.h> #include <stdio.h> #include <string.h> xContainer splitTerm(string,int,int); expContainer createExpression() { expContainer exp; /*allocate memory*/ exp = (expContainer)malloc(sizeof(struct expressions)); if(exp != NULL) { /*set inital terms to zero*/ exp->numberOfTerms = 0; return exp; /*return pointer*/ } else printf("Out Of Heap!!!\n"); return NULL; } void string2Expression(string inString,expContainer* inExp) { string tempString; int length; int i=0, j=0,sign=0; tempString = (string)calloc(1,sizeof(char)); /*get string length*/ length = strlen(inString); /*determine first term sign*/ if(inString[0] == '-') sign = 0; else if(inString[0] == '+') sign = 1; else if(inString[0] == '*') sign = 2; else sign = 3; /*The operation down there is to splite the whole string into separate term*/ /*the term is split by detecting the sign*/ for(i=0; i < length; i++) { /*pass if char not '+' and not '-' and current pos is not the end of the string*/ if(inString[i] != '+' && inString[i] != '-' && inString[i] != '*' && inString[i] != '/' && i != length-1) { tempString = (char*)realloc(tempString,sizeof(char)*j+1); tempString[j] = inString[i]; j++; continue; } else { /*to add the last value before the end of the string*/ if(i == length-1) { tempString = (string)realloc(tempString,sizeof(char)*j+1); tempString[j] = inString[i]; j++; } if(j != 0) { /*save the term into expression format*/ if((*inExp)->numberOfTerms == 0) (*inExp)->exp = (xContainer*)calloc(3,sizeof(xContainer)); else (*inExp)->exp = (xContainer*)realloc((*inExp)->exp,sizeof(xContainer)*((*inExp)->numberOfTerms+1)); (*inExp)->exp[(*inExp)->numberOfTerms] = splitTerm(tempString,sign,j); (*inExp)->numberOfTerms++; if(inString[i] == '-') sign = 0; else if(inString[i] == '+') sign = 1; else if(inString[i] == '*') sign = 2; else sign = 3; } j = 0; tempString = (string)realloc(tempString,sizeof(char)*0); } } } /*function to handle term*/ xContainer splitTerm(string inTerm,int inSign, int length) { string tempString; xContainer part; int xFlag=0,powerFlag=0; int i,j=0; part = (xContainer)malloc(sizeof(struct terms)); part->KnowX = 0; part->positive = inSign; part->isX = 0; part->x_power = 1; part->x_times = 1; part->x_value = 0; tempString = (string)calloc(1,sizeof(char)); /*function below is to determine x and square root*/ for(i=0; i < length; i++) { if(inTerm[i] != 'x' && inTerm[i] != '^') { tempString = (string)realloc(tempString,sizeof(char)*j+1); tempString[j] = inTerm[i]; j++; if(i == length-1 && !xFlag && !powerFlag) { part->x_value = atof(tempString); part->KnowX = 1; } continue; } else { if(inTerm[i] == 'x' && strlen(tempString) > 0) { part->x_times = atof(tempString); xFlag = 1; } else if(inTerm[i] == 'x') xFlag = 1; if(inTerm[i] == '^') { powerFlag = 1; if(!xFlag) part->x_value = atof(tempString); } j = 0; tempString = (string)realloc(tempString,sizeof(char)*0); } } if(xFlag) { part->isX = 1; part->KnowX = 0; } if(powerFlag) part->x_power = atof(tempString); switch(inSign) case 0: case 1: case 2: case 3: return part; }
With this code i am able to capture expression like 3x+9x^2-2/7..something like that...So i am wondering if i want to have some like (((x-3)+(x+9))(x+6)) or (x+3)(3x-9)(4-x)....The figure can be anything up to the user... So how am i goin to write the code?
Comment