在RealTouch中实现一个计算器
来源:互联网 发布:淘宝怎么打不开了 编辑:程序博客网 时间:2024/05/01 01:20
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_X50#define BEGAIN_Y150#define BUTTON_X50#define BUTTON_Y50#define BUTTON_BUTTON_INTERVAL30struct rtgui_label* label;char op='0';float Value1,Value2,Result;#define STATE_IN_Value10#define STATE_IN_op1#define STATE_IN_Value22char 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_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++]='3';rtgui_label_set_text(label,strBuf);debug_print((int)Value1,op,(int)Value2);}void button4_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=4;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++]='4';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button5_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=5;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++]='5';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button6_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=6;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++]='6';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button7_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=7;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++]='7';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button8_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=8;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++]='8';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button9_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=9;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++]='9';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数 下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button_add_pressed(struct rtgui_object* object, struct rtgui_event* event){op='+';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='+';rtgui_label_set_text(label,strBuf);}void button_sub_pressed(struct rtgui_object* object, struct rtgui_event* event){op='-';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='-';rtgui_label_set_text(label,strBuf);}void button_mul_pressed(struct rtgui_object* object, struct rtgui_event* event){op='*';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='*';rtgui_label_set_text(label,strBuf);}void button_div_pressed(struct rtgui_object* object, struct rtgui_event* event){op='/';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='/';rtgui_label_set_text(label,strBuf);}void button_dot_pressed(struct rtgui_object* object, struct rtgui_event* event){dot_cnt=1;strBuf[srtIndex++]='.';rtgui_label_set_text(label,strBuf);}void button_equ_pressed(struct rtgui_object* object, struct rtgui_event* event){char err=0;long temp;long dot_temp;char dot01;char dot001;char dot0001;char dot00001;err=Calculate(Value1,op,Value2,&Result);if(err==0){rt_kprintf("Result=%d\n",(long)(Result*10000));}else{rt_kprintf("err\n");}Value1=0;Value2=0;dot_cnt=0;state=STATE_IN_Value1;strBuf[srtIndex++]='=';temp=(long )Result;//取整数部分dot_temp=(Result-temp)*10000;//取小数部分,保留5位小数部分if(dot_temp>0){rt_sprintf(strBuf+srtIndex,"%d.%d%d%d%d%d",temp,dot_temp/1000,dot_temp/100,dot_temp/10,dot_temp%10);}else{rt_sprintf(strBuf+srtIndex,"%d",temp);}rtgui_label_set_text(label,strBuf);//清除缓冲rt_memset(strBuf,0,50);srtIndex=0;}void rect_moveto(rtgui_rect_t *rect, int x, int y){ rect->x1 += x; rect->x2 += x; rect->y1 += y; rect->y2 += y;}void main(void){/*变量声明*/struct rtgui_app* application;struct rtgui_win* win;struct rtgui_button *button0,*button1,*button2,*button3,*button4,*button5,*button6,*button7,*button8,*button9;struct rtgui_button *button_dot,*button_add,*button_sub,*button_mul,*button_div,*button_equ; rtgui_rect_t rect; rtgui_image_t *imageUP,*imageDOWN; debug_print(1.2,'+',4.7); rt_memset(strBuf,0,50); /*建立应用程序*/application = rtgui_app_create(rt_thread_self(), "buttondemo");/*判断应用程序是否加载成功*/if (RT_NULL==application){rt_kprintf("Create application failed!");return;}/*建立主窗体*/win =rtgui_mainwin_create(RT_NULL,"buttondemo", RTGUI_WIN_STYLE_MAINWIN| RTGUI_WIN_STYLE_DESTROY_ON_CLOSE);/*判断窗体是否建立成功*/ if (RT_NULL==win){rt_kprintf("Create mainwindow failed!");rtgui_app_destroy(application);return;} button0 = rtgui_button_create("0");button1 = rtgui_button_create("1");button2 = rtgui_button_create("2");button3 = rtgui_button_create("3");button4 = rtgui_button_create("4");button5 = rtgui_button_create("5");button6 = rtgui_button_create("6");button7 = rtgui_button_create("7");button8 = rtgui_button_create("8");button9 = rtgui_button_create("9");button0 = rtgui_button_create("0");button_dot = rtgui_button_create(".");button_add = rtgui_button_create("+");button_sub = rtgui_button_create("-");button_mul = rtgui_button_create("*");button_div = rtgui_button_create("/");button_equ = rtgui_button_create("=");/*设置button1的位置*///第一行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rtgui_widget_set_rect(RTGUI_WIDGET(button7), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button8), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button9), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_div), &rect);//第二行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button4), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button5), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button6), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_mul), &rect);//第三行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button1), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button2), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button3), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_sub), &rect);//第三行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button0), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_dot), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_equ), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_add), &rect);/*设置按键事件函数*/rtgui_button_set_onbutton(button0,button0_pressed); rtgui_button_set_onbutton(button1,button1_pressed); rtgui_button_set_onbutton(button2,button2_pressed); rtgui_button_set_onbutton(button3,button3_pressed); rtgui_button_set_onbutton(button4,button4_pressed); rtgui_button_set_onbutton(button5,button5_pressed); rtgui_button_set_onbutton(button6,button6_pressed); rtgui_button_set_onbutton(button7,button7_pressed); rtgui_button_set_onbutton(button8,button8_pressed); rtgui_button_set_onbutton(button9,button9_pressed); rtgui_button_set_onbutton(button_add,button_add_pressed); rtgui_button_set_onbutton(button_sub,button_sub_pressed); rtgui_button_set_onbutton(button_mul,button_mul_pressed); rtgui_button_set_onbutton(button_div,button_div_pressed); rtgui_button_set_onbutton(button_dot,button_dot_pressed); rtgui_button_set_onbutton(button_equ,button_equ_pressed);/*建立lable标签*/label=rtgui_label_create("This is a button demo");/*设置label位置*/rect = (rtgui_rect_t){100,50,600,160};rtgui_widget_set_rect(RTGUI_WIDGET(label),&rect);/*添加按钮到主窗体中*/rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button0));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button1));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button2));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button3));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button4));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button5));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button6));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button7));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button8));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button9));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_div));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_mul));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_sub));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_dot));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_equ));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_add));/*添加label到主窗体中*/rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(label));/*显示主窗体*/rtgui_win_show(win, RT_TRUE);rtgui_app_destroy(application);}char Calculate(float a ,char option,float b,float *pOutResult){char err=0;switch(option){case '+':*pOutResult=a+b;break;case '-':*pOutResult=a-b;break;case '*':*pOutResult=a*b;break;case '/':if(b==0){err=-1;}else{*pOutResult=a/b;}break;default : err=-1;break;}return err;}
- 在RealTouch中实现一个计算器
- C# 在主窗口中打开一个带有计算器功能的子窗口,有三种实现方法
- 请实现一个计算器
- 实现一个计算器
- 实现一个计算器
- 实现一个计算器
- 实现一个日期计算器
- 在android studio中做一个简易的计算器
- 在Android studio中使用GridLayout实现计算器
- 一个简易计算器的实现
- 实现一个简单的计算器
- vue.js实现一个计算器
- JS_实现一个简易计算器
- PHP实现一个简单的计算器(在html页面和php文件之间传值)
- 用int main(int argc, char **argv);在终端上实现一个计算器
- 一个简单的计算器界面实现
- 实现一个Java GUI计算器应用程序界面
- 一个简单的Java计算器实现
- 准备在AIX上安装或升级到Oracle 11.2.0.3的注意事项
- tasklet的使用与理解
- android启动画面
- C++遍历文件夹,使用boost filesystem递归遍历文件夹
- leveldb研究5- Snapshot, Level和Compaction
- 在RealTouch中实现一个计算器
- Korsaraju算法 强连通分量
- leveldb研究7-Version/VersionSet/VersionEdit,内存中的数据结构Memtable/SkipList
- 数据结构---->图的遍历
- MPI Message Passing Interface
- Boost.Filesystem
- spring bean scope 的几种类型
- 谷歌地图发布海底街景地图
- java 导出word文档