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

📄 科学计算器2.0.cpp

📁 DOS下的科学计算器
💻 CPP
字号:
//07.10.16 
//程序功能:将输入的运算表达式转换成逆波兰式,并输出计算结果
//例: 
//  输入  123+345*(24+345/(567-81/9))
//  输出  123 345 24 345 567 81 9 / - / + * + 
//	结果  8616.31   

#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
#include "stack.h"				// 栈类头文件

using namespace std;

void message(){					//信息函数 提示相关信息及注意事项
	cout <<"四则科学计算器2.0... "<<endl <<endl;
	cout <<"注:经过改进,此程序已经可以处理输入数据为小数的四则运算;"<<endl;
	cout <<endl;
	cout <<"    此程序未对输入的表达式做查错处理,请保证输入的是数学四则运算表达式,"<<endl;
	cout <<"    否则将会出现不可预计的后果;"<<endl;
	cout <<endl;
	cout <<"    此程序的计算数及计算结果均用 double 型数据储存,所以基本可以忽略浮点" <<endl;
	cout <<"    型数据存在的舍去误差。但结果只输出6位有效数字,其中第六位为近似值" <<endl;
	cout <<endl;
	cout <<"    此程序亦无对溢出进行处理,一般不会溢出。";
	cout <<endl <<endl <<endl;
	cout <<"                                               -------07.10.22改 (by yuwq07)" <<endl;
}

int cmp(int x,int y){			//优先级比较函数
	if(x==43||x==45) x=1;
	else x=2;
	if(y==43||y==45) y=1;
	else y=2;
	if(x<y) return 0;
	return 1;
}

void change(Stack<char> s,string str1,string &str2){	//逆波兰转换函数
	int i;
	char a;
	for(i=0;i<str1.size();i++){
		if(str1[i]<58&&str1[i]>47||str1[i]==46){
			str2+=str1[i];
			continue;
		}

		if(str1[i]==40){
			s.Push(40);
			continue;
		}

		if(str1[i]==41){
			s.Pop(a);
			while(a!=40){
				str2+=32;
				str2+=a;
				s.Pop(a);
			}
			continue;
		}

		while(s.GetTop(a)&&a!=40&&cmp(a,str1[i])){
			str2+=32;
			s.Pop(a);
			str2+=a;
		}
		str2+=32;
		s.Push(str1[i]);
	}

	while(s.GetTop(a)){
		str2+=32;
		s.Pop(a);
		str2+=a;
	}
}

int judge(string str,int &p){  //判断运算符函数:如果为运算符,返回 1;否则返回 0;
	if(str[p]>47&&str[p]<58) return 0;
	p-=2;
	return 1;
}

double count(double id1,double id2,int op){   //四则运算函数
	double sum;
	switch(op){
		case 42: sum=id1*id2; break;
		case 43: sum=id1+id2; break;
		case 45: sum=id1-id2; break;
		case 47: sum=id1/id2; break;
	}
	return sum;
}

double change_num(string str,int &p){		//数据转换函数
	int i=0,j;								//把数字字符串转换成相对应的数字
	double sum=0.0,t;
	while(str[p]!=32&&p>=0){				//32为空格的ASCII码
		if(str[p]==46){						//46为小数点的ASCII码
			t=1;
			for(j=0;j<i;j++)
				t=t*10;
			sum=sum/t;
			i=0;
			p--;
		}
		else{
			t=str[p--]-48;
			for(j=0;j<i;j++)
				t=t*10;
			sum+=t;
			i++;
		}
	}
	p--;
	return sum;
}

double summation(string str,int &p){		//表达式计算函数
	double id1,id2;							//根据所求得的逆波兰式计算表达式的值
	int op=str[p];
	if(judge(str,p)){
		id2=summation(str,p);
		id1=summation(str,p);
		return count(id1,id2,op);
	}
	return change_num(str,p);
}

void task(){								//任务函数 执行要完成的任务
	string str1,str2;
	Stack<char> s;
	s.InitStack();

	cout <<"输入要计算的数学表达式" <<endl;		//求逆波兰式
	cin >>str1;
	change(s,str1,str2);
	cout <<endl <<"该数学表达式的逆波兰式为" <<endl;
 	cout <<str2 <<endl <<endl;

	double sum;								//计算表达式的值				
	int p=str2.size()-1;				
	sum=summation(str2,p);
	cout <<"计算得到该表达式的值为:" <<endl;
	cout <<sum <<endl <<endl <<endl;
}


int main(){									//主函数
	message();								//输入相关信息
	system("pause");

	do{
		system("cls");
		task();
		cout <<"按ESC退出,按其它键继续..." <<endl;
	}while(getch()!=27);

	return 0; 
}









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -