C/C++四则运算简易计算器

四则运算简易计算器C/C++语言

说明:一道大一、大二延续的作业题,出现在POP语言©和OOP语言(C++、Java)的学习过程中。

一、最初版(最近修改于2022-7-5,调整了代码风格):

#include <stdio.h>
#include <stdlib.h>

int main() {
	double num1, num2;
	char ope; //ope = getchar();    putchar('')
	
	printf("input a formula like : num1+num2\n");
	scanf("%lf%c%lf", &num1, &ope, &num2);
	getchar();
	if (ope == '+') { //switch (int char short /long bool string) no arr[](javascript?) or function
		printf("=%.2f\n", (num1 + num2));
	}
	else if (ope == '-') {
		printf("=%.2f\n", (num1 - num2));
	}
	else if (ope == '*') {
		printf("=%.2f\n", (num1 * num2));
	}
	else if (ope == '/') {
		if (!num2) {
			printf("/0 err\n");
		}
		else {
			printf("=%.2f\n", (num1 / num2));
		}
	}
	else {
		printf("unkown character\n");
	}
	system("pause");
	
	return 0;
}

二、函数版(最近修改于2021-9-2):

#include <stdio.h>
#include <math.h>

//定义全局变量,临时存放数据,作为最终输出结果,用来拆解计算式。初始化为0。 
double term = 0; 
//定义全局变量,接收输入的数。初始化为0。 
double n = 0;
//定义全局变量,接收运算符号。 
char ch;
//定义全局变量,计数输入数字个数。初始化为0。 
int cnt = 0;

//自定义函数进行计算,简化main函数。置于main之上,不需要声明,直接调用。 
void Calculate(){
	//声明要用的函数。 
	double Plus( double x, double y);
	double Minus( double x, double y);
	double Multiply( double x, double y);
	double Divide( double x, double y);
	//用do…while循环解决不确定次数的循环问题且先执行一次。
	do{
		//读入运算符号。 
		printf("请输入运算符号:\n");
		// \"是逃逸字符,可以在printf引号中打出"。 
		printf(" \"+\" or \"-\" or \"*\" or \"/\" \n");
		scanf("%c",&ch);
		
		//用switch选择一种计算方式。 
		switch(ch){
			case '+':
					//读入下一个数。
					printf("请输入第%d个数:\n",++cnt);
					scanf("%lf",&n); 
					getchar();
					//开始计算。用term临时存放结果。 
					term = Plus(term,n);
					printf("当前结果是:%.2lf\n",term); 
					break;
			case '-':
					printf("请输入第%d个数:\n",++cnt);
					scanf("%lf",&n); 
					getchar();
					term = Minus(term,n);
					printf("当前结果是:%.2lf\n",term);
					break;
			case '*':
					printf("请输入第%d个数:\n",++cnt);
					scanf("%lf",&n); 
					getchar(); 
					term = Multiply(term,n);
					printf("当前结果是:%.2lf\n",term);
					break;
			case '/':
					printf("请输入第%d个数:\n",++cnt);
					scanf("%lf",&n); 
					getchar(); 
					term = Divide(term,n);
					printf("当前结果是:%.2lf\n",term);
					break;
		}
	}while(ch != 'n'); 
}

int main(){
	//用printf输出,增强程序与人的交互性。
	printf("***若要结束计算,请在符号输入口输入‘n’。***\n");
	printf("请输入第%d个数:\n",++cnt);
	//用scanf读入输入的第一个数。 
	scanf("%lf",&n);
	//读取上一个回车符,否则不能接收运算符号。 
	getchar();
	//存放第一个数值。
	term = n;  
	Calculate();
	//输出结果。
	printf("结果是:%.2lf",term);	
	return 0;
}

//加法运算 
double Plus( double x, double y){
	double sum;
	sum = x + y;
	return sum;
} 
//减法运算 
double Minus( double x, double y){
	double difference;
	difference = x - y;
	return difference;
}
//乘法运算 
double Multiply( double x, double y){
	double product;
	product = x * y;
	return product;
}
//除法运算 
double Divide( double x, double y){
	double quotient;
	quotient = x / y;
	return quotient; 
}

附结果图
在这里插入图片描述

三、使用栈的版本(C++,最近修改于2022-6-1):

如何直接计算出一个长式子?可以使用栈结构:中缀表达式转后缀表达式。如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stack> //栈
using namespace std;

enum Prior_LV {
	Prior_LV0 = 0,
	Prior_LV1 = 1,
	Prior_LV2 = 2,
};

double inStack(); //入栈函数,是核心函数
void Calculate(stack<char>& Ope, stack<double>& Num); //计算函数,结果放栈顶。operate操作 number数字
int getPriority(char ope); //获取运算优先级函数
/*		*****	***主函数*** 	*****		*/
int main() {
	double result;
	cout << "-----四则运算计算器Calculator-----" << endl; //加<< endl就是换行
	cout << "请输入:\n";
	result = inStack();
	cout << "结果是:\n" << result << endl;

	return 0;
}
double inStack() {
	stack<char> Op; //操作符栈
	stack<double> N; //数字栈
	char op;
	double n;

	while (1) {
		if (cin.peek() >= '0' && cin.peek() <= '9') {
			cin >> n;
			N.push(n);
		}
		/*
		* cin.peek()返回值是字符。peek探视,该函数只观测当前字符,指针停留在当前位置并不后移,读取字符后不会删除。
		*/
		else {
			cin >> op;
			if (op == '=') {
				while (!Op.empty()) { //如果遇到等号但符号栈未空,做计算
					Calculate(Op, N);
				}
				return N.top(); //如果遇到等号且符号栈空,返回数字栈顶元素
			}
			else if (Op.empty() || op == '(') { //符号栈空或是左括号,符号可以直接入栈
				Op.push(op);
			}
			else if (op == ')') { //遇到右括号,完成括号内的计算
				while (Op.top() != '(') {
					Calculate(Op, N);
				}
				Op.pop(); //左括号出栈
			}
			else if (getPriority(op) <= getPriority(Op.top())) { //当前运算符优先级小于栈顶符号时
				while (Op.top() != '(') {
					Calculate(Op, N);
					if (Op.empty() || getPriority(op) > getPriority(Op.top())) {
						break;
					}
				}
				Op.push(op);
			}
			else Op.push(op);
		}
	}
}
void Calculate(stack<char>& Ope, stack<double>& Num) {
	double num1, num2;

	if (Ope.top() == '-') { //减法运算变为加法运算
		num1 = Num.top();
		Num.pop();
		Ope.pop(); //取出减号
		if (!Num.empty()) {
			if (Ope.empty() || Num.size() == Ope.size()) {
				Ope.push('+');
			}
		}
		Num.push(-num1); //c++可以直接输入负数
	}
	else {
		num1 = Num.top();
		Num.pop();
		num2 = Num.top();
		Num.pop();

		if (Ope.top() == '+') Num.push(num2 + num1);
		else if (Ope.top() == '*') Num.push(num2 * num1);
		else if (Ope.top() == '/') Num.push(num2 / num1);

		Ope.pop();
	}
}
int getPriority(char ope) {
	if (ope == '+' || ope == '-') return Prior_LV1;
	else if (ope == '*' || ope == '/') return Prior_LV2;
	else return Prior_LV0;
}

附结果图:
在这里插入图片描述
之后,交互上待改为GUI图形化界面,功能待扩充。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值