Milad._.R
Registered User
- تاریخ عضویت
- 2 ژوئن 2011
- نوشتهها
- 4,191
- لایکها
- 1,203
ماشین حساب زیر رو میخوام در turbo c++ اجرا کنم. خط while (len = getparm(parm, PARMLEN)) { ارور میده.
چطوری میتونم با turbo هماهنگش کنم ؟
لطفا اگه ماشین حساب بهتر که در turbo c++ اجرا میشه دارید بذارید
ویرایش :
مشکل حل شد.
چطوری میتونم با 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: