课程设计(论文)GTK图形界面编程计算器的实现_第1页
课程设计(论文)GTK图形界面编程计算器的实现_第2页
课程设计(论文)GTK图形界面编程计算器的实现_第3页
课程设计(论文)GTK图形界面编程计算器的实现_第4页
课程设计(论文)GTK图形界面编程计算器的实现_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录 1 引言引言. 1.1 课题背景课题背景. 1.2 课程设计目的课程设计目的. 1.3 课程设计任务课程设计任务. 2 系统需求分析系统需求分析 . 2.1 功能需求分析功能需求分析. 2.2 性能需求分析性能需求分析. 3 总体设计总体设计. 3.1 功能模块分析与设计功能模块分析与设计. 3.2 系统功能模块设计系统功能模块设计. 4 系统功能测试系统功能测试 . 4.1 一个一个 helloworld 窗口窗口. 4.2 计算器功能测试计算器功能测试. 5 课程设计总结课程设计总结. 参考文献参考文献. 1 引言 1.1 课题背景 简单的计算器是一种能实现加、减、乘、除等简单运算的

2、工具。要实现计算功能, 可以用 c 语言的知识和 gtk+编写程序来解决此问题。该计算器大大的降低了数字计 算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中 小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。 gtk+2.0 是自由软件,并且是gnu 工程的一部分1。gtk+2.0 的许可协议 lgpl,允许任何开发者使用(包括那些开发中的专利软件)且不收任何费用。gtk+2.0 是当今惟一百分之百零付费的工业级的图形界面开发工具。本设计就以 gtk+2.0 为 开发工具,全面展示在linux 平台上开发应用程序的各个侧面,也展现在linux 平台上 开发图

3、形界面应用程序。 计算机信息管理技术的应用,除了能在相当大的程度上代替人工作业,从而减少 人员工作量,减轻工作负担,减少工作中因人为原因而产生的错误从而避免不必要的 损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准 确、及时的信息以帮助做出正确而及时的选择与决定,从而给采用这门技术的单位带 来了巨大的可见或不可见的利益与效益。 1.2 课程设计目的 现在大多数的计算器都具备+,-,*,/等四则运算的功能。用计算器来算数显然比 用脑袋或用纸笔计算要来得方便。讲究高效的我们势必要用到傻瓜设备(就是拿到手 看看说明就知道怎样使用的东东) 。当我们看到一个很长很大的表达式需要

4、得到结果时, 我们就会想到计算器,这样,本程序就是为解决大家基本四则运算的问题而产生的。 只要你读懂说明,那么你所输入的表达式就一定能得到正确的结果。 本文主要基于对表达式的分析并利用 c 进行编程进而实现算法的。与 java 和 c# 等其他高级语言相比,c 在程序运行效率、内存使用的可控性和编程的灵活性上均具 有较大的优势2,与汇编语言和 c 语言更具有面向对象的优点,因此本文采用 ubuntu linux 操作系统以及 gtk+2.0,以达到算法快速有效地执行。 1.3 课程设计任务 本课程设计内容是在 linux 平台下开发一个简单的计算器程序,采用 gcc 编程工 具和 gtk+2.

5、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

6、 以上版本。 工具软件: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+是一种图形用户界面工具包。也就是说,它是一个库(或者,实际上是若干 个密切相关的库的集合) ,它支持创

7、建基于 gui 的应用程序4。可以把 gtk+ 想像成 一个工具包,从这个工具包中可以找到用来创建 gui 的许多已经准备好的构造块。使 用 gtk+ 这样的库比起编写自己的 gui 代码来有多个优势。例如,它可以显著节约 开发时间,让开发人员把精力集中在项目真正重要和真正独特的地方,而不必重复公 共的功能。对于用户来说,这意味着 他们使用的应用程序之间具有更好的一致性:工 具包能在哪使用,应用程序就能跟到哪里。就像使用 lego 一样,所有的人都使用同 一兼容尺寸这一事实,意味着设计可以在使用库的人之间共享,不论他们在哪里使用 它。 3 总体设计 3.1 功能模块分析与设计 本计算器主要是完

8、成整数之间、小数之间、整数和小数之间的加减乘除的运算, 使用 gtk+完成界面布局。 根据需求分析的结果,总体结构如图 3-1 所示。 图 3-1 总体结构图 3.2 系统功能模块设计 本课程设计所实现的计算器可以分为以下几个模块实现: 简单的计算器 整数 间的 四则 运算 小数 间的 四则 运算 整数 小数 间的 四则 运算 (1)图形界面设计 (2)数字键处理模块 (3)小数点处理模块 (4)加减乘除运算按键处理模块 (5)结果按键,即等号处理模块 (6)清除模块 3.2.1 图形界面设计 此程序采用一个纵向盒状容器和多个横向盒状容器来设计界面。另外在单行输入控 件的阅读方向属性上用函数

9、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_contain

10、er_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),la

11、bel,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); /按键 3 g

12、tk_box_pack_start(gtk_box(hbox1),button,true,true,5); g_callback(on_num_clicked),null); button = gtk_button_new_with_label(2); /按键 2 gtk_box_pack_start(gtk_box(hbox1),button,true,true,5); g_callback(on_num_clicked),null); button = gtk_button_new_with_label(1); /按键1 gtk_box_pack_start(gtk_box(hbox1),

13、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(vbo

14、x),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(); /有

15、结果则全部清除 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); /数一 else mm = strtod(number,null); /数二 gtk_entry_set_text(gtk_entry(entry),number); /显示 3.2.3 小数点处理模块 小数点按钮的回调函数是较特殊的一个。首先小数点在

16、一个数中只能出现一次,再 按的话则不起作用,小数点按钮在点击后要对所输入的数字做一下处理,使之成为浮 点数,并且让后续数字也转换为相应的浮点数字,关键代码如下: 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)

17、,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 ; coun

18、t = 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; 3.2.5 等号按键处理模块 等号按钮的回调函数是根据当前的计算方法进行相应的运算,并将运算结果输出到 单行输出控件中。其关键代码如下: switch(s) /判断四则运算的符号 case 1: /当

19、+时 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) /清除所有相关标记 gint i; gtk_entry_set_text(gtk_entry(entry),); nn = 0;/第一个数清零 mm = 0 ;/第二个数清零 s = 0; coun

20、t = 0 ; first = true; have_dot = false;/小数点标记 have_result = false;/结果标记 for(i = 0 ; i 100 ; i+) numberi = 0; 4 系统功能测试 4.1 一个 helloworld 窗口 本例子是使用 gtk+2.0 编写一个 helloworld.c 的程序,用以显示一个窗口,并且在 这个窗口的标题栏上显示字符串“hello,world!”。程序截图如图 4-1。 图 4-1 使用 vim 编写 helloworld.c 运行 gcc -wall helloworld.c -o helloworld p

21、kg-config -cflags -libs gtk+-2.0命令编译后, 执行./helloworld 出现窗口,如图 4-2 所示。 图 4-2 helloworld 窗口 4.2 计算器功能测试 (1)计算器主界面,如图 4-3 所示。 图 4-3 计算器主界面 (2)加法运算演示:55+346=401,如图 4-4、4-5、4-6 所示。 图 4-4 输入 55 图 4-5 输入 346 图 4-6 按下等号得出结果 (2)乘法运算演示:321*22=7062,如图 4-7、4-8、4-9 所示。 图 4-7 输入 321 图 4-8 输入 22 图 4-9 按下等号输出结果 (3)

22、除法运算演示:100/3=33.33333,如图 4-10、4-11、4-12 所示。 图 4-10 输入 100 图 4-11 输入 3 图 4-11 按下等号输出结果 5 课程设计总结 通过两周周的数据结构课程设计,我顺利的完成了linux平台下图形界面计算 器设计的课程设计。感觉在这次课程设计中自己受益匪浅,不仅将以前在课堂上学到 的东西从新又巩固了一遍,并且又有所创新,将数据结构的知识与linux知识相结合, 做出了功能丰富的应用程序,还有就是同时发现了以前的不足,及时的弥补! 在课程设计中遇见的课题中的很多技术问题,当然要感谢邓老师能给予认真的指 导,并培养我们独立自立的能力,让我们

23、对自学能力有了很高的提高,在各方面,提 高了我们的主动积极性。同时也要谢谢同学们的相互帮助,感谢有了这些,我才能很 好的顺利的完成我的这次课程设计。 参考文献 1宋国伟.gtk+2.0 编程范例北京:清华大学出版社,2002.11 2谭诰强.c 程序设计北京:清华大学出版社,2004.6 3kurt wall et al.gun/linux 编程指南(第二版)北京:清华大学出版社,2002.6 4严蔚敏,吴伟民.数据结构(c 语言版) 北京:清华大学出版,2009.4 源程序清单: #include #include static gtkwidget *entry; /定义单行输入控件来显示输

24、入输出的数字 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),); n

25、n = 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; gint i; if(have_result) clear_all();/有结果则全部清除 if(count = 6) return; /够 6 位数则不能再输入数字 count+;

26、num = gtk_button_get_label(gtk_button(button);/取数 i = g_strlcat(number,num,100);/保存 if(first) nn = strtod(number,null);/数一 else mm = 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_al

27、l();/全部清除 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();/全部清除 void on_suan_clicked (gtkbutton* button,gpointer data) /当计算按钮 +,-,*,/ 按下时 gint i;

28、 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

29、; 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; gchar *result; switch(s) case 1: /当+时 numb = n

30、n+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 *

31、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, g_callback(gtk_main_quit),null); gtk_window_set_title(gtk_window(window),我的计算器); /主窗口标签栏 gtk_window_set_position(gtk_win

32、dow(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_

33、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_

34、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);/按键 3 gtk_box_pack_start(gtk_box(hbox1),button,true,true,5); g_signal_connect(g_object(button),clicked, g_callback

35、(on_num_clicked),null); button = gtk_button_new_with_label(2);/按键 2 gtk_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);/按键 1 gtk_box_pack_start(gtk_box(hbox1),button,true,true,5); g

36、_signal_connect(g_object(button),clicked, g_callback(on_num_clicked),null); 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 容

37、纳 6、5、4、- gtk_box_pack_start(gtk_box(vbox),hbox2,false,false,5); button = gtk_button_new_with_label(6);/按键 6 g_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);/按键 5 g_signal_connec

38、t(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);/按键 4 g_signal_connect(g_object(button),clicked, g_callback(on_num_clicked),null); gtk_box_pack_start(gtk_box(hbox2),button,true,true,5); button

39、= 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);/按键 9 g_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);/按键 8 g_signal_connect(g_object(button)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论