GTK简单版计算器

接下来我们做一个简单版的计算器。

1)获取按钮上的内容。

2)如果获取的内容是“ c ”,则代表进行退格操作,相当于删去最后一个字符。

3)如果获取的内容不是“ c ”,则把每一次获取的内容连接起来,如:

第一次按了 “ 1 ”, 第二次按了 “ + ”, 第三次按了 “ 1 ”, 连起来则变为 “1+1”。

4)如果获取的内容是“ = ”,则需要相应的运算。先把连起来的字符串拆出来,然后再进行相应操作,最后把运算结果重新显示到行编辑上。

完整代码如下:

 #include <gtk/gtk.h>
 #include <stdio.h>
 #include <string.h>

char buf[50] = "";

void deal_num(GtkButton *button, gpointer data)
{
	const char *text = gtk_button_get_label(button);

	//退个操作
	if (0 == strcmp(text, "c")) {
			buf[strlen(buf) - 1] = 0;
	}
	else
	{
		int a = 0, b = 0;
		char c;
		strcat(buf,text);

		if (0 == strcmp("=", text)) {
			printf("text==##%s##\n",text);
			sscanf(buf, "%d%c%d", &a, &c, &b);

			printf("---------001-----%c--\n",c);
			if ('+' == c) {
					sprintf(buf,"%d", a+b);
			}
			else if ('-' == c) {
					sprintf(buf, "%d", a-b);
			}
			else if ('*' == c) {
					sprintf(buf, "%d", a*b);
			}
			else if ('/' == c) {
					sprintf(buf, "%d", a/b);
			}

		}
	}

	gtk_entry_set_text(GTK_ENTRY(data), buf);

	return;
}

 int main(int argc,char *argv[])
 {
	 //1.gtk环境初始化
	 gtk_init(&argc, &argv);

	 //2.创建一个窗口
	 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	 //3.创建一个表格容器5行4列
	 GtkWidget *table = gtk_table_new(5,4,TRUE);
	 //将table加入到window中
	 gtk_container_add(GTK_CONTAINER(window), table);

	 //4.创建一个行编辑
	 GtkWidget *entry = gtk_entry_new();
	 //设置行编辑的内容
	 gtk_entry_set_text(GTK_ENTRY(entry), "2+2=4");
	 //设置行编辑不允许编辑,只能显示用
	 gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);

	 //5.创建多个按钮
	 GtkWidget *button0 = gtk_button_new_with_label("0");//数值键0
	 GtkWidget *button1 = gtk_button_new_with_label("1");//数值键1
	 GtkWidget *button2 = gtk_button_new_with_label("2");//数值键2
	 GtkWidget *button3 = gtk_button_new_with_label("3");//数值键3
	 GtkWidget *button4 = gtk_button_new_with_label("4");//数值键4
	 GtkWidget *button5 = gtk_button_new_with_label("5");//数值键5
	 GtkWidget *button6 = gtk_button_new_with_label("6");//数值键6
	 GtkWidget *button7 = gtk_button_new_with_label("7");//数值键7
	 GtkWidget *button8 = gtk_button_new_with_label("8");//数值键8
	 GtkWidget *button9 = gtk_button_new_with_label("9");//数值键9

	 GtkWidget *button_add = gtk_button_new_with_label("+");//加号
	 GtkWidget *button_minus = gtk_button_new_with_label("-");//减号
	 GtkWidget *button_mul = gtk_button_new_with_label("*");//乘号
	 GtkWidget *button_div = gtk_button_new_with_label("/");//除号
	 GtkWidget *button_equal = gtk_button_new_with_label("=");//等号
	 GtkWidget *button_delete = gtk_button_new_with_label("c");//退格键

	 //6.布局将上面的按钮均放入table容器中
	 gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);

	 gtk_table_attach_defaults(GTK_TABLE(table), button0, 0, 1, 4, 5);
	 gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 1, 3, 4);
	 gtk_table_attach_defaults(GTK_TABLE(table), button2, 1, 2, 3, 4);
	 gtk_table_attach_defaults(GTK_TABLE(table), button3, 2, 3, 3, 4);
	 gtk_table_attach_defaults(GTK_TABLE(table), button4, 0, 1, 2, 3);
	 gtk_table_attach_defaults(GTK_TABLE(table), button5, 1, 2, 2, 3);
	 gtk_table_attach_defaults(GTK_TABLE(table), button6, 2, 3, 2, 3);
	 gtk_table_attach_defaults(GTK_TABLE(table), button7, 0, 1, 1, 2);
	 gtk_table_attach_defaults(GTK_TABLE(table), button8, 1, 2, 1, 2);
	 gtk_table_attach_defaults(GTK_TABLE(table), button9, 2, 3, 1, 2);

	 gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1, 2, 4, 5);
	 gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2, 3, 4, 5);
	 gtk_table_attach_defaults(GTK_TABLE(table), button_mul , 3, 4, 2, 3);
	 gtk_table_attach_defaults(GTK_TABLE(table), button_div, 3, 4, 3, 4);
	 gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3, 4, 4, 5);
	 gtk_table_attach_defaults(GTK_TABLE(table), button_delete, 3, 4, 1, 2);

	 //7.注册信号函数,把entry传给回调函数deal_num()
	 g_signal_connect(button0, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button1, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button2, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button3, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button4, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button5, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button6, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button7, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button8, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button9, "pressed", G_CALLBACK(deal_num), entry);

	 g_signal_connect(button_add, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button_mul, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button_div, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button_minus, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button_equal, "pressed", G_CALLBACK(deal_num), entry);
	 g_signal_connect(button_delete, "pressed", G_CALLBACK(deal_num), entry);

	 //7.显示所有控件
	 gtk_widget_show_all(window);

	 //8.主事件循环
	 gtk_main();

	 return 0;
 }

运行结果:

源码下载:http://download.csdn.net/download/lianghe_work/8936329

转自:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 13:59:45

GTK简单版计算器的相关文章

简单版计算器

解题思路 一.计算器运算规则 优先级                    匹配格式 1. 小括号(最底层的)                    括号里没有括号 小括号里算式计算优先级: 2.幂运算            (正数)**(正数).(正数)**(负数)     ---支持小数 3.乘除                (正数或负数)(*/)(正数或负数)         ---支持小数 4.加减                (正数或负数)(+-)(正数或负数)         -

超级简单版多态计算器

个人笔记学习黑马四期 一.编写一个操作父类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 多态计算器 { /// <summary> /// 计算父类 /// </summary> class Operation { public int NumA { get; set; } p

Swift之旅:1.概述-用Swift实现一个简单的计算器

学习所用到的资源: 斯坦福大学公开课:iOS 8开发 网易空开课地址链接:斯坦福大学公开课:IOS8开发 github上字幕链接:字幕 百度网盘资源下载链接:百度网盘 1.详解IOS编程的四个层 ①cocoa touch层 这是我们最长用到的层,里面最长用到的当然是最基础的控件 ②媒体层(Media) ③核心服务层 ④核心操作系统层 2.新建一个Swift的IOS工程 ①打开Xcode,按照图示新建一个工程 ②选择Application 然后 单击Sigle View Application.

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(Caliburn.Micro框架概述 - https://blog.csdn.net/lzuacm/article/details/78886436) 是一个轻量级的WPF框架,简化了WPF中的不少用法,推荐做WPF开发时优先使用. 真正快速而熟练地掌握一门技术就可以尝试着用最快的

JS实现一个简单的计算器

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElementById( id名 ).value 获取或设置 id名的值. 第三步: 获取通过下拉框来选择的值来改变加减乘除的运算法则. 提示:使用switch判断运算法则. 第四步:  通过 = 按钮来调用创建的函数,得到结果. 注意: 使用parseInt

分享一个近期写的简单版的网页采集器

分享一个近期写的简单版的网页采集器 功能特点: 1.可通过配置,保存采集规则. 2.可通过采集规则,进行数据采集. 3.可分页,分关键字,进行采集. 4.可保存数据至数据库,文本中. ........... 功能还比较简单,喜欢深入的可以继续深入下去,暂时还没有登录的功能,因为登录功能涉及到的范围比较广,待日后慢慢研究后再开发. 我先上个图让大家一睹为快吧: 首先看看页面,我们要采集这个网站的文章 接下来,首先是查找分页,获得分页里面的文章链接,接着查找内容页需要采集的字段,生成规则,进行采集.

留念 C语言第一课简单的计算器制作

学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h>  #include<stdlib.h> #include<conio.h>void displayMenu();void add();void sub();void multiply();void divide();void yushu();void jiecheng();void leijia();void jiechengleijia();int main(in

Java实现简单版SVM

最近的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,因为没有用到拉格朗日,对偶,核函数等等.而是用最简单的梯度下降法求解.其中的数学原理我参考了http://blog.csdn.net/lifeitengup/article/details/10951655,文中是用matlab实现的svm. 源代码和数据集下载:https://github.com/linger2012/simpleSvm 其中数据集来自于libsvm,我找了其中

MFC抓取网页代码简单版。

最近又在网上找了一些有关MFC抓取网页代码的文章看,发现有个比较简单的代码,和大家分享下. CInternetSession session(NULL, 0); CHttpFile* htmlFile = NULL; CString strLine, strHtml; CString url = _T("http://www.tqyb.com.cn/data/gzWeather/gz_weatherForecastInDays.js?"); TCHAR sRecv[1024]; UIN