Arduino利用键盘矩阵实现计算器

这篇博客展示了如何利用Arduino和键盘矩阵构建一个计算器。首先介绍了实现四则运算的逻辑,包括数字入栈、运算符优先级判断。然后讲解了实现所需的数据结构——栈,以及相关操作函数。最后提供了部分代码实现,并指出由于键盘键位限制,无法展示所有运算,但能处理括号和复杂算术表达式。
摘要由CSDN通过智能技术生成

运行结果演示

计算器运行结果

基本思路

基本结构

程序基本结构

键盘数据读入

运算实现原理

为了实现复杂的四则运算,首先需要考虑的是算数符号以及括号的优先级。具体实现流程如下:

  1. 如果是数字,则压入操作数栈中
  2. 如果是运算符,则有两种情况:
    ①如果运算符栈为空,则将其压入运算符栈中
    ②如果不为空,则比较其与运算符栈中的优先级,如果大于则压入栈中,否则从操作数栈中取出两个数进行相应计算
  3. 如果为* ) * ,取出操作数栈中两个数与运算符栈中运算符计算,结果压入操作数栈中。直至遇到* )*
  4. 将剩余操作数与运算符进行运算,直至操作数栈为空

实现准备

为了实现运算,需要准备简单的栈结构及其基本操作:

/*
  简易栈实现
*/
int stackNum[255] = {
    0 };
int stackNumTopIndex = -1;

char stackChar[255] = {
   };
int stackCharTopIndex = -1;

void pushNumStack(int num) {
   
	stackNum[++stackNumTopIndex] = num;
}

void pushCharStack(char op)
{
   
	stackChar[++stackCharTopIndex] = op;
}

bool isEmptyOfNumStack()
{
   
	return stackNumTopIndex == -1;
}

bool isEmptyOfCharStack()
{
   
	return stackCharTopIndex == -1;
}

int popNumStack() {
   
	if (isEmptyOfNumStack()) {
   
		return -1;
	}
	return stackNum[stackNumTopIndex--];
}

char popCharStack()
{
   
	if (isEmptyOfCharStack()) {
   
		return '!';
	}
	return stackChar[stackCharTopIndex--];
}

int peekNumStack()
{
   
	return stackNum[stackNumTopIndex];
}

int peekCharStack() 
{
   
	return stackChar[stackCharTopIndex];
}

接着,实现对数据的一些基本功能函数

/*
 * 数据处理
*/

//获取算数符号优先级
int getPriority(char op)
{
   
	int level = 0;

	switch (op)
	{
   
	case '(':
		level = 1;
		break;
	case '+':
	case '-':
		level = 2;
		break;
	case '*':
	case '/':
		level = 3;
		break;
	default:
		break;
	}

	return level;
}

//是否是算数运算符
bool isOperator(char op) 
{
   
	if ( op== '+' || op == '-' || op == '*' || op == '/') {
   
		return true;
	}
	else {
   
		return false;
	}
}

//进行相应计算
int Calculate(int lNum, char op, int rNum)
{
   
	int result = 0;

	switch (op)
	{
   
	case '+':
		result = lNum + rNum;
		break;
	case '-':
		result = lNum - rNum;
		break;
	case '*':
		result = lNum * rNum;
		break;
	case '/':
		if (rNum != 0) {
   
			result = lNum / rNum;
		}
		break;
	default
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值