📄 calculator.h
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
#include"stack.h" //模板类Stack
#include"MathOptr.h" //运算符类MathOptr
//////////////////////////////////////////////////////////////////////////
//判断是否是指定字符
int isoptr(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch=='%'||ch=='^')
return 1;
else
return 0;
}
//////////////////////////////////////////////////////////////////////////
//将错误提示写入文件
int WriteWrongToFile(char *pFileName)
{
FILE *fp;
if( (fp = fopen( pFileName, "a+" )) == NULL )
{
printf(" can not open file ! \n");
return 0;
}
fprintf( fp, "ERROR IN INFIX NOTATION!\n");
fclose( fp );
return 1;
}
////////////////////////////////////////////////////////////////////////
//将运算结果写入文件
void Write_Value_Into_File(char *pFileName,double value)
{
FILE *fp;
if((fp=fopen(pFileName,"a"))==NULL)
{
cout<<"can not open file!"<<endl;
}
fprintf(fp,"%.2lf",value);
fprintf(fp,"\n");
fclose(fp);
}
////////////////////////////////////////////////////////////////////////
//判断表达式是否合法,出错返回1,否则返回0
int ValidFormula(char *str)
{
if(str[0]=='\0')
{
exit(0);
}//当搜寻至末尾时,也即读入的字符串是空时,终止程序
if(str[0]!='('&&str[0]!='-'&&(str[0]>'9'||str[0]<'0'))
{
cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//第一个字符不是数字,左括号,及负号时判错
for(int i=0;str[i]!='\0';i++)
{
if( str[i]!='.'&&str[i]!=-1&&str[i] != '(' && str[i] != ')' && str[i] != ' '&&str[i] != '+' && str[i] !='-' &&str[i] != '*'
&&str[i] !='/'&&str[i] != '^' &&str[i] != '%' &&str[i] != '='&&(str[i]<'0'||str[i]>'9') )
{
cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//某个字符不是+-*%/^().=及数字时,判错
if(isdigit(str[i])&&str[i+1]=='(')
{ cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//当一个数字字符后面接左括号时,判错
if(str[i]=='('&&(str[i+1]=='+'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]=='%'||str[i+1]=='^'||str[i+1]=='('))
{ cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//当左括号后接‘+’‘/’‘*’‘%’‘^’‘(’时,判错,注意可以接‘-’
if((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||
str[i]=='%'||str[i]=='^')&&(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||
str[i+1]=='%'||str[i+1]=='^'))
{ cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//当运算符后接运算符时,判错
if(str[i]=='.'&&str[i+1]=='.')
{
cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}//当两个小数点一起时,判错
if (str[i]=='/'&&str[i+1]=='0')
{
cout<<"ERROR IN INFIX NOTATION !\n";
WriteWrongToFile("output.txt");
return 1;
}
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
//计算表达式,并将结果写入文件
void Infix(char *str)
{
char ch,num[20];
int i,k,n=strlen(str);
double Opnd;
MathOptr Optr;
//================数栈和运算符栈==============//
Stack<double> Opnds(n);
Stack<MathOptr> Optrs(n);
//============================================//
k=0;
ch=str[k];
if(ch=='-')
{
k++;
ch=str[k];
Opnds.Push(-1);
Optrs.Push(MathOptr('*'));
}//当第一个字符是减号是,将-1压入数栈,将*压入运算符栈
while(ch!='=')
{
if(isdigit(ch)||ch=='.')
{
for(i=0;isdigit(ch)||ch=='.';i++)
{
num[i]=ch;
k++;
ch=str[k];
}
num[i]='\0';
Opnd=atof(num);
Opnds.Push(Opnd);
}//把数字字符转化为double型数
else if(isoptr(ch))
{
if(ch=='-'&&str[k-1]=='(')
{
Opnds.Push(-1);
Optrs.Push(MathOptr('*'));
k++;
ch=str[k];
}
else
{
Optr=MathOptr(ch);
while(!Optrs.Empty()&&Optrs.Peek()>=Optr)
Optrs.Pop().Evaluate(Opnds);
Optrs.Push(Optr);
k++;
ch=str[k];
}//根据运算符的优先级进行计算
}
else if(ch==')')
{
Optr=MathOptr(ch);
while(!Optrs.Empty()&&Optrs.Peek()>=Optr)
Optrs.Pop().Evaluate(Opnds);
Optrs.Pop();
k++;
ch=str[k];
}
}
while(!Optrs.Empty())
{
Optrs.Pop().Evaluate(Opnds);
}
Opnd=Opnds.Pop();
cout<<Opnd<<endl;
Write_Value_Into_File("output.txt",Opnd);
}
///////////////////////////////////////////////////////////////////////////
//从文件中读取表达式,判错,计算,并写入文件
void ReadFromFile( char *pFileName)
{
char *str;
str=new char[100];
FILE *fp;
if ((fp = fopen(pFileName,"r")) == NULL)
{
printf("cannot open file!\n");
}
char ch;
while((ch=fgetc(fp))!=EOF)
{
while(ch=='\n') //遇到回车 跳过
{
ch=fgetc(fp);
}
int i=0;
while((ch!='\n')&&(ch!=EOF))
{
while(ch==' ') //遇到空格 跳过
{
ch=fgetc(fp);
}
str[i++]=ch;
ch=fgetc(fp);
}
str[i]='\0';
if(!ValidFormula(str)) //表达式有意义时 计算其值
{
Infix(str);
}
}
/* int i=0;
while ( !feof(fp) )
{
ch=fgetc (fp);
while (ch == ' ')
{
ch=fgetc (fp);
}
str[i] = ch;
if ( str[i] != '\n' )
{
i++;
}
else
{
str[i] = '\0';
}
}
str[i]='\0';
if(!ValidFormula(str))
{
Infix(str);
}*/
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -