基于c语言GUI界面的简单学生管理系统

基于c语言的GUI(gtk)的简单学生管理系统

welcome

hello world! 这是第一次写博客,同时将本次课上实训的小作业展示出来 ,请多多关照。

GUI

Graphics User Interface)
图形用户界面,是计算机与使用者之间的对话接口,是计算机重要的组成部分,比如说咱们使用电脑或手机看到的Windows的桌面或wps软件显示的窗口界面等都是GUI,都是图形界面开发出来的图形界面的软件。

GTK+是一套在GIMP的基础上发展而来的高级的、可伸缩的现代化、跨平台图形工具包,它可以很方便地制作图形交互界面( GUI )。
GTK+特点:
稳定、跨平台、多种语言绑定、接口丰富、与时俱进、算法丰富、移动嵌入式应用广泛

[link]http://www.gtk.org/features.php

多余不叙述 直接附图账号shifeng 密码:123456登陆界面
查询界面 id :001 - 004 name:Shifeng等等查询界面

部分代码

首先是创建打开数据库haha1.db:

// An highlighted block
	result1 = sqlite3_open("haha1.db", &db);
	if(result1 != SQLITE_OK)
	{
	  printf("open error!");
	  return -1;
	}

创建数据表 xin存的是登陆账号信息 person存的的学生的姓名、分数、学号

	const char *sql7 = "create table xin(zhanghao char, mima text);";
	sqlite3_exec(db, sql7, NULL, NULL, &errmsg);
	const char *sql = "create table person(id char, name 'text', mark int);";
	sqlite3_exec(db, sql, NULL,NULL, &errmsg);

插入信息到表中


	const char *sql1 = "insert into xin values( 'shifeng', '123456');";//帐号:shifeng  密码: 123456
	int ret1 = sqlite3_exec(db, sql1 , NULL, NULL, &errmsg);
	const char *sql5 = "insert into person values( '001', 'Peter', 80);";
	 sqlite3_exec(db, sql5 , NULL,NULL,&errmsg);
	const char *sql2 = "insert into person values( '002', 'Jerry', 90);";
	 sqlite3_exec(db, sql2 , NULL,NULL,&errmsg);
	const char *sql3 = "insert into person values( '003', 'Shifeng', 70);";
	 sqlite3_exec(db, sql3 , NULL,NULL,&errmsg);
	const char *sql4 = "insert into person values( '004', 'Tony', 70);";

到这里数据库就差不多了

然后创建界面 :这是主界面 不重要

GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *test_button;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
    gtk_window_set_title(GTK_WINDOW(window), "学生管理系统");
    gtk_widget_set_size_request(window, 800, 800);
	// set the organization of window
	GtkWidget *table = gtk_table_new(4, 4, TRUE);
	gtk_container_add(GTK_CONTAINER(window), table);

        GtkWidget *label_title = gtk_label_new("学生管理系统");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 4, 0, 1);

	GtkWidget *label_info = gtk_label_new("帐号:");
	gtk_table_attach_defaults(GTK_TABLE(table), label_info, 0, 1, 1, 2);

	label_pc = gtk_label_new("密码:");
	gtk_table_attach_defaults(GTK_TABLE(table), label_pc, 0, 1, 2, 3);
	
	entry1=gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(entry1),"please input account number:");
	gtk_table_attach_defaults(GTK_TABLE(table), entry1, 1, 4, 1, 2);
        entry2=gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(entry2),"password");
	gtk_table_attach_defaults(GTK_TABLE(table), entry2, 1, 4, 2, 3);
	// setting for button
	GtkWidget *button1 = gtk_button_new_with_label("登录");
	gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 2, 3, 4);
	
	GtkWidget *button2 = gtk_button_new_with_label("关闭");
	gtk_table_attach_defaults(GTK_TABLE(table), button2, 2, 4, 3, 4);

点击按钮事件 回调函数

	g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL);//退出
	g_signal_connect(G_OBJECT(button1), "clicked",G_CALLBACK(panduan), NULL);//进入其他函数开始数据库查询判断
	g_signal_connect(button2, "clicked", G_CALLBACK (gtk_main_quit), NULL); //退出

判断函数panduan() 获取text文本信息 :

同时别忘了全局定义:GtkWidget *entry1=NULL;
还有类型转换GTK_ENYRT(entry1)

	const char *str = gtk_entry_get_text(GTK_ENTRY(entry1));   //帐号
	const char *str1 = gtk_entry_get_text(GTK_ENTRY(entry2));  //密码

用获取到的信息去表中查找,例如我输入shifeng, 而数据库查询语句就是:select zhanghao from xin where zhanghao = ’shifeng‘;此处我用的是sprintf()来写,出现了很多错误,双引号是只读区域,不能修改。gtk entry get text返回的字符串是禁止修改的sprintf会修改第一个参数指向的内存区域。错误:const char *str = gtk_entry_get_text(GTK_ENTRY(entry1)); sprintf(sql2, “select zhanghao from xin where zhanghao = ‘%s’;”, str);
解决办法:

	char c[50],d[50];
    for ( i = 0; str[i] != '\0'; i++)
	  *(c+i) = *(str+i);
	i[c] = '\0';
	for ( i = 0; str1[i] != '\0'; i++)
	  *(d+i) = *(str1+i);
	i[d] = '\0';
	printf("%s\n", str);
	char *sql2 = malloc(100);
	strcpy(sql2, c);
    sprintf(sql2, "select zhanghao from xin where zhanghao ='%s';", c);  

判断语句:ret == SQLITE_OK 仅仅是判断执行语句是否正确

我是用这句话来判断查找信息是否存在:

result = sqlite3_get_table(db, sql3, &dbresult, &nrow, &ncolumn, &errmsg);

代码

	 int ret2 = sqlite3_exec(db, sql2, NULL , NULL, &errmsg);
     printf("sql2: %s\n", sql2);
	 printf("ret2: %d\n", ret2);
	 printf("errmsg: %s\n", errmsg);
	if(ret2 == SQLITE_OK)//判断帐号
	{
          char *sql3 = malloc(100);
	  strcpy(sql3, d);
           sprintf(sql3, "select mima from xin where zhanghao = '%s'and mima = '%s' ;", c, d);//查询密码和帐号匹配语句
	   int ret3 = sqlite3_exec(db, sql3, NULL , NULL, &errmsg);
	   printf("sql3: %s\n", sql3);
	    
	   printf("errmsg: %s\n", errmsg);
	
	   if(ret3 == SQLITE_OK)//判断密码

	   {
		result = sqlite3_get_table(db, sql3, &dbresult, &nrow, &ncolumn, &errmsg);
		if(nrow == 0)
			  printf("帐号密码:没有这个信息!");
			else
			  show_test_window();// 如果正确进入查询界面

		 //  print_stu_db_get_table(db,sql2,sql3);
	     //  show_test_window();// 如果正确进入查询界面
	  
	   }
	   else
	       printf("语句错误!\n"); //密码错误
	}    
	else
	    printf("语句错误!\n"); //帐号错误

代码在资源里 :

源代码,里面有操作过程,注意事项,认真看博客
或者:在微信搜索公众号:MeiXiangDao2020 媒想到叭
回复:学生管理系统 获取资源

  • 13
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sf9090

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值