Pushok icon

calc test

Pushok | PRO | 04/25/11 02:05:25 PM UTC | 0 ⭐ | 389 👁️ | Never ⏰ | []
C |

2.55 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define NaN 0xaFFFFFF
 
struct com {
    int digit;
    char oper;
    int nextdigit;
} parser = {NaN, NULL, NaN};
 
int isStrDigit(char* c)
{
    int i;
    for(i=0;i<strlen(c);i++)
    {
        if(!isdigit(c[i]) || c[i] == 0)
            return 0;
    }
 
    return 1;
}
 
int main()
{
    char expression[1024] ;
    scanf("%s", expression);
    printf("\n%s\n", expression);
    char* c = expression;
    char* mem = (char*)malloc(sizeof(char*) * 256);
 
    do
    {
        char* ch = c;
        char* cptr = mem;
        *cptr = 0;
 
        if(isdigit(*ch))
        {
            if(isdigit(*(ch+1)))
            {
                do
                {
                    *cptr++ = *ch++;
                }while(isdigit(*ch));
 
                *(cptr++) = 0;
                c = ch-1;
            }
            else
            {
                *cptr = *ch;
                *(cptr+1) = 0;
            }
        }
        else
        {
            if(parser.digit != NaN && parser.oper == 0)
            {
                parser.oper = *ch;
            }
            else
            {
                printf("Error in expression!");
                free(mem);
                exit(1);
            }
        }
 
        if(*mem != '\0')
        {
            if(parser.digit == NaN) // first runing
            {
                parser.digit = atoi(mem) ;
            }
            else if(parser.nextdigit == NaN)
            {
                parser.nextdigit = atoi(mem) ;
            }
        }
 
        if(parser.nextdigit != NaN)
        {
               switch(parser.oper)
               {
                   case '+':
                   {
                       parser.digit += parser.nextdigit;
                       parser.nextdigit = NaN;
                       break;
                   }
                   case '-':
                   {
                       parser.digit -= parser.nextdigit;
                       parser.nextdigit = NaN;
                       break;
                   }
                   default:
                   {
                       printf("\nThis command is not supported!");
                       free(mem);
                       exit(1);
                   }
               }
 
               parser.oper = 0;
        }
 
        int i;
        for(i=0;i<256;i++) mem[i] = 0;
 
        c++;
 
    }while(*c);
 
    printf("\n%d", parser.digit);
    getchar();
 
    return 0;
}

Comments