编写一个程序,可以计算算术表达式的值,对非法表达式要给出提示,并要求重新输入正确的表达式.(正确的表达式范例:123+45*6-78/9 或 (123+45)*(6-78)/9 等等)题目要求:(1) 能正确计算出正确表
来源:学生作业帮助网 编辑:六六作业网 时间:2025/01/09 06:44:36
编写一个程序,可以计算算术表达式的值,对非法表达式要给出提示,并要求重新输入正确的表达式.(正确的表达式范例:123+45*6-78/9 或 (123+45)*(6-78)/9 等等)题目要求:(1) 能正确计算出正确表
编写一个程序,可以计算算术表达式的值,对非法表达式要给出提示,并要求重新输入正确的表达式.
(正确的表达式范例:123+45*6-78/9 或 (123+45)*(6-78)/9 等等)题目要求:(1) 能正确计算出正确表达式的值.(2) 要考虑表达式中的优先级.相关知识:(1) 函数(2) 结构这个程序能不能给我也发一份
编写一个程序,可以计算算术表达式的值,对非法表达式要给出提示,并要求重新输入正确的表达式.(正确的表达式范例:123+45*6-78/9 或 (123+45)*(6-78)/9 等等)题目要求:(1) 能正确计算出正确表
对非法表达式的判断你再自己加些,
#include "stdio.h"
#include "stdlib.h"
int INITSIZE = 20;
int ADDSIZE = 10;
/*
用一个堆栈存储数据,用一个堆栈存储符合(预存一个'#').
读到数据时入栈,读到运算符A是判断其优先级与栈定的运算
符B高低,若A高则A入栈,若A低则取出B,取出两栈定数据,进行运算,再A入栈.
输入格式:3-8*(2-7)=
*/
struct stackData {
\x05float *top;
\x05float *bottom;
\x05float *data;
\x05int size;
};
struct stackFlag {
\x05char *top;
\x05char *bottom;
\x05char *data;
\x05int size;
};
void initStackData(struct stackData *st)
{
\x05float *p=(float*) malloc( (sizeof(float) * INITSIZE));
\x05if(p!=NULL)
\x05{
\x05\x05st->data=p;
\x05\x05st->size=INITSIZE;
\x05}
\x05else
\x05\x05exit(1);
\x05st->top=st->data;
\x05st->bottom=st->data;
}
void pushData(struct stackData *st,float element)
{
\x05float *p;
\x05if((st->top-st->bottom)>=st->size)
\x05{
\x05\x05p=(float*)realloc(st->data ,(((st->size+ADDSIZE)*sizeof(float)) ));
\x05\x05if(p!=NULL)
\x05\x05{
\x05\x05\x05st->data=p;
\x05\x05\x05st->size +=ADDSIZE;
\x05\x05}
\x05\x05else
\x05\x05\x05exit(0);
\x05}
\x05*((st->top)++) = element;
}
float popData(struct stackData *st)
{
\x05if(st->top==st->bottom)
\x05\x05return -1;
\x05return *(--(st->top));
}
float getData(struct stackData *st)
{
\x05if(st->top==st->bottom)
\x05\x05return -1;
\x05return *(st->top-1);
}
void destoryStackData(struct stackData *st)
{
\x05if(st->data!=NULL)
\x05\x05free(st->data);
}
void initStackFlag(struct stackFlag *st)
{
\x05char *p=(char*)malloc(INITSIZE*sizeof(char));
\x05if(p!=NULL)
\x05{
\x05\x05st->data=p;
\x05\x05st->size=INITSIZE;
\x05}
\x05else
\x05\x05exit(1);
\x05st->top=st->data;
\x05st->bottom=st->data;
}
void pushFlag(struct stackFlag *st,char element)
{
\x05char *p;
\x05if((st->top-st->bottom)>=st->size)
\x05{
\x05\x05p=(char*)realloc(st->data,(st->size+ADDSIZE)*sizeof(char));
\x05\x05if(p!=NULL)
\x05\x05{
\x05\x05\x05st->data=p;
\x05\x05\x05st->size +=ADDSIZE;
\x05\x05}
\x05\x05else
\x05\x05\x05exit(0);
\x05}
\x05*((st->top)++) = element;
}
char popFlag(struct stackFlag *st)
{
\x05if(st->top==st->bottom)
\x05\x05return -1;
\x05return *(--(st->top));
}
char getFlag(struct stackFlag *st)
{
\x05if(st->top==st->bottom)
\x05\x05return -1;
\x05return *(st->top-1);
}
void destoryStackFlag(struct stackFlag *st)
{
\x05if(st->data!=NULL)
\x05\x05free(st->data);
}
int flagLevel(char flag)
{
\x05switch(flag)
\x05{
\x05case '#':
\x05\x05return 0;
\x05\x05break;
\x05case '(':
\x05\x05return\x054;
\x05\x05break;
\x05case ')':
\x05\x05return 3;
\x05\x05break;
\x05case '+':
\x05case '-':
\x05\x05return 1;
\x05\x05break;
\x05case '*':
\x05case '/':
\x05\x05return 2;
\x05\x05break;
\x05default :return -1;
\x05};
}
float compute(float num1,float num2,char flag)
{
\x05switch(flag)
\x05{
\x05case '*':
//\x05\x05printf("%f*%f=%f\n",num1,num2,num1*num2);
\x05\x05return num1*num2;
\x05\x05break;
\x05case '/':
//\x05\x05printf("%f/%f=%f\n",num1,num2,num1/num2);
\x05\x05if(num2 == 0)
\x05\x05{
\x05\x05\x05printf("除数为零");
\x05\x05\x05exit(0);
\x05\x05}
\x05\x05return num1/num2;
\x05\x05break;
\x05case '+':
//\x05\x05printf("%f+%f=%f\n",num1,num2,num1+num2);
\x05\x05return num1+num2;
\x05\x05break;
\x05case '-':
//\x05\x05printf("%f-%f=%f\n",num1,num2,num1-num2);
\x05\x05return num1-num2;
\x05\x05break;
\x05default :return 0;
\x05};
}
int check(char *str)
{
\x05char a = *(str++);
\x05if(a != '(' && !('0'