Expand|Select|Wrap|Line Numbers
- #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?