Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define string_size 100
char input_string[string_size];
void RemoveSpaces(char *source);
double solve(char *equation_s);
int main (void)
{
int option;
double result;
do
{
system("cls");
printf("Basic Arithmetic Calculator\n");
printf("Enter an equation to solve\n");
fflush(stdin);
gets_s(input_string, string_size);
RemoveSpaces(input_string);
solve(input_string);
result = atof(input_string);
printf("\nAnswer: %.4f\n",result);
printf("\nDo you want to do another operation?\n1) Yes 2) No\n");
scanf("%d",&option);
}
while (option ==1);
system("cls");
return(0);
}
void RemoveSpaces(char *source)//disregards any spaces
{
char temp_string[string_size];
int i,j,size;
size = strnlen_s(source,string_size);
temp_string[0] = source[0];
j = 1;
for (i=1;i<=size;i++)
{
// if subtraction and preseading charitor is an operation, then change to adding a negitive number.
if ((source[i] == '-') &&! ((temp_string[j-1] == '*') || (temp_string[j-1] == '/') || (temp_string[j-1] == '+') || (temp_string[j-1] == '^')))
{
temp_string[j] = '+';
j++;
}
// remove all spaces
if (source[i] == ' ')
{
}
else
{
temp_string[j] = source[i];
j++;
}
};
strcpy_s(source,string_size,temp_string);
}
int exist_paren(char *equation_s) //check for parentheses
{
int length,i, rc=0;
length=strnlen_s(equation_s,string_size);
for(i=0; i<length; i++) // checks for parentheses and returns a 1. if no parentheses found, returns a 0
{
if((equation_s[i] == '(' )||(equation_s[i]== ')' ))
{
rc=1;
break;
}
}
return (rc);
}
int exist_expon(char *equation_s) //check for exponents
{
int length,i, rc=0;
length=strnlen_s(equation_s,string_size);
for(i=0; i<length; i++) // checks for carrot
{
if(equation_s[i] == '^' )
{
rc=1;
break;
}
}
return (rc); //if found, returns a 1. if not found returns a 0
}
int exist_mult(char *equation_s) //check for multiplication and division
{
int length,i, rc=0;
length=strnlen_s(equation_s,string_size);
for(i=0; i<length; i++) // checks for carrot
{
if((equation_s[i] == '*' )||(equation_s[i] == '/' ))
{
rc=1;
break;
}
}
return (rc); //if found, returns a 1. if not found returns a 0
}
int exist_add(char *equation_s) //check for addition and subraction
{
int length,i, rc=0;
length=strnlen_s(equation_s,string_size);
for(i=0; i<length; i++)
{
if(equation_s[i] == '+' )
{
rc=1;
break;
}
}
return (rc); //if found, returns a 1. if not found returns a 0
}
double solve_paren(char *equation_s)
{
int open_paren=0, close_paren=0, i;
double result;
char paren_string[string_size], temp_string1[string_size],temp_string2[string_size];
for (i=0; i<strnlen_s(equation_s,string_size); i++) //continues until i = the length of the string entered
{
if(equation_s[i] == '(' )
{
open_paren = i; //searches for open parentheses, and stores position in open_paren
}
if(equation_s[i] == ')' )
{
close_paren = i; //searches for close parentheses, and stores position in closes_paren
break;
}
}
strncpy_s(paren_string, string_size, &equation_s[open_paren+1], close_paren- open_paren-1);
result=solve(paren_string);
//changes a double negative to a positive
if(result<0) //checks to see if number inside parentheses is negative
{
if(equation_s[open_paren-1] =='-') //checks if result is to be negated
{
result = result *-1; // changes to a positive
open_paren -=1; // erases negative sign
}
}
sprintf(temp_string1,"%lf", result); // converts results (double) into an array and stores it in temp_string1
strcpy(temp_string2,&equation_s[close_paren+1]); //copies remainder of string after closing parenthese
strcpy(&equation_s[open_paren],temp_string1);
i = strnlen_s(equation_s, string_size); // i is length of string size in equation_s
strcpy(&equation_s[i],temp_string2);
return result;
}
double solve_expon(char *equation_s)
{
int last_op= strnlen_s(equation_s,string_size), first_op=0, carrot=0, i;
double result, r1, r2;
char base[string_size],exponent[string_size], temp_string1[string_size], temp_string2[string_size];
// Find left operand for exponent
// Will be between first_op and carrot
for (i=0; i<strnlen_s(equation_s,string_size); i++)
{
if((equation_s[i]=='+')||(equation_s[i]=='*')||(equation_s[i]=='/'))
{
first_op = i+1;
}
if (equation_s[i]=='^')
{
carrot = i;
break;
}
}
// Find right operand for exponent
// will be between carrot and last_op
for (i=carrot+1; i < strnlen_s(equation_s,string_size); i++)
{
if((equation_s[i]=='+')||(equation_s[i]=='*')||(equation_s[i]=='/'))
{
last_op=i-1;
break;
}
}
strncpy_s(base, string_size, equation_s+first_op, carrot - first_op);
r1= atof(base);
strncpy_s(exponent, string_size, equation_s+carrot+1, last_op - carrot);
r2= atof(exponent);
result = pow(r1,r2);
sprintf(temp_string1,"%f", result); // converts results (double) into an array and stores it in temp_string1
strcpy_s(&temp_string2,string_size,&equation_s[last_op+1]); //copies string in equation_s and stores it in temp_string2
strcpy_s(&equation_s[first_op],string_size, &temp_string1);
i = strnlen_s(equation_s, string_size); // i is length of string size in equation_s
strcpy_s(&equation_s[i], string_size, temp_string2);
return result;
}
double solve_mult(char *equation_s)
{
int last_op= strnlen_s(equation_s,string_size), first_op=0, operation=0, i;
double result, r1, r2;
char operand1[string_size],operand2[string_size], temp_string1[string_size], temp_string2[string_size];
for (i=0; i<strnlen_s(equation_s,string_size); i++)
{
if(equation_s[i]=='+') //looks for + sign and stores position
{
first_op = i+1;
}
if ((equation_s[i]=='*')||(equation_s[i]=='/'))
{
operation = i;
break;
}
}
for (i=operation+1; i < strnlen_s(equation_s,string_size); i++)
{
if((equation_s[i]=='+')||(equation_s[i]=='*')||(equation_s[i]=='/'))
{
last_op=i-1;
break;
}
}
strncpy_s(operand1, string_size, equation_s+first_op, operation - first_op);
r1= atof(operand1);
strncpy_s(operand2, string_size, equation_s+operation+1, last_op - operation);
r2= atof(operand2);
if(equation_s[operation]=='*')
{
result = r1*r2;
}
else
{
result = r1/r2;
}
sprintf(temp_string1,"%f", result); // converts results (double) into an array and stores it in temp_string1
strcpy_s(&temp_string2,string_size,&equation_s[last_op+1]); //copies string in equation_s and stores it in temp_string2
strcpy_s(&equation_s[first_op],string_size, &temp_string1);
i = strnlen_s(equation_s, string_size); // i is length of string size in equation_s
strcpy_s(&equation_s[i], string_size, temp_string2);
return result;
}
double solve_add(char *equation_s)
{
int last_op= strnlen_s(equation_s,string_size), first_op=0, operation=0, i;
double result, r1, r2;
char operand1[string_size],operand2[string_size], temp_string1[string_size], temp_string2[string_size];
for (i=0; i<strnlen_s(equation_s,string_size); i++)
{
if(equation_s[i]=='+')
{
operation = i;
break;
}
}
for (i=operation+1; i < strnlen_s(equation_s,string_size); i++)
{
if(equation_s[i]=='+') //finding next + sign
{
last_op=i-1;
break;
}
}
strncpy_s(operand1, string_size, equation_s+first_op, operation - first_op);
r1= atof(operand1);
strncpy_s(operand2, string_size, equation_s+operation+1, last_op - operation);
r2= atof(operand2);
if(equation_s[operation]=='+')
{
result = r1+r2;
}
else
{
result = r1-r2;
}
sprintf(temp_string1,"%f", result); // converts results (double) into an array and stores it in temp_string1
strcpy_s(&temp_string2,string_size,&equation_s[last_op+1]); //copies string in equation_s and stores it in temp_string2
strcpy_s(&equation_s[first_op],string_size, &temp_string1);
i = strnlen_s(equation_s, string_size); // i is length of string size in equation_s
strcpy_s(&equation_s[i], string_size, temp_string2);
return result;
}
double solve(char *equation_s)
{
double result=0;
while(exist_paren(equation_s)) //check for parentheses
{
result= solve_paren(equation_s); //if parentheses are in equation, goes to solve_paren function
}
while(exist_expon(equation_s)) // checks for carrot
{
result=solve_expon(equation_s); // if carrot is in equation, goes to slove_expon
}
while(exist_mult(equation_s))
{
result = solve_mult(equation_s);
}
while(exist_add(equation_s))
{
result = solve_add(equation_s);
}
return result;
}
line 20 is my fflush function. without it, my program only runs correctly once, and when i choose 1 to enter another operation, the answer printed just turns to 0.0000 and doesn't allow for me to input another string.