Calc


#include 
#include 
#include 
#include 
#include 
double GetNum(char *&szp)
{
	double retint = 0;
	for(;isdigit(*szp);szp++)
	{
		retint *= 10;
		retint += *szp - 48;
	}
	if(*szp == '.')
	{
		double retdec = 0;
		int deccount = 0;
		szp++;
		for(;isdigit(*szp);szp++)
		{
			retdec *= 10;
			retdec += *szp - 48;
			deccount++;
		}
		while(deccount-->0)
			retdec /= 10;
		retint += retdec;
	}
	return retint;
}

void GetUnprintableChar(char *&szp)
{
	while (*szp == ' ' || *szp == '\t')
		szp++;
}

class factor
{
	public:	
		factor(){};
		factor(char *&start)
		{
			if(*start == '+')sign = true;
			else if(*start == '-')sign = false;
			else 
			{
				fprintf(stderr, "factor.factor: (sz = %p) error: sign must be '+' or '-'.\n", start);
				exit(-1);
			}
			start++;
			GetUnprintableChar(start);
			szstart = start;
			for(;isdigit(*start)||*start=='*'||*start=='/'||*start==' ';start++);
			szend = start;
			calculate();
		}
		
		void calculate()
		{
			fatalvalue = GetNum(szstart);
			while(szstart!=szend)
			{
				GetUnprintableChar(szstart);
				if(*szstart == '*')
					GetUnprintableChar(++szstart), fatalvalue *= GetNum(szstart);
				else if (*szstart == '/')
					GetUnprintableChar(++szstart), fatalvalue /= GetNum(szstart);
				else break;
			}
		}
		
		double getval()
		{
			if(sign)
				return fatalvalue;
			else
				return -fatalvalue;
		}
		
		void forthset(char *start, char *end, bool s)
		{
			szstart = start;
			szend = end;
			sign = s;
		}
	private:
		//input
		char *szstart;
		char *szend;
		bool sign;
		//calulate
		double fatalvalue;		
};

using std::vector;
double separator(char *sz)
{
	GetUnprintableChar(sz);
	vector factors;
	if(isdigit(*sz))
	{
		factors.push_back(new factor);
		char *sze = sz;
		while (*sze != '+'&&*sze != '-')
			sze++;
		factors[0]->forthset(sz, sze, true);
		factors[0]->calculate();
		sz = sze;
	}
	while(*sz=='+'||*sz=='-')
		factors.push_back(new factor(sz));
	
	if(*sz!=0)
	{
		fprintf(stderr, "separator: (sz = %p) error: incorrect char at the end of the string.\n", sz);
		while (*sz!=0)	putchar(*sz++);
		exit(-1);
	}
	
	double returnvalue = 0;
	vector::iterator it;
	for(it=factors.begin();it!=factors.end();it++)
		returnvalue += (*it)->getval();

	return returnvalue;
}

int main(int argc, char **argv)
{
	char *sz = argv[1];
	printf("%f", separator(sz));
}
  1 #include 
  2 #include 
  3 
  4 char token;
  5 
  6 double exp(void);
  7 double term(void);
  8 double factor(void);
  9 char getPrintableChar(void);
 10 
 11 void match(char expectedToken);
 12 void error(void);
 13 
 14 
 15 int main(void)
 16 {
 17     double result;
 18     printf(">>: ");
 19     while(1)
 20     {
 21         token = getPrintableChar();
 22         result = exp();
 23         if (token == '\n')
 24             printf("<<< %g\n>>: ", result);
 25         else
 26             error();
 27     }
 28 
 29     return 0;
 30 }
 31 
 32 double exp(void)
 33 {
 34     double temp = term();
 35     while (token == '+' || token == '-')
 36         switch(token)
 37         {
 38         case '+':
 39             match('+');
 40             temp += term();
 41             break;
 42         case '-':
 43             match('-');
 44             temp -= term();
 45             break;
 46         }
 47     return temp;
 48 }
 49 
 50 double term(void)
 51 {
 52     double temp = factor();
 53     while (token == '*' || token == '/')
 54         switch(token)
 55         {
 56         case '*':
 57             match('*');
 58             temp *= factor();
 59             break;
 60         case '/':
 61             match('/');
 62             temp /= factor();
 63             break;
 64         }
 65     return temp;
 66 }
 67 
 68 double factor(void)
 69 {
 70     double temp;
 71     if (token == '(')
 72     {
 73         match('(');
 74         temp = exp();
 75         match(')');
 76     }
 77     else if (isdigit(token))
 78     {
 79         ungetc(token, stdin);
 80         scanf("%lf", &temp);
 81         token = getPrintableChar();
 82     }
 83     else
 84         error();
 85 
 86     return temp;
 87 }
 88 
 89 void error(void)
 90 {
 91     fprintf(stderr, "Error!\n");
 92     exit(EXIT_FAILURE);
 93 }
 94 
 95 void match(char expectedToken)
 96 {
 97     if (expectedToken == token)
 98         token = getPrintableChar();
 99     else
100         error();
101 }
102 
103 char getPrintableChar(void)
104 {
105     char temp;
106     do
107         temp = getchar();
108     while (isblank(temp));
109 
110     return temp;
111 }