برگزیده های پرشین تولز

ماشین حساب برای C++

Milad._.R

Registered User
تاریخ عضویت
2 ژوئن 2011
نوشته‌ها
4,191
لایک‌ها
1,203
ماشین حساب زیر رو میخوام در turbo c++ اجرا کنم. خط while (len = getparm(parm, PARMLEN)) { ارور میده.
چطوری میتونم با turbo هماهنگش کنم ؟

لطفا اگه ماشین حساب بهتر که در turbo c++ اجرا میشه دارید بذارید

کد:
// Calc.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"


void expr(void);
void term(void);   
void factor(void);
void operand(void);
void unsigned_num(void);
void infix_postfix(void);
void evaluate(void);
void puttoken(int t);
void putnumber(char *i,int l);
void syntax_error(void);
int strhead(char *i,char *s);
int getparm(char s[], int lim);


#define      PARMLEN  256


#define   NFUN   (sizeof(fun_tab)/sizeof(char *))
#define   NCON   (sizeof(con_tab)/sizeof(struct con_ent))


char parm[PARMLEN],*i;
char answer[25];
int token[PARMLEN];
double reg[PARMLEN/2+1];
int stack[PARMLEN/2+1];
int top;
int p,r,k;
int error;
char outline[PARMLEN+1];
static char *fun_tab[] = {
    "abs", "acos", "asin", "atanh", "atan", "cosh", "cos", "exp",
    "log2", "log10", "log", "sinh", "sin", "sqrt", "tanh", "tan"
};
static struct con_ent {
    char *sym;
    char *val;
} con_tab[] = {
    {"pi", "3.141592653589793238"},
    {"e", "2.718281828459045235"}
};
int len;




int main(int argc, char* argv[])
{
    while (len = getparm(parm, PARMLEN)) {
        error = 0;
        i = parm;
        p = r = 0;
        expr();
        if (i!=parm+len || error)
            syntax_error();
        else {
            puttoken(1);
            infix_postfix();
            evaluate();        
            printf("     %s\n\n", answer);
        }        
    }
    return(0);
}


    
void expr(void)
{
    term();
    switch(*i) {
    case('+'):
        puttoken(3);
        expr();
        return;
    case('-'):
        puttoken(4);
        expr();
        return;
    }
}
    


void term(void)
{
    factor();
    switch(*i) {
    case('*'):
        puttoken(5);
        term();
        return;
    case('/'):
        puttoken(6);
        term();
        return;
    }
}




void factor(void)
{
    operand();
    if (strhead(i,"**")) {
        puttoken(7);
        factor();
    }
}
    


void operand(void)
{
    char c;
    int k;
    
    c = *i;
    if (c=='-') {
        puttoken(11);
        operand();
    } else if (c=='(') {
        puttoken(2);
        expr();
        if (*i==')')
            puttoken(8);
        else
            syntax_error();
    } else if (c>='a' && c<='z') {
        for (k = 0; k<NFUN; ++k)
            if (strhead(i, fun_tab[k])) {
                   puttoken(k+12);
            if (*i=='(')
                operand();
            else
                syntax_error();
            return;
        }
    for (k = 0; k<NCON; ++k)
            if (strhead(i, con_tab[k].sym)) {
                putnumber(con_tab[k].val, strlen(con_tab[k].val));
            i += strlen(con_tab[k].sym);
            return;
        }
    syntax_error();
    } else
        unsigned_num();
}    


    
void unsigned_num(void)
{
    static char *table[] = {
        "d4.1", "d5", "d6+3-3", "d6", "d4.5e2", "d5e2", "d7", "d8", ""
    };
    int s,found;
    char a,b;
    char *j;
        
    j = i;
    s = 0;
    found = 1;
    while (found) {
        found = 0;
        k = 0;
        a = *table[s];
        b = *j;
        while (!found && a!='\0') {
               if (a=='d') {
            if (b>='0' && b<='9')
                found = 1;
        } else
            if (a==b)
                found = 1;
        k += 2;
        a = *(table[s]+k);
    }
        if (found) {
            ++j;
        s = *(table[s]+k-1)-'0';
    }
    }
    if (s>3) {
    putnumber(i,j-i);
    i = j;
    } else {
    i = j;
    syntax_error();
    }
}


    
void infix_postfix(void)
{
    int p,q,t;
    
    stack[0] = 1;
    top = 0;
    t = token[0];
    p = 1;
    q = 0;
    while (t!=1) {
    if (t>50)
        token[q++] = t;
    else if (t>10 || t==2)
        stack[++top] = t;
    else if (t>2 && t<8) {
        while (t<=stack[top])
        token[q++] = stack[top--];    
        stack[++top] = t;
    } else {
        while (stack[top]!=2)
        token[q++] = stack[top--];
        --top;
    }
    t = token[p++];
    }
    while (stack[top]!=1)
    token[q++] = stack[top--];
    token[q] = 1;
}


    
void evaluate(void)
{


    int p,t;
    double op1,op2;


    top = -1;
    p = 0;
    t = token[0];
    while (t!=1) {
    if (t>=50)
        stack[++top] = t-50;
    else if (t<11) {
        op2 = reg[stack[top--]];
        op1 = reg[stack[top]];
        switch(t) {
        case(3):
        op1 = op1+op2;
        break;
        case(4):
        op1 = op1-op2;
        break;
        case(5):
        op1 = op1*op2;
        break;
        case(6):
        op1 = op1/op2;
        break;
        case(7):
        op1 = exp(log(op1)*op2);
        }
        reg[stack[top]] = op1;
    } else {
        op1 = reg[stack[top]];
        switch(t) {
            case(11):
        op1 = -op1;
        break;
        case(12):
        if (op1<0)
            op1 = -op1;
        break;
        case(13):
        op1 = acos(op1);
        break;
        case(14):
        op1 = asin(op1);
        break;
        case(15):
        op1 = log((1+op1)/(1-op1))/2;
        break;
        case(16):
        op1 = atan(op1);
        break;
        case(17):
        op1 = cosh(op1);
        break;
        case(18):
        op1 = cos(op1);
        break;
        case(19):
        op1 = exp(op1);
        break;
        case(20):
        op1 = log(op1)/log((double)2);
        break;
        case(21):
        op1 = log10(op1);
        break;
        case(22):
        op1 = log(op1);
        break;
        case(23):
        op1 = sinh(op1);
        break;
        case(24):
        op1 = sin(op1);
        break;
        case(25):
        op1 = sqrt(op1);
        break;
        case(26):
        op1 = tanh(op1);
        break;
        case(27):
        op1 = tan(op1);
            }
        reg[stack[top]] = op1;
    }
    t = token[++p];
    }       
    _gcvt(reg[0], 16, answer);
}


    
void puttoken(int t)
{
    token[p++] = t;
    if (t==7)
    i += 2;
    else if (t<12)
    ++i;
    else
    i += strlen(fun_tab[t-12]);
}


    
void putnumber(char *i,int l)
{
    char buf[PARMLEN];
    int k;


    for (k = 0; k<l; ++k)
    buf[k] = *i++;
    buf[k] = '\0';
    reg[r] = atof(buf);
    token[p++] = (r++)+50;
}


    
void syntax_error(void)
{
    if (!error) {
    printf("-----");
    while (i--!=parm)
        printf("-");
    printf("*\nUnexpected Character.\n");
    error = 1;
    i = "";
    }
}


    
int strhead(char *i, char *s)
{
    while (*s!='\0' && *i++==*s)
    ++s;
    return(*s=='\0');
}
    


int getparm(char s[], int lim)
{
    int c,i;
    
    i = 0;
    do {
    printf("===> ");
        while (i<lim && (c = fgetc(stdin))!=EOF && c!='\n')
            s[i++] = c;
        if (i==lim) {
            while ((c = fgetc(stdin))!=EOF && c!='\n')
            ;
        if (c==EOF)
            printf("\n");
        printf("calc: Expression too long.");
        if (c!=EOF)
            printf("\n");
        i = 0;
    }
    } while (c!=EOF && !i);
    if (c==EOF)
        printf("\n");        
    s[i] = '\0';
    return(i);
}





ویرایش :

مشکل حل شد.
 
Last edited:
بالا