在RealTouch中实现一个计算器

这篇博客介绍了在RealTouch环境中创建一个计算器的过程,重点在于解决算法难题,如数值输入、小数点调整、有效小数位保留以及防止重复操作Op。尽管UI设计相对简单,但算法实现耗费了较多时间,作者因此决定停止进一步开发。
摘要由CSDN通过智能技术生成

 

UI的设计倒是很简单,按钮和label就可以了。困难的是算法。

1.这样把数值输入

2.这样调整小数点

3这样保留有效小数位

4防止多次按下Op

代码还有很多问题,本来目的是使用realtouch的GUI的反而在算法上花费太多时间了。所以不再继续了

 

#include <rtthread.h>
#include <rtgui/rtgui_app.h>
#include <rtgui/widgets/container.h>
#include <rtgui/widgets/window.h>
#include <rtgui/widgets/button.h>
#include <rtgui/widgets/label.h>
#include <rtgui/image.h>
#include <rtgui/font.h>

#define BEGAIN_X		50
#define BEGAIN_Y		150

#define BUTTON_X	50
#define BUTTON_Y	50
#define BUTTON_BUTTON_INTERVAL	30
struct rtgui_label* label;

char op='0';
float Value1,Value2,Result;

#define  STATE_IN_Value1	0
#define  STATE_IN_op			1
#define  STATE_IN_Value2	2

char state=STATE_IN_Value1;


char dot_cnt=0;
char strBuf[50];
char srtIndex=0;

char Calculate(float a ,char option,float b,float *pOutResult);

void debug_print(float a,char op,float b)
{
		rt_kprintf("%d\n",(long)(a*100));
		rt_kprintf("op=%c\n",op);
		rt_kprintf("%d\n",(long)(b*100));

}
float moveDot(char cnt)
{
	int i;
	float temp=1;
	for(i=0;i<cnt;i++)
	{
		temp*=0.1;
	}
	return temp;
}
void button0_pressed(struct rtgui_object* object, struct rtgui_event* event)
{
	char X=0;
	float dot;

	if(state==STATE_IN_Value1)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value1=Value1+X*dot;
		}
		else
		{
			Value1=Value1*10+X;
		}

	}
	else if(state==STATE_IN_Value2)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value2=Value2+X*dot;
		}
		else
		{
			Value2=Value2*10+X;
		}
	}

	strBuf[srtIndex++]='0';
	rtgui_label_set_text(label,strBuf);

	if(dot_cnt) dot_cnt++;	//记录小数点位数  下一次按下数值键时小数点位数
	debug_print((int)Value1,op,(int)Value2);
}
void button1_pressed(struct rtgui_object* object, struct rtgui_event* event)
{
	char X=1;
	float dot;
	if(dot_cnt) dot_cnt++;	//记录小数点位数
	if(state==STATE_IN_Value1)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value1=Value1+X*dot;
		}
		else
		{
			Value1=Value1*10+X;
		}

	}
	else if(state==STATE_IN_Value2)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value2=Value2+X*dot;
		}
		else
		{
			Value2=Value2*10+X;
		}
	}

	strBuf[srtIndex++]='1';
	rtgui_label_set_text(label,strBuf);

	debug_print((int)Value1,op,(int)Value2);
}
void button2_pressed(struct rtgui_object* object, struct rtgui_event* event)
{
	char X=2;
	float dot;
	if(dot_cnt) dot_cnt++;	//记录小数点位数
	if(state==STATE_IN_Value1)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value1=Value1+X*dot;
		}
		else
		{
			Value1=Value1*10+X;
		}

	}
	else if(state==STATE_IN_Value2)
	{
		if(dot_cnt!=0)//按下小数点
		{
			dot=moveDot(dot_cnt);
			Value2=Value2+X*dot;
		}
		else
		{
			Value2=Value2*10+X;
		}
	}

	strBuf[srtIndex++]='2';
	rtgui_label_set_text(label,strBuf);

	debug_print((int)Value1,op,(int)Value2);
}
void button3_pressed(struct rtgui_object* object, struct rtgui_event* event)
{
	char X=3;
	float dot;
	if(dot_cnt) dot_cnt++;	//记录小数点位数
	if(state==STATE_I
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值