问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define maximum 10000
#define MAX_LINE 1000 //每行最大字节数
typedef struct
{
float data[maximum];
int top;
}number;
typedef struct
{
char data[maximum];
int top;
}sign;
void InitNumber(number *stack);
int GetTopNumber(number stack, float *e);
void PushNumber(number *stack, float e);
void PopNumber(number *stack, float *e);
void InitSign(sign *stack);
void GetTopSign(sign stack, char *e);
void PushSign(sign *stack, char e);
void PopSign(sign *stack, char *e);
void Calculate(number *stack, char e);
number Num;
sign sig;
char expression[maximum];
int main()
{
FILE *fp;
FILE *fp1;
int count = 1;
int i,m,j;
float en,n;
char es,a[maximum],z[maximum];
InitNumber(&Num);
InitSign(&sig);
int length;
char strLine[MAX_LINE]; //读取缓冲区
if((fp = fopen("input.txt","r")) == NULL) // 判断文件是否存在及可读
{
printf("Open Falied!");
return -1;
}
if ((fp1=fopen("output.txt","a"))==NULL) // 打开指定文件,如果文件不存在则新建该文件
{
printf("Open Failed.\n");
return -1;
}
while (!feof(fp)) //循环读取每一行,直到文件尾
{
fgets(expression, MAX_LINE, fp); // 将fp所指向的文件一行内容读到strLine缓冲区
printf("%s", expression);
length = strlen(expression); // 输出所读到的内容
for (i=0;i<length;i++)
{
if(expression[i]>='0'&&expression[i]<='9')
{m=i;
a[i]=expression[i];
while (expression[i+1]!='\0')
{
if (expression[i+1]=='.'||(expression[i+1]>='0'&&expression[i+1]<='9'))
{
a[i+1]=expression[i+1];
++i;
}
else break;
}
for(j=0;m<=i;m++,j++)
{
z[j]=a[m];
}
sscanf(z,"%f",&n);
PushNumber(&Num,n);
}
else if (expression[i]=='+'||expression[i]=='-'||expression[i]=='*'||expression[i]=='/'||expression[i]=='^'||expression[i]=='('||expression[i]==')'||expression[i]=='%')
{
switch (expression[i])
{
case '+':
if(sig.data[sig.top-1]!='+'&&sig.data[sig.top-1]!='-'&&sig.data[sig.top-1]!='*'&&sig.data[sig.top-1]!='/'&&sig.data[sig.top-1]!='^'&&sig.data[sig.top-1]!='%')
PushSign(&sig,'+');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'+');
}
break;
case '-':
if(sig.data[sig.top-1]!='+'&&sig.data[sig.top-1]!='-'&&sig.data[sig.top-1]!='*'&&sig.data[sig.top-1]!='/'&&sig.data[sig.top-1]!='^'&&sig.data[sig.top-1]!='%')
PushSign(&sig,'-');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'-');
}
break;
case '*':
if(sig.data[sig.top-1]!='*'&&sig.data[sig.top-1]!='/'&&sig.data[sig.top-1]!='^'&&sig.data[sig.top-1]!='%')
PushSign(&sig,'*');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'*');
}
break;
case '/':
if(sig.data[sig.top-1]!='*'&&sig.data[sig.top-1]!='/'&&sig.data[sig.top-1]!='^'&&sig.data[sig.top-1]!='%')
PushSign(&sig,'/');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'/');
}
break;
case '^':
if(sig.data[sig.top-1]!='^')
PushSign(&sig,'^');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'^');
}
break;
case '%':
if(sig.data[sig.top-1]!='*'&&sig.data[sig.top-1]!='/'&&sig.data[sig.top-1]!='^'&&sig.data[sig.top-1]!='%')
PushSign(&sig,'%');
else
{
while (sig.top>0&&sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PushSign(&sig,'%');
}
break;
case '(':
PushSign(&sig,'(');
break;
case ')':
while (sig.data[sig.top-1]!='(')
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
PopSign(&sig,&es);
}
}
}
expression[i-1]='\0';
while (sig.top>0)
{
PopSign(&sig,&es);
Calculate(&Num,es);
}
if(GetTopNumber(Num,&en)!=0)
fprintf(fp1,"%.2f\n",en); // 格式化写入文件(追加至文件末尾)
count++;
}
fclose(fp); // 关闭读文件
fclose(fp1); // 关闭写文件
return 0;
}
void InitNumber(number *stack)
{
stack->top=0;
}
int GetTopNumber(number stack, float *e)
{
if(stack.top==0) return 0;
else {
*e=stack.data[stack.top-1];
return 1;
}
}
void PushNumber(number *stack, float e)
{
if(stack->top>=maximum) return;
else stack->data[stack->top++]=e;
}
void PopNumber(number *stack, float *e)
{
if(stack->top==0) return;
else *e=stack->data[--stack->top];
}
void InitSign(sign *stack)
{
stack->top=0;
}
void GetTopSign(sign stack, char *e)
{
if(stack.top==0) return;
else *e=stack.data[stack.top-1];
}
void PushSign(sign *stack, char e)
{
if(stack->top>=maximum) return;
else
{
stack->data[stack->top]=e;
stack->top++;
}
}
void PopSign(sign *stack, char *e)
{
if(stack->top==0) return;
else *e=stack->data[--stack->top];
}
void Calculate(number *stack, char e)
{ FILE *fp1;
float num1,num2,result;
PopNumber(stack, &num2);
PopNumber(stack, &num1);
if ((fp1=fopen("output.txt","a"))==NULL) // 打开指定文件,如果文件不存在则新建该文件
{
printf("Open Failed.\n");
return -1;
}
switch (e)
{
case '+':
result=num1+num2;
PushNumber(stack,result);
break;
case '-':
result=num1-num2;
PushNumber(stack,result);
break;
case '*':
result=num1*num2;
PushNumber(stack,result);
break;
case '/':
if (num2==0)
{
fprintf(fp1,"ERROR IN INFIX NOTATION\n");
}
else
{if(num1==(int)num1&&num2==(int)num2)
result=num1/num2;
PushNumber(stack,result);
}
break;
case '%':
if (num2==0)
{
fprintf(fp1,"ERROR IN INFIX NOTATION\n");
}
else
{if((num1==(int)num1)&&(num2==(int)num2))
{num1=(int)num1;
num2=(int)num2;
result=(float)(((int)num1)%((int)num2));
PushNumber(stack,result);}
else
{
fprintf(fp1,"ERROR IN INFIX NOTATION\n");
}
}break;
case '^':
result=pow(num1,num2);
PushNumber(stack,result);
break;
}
}
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果