用 C 语言编写一个具有加、减、乘、除计算功能的程序,代码语句后要写有正确注释。

2024-11-02 23:35:32
推荐回答(3个)
回答(1):

#include
#include
#define STACK_SIZE 512

typedef struct /* 定义一个运算符栈 */
{
char * base; /*指向栈底的指针*/
char * top; /*指向栈顶的指针*/
}OPTR_Stack;

typedef struct /* 定义一个操作符栈 */
{
double * base;
double * top;
}OPND_Stack;

void OptrInIt(OPTR_Stack *s) /* 初始化运算符栈 */
{
s->base=(char*)malloc(STACK_SIZE*sizeof(char));/*分配内存*/
if(s->base==NULL) exit(0); /* 判断栈是否为空 */
s->top=s->base; /* 初始化栈 */
}

int OptrEmpty(OPTR_Stack s) /* 定义栈空事件 */
{
if(s.top==s.base) /*判断栈空*/
return 1; /* 栈空返回1,否则为0 */
else
return 0;
}

void OptrPush(OPTR_Stack *s,char elem) /* 入栈操作符 */
{
if (s->top-s->base==STACK_SIZE) /* 判断栈满 */
{
printf("OPTR_Stack is full!\n"); /*栈满则打印*/
getch(); /*停止*/
exit(0);
}
else
*(s->top++)=elem; /*栈未满则elem入栈*/
}

char OptrPop(OPTR_Stack *s) /* 出栈 */
{
char elem; /*定义字符变量*/
if(OptrEmpty(*s)) /*判断栈是否为空*/
{
printf("Stack is empty\n"); /*栈空打印*/
getch(); /*停止*/
exit(0);
}
else
{
elem=*--s->top; /*出栈值传给elem*/
return elem;
}
}

char OptrGetTop(OPTR_Stack s) /* 获取栈顶元素 */
{
char elem; /*定义字符变量*/
if(!OptrEmpty(s)) /*判断栈s是否为空*/
{
elem=*(s.top-1); /*将栈顶元素值传给elem*/
return elem;
}
}

void OpndInit(OPND_Stack *s) /* 初始化数栈 */
{
s->base=(double *)malloc(STACK_SIZE*sizeof(double));/*分配内存*/
if(s->base==NULL) exit(0); /* 判断栈是否为空 */
s->top=s->base; /* 初始化栈 */
}

int OpndEmpty(OPND_Stack s) /* 判断数栈是否为空 */
{
if(s.top==s.base)
return 1; /*栈为空则返回1*/
else
return 0; /*栈不为空则返回0*/
}

void OpndPush(OPND_Stack *s,double elem) /* 入栈 */
{
if (s->top-s->base==STACK_SIZE) /* 判断栈满 */
{
printf("OPND_Stack is full!\n"); /*栈满则打印*/
getch(); /*停止*/
exit(0);
}
else
*s->top++=elem; /*栈未满则elem入栈*/
}

double OpndPop(OPND_Stack *s) /* 出栈 */
{
double elem; /*定义字符变量*/
if(OpndEmpty(*s)) /*判断栈s是否为空*/
{
printf("OPND_Stack is empty\n"); /*栈空则打印*/
getch(); /*停止*/
exit(0);
}
else
{
elem=*--s->top; /*栈非空出栈*/
return elem;
}
}

double OpndGetTop(OPND_Stack s) /* 获取栈顶元素 */
{
double elem; /*定义字符变量*/
if(!OpndEmpty(s)) /*判断栈s是否为空*/
{
elem=*(s.top-1); /* 将栈顶值传给elem*/
return elem; /*返回值*/
}
}

int isoper(char c) /* 判断是否为运算符 */
{

if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%')
return 1; /*如果c是'+''-''/''*'中的一种则返回1*/
else
return 0; /*否则返回0*/
}

int priority(char c) /* 判断优先级 */
{
int p; /*定义一个整型数*/
switch(c)
{
case '+':
case '-': p=1;break; /* +-的优先级为1*/
case '*':
case '%':
case '/': p=2;break; /* '*''%''/'的优先级为2*/
case '(': p=0;break; /* (的优先级为0*/
}
return(p); /*返回值*/
}

double calculate(double s1,double s2,char oper) /* 计算表达式 */
{
double y; /*定义一个浮点型*/
switch(oper)
{
case '+': y=s2+s1;break;
case '-': y=s2-s1;break;
case '*': y=s2*s1;break;
case '%': y=(int)((int)s2%(int)s1); break;
case '/': /*情形为'/'时*/
if(s1==0) /*当除数为0时*/
{
printf("\nDevided by zero!"); /*打印除数为0*/
getch(); /*停止*/
exit(0);
}
y=s2/s1;break; /*除数不为0则定义y值为两数商*/
}
return(y); /*返回值*/
}
double StrTodouble(char *s,int *j) /* 将字符串转化成数字 */
{
int i,k; /*定义两个整型变量*/
char n[100]; /*定义一个数组*/
double f; /*定义一个浮点型*/
i=*j;
for(k=0;s[i]>='0' && s[i]<='9' || s[i]=='.';i++,k++) /*当数组里为0~9的数值或是小数点*/
{
n[k]=s[i]; /*将字符存入数组*/
}
n[k]='\0'; /*存入一个数值后数值间加空格*/
*j=i;
f=atof(n); /*将字符数组转换成浮点型数据*/
return(f); /*返回值*/
}

double compute(char *exp1)
{
char oper;
int i;
double OPND1,OPND2,result,f;
OPTR_Stack OPTR; /* 运算符栈OPTR*/
OPND_Stack OPND; /*操作数栈OPND */
OptrInIt(&OPTR); /*初始化符号栈*/
OpndInit(&OPND); /*初始化操作数栈*/
printf("\n你输入的表达式是 :");
puts(exp1); /*输出输入的表达式*/

for(i=0;exp1[i]!='\0' && exp1[i]!='\n';i++)
{
if(!isoper(exp1[i]) && exp1[i]>='0' && exp1[i]<='9' || exp1[i]=='.') /* 将字符型的操作数转化为数字,存入数栈中 */
{
f=StrTodouble(exp1,&i); /*将数组exp1中的字符型操作数转换为浮点型的数*/
OpndPush(&OPND,f); /*将转换后的数存入数栈中*/
}
if(isoper(exp1[i])) /* 为运算符时 */
{
if(!OptrEmpty(OPTR)) /*当符号栈不为空时*/
{
while(!OptrEmpty(OPTR) && priority(exp1[i])<=priority(OptrGetTop(OPTR)))
/* 比较优先级,栈顶运算符优先级高时,运算符出栈 */
{
oper=OptrPop(&OPTR); /*出栈将值传给oper*/
OPND1=OpndPop(&OPND); /*数栈中一个数出栈*/
OPND2=OpndPop(&OPND); /*数栈中下一个数出栈*/
result=calculate(OPND1,OPND2,oper); /*计算*/
OpndPush(&OPND,result); /*计算结果入栈*/
}
OptrPush(&OPTR,exp1[i]); /*栈顶运算符优先级低时,运算符入栈*/
}
else
OptrPush(&OPTR,exp1[i]); /*符号栈为空时,运算符入栈*/
}
else if(exp1[i]=='(') OptrPush(&OPTR,exp1[i]); /*'('入栈*/
else if(exp1[i]==')')
{
while(OptrGetTop(OPTR)!='(' && !OptrEmpty(OPTR))
/*运算符出栈,直到遇到')'或者栈空 */
{
oper=OptrPop(&OPTR); /*出栈将值传给oper*/
OPND1=OpndPop(&OPND); /*数栈中一个数出栈*/
OPND2=OpndPop(&OPND); /*数栈中下一个数出栈*/
result=calculate(OPND1,OPND2,oper); /*计算*/
OpndPush(&OPND,result); /*计算结果入栈*/
}
OptrPop(&OPTR); /*将栈内的'('丢掉*/
}
}

while(!OptrEmpty(OPTR)) /*符号栈不为空*/
{

oper=OptrPop(&OPTR); /*出栈将值传给oper*/
OPND1=OpndPop(&OPND); /*数栈中一个数出栈*/
OPND2=OpndPop(&OPND); /*数栈中下一个数出栈*/
result=calculate(OPND1,OPND2,oper); /*计算*/
OpndPush(&OPND,result); /*计算结果入栈*/
}
return result;
}

int main()
{
double result;
char exp1[100]; /*表达式*/
while(1) {
printf("请输入要计算的表达式 : ");
gets(exp1); /*输入值放入数组exp1中*/
result = compute(exp1);
printf("\n结果是 : %lf\n",result); /*打印结果*/
printf("回车继续,其他退出\n");
if(getch()!='\r') exit(0);
}
}

回答(2):

这个我做过,很简单

回答(3):

你好!是 dos 的黑窗口程序吗