logo资料库

C语言四则运算计算器设计.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
四则运算计算器设计
(1)设计过程
(2)流程图
(3)优先级比较规则
(4)所用函数与部分代码:
(5)运行结果
四则运算计算器设计 (1)设计过程 1.建立两个空栈,栈 OPND 用于存放数据,OPTR 用于存放运算符,表达式起始符“#”作 为 OPTR 栈底元素。 2.依次读入表达式中的每个字符,若是数据,进 OPND,若是运算符,则与 OPTR 栈顶元素 比较优先级后进行相应操作(优先级为“<”进 OPTR,为“=”即“(”与“)”则脱括号, 为“>”则进行运算,直到进栈),直至整个表达式求值完毕(即 OPTR 只剩两个“#”)。 (2)流程图
(3)优先级比较规则 1.乘除大于加减,乘除同级,加减同级,同级相遇为“>”。 2.“(”与“)”大于括号外运算符,小于括号内运算符,“(”与“)”相遇为“=” 3.“#”优先级最低,双“#”相遇为“<”。 (4)所用函数与部分代码: void InitStack(SeqStack *&); void Push(SeqStack*,datatype); datatype PoP(SeqStack*); datatype GetTop(SeqStack*); datatype Precede(datatype,datatype); datatype Operate(datatype,datatype,datatype); datatype evaluate(); int main() { datatype i; printf("输入表达式(例如 2*(3+4)#):\n"); i=evaluate(); printf("结果为: \n%d",i); return 0; } datatype Precede(datatype x,datatype y) { datatype fh; if(x=='('&&y==')') fh='='; else if((x=='#')||(x!='('&&y=='(')||((x=='+'||x=='-')&&(y=='*'||y=='/'))||(x=='('&&y!=')')) fh='<'; else fh='>'; return fh; } datatype Operate(datatype a,datatype op,datatype b) { switch(op) { case '*': return (char)(a*b); return (char)(a/b);
case '-': return (char)(a-b); case '+': return (char)(a+b); } } 完整代码: #include #include #define maxsize 60 typedef char datatype; typedef struct { datatype data[maxsize]; int Top; }SeqStack; void InitStack(SeqStack *&); void Push(SeqStack*,datatype); datatype PoP(SeqStack*); datatype GetTop(SeqStack*); datatype Precede(datatype,datatype); datatype Operate(datatype,datatype,datatype); datatype evaluate(); int main() { datatype i; printf("输入表达式(例如 2*(3+4)#):\n"); i=evaluate(); printf("结果为: \n\t%d",i); return 0; } void InitStack(SeqStack*&S) { S=(SeqStack*)malloc(sizeof(SeqStack)); S->Top=0; } void Push(SeqStack*S,datatype e) { if(S->Top>=maxsize-1) printf("输入数据过多");
else S->data[++S->Top]=e; } datatype Pop(SeqStack*S) { return S->data[S->Top--]; } datatype GetTop(SeqStack*S) { return S->data[S->Top]; } datatype Precede(datatype x,datatype y) { datatype fh; if(x=='('&&y==')') fh='='; /* else if(y=='#'&&x!='#') fh='>';*/ else if((x=='#')||(x!='('&&y=='(')||((x=='+'||x=='-')&&(y=='*'||y=='/'))||(x=='('&&y!=')')) fh='<'; else fh='>'; return fh; } datatype Operate(datatype a,datatype op,datatype b) { switch(op) { case '*': return (char)(a*b); case '/': return (char)(a/b); case '-': return (char)(a-b); case '+': return (char)(a+b); } } datatype evaluate() { SeqStack*OPTR; SeqStack*OPND;
InitStack(OPTR); InitStack(OPND); Push(OPTR,'#'); datatype ch,x,a,b,op; while(ch=getchar()) { if(GetTop(OPTR)==OPTR->data[OPTR->Top-1]) break; if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='('&&ch!=')'&&ch!='#') ch=ch-48; Push(OPND,ch); { } else label:switch(Precede(GetTop(OPTR),ch)) { case '<': Push(OPTR,ch); break; case '=': x=Pop(OPTR);break; case '>': op=Pop(OPTR); b=Pop(OPND); a=Pop(OPND); Push(OPND,Operate(a,op,b)); goto label; break; } } return GetTop(OPND); } (5)运行结果
分享到:
收藏