⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.h

📁 一个不带界面的计算器
💻 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 + -