




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GTK+图形界面编程计算器的实现 第页 共 22 页 目录1 引言 1.1 课题背景 .1.2 课程设计目的 .1.3 课程设计任务 .2 系统需求分析 .2.1 功能需求分析 .2.2 性能需求分析 3 总体设计 .3.1 功能模块分析与设计 .3.2 系统功能模块设计 4 系统功能测试 .4.1 一个 Helloworld 窗口 4.2 计算器功能测试 .5 课程设计总结 .参考文献 GTK+图形界面编程计算器的实现 第页 共 22 页 1 引言1.1 课题背景简单的计算器是一种能实现加、减、乘、除等简单运算的工具。要实现计算功能,可以用 C 语言的知识和 GTK+编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。GTK+2.0 是自由软件,并且是GNU 工程的一部分 1。GTK+2.0 的许可协议LGPL,允许任何开发者使用(包括那些开发中的专利软件)且不收任何费用。GTK+2.0 是当今惟一百分之百零付费的工业级的图形界面开发工具。本设计就以 GTK+2.0 为开发工具,全面展示在Linux 平台上开发应用程序的各个侧面,也展现在Linux 平台上开发图形界面应用程序。计算机信息管理技术的应用,除了能在相当大的程度上代替人工作业,从而减少人员工作量,减轻工作负担,减少工作中因人为原因而产生的错误从而避免不必要的损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准确、及时的信息以帮助做出正确而及时的选择与决定,从而给采用这门技术的单位带来了巨大的可见或不可见的利益与效益。1.2 课程设计目的现在大多数的计算器都具备+,-,*,/等四则运算的功能。用计算器来算数显然比用脑袋或用纸笔计算要来得方便。讲究高效的我们势必要用到傻瓜设备(就是拿到手看看说明就知道怎样使用的东东) 。当我们看到一个很长很大的表达式需要得到结果时,我们就会想到计算器,这样,本程序就是为解决大家基本四则运算的问题而产生的。只要你读懂说明,那么你所输入的表达式就一定能得到正确的结果。本文主要基于对表达式的分析并利用 C 进行编程进而实现算法的。与 Java 和 C#等其他高级语言相比,C 在程序运行效率、内存使用的可控性和编程的灵活性上均具有较大的优势 2,与汇编语言和 C 语言更具有面向对象的优点,因此本文采用 Ubuntu GTK+图形界面编程计算器的实现 第页 共 22 页 Linux 操作系统以及 GTK+2.0,以达到算法快速有效地执行。1.3 课程设计任务本课程设计内容是在 Linux 平台下开发一个简单的计算器程序,采用 GCC 编程工具和 GTK+2.0 工具包等软件为开发工具以及 C 语言知识实现图形化的计算器程序。该程序能够实现的对整数的加减乘除和小数的加减乘除。2 系统需求分析2.1 功能需求分析(1)整数之间的加减乘除运算,如:1+2、6-5、24/12 、90*2 等。(2)小数之间的加减乘除运算,如:1.2+2.3、3.1-1.2、4.2*1.9、66.1/2.1 等。(3)小数与整数之间的加减乘除运算,如:1.4+4、2.4*6 等。2.2 性能需求分析(1)硬件环境处理器:奔腾 4 或以上。内存:128MB 或以上。硬盘空间:20M 以上。(2)软件环境操作系统:Linux Kernel 2.6.20 以上版本。工具软件:GTK+2.0 工具包、GCC 编程工具。(3)技术需求GCC,即 GNU Compiler Collection,GNU 编译器套装,是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 计划的关键部分,亦是自由的类 Unix 及苹果电脑 Mac OS X 操作系统的标准编译器。可处理 C、C+、 Fortran、Pascal 、Objective-C 、Java, 以及 Ada 与其他语言 3。GTK+图形界面编程计算器的实现 第页 共 22 页 GTK+是一种图形用户界面工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合) ,它支持创建基于 GUI 的应用程序 4。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。使用 GTK+ 这样的库比起编写自己的 GUI 代码来有多个优势。例如,它可以显著节约开发时间,让开发人员把精力集中在项目真正重要和真正独特的地方,而不必重复公共的功能。对于用户来说,这意味着 他们使用的应用程序之间具有更好的一致性:工具包能在哪使用,应用程序就能跟到哪里。就像使用 LEGO 一样,所有的人都使用同一兼容尺寸这一事实,意味着设计可以在使用库的人之间共享,不论他们在哪里使用它。3 总体设计3.1 功能模块分析与设计本计算器主要是完成整数之间、小数之间、整数和小数之间的加减乘除的运算,使用 GTK+完成界面布局。根据需求分析的结果,总体结构如图 3-1 所示。图 3-1 总体结构图3.2 系统功能模块设计本课程设计所实现的计算器可以分为以下几个模块实现:简单的计算器整数间的四则运算小数间的四则运算整数小数间的四则运算GTK+图形界面编程计算器的实现 第页 共 22 页 (1)图形界面设计(2)数字键处理模块(3)小数点处理模块(4)加减乘除运算按键处理模块(5)结果按键,即等号处理模块(6)清除模块3.2.1 图形界面设计此程序采用一个纵向盒状容器和多个横向盒状容器来设计界面。另外在单行输入控件的阅读方向属性上用函数 gtk_widget_set_direction 设定为 GTK_TEXT_DIR_RTL,即从右向左,使此控件的数字显示更像一个计算器的显示屏。(1)主窗体关键代码:window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /主窗体G_CALLBACK(gtk_main_quit),NULL);gtk_window_set_title(GTK_WINDOW(window),“我的计算器“); /窗体名称gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_container_set_border_width(GTK_CONTAINER(window),10);vbox = gtk_vbox_new(FALSE,0);gtk_container_add(GTK_CONTAINER(window),vbox);hbox = gtk_hbox_new(FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);(2)各个按键布局的关键代码:label = gtk_label_new(“Calculator“); /标签名称gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5);button = gtk_button_new_with_label(“C“); /清除按键gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);构建一个hbox1容纳数字“1” 、 “2”、 “3”、 “+”四个按键:hbox1 = gtk_hbox_new(FALSE,0); /hbox1 的构建gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);button = gtk_button_new_with_label(“3“); /按键 3gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);G_CALLBACK(on_num_clicked),NULL);GTK+图形界面编程计算器的实现 第页 共 22 页 button = gtk_button_new_with_label(“2“); /按键 2gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(“1“); /按键1gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);类似的构建 hbox2 控件容纳“4” 、 “5”、 “6”和“-”四个按键,hbox3 容纳“7” 、“8”、 “9”和“*”四个按键,hbox4 容纳“0” 、 “.”、 “=”和“/ ”四个按键。而对于 hbox1hbox4,是控件 vbox 的子类,布局如下:gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox4,FALSE,FALSE,5);3.2.2 数字键处理模块数字按钮 09 的功能是向计算器输入数字,通过计算和定位,最后显示出来,所以它们的回调函数都是同一个,只不过传递的参数根据不同的按钮传递不同的数字,关键代码如下:void on_num_clicked (GtkButton* button,gpointer data) /当数定键按下时执行const gchar *num;gint i;if(have_result)clear_all(); /有结果则全部清除if(count = 6) return; /够6位数则不能再输入数字count+;num = gtk_button_get_label(GTK_BUTTON(button); /取数i = g_strlcat(number,num,100); /保存if(first)nn = strtod(number,NULL); /数一elsemm = strtod(number,NULL); /数二GTK+图形界面编程计算器的实现 第页 共 22 页 gtk_entry_set_text(GTK_ENTRY(entry),number); /显示3.2.3 小数点处理模块小数点按钮的回调函数是较特殊的一个。首先小数点在一个数中只能出现一次,再按的话则不起作用,小数点按钮在点击后要对所输入的数字做一下处理,使之成为浮点数,并且让后续数字也转换为相应的浮点数字,关键代码如下:void on_dot_clicked (GtkButton* button,gpointer data) /当小数点按下时gint i;if(have_result)clear_all(); /全部清除if(have_dot = FALSE) /如果无小数点则可以have_dot = TRUE;i = g_strlcat(number,“.“,100);gtk_entry_set_text(GTK_ENTRY(entry),number); /如果有小数点则不输出3.2.4运算按键处理模块本计算器软件只有加减乘除4种运算功能,这4个运算按钮用了同一个回调函数,根据传递的参数设定当前的计算方法。其关键代码如下:switch(GPOINTER_TO_INT(data)case 1: /当“+“ 时s = 1;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;case 2: /当“-“时s = 2;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;GTK+图形界面编程计算器的实现 第页 共 22 页 case 3: /当“*“时s = 3;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;case 4: /当“/“ 时s = 4;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;3.2.5 等号按键处理模块等号按钮的回调函数是根据当前的计算方法进行相应的运算,并将运算结果输出到单行输出控件中。其关键代码如下:switch(s) /判断四则运算的符号case 1: /当“+“ 时numb = nn+mm;break;case 2: /当“-“时numb = nn-mm;break;case 3: /当“*“时numb = nn*mm;break;case 4: /当“/“ 时numb = nn/mm;break;3.2.6 清除模块清除按钮的功能是清除当前显示,同时清除所有标记,将标记设为默认等。关键代码如下:void clear_all (void)GTK+图形界面编程计算器的实现 第页 共 22 页 /清除所有相关标记gint i;gtk_entry_set_text(GTK_ENTRY(entry),“);nn = 0; /第一个数清零mm = 0 ; /第二个数清零s = 0;count = 0 ;first = TRUE;have_dot = FALSE; /小数点标记have_result = FALSE; /结果标记for(i = 0 ; i #include static GtkWidget *entry; /定义单行输入控件来显示输入输出的数字gint count = 0 ; /计位gdouble nn = 0 ; /计数一gdouble mm = 0 ; /计数二gint s = 0 ; /算法gboolean first = TRUE; /首次输入gboolean have_dot = FALSE; /是否有小数点gboolean have_result = FALSE; /是否有结果输出gchar number100; /保存用户输入的数字void clear_all (void) /清除所有相关标记gint i;gtk_entry_set_text(GTK_ENTRY(entry),“);nn = 0;mm = 0 ;s = 0;count = 0 ;first = TRUE;have_dot = FALSE;have_result = FALSE;for(i = 0 ; i 100 ; i+)numberi = 0;void on_num_clicked (GtkButton* button,gpointer data) /当数定键按下时执行const gchar *num;GTK+图形界面编程计算器的实现 第页 共 22 页 gint i;if(have_result)clear_all(); /有结果则全部清除if(count = 6) return; /够 6 位数则不能再输入数字count+;num = gtk_button_get_label(GTK_BUTTON(button); /取数i = g_strlcat(number,num,100); /保存if(first)nn = strtod(number,NULL); /数一elsemm = strtod(number,NULL); /数二gtk_entry_set_text(GTK_ENTRY(entry),number); /显示void on_dot_clicked (GtkButton* button,gpointer data) /当小数点按下时gint i;if(have_result)clear_all(); /全部清除if(have_dot = FALSE) /如果无小数点则可以have_dot = TRUE;i = g_strlcat(number,“.“,100);gtk_entry_set_text(GTK_ENTRY(entry),number);/如果有小数点则不输出void on_clear_clicked (GtkButton* button,gpointer data)clear_all(); /全部清除GTK+图形界面编程计算器的实现 第页 共 22 页 void on_suan_clicked (GtkButton* button,gpointer data) /当计算按钮 +,- ,*,/ 按下时gint i;switch(GPOINTER_TO_INT(data)case 1: /当“+“时s = 1;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;case 2: /当“-“时s = 2;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;case 3: /当“*“时s = 3;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;case 4: /当“/“时s = 4;gtk_entry_set_text(GTK_ENTRY(entry),“);first = FALSE ; count = 0; break;have_dot = FALSE;for(i = 0 ; i 100 ; i+) /清除数字numberi = 0;void on_eq_clicked (GtkButton* button,gpointer data) /当等号键按钮按下时double numb;gchar num100;GTK+图形界面编程计算器的实现 第页 共 22 页 gchar *result;switch(s)case 1: /当“+“时numb = nn+mm;break;case 2: /当“-“时numb = nn-mm;break;case 3: /当“*“时numb = nn*mm;break;case 4: /当“/“时numb = nn/mm;break;result = g_ascii_dtostr(num,100,numb);gtk_entry_set_text(GTK_ENTRY(entry),result);have_result = TRUE;int main ( int argc , char* argv)GtkWidget *window;GtkWidget *vbox;GtkWidget *hbox,*hbox1,*hbox2,*hbox3,*hbox4;GtkWidget *button;GtkWidget *label;gtk_init(window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /主窗口g_signal_connect(G_OBJECT(window),“delete_event“,GTK+图形界面编程计算器的实现 第页 共 22 页 G_CALLBACK(gtk_main_quit),NULL);gtk_window_set_title(GTK_WINDOW(window),“我的计算器“); /主窗口标签栏gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_container_set_border_width(GTK_CONTAINER(window),10);vbox = gtk_vbox_new(FALSE,0);gtk_container_add(GTK_CONTAINER(window),vbox);hbox = gtk_hbox_new(FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);label = gtk_label_new(“Calculator“);gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5);button = gtk_button_new_with_label(“C“);gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_clear_clicked),NULL);entry = gtk_entry_new();gtk_widget_set_direction(entry,GTK_TEXT_DIR_RTL);gtk_box_pack_start(GTK_BOX(vbox),entry,FALSE,FALSE,5);hbox1 = gtk_hbox_new(FALSE,0); /定义 hbox1 容纳 3、2、1、“+“gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);button = gtk_button_new_with_label(“3“); /按键 3gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(“2“); /按键 2gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(“1“); /按键 1gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);GTK+图形界面编程计算器的实现 第页 共 22 页 button = gtk_button_new_with_label(“+“); /按键 “+“g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_suan_clicked),(gpointer)1);gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);hbox2 = gtk_hbox_new(FALSE,0); /定义 hbox2 容纳 6、5、4、“-“gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);button = gtk_button_new_with_label(“6“); /按键 6g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(“5“); /按键 5g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(“4“); /按键 4g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(“-“); /按键 “-“g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_suan_clicked),(gpointer)2);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);hbox3 = gtk_hbox_new(FALSE,0); /定义 hbox3 容纳 9、8、7、“*“gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,5);button = gtk_button_new_with_label(“9“); /按键 9g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);button = gtk_button_new_with_label(“8“); /按键 8g_signal_connect(G_OBJECT(button),“clicked“,G_CALLBACK(on_num_clicked),NULL);GTK+图形界面编程计算器的实现 第页 共 22 页 gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);button = gtk_but
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美甲店会员合同(标准版)
- 会员卡合同(标准版)
- 2025年安全生产专题试卷及答案
- 2024年儿童补钙项目资金申请报告代可行性研究报告
- 2025年通讯工程考试题目及答案
- 贵州省2025年医师资格考试医学综合考试“年两试”临床执业医师复习题库及答案
- 2025年重庆临床执业医师考试(实践技能)模拟题及答案
- 学校接待应急预案
- 2025年高二物理上学期云计算在物理中应用初探(复杂光学计算)
- 2025年高二物理上学期物理与增强现实(AR)试题
- 生存分析教学课件
- 2024年湖南石油化工职业技术学院单招职业技能测试题库及答案
- 癫痫患者的麻醉管理
- 甲状腺疾病护理小讲课
- 2025年中国中信集团招聘笔试冲刺题2025
- 家具双十一活动方案
- 护工跌倒培训
- AI+Agent与Agentic+AI的原理和应用洞察与未来展望
- 白酒企业召回管理制度
- 2025春季学期国开电大法学本科《合同法》一平台在线形考(任务1至4)试题及答案
- 药品网络交易服务三方平台质量管理体系文件-B2B平台(完整版)
评论
0/150
提交评论