基础部分实验报告题目:科技成果信息管理系统专业:班级:学号:姓名:成绩:
计算机科学与技术1204
指导教师:
目录一、系统功能结构设计…………………………………………………………………
二、数据结构设计
114
……………………………………………………………………………………………………………………………………
三、程序结构四、函数原型及功能五、试验结果六、实验体会
…………………………………………………………………9…………………………………………………………………13……………………………………………………………………29
七、附录1:参考文献……………………………………………………………………31八、附录2:程序清单……………………………………………………………………31
C语言课程设计实验报告一、系统功能结构设计
航科技成果信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。如下图所示:二、数据结构设计
1.单位信息链结点结构(DEPT_NODE)及用法
typedefstructdept_node
1C语言课程设计实验报告{
charnumber[8];/*单位编号*/charname[30];/*单位名称*/charPIC[20];/*负责人*/structdept_node*next;/*指向下一结点*/
structarchs_node*achs;/*指向科技成果信息链结点的指针*/GtkTreeIteriter;/*treeview中对应treeiter*/}DEPT_NODE;
中文字段名单位编号单位名称负责人类型及长度char[8]char[30]char[20]变量名举例43007401Huazhong_university_of_sci&techLi_peigengnumbernamePIC
2.科技成果信息链结点结构(ACHS_NODE)及用法
typedefstructachs_node{
charnumber[12];/*成果编号*/charname[50];/*成果名称*/charfield[20];/*所属技术领域*/charfirst_dept_name[30];/*第一完成单位*/charfirst_dept_number[8];/*第一完成单位编号*/charfirst_member_name[20];/*第一完成人*/charaward_name[30];/*获奖名称*/charaward_level[10];/*获奖档次*/charaward_grade[10];/*获奖等级*/structarhs_node*next;/*指向下一节点*/
structmember_node*members;/*指向完成人员信息结点的指*/GtkTreeIteriter;/*treeview中对应treeiter*/}ACHS_NODE;
中文字段名成果编号成果名称所属技术领域第一完成单位第一完成单位编号第一完成人获奖名称获奖档次类型及长度char[12]char[40]char[20]char[30]变量名举例200703150001The_method_of_studycomputerHuazhong_university_of_sci&tech43007401Lu_zhengdingNatural_science_of_hubie_provinceprovince/*省级*/numbenamefield
first_dept_namefirst_dept_numberfirst_member_nameaward_nameaward_level
2first_dept_number
char[20]char[30]char[10]C语言课程设计实验报告获奖等级intaward_grade1/*一等奖*/3.
完成人员信息链结点结构(MEMBER_NODE)及用法
typedefstructmember_node{
charnumber[18];/*身份证号*/charname[20];/*姓名*/chardept_name[30];/*工作单位*/charsex[4];/*性别*/intage;/*年龄*/chartitle[15];/*职称*/intrank;/*成果排名*/
charachs_name[40];/*所属成果名称*/
structmember_node*next;/*指向下一个结点*/GtkTreeIteriter;/*treeview中对应treeiter*/}MEMBER_NODE;
中文字段名姓名身份证号工作单位性别年龄职称成果排名所属成果名称类型及长度char[20]char[18]char[30]charintchar[15]intchar[40]举例numbername
dept_namesexagetitlerank
achs_name
Lu_zhengding420111194801012216Huazhong_university_of_sci&techm60professor1The_method_of_study4.
三方向的十字交叉链表结构
…
…
2C语言课程设计实验报告5.
{
登陆窗体控件结构体(wgt)及用法
structlogin_widget
GtkWidget*window;//主窗体
GtkWidget*label_tips;//用于信息提示的标签
GtkWidget*button_login;//两个按钮,一个点击后登录,一个点击后退出GtkWidget*button_exit;
GtkWidget*entry_username;//两个文本框,用于输入用户名和密码GtkWidget*entry_pwd;
GtkWidget*label_username;//两个标签用于显示username文本框和password文本框提示
GtkWidget*label_pwd;
GtkWidget*vbox;//垂直布局盒子,包含以下三个水平布局盒子
GtkWidget*hbox_username;//包含用户名提示标签和用户名文本框,下面的HBOX作用类似
GtkWidget*hbox_pwd;GtkWidget*hbox_button;}wgt;
说明:将登陆窗体相关控件成一个结构体
6.
指向3种节点的指针联合及用法
typedefunionnodep{
structdept_node*dept;structachs_node*achs;
structmember_node*member;}nodep;
说明:用于3种结构都会用到但不会同时用到的情形
7.
两个传递参数的结构及其用法
structnodecreate{
GtkWidget*window;GtkWidget*entry[9];nodepunp;inttype;};
structquery_judge
3C语言课程设计实验报告{
GtkWidget*entry;intflag;};
说明:GTK信号连接g_signal_connected将函数与信号链接后之内传递一个参数给函数,所以定义这两个结构分别将几个参数结合在一起传递
三、程序结构1.
主程序运行流程
开始登陆框出现输入用户名与密码主界面初始化加载数据或重新添加系统功能模块的选择及运行退出系统前提示保存链表数据清理内存中的缓存信息,关闭系统结束4C语言课程设计实验报告2.数据保存流程
开始打开航班,经停机场,经停航班信息文件P1==NULLY
N
在文件1写入一条单位信息Y
P1=P1->nextP2==NULLN
在文件2写入一条科技成果信息P2=p2->nextY
P3==NULL关闭文件退出系统N
在文件3写入一条完成人员信息P3=p3->next结束5C语言课程设计实验报告3.
添加流程
6C语言课程设计实验报告4.
单位查询流程
7C语言课程设计实验报告5.统计50岁以下第一完成人流程
开始调用统计函数statis_func3创建一个GtkListStore,P1=gp_headP1==NULLP1=p1->nextY
N
获取第二级链表的链头指针p2=p1->achsYP2==NULLP2=p2->nextNP3=MEMBER_search(p2->first_member_name,p2->members)N
P3->age<50N
Y插入liststore将ListStore传递给Statis_info展示出来结束8C语言课程设计实验报告四、函数原型及功能
(所有GtkWidget*button参数均为与消息链接用)
1.登陆模块
//功能:登录框初始化函数//输入参数://返回值:无
voidinit_login_widget()
//功能:登录验证函数,点击login按钮时调用//输入参数://返回值:无
voidlogin(GtkWidget*widget,gpointerdata)
2.图形界面模块
/**初始化部分变量,再依次调用各函数初始化界面各部分*/intmain(intargc,char*argv[])/**初始化菜单栏*/
voidinit_menubar(GtkWidget*menubar)/**初始化目录*/
voidcreate_view_and_model(void)/**初始化显示栏*/
voidinit_show(GtkWidget*list)/**改变状态栏及显示栏*/
voidon_changed(GtkWidget*widget,gpointerstatusbar)//功能:将选中的节点信息在显示栏中显示出来//输入参数:iter//返回值:无
intShow_Node(GtkTreeIteriter)//值传递不影响selectediter/**对应3个节点显示的3个函数,返回对应GtkListStore*/GtkListStore*Show_Dept(char*name);
GtkListStore*Show_Achs(char*name,char*P_name);
GtkListStore*Show_Member(char*name,char*P_name,char*PP_name);
3.文件模块
//功能:读取数据文件//输入参数:
//返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功intLoadData(GtkWidget*button)
//功能:读取数据文件中数据到链表中
//输入参数:phead单位节点头指针的地址
//返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功
9C语言课程设计实验报告intLoadList(DEPT_NODE**phead)
//功能:将链表中节点添加到左侧树状列表中//输入参数://返回值:
voidrebuildtree()
//功能:存储数据文件//输入参数:
//返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功intSaveData(GtkWidget*button)
//功能:将链表中数据存储在数据文件中//输入参数:phead单位节点头指针
//返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功intSaveList(DEPT_NODE*phead)//功能:推出前提示保存//输入参数://返回值:
voidquit_save(GtkWidget*button)
4.查询模块
//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无
voidQuery_info(GtkWidget*button,inttype)//功能:查询学院
//输入参数:in包含iter和名称的结构//返回值:无
voidQuery_Dept(GtkWidget*button,structquery_judge*in)
//功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无
voidQuery_info(GtkWidget*button,inttype)//功能:查询完成人员
//输入参数:in包含iter和名称的结构//返回值:无
voidQuery_Member(GtkWidget*button,structquery_judge*in)//功能:展开并跳转至指定iter
//输入参数:itertreeview中的一个目标iter//返回值:无
voidexpand_select(GtkTreeIteriter)//功能:按名称搜索单位
//输入参数:D_name单位名称//返回值:单位节点指针
DEPT_NODE*DEPT_search(char*D_name)
10C语言课程设计实验报告//功能:按名称搜索科技成果节点
//输入参数:A_name科技成果节点名称,ACHS所在学院头科技成果节点指针//返回值:科技成果节点节点指针
ACHS_NODE*ACHS_search(char*A_name,ACHS_NODE*ACHS)//功能:按名称搜索完成人员节点
//输入参数:M_name完成人员节点名称,ACHS所属科技成果头完成人员节点指针
//返回值:完成人员节点节点指针
MEMBER_NODE*MEMBER_search(char*M_name,MEMBER_NODE*MEMBER)
5.添加模块
//功能:弹出一个输入框
//输入参数:type对应枚举的几种类型//返回值:无
voidentry_info(GtkWidget*button,inttype)
//功能:添加3种节点统一函数,由entry_info确定按钮调用//输入参数://返回值:无
voidAdd_node(GtkWidget*button,structnodecreate*nodec)//功能:插入科技成果节点函数,由Add_Node中情况3调用//输入参数:pNew指向新节点的指针//返回值:对应单位节点指针
DEPT_NODE*insert_ACHS(ACHS_NODE*pNew)
//功能:插入完成人员节点函数,由Add_Node中情况4调用//输入参数:pNew指向新节点的指针//返回值:对应科技成果节点指针
ACHS_NODE*insert_MEMBER(MEMBER_NODE*pNew)
6.删除模块
//功能:删除3种节点统一函数,由“删除”按钮调用//输入参数://返回值:无
voidDel_Node(GtkWidget*button)
//功能:删除单位节点,由Del_Node函数case2调用//输入参数:name单位名称
//返回值:int1为有错,0为正常intDel_Dept(char*name)//功能:删除科技成果
节点,由Del_Node函数case2调用
//输入参数:name科技成果名称,P_name对应单位名称//返回值:int1为有错,0为正常
11C语言课程设计实验报告intDel_Achs(char*name,char*P_name)
//功能:删除完成人员节点,由Del_Node函数case4调用
//输入参数:name完成人员名称,P_name对应科技成果名称,PP_name对应单位名称
//返回值:int1为有错,0为正常
intDel_Member(char*name,char*P_name,char*PP_name)
7.编辑模块
//功能:弹出一个编辑框//输入参数://返回值:无
intEdit_info(GtkWidget*button)//功能:编辑节点//输入参数://返回值:无
voidEdit_Node(GtkWidget*button,structnodecreate*nodec)
8.统计模块
//功能:弹出一个统计框,由传入参数设置具体内容
//输入参数:title统计框标题,col1第一列标题,col2第二列标题,in传入的model
//返回值:无
voidStatis_info(char*title,char*col1,char*col2,GtkListStore*in)//功能:统计各单位科技成果数量,调用Statis_info显示统计结果//输入参数://返回值:无
voidstatis_func1(GtkWidget*button)
//功能:统计各单位完成人员成果排名,调用Statis_info显示统计结果//输入参数://返回值:无
voidstatis_func2(GtkWidget*button)
//功能:统计所有50岁以下第一完成人,调用Statis_info显示统计结果//输入参数://返回值:无
voidstatis_func3(GtkWidget*button)
9.帮助模块
//功能:弹出软件信息及作者信息//输入参数://返回值:无
voidhelp_about(GtkWidget*button)
五、试验结果
12C语言课程设计实验报告编译环境:Ubuntulinux位
MingwGcc
(源代码配置好后可跨平台编译)
GTK版本:GTK+2.41开发IDE:Codeblocks12.111.系统登陆
输对自动进入
输错显示错误
13C语言课程设计实验报告2.登陆成功进入主界面
3.全屏模式
4.读取数据
14C语言课程设计实验报告(标准gnome菜单栏在最上面)5.读取成功
点击相应节点右侧显示相关信息6.添加单位
15C语言课程设计实验报告(添加成功提示)
16C语言课程设计实验报告7.添加科技成果
17C语言课程设计实验报告8.添加完成人员
9.添加错误返回信息
18C语言课程设计实验报告19C语言课程设计实验报告10.编辑结点
(选中节点后点击左下角编辑按钮)
20C语言课程设计实验报告更改生效
11.删除节点
弹出确认框
21C语言课程设计实验报告删除成功
12.查询单位
22C语言课程设计实验报告查询成功,左侧已跳转至并展开机械学院
13.查询科技成果
查询成功,左侧已跳转至并展开网络磁盘阵列
23C语言课程设计实验报告未查询到时弹出提示
14.查询完成人员
24C语言课程设计实验报告从头查询,跳转至并展开第一个张江
点击查询,跳转至并展开第二个张江
25C语言课程设计实验报告15.统计各单位科技成果总数及各类成果数
16.统计各单位成果排名
26C语言课程设计实验报告17.统计50岁以下第一完成人
18.软件信息及作者信息
27C语言课程设计实验报告19.退出前提示保存
六、实验体会
首先我看了一下实验书上的编程规范和几个基本模块的实现思想,但当我开始做的时候我发现光用face.c自己看不懂文本菜单操作肯定会有很多问题的,于是我想同样是学,不如直接学图形界面的开发。因为之前有些linux下的经验,所以选择了GTK+在linux下开发。
之前完全没有接触过GTK+和图形界面开发的东西,于是便开始了两个多星期的GTK+学习。GTK+的资料并不如windowsSDK等一些主流技术那么多,中文资料的情况基本就是少,乱,老。没有合适的书,只找到一份网页中文教程,但做得还挺不错,边看教程边实验边查官网的ReferenceManual,算是学了个大概。我觉得经过这次我对在网上学技术有了更多的认识,的确是最佳的方式。
28C语言课程设计实验报告在一开始我通过头文件和多个.C文件来划分了一下整个程序的模块,虽然不是一开始规划完整体的结构,但边写边规划还是很不错的,这个可以根据各处开头的注释看出那种模块化的感觉。我在开发的过程中,一直都重点地考虑了重用性,抽取定义了一些多处重复使用的函数,IO.c里面的函数基本都是这样的。我也定义了许多函数指针数组、枚举常量等等来将3种节点的情况在一个函数里完成,包括输入框等的生成也是同一个for循环不同的条件。
我写完主界面后因为比较顺利,一次写完了3块东西才一起调试,结果大量的问题一下涌现,调试毫无头绪。那段时间真是绝望到怀疑自己能不能写出能运行的成品。后来只能又重新学习更多调试方法与技巧,然后再循序渐进地先看warning,再看代码,再用GDB,一个问题一个问题解决,经过同学的给力帮助还有自己在网上学习查找相关内容终于在解决了几个关键问题后跨过了这一步。那将近一个星期完全没有新代码,花了好几倍的时间调试之前的那几个模块,不过感觉很多基本调试方法之前都没掌握,还是很值得很有收获的,之后的调试便顺利多了。C语言的问题很多都是极小的问题但经过
最后进入写报告阶段,之前就做了一些准备,也有很多word排版的经验,所以效果自认为还不错吧,主要是电子版。就是流程图上因为和图形界面交互的操作比较繁琐,不知道处理得是否得当。
回顾整个课设的历程,第一次做这种实用的大型程序,又是边学边用GTK+,确实是边写边积累了很多宝贵的经验。收获在前面已经说了很多了,另一方面真的是深感自己知识与能力的不足,不要好高
29C语言课程设计实验报告骛远,想着要学什么什么多少,学了后踏踏实实地写出点东西才是真的学到了,还好感觉这次已经弥补了足够多的欠缺。
系统本身也还有许多有待完善的地方,也如果有需要的话接下来可以做下。我用的各种查找的方法都有点太依赖于名称,和遍历的方法比起来有很多缺点,但在大量数据的情况也有优势,可以结合一下。跟真正使用的系统比起里又更是差距甚远,这次感觉到软件的体验方面对程序员来说也真的是个大问题,这个以后可以在工作中和PM好好合作做好把。
就是这样了,C语言的入门算是以课设结束了吧,接下来还有很多用C的地方,下次再见吧。
七、附录1:参考文献
[1]gtk2-tutorial2[2]gtk2ReferenceManual
[3]李开,卢萍,曹计昌.C语言实验与课程设计,北京:科学出版社,2011.
八、附录2:程序清单1)achsMIS.h
#ifndef_ACHSMIS_H#define_ACHSMIS_H/*-------头文件---------*/#include 30C语言课程设计实验报告#defineNAME\"root\"#definePWD\"123456\"/******************** 结构声明 *********************/ /**完成人员信息链结点结构*/typedefstructmember_node{ charnumber[18];/*身份证号*/charname[20];/*姓名*/chardept_name[30];/*工作单位*/charsex[4];/*性别*/intage;/*年龄*/chartitle[15];/*职称*/intrank;/*成果排名*/ charachs_name[40];/*所属成果名称*/ structmember_node*next;/*指向下一个结点*/GtkTreeIteriter;/*treeview中对应treeiter*/}MEMBER_NODE; /**科技成果信息链结点结构*/typedefstructachs_node{ charnumber[12];/*成果编号*/charname[50];/*成果名称*/charfield[20];/*所属技术领域*/charfirst_dept_name[30];/*第一完成单位*/charfirst_dept_number[8];/*第一完成单位编号*/charfirst_member_name[20];/*第一完成人*/charaward_name[30];/*获奖名称*/charaward_level[10];/*获奖档次*/charaward_grade[10];/*获奖等级*/structarhs_node*next;/*指向下一节点*/ structmember_node*members;/*指向完成人员信息结点的指针*/GtkTreeIteriter;/*treeview中对应treeiter*/}ACHS_NODE; /**单位信息链结点结构*/typedefstructdept_node{ charnumber[8];charname[30];charPIC[20]; /*单位编号*//*单位名称*/ /*负责人*/ 31C语言课程设计实验报告structdept_node*next;/*指向下一结点*/ structarchs_node*achs;/*指向科技成果信息链结点的指针*/GtkTreeIteriter;/*treeview中对应treeiter*/}DEPT_NODE; /**将登陆窗体成一个结构体*/structlogin_widget{ GtkWidget*window;//主窗体 GtkWidget*label_tips;//用于信息提示的标签 GtkWidget*button_login;//两个按钮,一个点击后登录,一个点击后退出GtkWidget*button_exit; GtkWidget*entry_username;//两个文本框,用于输入用户名和密码GtkWidget*entry_pwd; GtkWidget*label_username;//两个标签用于显示username文本框和password文本框提示 GtkWidget*label_pwd; GtkWidget*vbox;//垂直布局盒子,包含以下三个水平布局盒子 GtkWidget*hbox_username;//包含用户名提示标签和用户名文本框,下面的HBOX作用类似 GtkWidget*hbox_pwd;GtkWidget*hbox_button;}wgt; typedefunionnodep/*指向节点的指针联合*/{ structdept_node*dept;structachs_node*achs; structmember_node*member;}nodep; structnodecreate/*传递参数*/{ GtkWidget*window;GtkWidget*entry[9];nodepunp;inttype;}; structquery_judge{ GtkWidget*entry;intflag;}; /*传递参数*/ 32C语言课程设计实验报告/******************** 全局变量 *********************/GtkWidget*window;/*主界面窗口*/GtkWidget*showlist;/*显示属性的位置*/GtkListStore*liststore;GtkListStore*lstore[3];/*显示栏左边项目名liststore组*/GtkTreeStore*treestore;/*树形储存*/GtkWidget*treeview;/*树状列表目录*/GtkTreeIterrootiter;/*根位置*/GtkTreeIterselectediter;/*选中的位置*//*显示属性liststore的控件组*/GtkTreeIterdept_iter[3];GtkTreeIterachs_iter[9];GtkTreeItermember_iter[8];DEPT_NODE*gp_head;char**Str_Pointer[3];void(*query_node[3])(); /*主链头指针*/ /*mylib.c中已初始化的全局变量*/externchar*gp_dept_info_filename;externchar*gp_achs_info_filename;externchar*gp_member_info_filename;externchar*Node_Str[];externintNODE_INS[];externchar*Dept_Str[];externchar*Achs_Str[];externchar*Member_Str[]; enum//iter里的列号{ COLUMN=0,COMMENT};enum{ TYPE_ROOT=1,TYPE_DEPT,TYPE_ACHS,TYPE_MEMBER}; 33C语言课程设计实验报告/******************** 函数声明 *********************//**main.c*/ voidinit_menubar(GtkWidget*menubar);voidcreate_view_and_model(void);voidinit_show(GtkWidget*list); voidon_changed(GtkWidget*widget,gpointerstatusbar);/**file.c*/ intLoadData(GtkWidget*button);intLoadList(DEPT_NODE**phead);voidrebuildtree(); intSaveData(GtkWidget*button);intSaveList(DEPT_NODE*phead);voidquit_save(GtkWidget*button); /**operate.c*/ voidAdd_node(GtkWidget*button,structnodecreate*nodec);DEPT_NODE*insert_ACHS(ACHS_NODE*pNew); ACHS_NODE*insert_MEMBER(MEMBER_NODE*pNew);intDelNode(GtkWidget*button);voidDel_Node(GtkWidget*button);intDel_Dept(char*name); intDel_Achs(char*name,char*P_name); intDel_Member(char*name,char*P_name,char*PP_name);voidEdit_Node(GtkWidget*button,structnodecreate*nodec); /**IO.c*/ voiddialog_info(char*show); voidentry_info(GtkWidget*button,inttype);intEdit_info(GtkWidget*button); voidQuery_info(GtkWidget*button,inttype); voidf_cancel(GtkWidget*button,GtkWidget*win);gintJudge_NODE_Type(GtkTreeIter*iter);intShow_Node(GtkTreeIteriter); GtkListStore*Show_Dept(char*name); GtkListStore*Show_Achs(char*name,char*P_name); GtkListStore*Show_Member(char*name,char*P_name,char*PP_name);voiditoa(inti,char*str);/**query.c*/ 34C语言课程设计实验报告voidQuery_Dept(GtkWidget*button,structquery_judge*in);voidQuery_Achs(GtkWidget*button,structquery_judge*in);voidQuery_Member(GtkWidget*button,structquery_judge*in);voidexpand_select(GtkTreeIteriter); DEPT_NODE*DEPT_search(char*D_name); ACHS_NODE*ACHS_search(char*A_name,ACHS_NODE*ACHS); MEMBER_NODE*MEMBER_search(char*M_name,MEMBER_NODE*MEMBER);/**statistics.c*/ voidstatis_func1(GtkWidget*button);voidstatis_func2(GtkWidget*button);voidstatis_func3(GtkWidget*button); /**login.c*/ voidgtk_win_destroy(GtkWidget*widget,gpointerdata);voidlogin(GtkWidget*widget,gpointerdata);voidinit_login_widget(); /**help.c*/ voidhelp_about(GtkWidget*button);#endif 2)mylib.c #include\"achsMIS.h\" /**<数据文件全局变量*/ char*gp_dept_info_filename=\"dept.dat\";char*gp_achs_info_filename=\"achs.dat\"; char*gp_member_info_filename=\"member.dat\";据文件*/ /**3类节点名称字符串数组*/char*Node_Str[]={ \"单位\\"科技成果\\"完成人员\"}; /**3类信息需填资料个数*/intNODE_INS[]={ 0,0,3,9,8 35/*单位信息数据文件*//*成果信息数据文件*/ /*完成人员信息数 C语言课程设计实验报告}; /**3类信息需填资料字符串数组*/char*Dept_Str[]={ \"单位编号:\\"单位名称:\\"负责人:\"}; char*Achs_Str[]={ \"成果编号:\\"成果名称:\\"所属技术领域:\\"第一完成单位:\\"第一完成单位编号:\\"第一完成人:\\"获奖名称:\\"获奖档次:\\"获奖等级:\"}; char*Member_Str[]={ \"身份证号:\\"姓名:\\"工作单位:\\"性别:\\"年龄:\\"职称:\\"成果排名:\\"所属成果名称\"}; 3)main.c #include\"achsMIS.h\"/******************** main函数 *********************/intmain(intargc,char*argv[]){ GtkWidget*vbox=NULL; 36C语言课程设计实验报告GtkWidget*hbox,*hbox2;GtkWidget*menubar;GtkWidget*scrolled;GtkWidget*remove;GtkWidget*edit; GtkWidget*statusbar;GtkTreeSelection*selection;gtk_init(&argc,&argv);Str_Pointer[0]=Dept_Str;Str_Pointer[1]=Achs_Str;Str_Pointer[2]=Member_Str;query_node[0]=Query_Dept;query_node[1]=Query_Achs;query_node[2]=Query_Member; window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//TODO:登陆框,另存为/**主窗口*/ gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_window_set_default_size(GTK_WINDOW(window),700,525); gtk_window_set_title(GTK_WINDOW(window),\"科技成果信息管理系统by祝迪\"); gtk_container_set_border_width(GTK_CONTAINER(window),0);gtk_widget_realize(window); g_signal_connect(G_OBJECT(window),\"destroy\ G_CALLBACK(quit_save),NULL); vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox);/**菜单栏*/ menubar=gtk_menu_bar_new();init_menubar(menubar); gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,0);/**滚动条*/ hbox=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(vbox),hbox); scrolled=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 37C语言课程设计实验报告GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_ETCHED_IN); vbox=gtk_vbox_new(FALSE,6); gtk_container_add(GTK_CONTAINER(hbox),vbox);gtk_widget_set_usize(GTK_WIDGET(vbox),200,500); gtk_box_pack_start(GTK_BOX(vbox),scrolled,TRUE,TRUE,10); /**目录*/ create_view_and_model();//初始化treeview gtk_container_add(GTK_CONTAINER(scrolled),treeview);/**下方两按钮*/ hbox2=gtk_hbox_new(TRUE,4); edit=gtk_button_new_with_label(\"编辑\");g_signal_connect(G_OBJECT(edit),\"clicked\ G_CALLBACK(Edit_info),NULL); remove=gtk_button_new_with_label(\"删除\");g_signal_connect(G_OBJECT(remove),\"clicked\ G_CALLBACK(Del_Node),NULL); gtk_box_pack_start(GTK_BOX(hbox2),edit,FALSE,FALSE,0);gtk_box_pack_start(GTK_BOX(hbox2),remove,FALSE,FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,3);/**展示区域*/ showlist=gtk_tree_view_new();//全局变量 vbox=gtk_vbox_new(FALSE,6); gtk_container_add(GTK_CONTAINER(hbox),vbox);gtk_widget_set_usize(GTK_WIDGET(vbox),500,500); gtk_box_pack_start(GTK_BOX(vbox),showlist,TRUE,TRUE,5);init_show(showlist);/**状态栏*/ statusbar=gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(vbox),statusbar,FALSE,FALSE,5); selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));g_signal_connect(selection,\"changed\ G_CALLBACK(on_changed),statusbar); /**登陆栏*/ init_login_widget();gtk_main();return0;} 38C语言课程设计实验报告/**************界面初始化**************/ /**初始化菜单栏*/ voidinit_menubar(GtkWidget*menubar){ /**\"文件\"子菜单*/GtkWidget*file; GtkWidget*filemenu;GtkWidget*load;GtkWidget*save;GtkWidget*quit; file=gtk_menu_item_new_with_label(\"文件\"); gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);filemenu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(file),filemenu);load=gtk_menu_item_new_with_label(\"读取\"); gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),load);save=gtk_menu_item_new_with_label(\"存储\"); gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),save);quit=gtk_menu_item_new_with_label(\"退出\"); gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);g_signal_connect(G_OBJECT(load),\"activate\ G_CALLBACK(LoadData),NULL); g_signal_connect(G_OBJECT(save),\"activate\ G_CALLBACK(SaveData),NULL); g_signal_connect(G_OBJECT(quit),\"activate\ G_CALLBACK(quit_save),NULL);/**\"添加\"子菜单*/GtkWidget*add_M;GtkWidget*add_menu;GtkWidget*add[3]; add_M=gtk_menu_item_new_with_label(\"添加\"); gtk_menu_shell_append(GTK_MENU_SHELL(menubar),add_M); 39C语言课程设计实验报告add_menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(add_M),add_menu);add[0]=gtk_menu_item_new_with_label(\"添加单位\"); gtk_menu_shell_append(GTK_MENU_SHELL(add_menu),add[0]);add[1]=gtk_menu_item_new_with_label(\"添加科技成果\");gtk_menu_shell_append(GTK_MENU_SHELL(add_menu),add[1]);add[2]=gtk_menu_item_new_with_label(\"添加完成人员\");gtk_menu_shell_append(GTK_MENU_SHELL(add_menu),add[2]);g_signal_connect(G_OBJECT(add[0]),\"activate\ G_CALLBACK(entry_info),2); g_signal_connect(G_OBJECT(add[1]),\"activate\ G_CALLBACK(entry_info),3); g_signal_connect(G_OBJECT(add[2]),\"activate\ G_CALLBACK(entry_info),4);/**\"查询\"子菜单*/GtkWidget*query_M;GtkWidget*query_menu;GtkWidget*query[3]; query_M=gtk_menu_item_new_with_label(\"查询\"); gtk_menu_shell_append(GTK_MENU_SHELL(menubar),query_M);query_menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(query_M),query_menu);query[0]=gtk_menu_item_new_with_label(\"查询单位\"); gtk_menu_shell_append(GTK_MENU_SHELL(query_menu),query[0]);query[1]=gtk_menu_item_new_with_label(\"查询科技成果\"); gtk_menu_shell_append(GTK_MENU_SHELL(query_menu),query[1]);query[2]=gtk_menu_item_new_with_label(\"查询完成人员\"); gtk_menu_shell_append(GTK_MENU_SHELL(query_menu),query[2]);g_signal_connect(G_OBJECT(query[0]),\"activate\ G_CALLBACK(Query_info),2); g_signal_connect(G_OBJECT(query[1]),\"activate\ G_CALLBACK(Query_info),3); g_signal_connect(G_OBJECT(query[2]),\"activate\ G_CALLBACK(Query_info),4);/**\"统计\"子菜单*/ 40C语言课程设计实验报告GtkWidget*statistics_M;GtkWidget*statistics_menu;GtkWidget*statistics[3]; statistics_M=gtk_menu_item_new_with_label(\"统计\"); gtk_menu_shell_append(GTK_MENU_SHELL(menubar),statistics_M);statistics_menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(statistics_M),statistics_menu); statistics[0]=gtk_menu_item_new_with_label(\"各单位科技成果数量\");gtk_menu_shell_append(GTK_MENU_SHELL(statistics_menu),statistics[0]);statistics[1]=gtk_menu_item_new_with_label(\"单位完成人员成果排名\");gtk_menu_shell_append(GTK_MENU_SHELL(statistics_menu),statistics[1]);statistics[2]=gtk_menu_item_new_with_label(\"所有50岁以下第一完成人\"); gtk_menu_shell_append(GTK_MENU_SHELL(statistics_menu),statistics[2]);g_signal_connect(G_OBJECT(statistics[0]),\"activate\ G_CALLBACK(statis_func1),NULL); g_signal_connect(G_OBJECT(statistics[1]),\"activate\G_CALLBACK(statis_func2),NULL); g_signal_connect(G_OBJECT(statistics[2]),\"activate\ G_CALLBACK(statis_func3),NULL); /**\"帮助\"子菜单*/GtkWidget*help; GtkWidget*helpmenu;GtkWidget*about; help=gtk_menu_item_new_with_label(\"帮助\"); gtk_menu_shell_append(GTK_MENU_SHELL(menubar),help);helpmenu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(help),helpmenu);about=gtk_menu_item_new_with_label(\"相关信息\"); gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu),about);g_signal_connect(G_OBJECT(about),\"activate\ G_CALLBACK(help_about),NULL);} 41C语言课程设计实验报告/**初始化目录*/ voidcreate_view_and_model(void){ GtkTreeViewColumn*col;GtkCellRenderer*renderer;GtkTreeModel*model; treeview=gtk_tree_view_new(); col=gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col,\"目录\"); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview),col);renderer=gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col,renderer,TRUE);gtk_tree_view_column_add_attribute(col,renderer, \"text\COLUMN);//添加model及rootiter treestore=gtk_tree_store_new(1, G_TYPE_STRING); gtk_tree_store_append(treestore,&rootiter,NULL);gtk_tree_store_set(treestore,&rootiter, COLUMN,\"华中科技大学\-1);model=GTK_TREE_MODEL(treestore); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),model);} /**初始化显示栏*/ voidinit_show(GtkWidget*list){ GtkCellRenderer*renderer;GtkTreeViewColumn*column;inti,j; renderer=gtk_cell_renderer_text_new(); column=gtk_tree_view_column_new_with_attributes(\"项目\ renderer,\"text\0,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);column=gtk_tree_view_column_new_with_attributes(\"内容\ renderer,\"text\1,NULL); 42C语言课程设计实验报告gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);GtkTreeIter*Node_iter[3];Node_iter[0]=dept_iter;Node_iter[1]=achs_iter;Node_iter[2]=member_iter;for(i=0;i<3;i++){ lstore[i]=gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_STRING); for(j=0;j COLUMN,Str_Pointer[i][j],-1); } } gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(lstore[0]));} /**改变状态栏及显示栏*/ voidon_changed(GtkWidget*widget,gpointerstatusbar){ GtkTreeModel*model;char*value; if(gtk_tree_selection_get_selected( GTK_TREE_SELECTION(widget),&model,&selectediter)) { gtk_tree_model_get(model,&selectediter,COLUMN,&value,-1);gtk_statusbar_push(GTK_STATUSBAR(statusbar),gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), value),value); g_free(value); Show_Node(selectediter);} 43C语言课程设计实验报告} 4)login.c #include\"achsMIS.h\" //函数名:login //功能:登录验证函数,点击login按钮时调用//输入参数://返回值:无 voidlogin(GtkWidget*widget,gpointerdata){ gchar*name;gchar*pwd; structlogin_widget*wgt; wgt=(structloging_widget*)data;//获取输入的信息 name=gtk_entry_get_text(GTK_ENTRY(wgt->entry_username));pwd=gtk_entry_get_text(GTK_ENTRY(wgt->entry_pwd));if((strcmp(name,NAME)==0)&&(strcmp(pwd,PWD)==0)){ gtk_label_set_text(GTK_LABEL(wgt->label_tips),\"Welcometo AchsMIS\"); gtk_widget_show_all(window);gtk_widget_hide(wgt->window); }else{ gtk_label_set_text(GTK_LABEL(wgt->label_tips),\"Invaliduser nameorpassword.\"); } } //函数名:init_login_widget//功能:登录框初始化函数//输入参数://返回值:无 voidinit_login_widget(){ wgt.window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_position(GTK_WINDOW(wgt.window), GTK_WIN_POS_CENTER); gtk_window_set_keep_above(GTK_WINDOW(wgt.window),1);wgt.label_tips=gtk_label_new(\"Welcome,pleaseloginfirst\"); 44C语言课程设计实验报告wgt.button_login=gtk_button_new_with_label(\"login\");wgt.button_exit=gtk_button_new_with_label(\"exit\"); wgt.entry_username=gtk_entry_new_with_max_length(10);wgt.entry_pwd=gtk_entry_new_with_max_length(10);wgt.label_username=gtk_label_new(\"Username:\");wgt.label_pwd=gtk_label_new(\"Password:\");wgt.vbox=gtk_vbox_new(FALSE,20); wgt.hbox_username=gtk_hbox_new(FALSE,20);wgt.hbox_pwd=gtk_hbox_new(FALSE,20);wgt.hbox_button=gtk_hbox_new(FALSE,20);//设置窗体 gtk_window_set_title(GTK_WINDOW(wgt.window),\"Systemlogin\");gtk_window_set_resizable(GTK_WINDOW(wgt.window),FALSE);//设置布局盒子 gtk_box_pack_start(GTK_BOX(wgt.hbox_username),wgt.label_username,TRUE,FALSE,10); gtk_box_pack_start(GTK_BOX(wgt.hbox_username),wgt.entry_username,TRUE,FALSE,10); gtk_box_pack_start(GTK_BOX(wgt.hbox_pwd),wgt.label_pwd,TRUE,FALSE,10);gtk_box_pack_start(GTK_BOX(wgt.hbox_pwd),wgt.entry_pwd,TRUE,FALSE,10);gtk_box_pack_start(GTK_BOX(wgt.hbox_button),wgt.button_login,TRUE,FALSE,10);gtk_box_pack_start(GTK_BOX(wgt.hbox_button),wgt.button_exit,TRUE,FALSE,10); gtk_box_pack_start(GTK_BOX(wgt.vbox),wgt.label_tips,TRUE,FALSE,10);gtk_box_pack_start(GTK_BOX(wgt.vbox),wgt.hbox_username,TRUE,FALSE,10); gtk_box_pack_start(GTK_BOX(wgt.vbox),wgt.hbox_pwd,TRUE,FALSE,10);gtk_box_pack_start(GTK_BOX(wgt.vbox),wgt.hbox_button,TRUE,FALSE,10); //设置密码框不可见,用户输入时显示“*” gtk_entry_set_visibility(GTK_ENTRY(wgt.entry_pwd),FALSE);gtk_entry_set_invisible_char(GTK_ENTRY(wgt.entry_pwd),'*');g_signal_connect(GTK_OBJECT(wgt.button_login),\"clicked\n),&wgt); g_signal_connect(GTK_OBJECT(wgt.window),\"destroy\_destroy),NULL); 45C语言课程设计实验报告g_signal_connect(GTK_OBJECT(wgt.button_exit),\"clicked\win_destroy),NULL); gtk_container_add(GTK_CONTAINER(wgt.window),wgt.vbox);gtk_widget_show_all(wgt.window); } voidgtk_win_destroy(GtkWidget*widget,gpointerdata){ gtk_main_quit(); } 5)file.c #include\"achsMIS.h\"/******************** 读取与存储 *********************/ //函数名:LoadData//功能:读取数据文件//输入参数: //返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功intLoadData(GtkWidget*button){ intre; re=LoadList(&gp_head);if(re==28){ dialog_info(\"数据加载成功\");rebuildtree();}else dialog_info(\"数据加载失败\");return(re);} //函数名:LoadList //功能:读取数据文件中数据到链表中 //输入参数:phead单位节点头指针的地址 //返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功intLoadList(DEPT_NODE**phead){ DEPT_NODE*hd=NULL,*pDeptNode;ACHS_NODE*pAchsNode; 46C语言课程设计实验报告MEMBER_NODE*pMemberNode;FILE*pFile;intfind;intre=0; if((pFile=fopen(gp_dept_info_filename,\"rb\"))==NULL){ printf(\"单位数据文件打开失败!\\n\");//printf用于控制台调试returnre;} printf(\"单位数据文件打开成功!\\n\");/*从数据文件中读宿舍楼信息数据,存入以后进先出方式建立的主链中*/while(!feof(pFile)){ pDeptNode=(DEPT_NODE*)calloc(1,sizeof(DEPT_NODE));fread(pDeptNode,sizeof(DEPT_NODE),1,pFile);if(!feof(pFile)){ pDeptNode->achs=NULL;pDeptNode->next=hd;hd=pDeptNode;}} fclose(pFile);if(hd==NULL){ printf(\"单位数据文件加载失败!\\n\");returnre;} printf(\"单位数据文件加载成功!\\n\");*phead=hd;re+=4; if((pFile=fopen(gp_achs_info_filename,\"rb\"))==NULL){ printf(\"成果数据文件打开失败!\\n\");returnre;} printf(\"成果数据文件打开成功!\\n\");re+=8; /*从数据文件中读取成果基本信息数据,存入主链对应结点的成果基本信息支链中*/ while(!feof(pFile)){ /*创建结点,存放从数据文件中读出的成果基本信息*/ 47C语言课程设计实验报告pAchsNode=(ACHS_NODE*)calloc(1,sizeof(ACHS_NODE));fread(pAchsNode,sizeof(ACHS_NODE),1,pFile);if(!feof(pFile)){ pAchsNode->members=NULL; /*在主链上查找该成果第一完成单位对应的主链结点*/pDeptNode=hd; while(pDeptNode!=NULL &&strcmp(pDeptNode->name,pAchsNode->first_dept_name)!=0) { pDeptNode=pDeptNode->next;} /*如果找到,则将结点以后进先出方式插入成果信息支链*/if(pDeptNode!=NULL){ pAchsNode->next=pDeptNode->achs;pDeptNode->achs=pAchsNode;} else/*如果未找到,则释放所创建结点的内存空间*/{ free(pAchsNode);}} } fclose(pFile); if((pFile=fopen(gp_member_info_filename,\"rb\"))==NULL){ printf(\"完成人员数据文件打开失败!\\n\");returnre;} printf(\"完成人员数据文件打开成功!\\n\");re+=16; /*从数据文件中读取成果完成人员信息数据,存入成果基本信息支链对应结点的缴费支链中*/ while(!feof(pFile)){ /*创建结点,存放从数据文件中读出的成果完成人员信息*/ pMemberNode=(MEMBER_NODE*)calloc(1,sizeof(MEMBER_NODE));fread(pMemberNode,sizeof(MEMBER_NODE),1,pFile);if(!feof(pFile)) 48C语言课程设计实验报告{ /*查找成果信息支链上对应成果信息结点*/pDeptNode=hd;find=0; while(pDeptNode!=NULL&&find==0){ pAchsNode=pDeptNode->achs; while(pAchsNode!=NULL&&find==0){ if((strcmp(pAchsNode->name, pMemberNode->achs_name)==0)) { find=1;break;} pAchsNode=pAchsNode->next;} pDeptNode=pDeptNode->next;} if(find)/*如果找到,则将结点以后进先出方式插入成果完成人 员信息支链中*/ { pMemberNode->next=pAchsNode->members;pAchsNode->members=pMemberNode;} else/*如果未找到,则释放所创建结点的内存空间*/{ free(pMemberNode);}}} fclose(pFile); printf(\"\\n数据加载完整\\n\");returnre;} //函数名:rebuildtree //功能:将链表中节点添加到左侧树状列表中//输入参数://返回值: voidrebuildtree(){ GtkTreeModel*model;DEPT_NODE*p1; 49C语言课程设计实验报告ACHS_NODE*p2;MEMBER_NODE*p3; for(p1=gp_head;p1!=NULL;p1=p1->next){ gtk_tree_store_append(treestore,&p1->iter,&rootiter);//添加条目gtk_tree_store_set(treestore,&p1->iter,//设置新添 加条目的文本显示 COLUMN,p1->name,-1); for(p2=p1->achs;p2!=NULL;p2=p2->next){ gtk_tree_store_append(treestore,&p2->iter,&p1->iter);gtk_tree_store_set(treestore,&p2->iter, COLUMN,p2->name,-1); for(p3=p2->members;p3!=NULL;p3=p3->next){ gtk_tree_store_append(treestore,&p3->iter,&p2->iter);gtk_tree_store_set(treestore,&p3->iter, COLUMN,p3->name,-1); }}} model=GTK_TREE_MODEL(treestore); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),model);g_object_unref(model);} //函数名:SaveData//功能:存储数据文件//输入参数: //返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功intSaveData(GtkWidget*button){ intflag=0; flag=SaveList(gp_head);if(flag==28){ dialog_info(\"数据保存成功\");}else dialog_info(\"数据保存失败\");return(flag);} 50C语言课程设计实验报告//函数名:SaveData //功能:将链表中数据存储在数据文件中//输入参数:phead单位节点头指针 //返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功intSaveList(DEPT_NODE*phead){ FILE*fout1,*fout2,*fout3;DEPT_NODE*p1=phead;ACHS_NODE*p2;MEMBER_NODE*p3;intflag=0; if((fout1=fopen(gp_dept_info_filename,\"wb\"))==NULL) returnflag;flag+=4; if((fout2=fopen(gp_achs_info_filename,\"wb\"))==NULL) returnflag;flag+=8; if((fout3=fopen(gp_member_info_filename,\"wb\"))==NULL) returnflag;flag+=16; while(p1!=NULL){ fwrite(p1,sizeof(DEPT_NODE),1,fout1);p2=p1->achs;while(p2!=NULL){ fwrite(p2,sizeof(ACHS_NODE),1,fout2);p3=p2->members;while(p3!=NULL){ fwrite(p3,sizeof(MEMBER_NODE),1,fout3);p3=p3->next;} p2=p2->next;} p1=p1->next;} fclose(fout1);fclose(fout2);fclose(fout3);return(flag);} //函数名:quit_save 51C语言课程设计实验报告//功能:推出前提示保存//输入参数://返回值: voidquit_save(GtkWidget*button){ GtkWidget*dialog;intflag; dialog=gtk_message_dialog_new((gpointer)window,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,GTK_BUTTONS_OK_CANCEL,\"退出前是否保存当前状态?\"); flag=gtk_dialog_run(dialog);switch(flag){ caseGTK_RESPONSE_OK:SaveList(gp_head);caseGTK_RESPONSE_CANCEL:gtk_main_quit();default:;} gtk_widget_destroy(dialog);} 6)IO.c #include\"achsMIS.h\"/********************* 弹窗函数 *********************/ //函数名:dialog_info//功能:弹出一个消息框 //输入参数:show要显示的字符串//返回值:无 voiddialog_info(char*show)//TODO:查询窗口底层问题{ GtkWidget*dialog; //show=g_locale_to_utf8(show,strlen(show),NULL,NULL,NULL);dialog=gtk_message_dialog_new((gpointer)window,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,GTK_BUTTONS_OK, 52C语言课程设计实验报告show,\"title\"); gtk_window_set_title(GTK_WINDOW(dialog),\"通知\");gtk_window_set_keep_above(GTK_WINDOW(dialog),1);gtk_dialog_run(GTK_DIALOG(dialog));gtk_widget_destroy(dialog);} //函数名:entry_info//功能:弹出一个输入框 //输入参数:type对应枚举的几种类型//返回值:无 voidentry_info(GtkWidget*button,inttype){ GtkWidget*entry_window; GtkWidget*label,*b_ok,*b_cancel;GtkWidget*table;GtkWidget*vbox;GtkWidget*entry[9]; structnodecreate*nodec;inti; entry_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_widget_set_size_request(entry_window,350,300); gtk_window_set_title(GTK_WINDOW(entry_window),\"输入新节点数据\");g_signal_connect(G_OBJECT(entry_window),\"destroy\ G_CALLBACK(gtk_widget_destroy),NULL);gtk_window_set_position(GTK_WINDOW(entry_window),GTK_WIN_POS_CENTER); gtk_window_set_keep_above(GTK_WINDOW(entry_window),1); vbox=gtk_vbox_new(FALSE,12); gtk_container_add(GTK_CONTAINER(entry_window),vbox);//传递几个重要参数给下一个函数而设计的结构 nodec=(structnodecreate*)malloc(sizeof(structnodecreate));table=gtk_table_new(NODE_INS[type]+1,7,TRUE); gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,10);for(i=0;i GTK_EXPAND,GTK_EXPAND,0,0); 53C语言课程设计实验报告entry[i]=gtk_entry_new(); gtk_table_attach(GTK_TABLE(table),entry[i],3,7,i,i+1, GTK_EXPAND,GTK_EXPAND,0,0); nodec->entry[i]=entry[i];} nodec->window=entry_window;nodec->type=type; b_ok=gtk_button_new_with_label(\"确定\"); g_signal_connect(G_OBJECT(b_ok),\"clicked\gtk_table_attach(GTK_TABLE(table),b_ok,1,2,NODE_INS[type],NODE_INS[type]+1, GTK_EXPAND,GTK_EXPAND,0,0); b_cancel=gtk_button_new_with_label(\"取消\");g_signal_connect(G_OBJECT(b_cancel),\"clicked\dow); gtk_table_attach(GTK_TABLE(table),b_cancel,5,6,NODE_INS[type],NODE_INS[type]+1, GTK_EXPAND,GTK_EXPAND,0,0); gtk_widget_show_all(entry_window);} //函数名:Edit_info //功能:弹出一个编辑框//输入参数://返回值:无 intEdit_info(GtkWidget*button){ GtkWidget*edit_window; GtkWidget*label,*b_ok,*b_cancel;GtkWidget*table;GtkWidget*vbox;GtkWidget*entry[9]; structnodecreate*nodec;inti;inttype; type=Judge_NODE_Type(&selectediter);if(type==TYPE_ROOT||type==0){ dialog_info(\"ROOT节点无法编辑!\"); C语言课程设计实验报告return1;} edit_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_widget_set_size_request(edit_window,400,300);g_signal_connect(G_OBJECT(edit_window),\"destroy\ G_CALLBACK(gtk_widget_destroy),NULL); gtk_window_set_position(GTK_WINDOW(edit_window),GTK_WIN_POS_CENTER); vbox=gtk_vbox_new(FALSE,12); gtk_container_add(GTK_CONTAINER(edit_window),vbox);nodec=(structnodecreate*)malloc(sizeof(structnodecreate));table=gtk_table_new(NODE_INS[type]+1,7,TRUE); gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,10);for(i=0;i GTK_EXPAND,GTK_EXPAND,0,0); entry[i]=gtk_entry_new(); gtk_table_attach(GTK_TABLE(table),entry[i],3,7,i,i+1, GTK_EXPAND,GTK_EXPAND,0,0); nodec->entry[i]=entry[i];} //获取节点名称并设置为标题GtkTreeModel*model;GtkTreePath*path; GtkTreeIteriter;//不能直接声名指针 model=gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));path=gtk_tree_model_get_path(model,&selectediter);char*name; gtk_tree_model_get(model,&selectediter, COLUMN,&name,-1); gtk_window_set_title(GTK_WINDOW(edit_window),name);switch(type) 55C语言课程设计实验报告{ caseTYPE_DEPT:{ DEPT_NODE*pDept; pDept=DEPT_search(name); gtk_entry_set_text(GTK_ENTRY(entry[0]),pDept->number);gtk_entry_set_text(GTK_ENTRY(entry[1]),\"此项不可更改\");gtk_entry_set_text(GTK_ENTRY(entry[2]),pDept->PIC);nodec->unp.dept=pDept;break;} caseTYPE_ACHS:{ char*P_name; gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&P_name,-1); DEPT_NODE*pDept; pDept=DEPT_search(P_name);ACHS_NODE*pAchs; pAchs=ACHS_search(name,pDept->achs); gtk_entry_set_text(GTK_ENTRY(entry[0]),pAchs->number);gtk_entry_set_text(GTK_ENTRY(entry[1]),\"此项不可更改\");gtk_entry_set_text(GTK_ENTRY(entry[2]),pAchs->field);gtk_entry_set_text(GTK_ENTRY(entry[3]),\"此项不可更改\"); gtk_entry_set_text(GTK_ENTRY(entry[4]),pAchs->first_dept_number);gtk_entry_set_text(GTK_ENTRY(entry[5]),pAchs->first_member_name);gtk_entry_set_text(GTK_ENTRY(entry[6]),pAchs->award_name);gtk_entry_set_text(GTK_ENTRY(entry[7]),pAchs->award_level);gtk_entry_set_text(GTK_ENTRY(entry[8]),pAchs->award_grade);nodec->unp.achs=pAchs;break;} caseTYPE_MEMBER:{ char*P_name,*PP_name;gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&P_name,-1); gtk_tree_path_up(path); 56C语言课程设计实验报告gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&PP_name,-1); DEPT_NODE*pDept; pDept=DEPT_search(PP_name);ACHS_NODE*pAchs; pAchs=ACHS_search(P_name,pDept->achs);MEMBER_NODE*pMember; pMember=MEMBER_search(name,pAchs->members); charstr[5]; gtk_entry_set_text(GTK_ENTRY(entry[0]),pMember->number);gtk_entry_set_text(GTK_ENTRY(entry[1]),pMember->name); gtk_entry_set_text(GTK_ENTRY(entry[2]),pMember->dept_name);gtk_entry_set_text(GTK_ENTRY(entry[3]),pMember->sex);itoa(pMember->age,str); gtk_entry_set_text(GTK_ENTRY(entry[4]),str); gtk_entry_set_text(GTK_ENTRY(entry[5]),pMember->title);itoa(pMember->rank,str); gtk_entry_set_text(GTK_ENTRY(entry[6]),str); gtk_entry_set_text(GTK_ENTRY(entry[7]),\"此项不可更改\");nodec->unp.member=pMember;break;}} nodec->window=edit_window;nodec->type=type; b_ok=gtk_button_new_with_label(\"确定\"); g_signal_connect(G_OBJECT(b_ok),\"clicked\gtk_table_attach(GTK_TABLE(table),b_ok,1,2,NODE_INS[type],NODE_INS[type]+1, GTK_EXPAND,GTK_EXPAND,0,0); b_cancel=gtk_button_new_with_label(\"取消\");g_signal_connect(G_OBJECT(b_cancel),\"clicked\ow); gtk_table_attach(GTK_TABLE(table),b_cancel,5,6,NODE_INS[type],NODE_INS[type]+1, GTK_EXPAND,GTK_EXPAND,0,0); gtk_widget_show_all(edit_window); 57C语言课程设计实验报告}; //函数名:Query_info //功能:根据type弹出一个查询框,再分别调用对应的Query函数//输入参数:type对应枚举的几种类型//返回值:无 voidQuery_info(GtkWidget*button,inttype){ GtkWidget*query_window; GtkWidget*label,*b_query,*b_next,*b_cancel;GtkWidget*table;GtkWidget*vbox;GtkWidget*entry; query_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_widget_set_size_request(query_window,300,100);g_signal_connect(G_OBJECT(query_window),\"destroy\ G_CALLBACK(gtk_widget_destroy),NULL); gtk_window_set_position(GTK_WINDOW(query_window),GTK_WIN_POS_CENTER); gtk_window_set_keep_above(query_window,1); vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(query_window),vbox);table=gtk_table_new(2,7,TRUE); gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,10);label=gtk_label_new(\"查询:\"); gtk_table_attach(GTK_TABLE(table),label,0,3,0,1, GTK_EXPAND,GTK_EXPAND,0,0); entry=gtk_entry_new(); gtk_table_attach(GTK_TABLE(table),entry,3,6,0,1, GTK_EXPAND,GTK_EXPAND,0,0); //配置不同窗口标题charall_title[40]; char*title[]={\"单位\科技成果\完成人员\sprintf(all_title,\"请输入%s名称\ gtk_window_set_title(GTK_WINDOW(query_window),all_title);//用来传递名字及分辨查询或重头查询的结构体structquery_judge*s1,*s2; s1=(structquery_judge*)calloc(1,sizeof(structquery_judge));s1=(structquery_judge*)calloc(1,sizeof(structquery_judge)); 58C语言课程设计实验报告s1->flag=0;s2->flag=1; s1->entry=entry;s2->entry=entry; b_next=gtk_button_new_with_label(\"查询\"); g_signal_connect(G_OBJECT(b_next),\"clicked\1);//函数指针 gtk_table_attach(GTK_TABLE(table),b_next,1,2,1,2, GTK_EXPAND,GTK_EXPAND,0,0); if(type==3||type==4){ b_query=gtk_button_new_with_label(\"从头查询\");g_signal_connect(G_OBJECT(b_query),\"clicked\s2);//函数指针 gtk_table_attach(GTK_TABLE(table),b_query,3,4,1,2, GTK_EXPAND,GTK_EXPAND,0,0); } b_cancel=gtk_button_new_with_label(\"退出\"); g_signal_connect(G_OBJECT(b_cancel),\"clicked\dow); gtk_table_attach(GTK_TABLE(table),b_cancel,5,6,1,2, GTK_EXPAND,GTK_EXPAND,0,0); gtk_widget_show_all(query_window);} //函数名:Statis_info //功能:弹出一个统计框,由传入参数设置具体内容 //输入参数:title统计框标题,col1第一列标题,col2第二列标题,in传入的model //返回值:无 voidStatis_info(char*title,char*col1,char*col2,GtkListStore*in){ GtkWidget*statis_window;GtkWidget*b_ok,*b_cancel;GtkWidget*vbox;GtkWidget*hbox;GtkWidget*list; GtkCellRenderer*renderer;GtkTreeViewColumn*column; 59C语言课程设计实验报告GtkWidget*swin; statis_window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(statis_window),0);gtk_window_set_title(GTK_WINDOW(statis_window),title);gtk_window_set_position(GTK_WINDOW(statis_window),GTK_WIN_POS_CENTER); gtk_widget_set_size_request(statis_window,300,350); list=gtk_tree_view_new(); //创建view等待与传入的model连接 renderer=gtk_cell_renderer_text_new(); column=gtk_tree_view_column_new_with_attributes(col1, renderer,\"text\COLUMN,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);column=gtk_tree_view_column_new_with_attributes(col2, renderer,\"text\COMMENT,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list),column);gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(in));vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(statis_window),vbox); swin=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(vbox),swin,TRUE,TRUE,0);gtk_container_add(GTK_CONTAINER(swin),list);hbox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);b_cancel=gtk_button_new_with_label(\"确定\");g_signal_connect(G_OBJECT(b_cancel),\"clicked\dow); gtk_box_pack_start(GTK_BOX(hbox),b_cancel,TRUE,FALSE,0); gtk_widget_show_all(statis_window);} 60C语言课程设计实验报告/**连接取消按钮关闭当前窗口*/ voidf_cancel(GtkWidget*button,GtkWidget*win){ gtk_widget_hide(win);} /********************** 处理选择及节点位置***********************///函数名:Judge_NODE_Type //功能:根据输入iter深度判断节点类型//输入参数:iter //返回值:iter深度对应枚举的节点类型gintJudge_NODE_Type(GtkTreeIter*iter){ GtkTreePath*path;GtkTreeModel*model; model=gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));path=gtk_tree_model_get_path(model,iter);return(gtk_tree_path_get_depth(path));} /******************* 显示数据 *******************///函数名:Show_Node //功能:将选中的节点信息在显示栏中显示出来//输入参数:iter//返回值:无 intShow_Node(GtkTreeIteriter)//值传递不影响selectediter{ GtkTreeModel*model;GtkTreePath*path; model=gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));path=gtk_tree_model_get_path(model,&iter);char*name; gtk_tree_model_get(model,&iter, COLUMN,&name,-1); switch(Judge_NODE_Type(&iter)){ caseTYPE_ROOT: 61C语言课程设计实验报告return1;caseTYPE_DEPT: liststore=Show_Dept(name);break; caseTYPE_ACHS:{ char*P_name; gtk_tree_path_up(path);//获取上一级父节点path gtk_tree_model_get_iter(model,&iter,path);//获取上一级父节点itergtk_tree_model_get(model,&iter, COLUMN,&P_name,//获取上一级父节点name-1); liststore=Show_Achs(name,P_name);break;} caseTYPE_MEMBER:{ char*P_name,*PP_name;gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&P_name,-1); gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&PP_name,-1); liststore=Show_Member(name,P_name,PP_name);break;} default: return0;} gtk_tree_view_set_model(GTK_TREE_VIEW(showlist), GTK_TREE_MODEL(liststore)); return1;} /**对应3个节点显示的3个函数,返回对应GtkListStore*/GtkListStore*Show_Dept(char*name){ DEPT_NODE*pDept; 62C语言课程设计实验报告pDept=DEPT_search(name); gtk_list_store_set(lstore[0],&dept_iter[0], COMMENT,pDept->number,-1); gtk_list_store_set(lstore[0],&dept_iter[1], COMMENT,pDept->name,-1); gtk_list_store_set(lstore[0],&dept_iter[2], COMMENT,pDept->PIC,-1); return(lstore[0]);} GtkListStore*Show_Achs(char*name,char*P_name){ DEPT_NODE*pDept; pDept=DEPT_search(P_name);ACHS_NODE*pAchs; pAchs=ACHS_search(name,pDept->achs);gtk_list_store_set(lstore[1],&achs_iter[0], COMMENT,pAchs->number,-1); gtk_list_store_set(lstore[1],&achs_iter[1], COMMENT,pAchs->name,-1); gtk_list_store_set(lstore[1],&achs_iter[2], COMMENT,pAchs->field,-1); gtk_list_store_set(lstore[1],&achs_iter[3], COMMENT,pAchs->first_dept_name,-1); gtk_list_store_set(lstore[1],&achs_iter[4], COMMENT,pAchs->first_dept_number,-1); gtk_list_store_set(lstore[1],&achs_iter[5], COMMENT,pAchs->first_member_name,-1); gtk_list_store_set(lstore[1],&achs_iter[6], COMMENT,pAchs->award_name,-1); gtk_list_store_set(lstore[1],&achs_iter[7], COMMENT,pAchs->award_level,-1); gtk_list_store_set(lstore[1],&achs_iter[8], 63C语言课程设计实验报告COMMENT,pAchs->award_grade,-1); return(lstore[1]);} GtkListStore*Show_Member(char*name,char*P_name,char*PP_name){ DEPT_NODE*pDept; pDept=DEPT_search(PP_name);ACHS_NODE*pAchs; pAchs=ACHS_search(P_name,pDept->achs);MEMBER_NODE*pMember; pMember=MEMBER_search(name,pAchs->members); charstr[5]; gtk_list_store_set(lstore[2],&member_iter[0], COMMENT,pMember->number,-1); gtk_list_store_set(lstore[2],&member_iter[1], COMMENT,pMember->name,-1); gtk_list_store_set(lstore[2],&member_iter[2], COMMENT,pMember->dept_name,-1); gtk_list_store_set(lstore[2],&member_iter[3], COMMENT,pMember->sex,-1); itoa(pMember->age,str); gtk_list_store_set(lstore[2],&member_iter[4], COMMENT,str,-1); gtk_list_store_set(lstore[2],&member_iter[5], COMMENT,pMember->title,-1); itoa(pMember->rank,str); gtk_list_store_set(lstore[2],&member_iter[6], COMMENT,str,-1); gtk_list_store_set(lstore[2],&member_iter[7], COMMENT,pMember->achs_name,-1); return(lstore[2]);} C语言课程设计实验报告/*********************其他可重用函数 *********************/voiditoa(inti,char*str){ intpower,j,k;if(i<0){ *str++='-';i=-i;}j=i; for(power=1,k=2;j>=10;j/=10,k++) power*=10; for(;power>0;power/=10){ *str++='0'+i/power;i%=power;} *str='\\0';} 7)operate.c #include\"achsMIS.h\"/**************** 新增节点 ****************/ //函数名:Add_node //功能:添加3种节点统一函数,由entry_info确定按钮调用//输入参数://返回值:无 voidAdd_node(GtkWidget*button,structnodecreate*nodec){ GtkTreeModel*model;interror=0;char*str; switch(nodec->type){ 65C语言课程设计实验报告case2://插入单位节点{ DEPT_NODE*pNew,*pSearch; pNew=(DEPT_NODE*)calloc(1,sizeof(DEPT_NODE)); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));if(strlen(str)==0)str=(char*)\"无效\";strcpy(pNew->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[1]));if(strlen(str)==0)str=(char*)\"无效\";strcpy(pNew->name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[2]));strcpy(pNew->PIC,str); if(gp_head==NULL) gp_head=pNew;else{ pSearch=gp_head; while(pSearch->next!=NULL){ pSearch=pSearch->next;} pSearch->next=pNew;} gtk_tree_store_append(treestore,&pNew->iter,&rootiter);gtk_tree_store_set(treestore,&pNew->iter, COLUMN,pNew->name,-1); break; } case3://插入科技成果节点{ DEPT_NODE*pDept;ACHS_NODE*pNew; pNew=(ACHS_NODE*)calloc(1,sizeof(ACHS_NODE)); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));strcpy(pNew->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[1]));if(strlen(str)==0)strcpy(\"无效\strcpy(pNew->name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[2])); 66C语言课程设计实验报告strcpy(pNew->field,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[3]));strcpy(pNew->first_dept_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[4]));strcpy(pNew->first_dept_number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[5]));strcpy(pNew->first_member_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[6]));strcpy(pNew->award_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[7]));strcpy(pNew->award_level,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[8]));strcpy(pNew->award_grade,str); if((pDept=insert_ACHS(pNew))!=NULL)//使用insert_ACHS函数{ gtk_tree_store_append(treestore,&pNew->iter,&pDept->iter);/*添 加条目*/ gtk_tree_store_set(treestore,&pNew->iter,/*设置新添加 条目的文本显示*/ COLUMN,pNew->name,-1); }else error=1;break;} case4://插入完成人员节点{ ACHS_NODE*pAchs;MEMBER_NODE*pNew; pNew=(MEMBER_NODE*)calloc(1,sizeof(MEMBER_NODE)); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));strcpy(pNew->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[1]));strcpy(pNew->name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[2]));strcpy(pNew->dept_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[3]));strcpy(pNew->sex,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[4]));pNew->age=atoi(str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[5])); 67C语言课程设计实验报告strcpy(pNew->title,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[6]));pNew->rank=atoi(str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[7]));strcpy(pNew->achs_name,str); if((pAchs=insert_MEMBER(pNew))!=NULL)//使用insert_MEMBER函数{ gtk_tree_store_append(treestore,&pNew->iter,&pAchs->iter);/*添 加条目*/ gtk_tree_store_set(treestore,&pNew->iter,/*设置新添加 条目的文本显示*/ COLUMN,pNew->name,-1); }else error=1;break;} default: dialog_info(\"添加失败!\");} printf(\"%d\if(error==0){ model=GTK_TREE_MODEL(treestore); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),model);//重新连 接model和view dialog_info(\"添加成功!\"); gtk_widget_hide(nodec->window);free(nodec);}} //函数名:insert_ACHS //功能:插入科技成果节点函数,由Add_Node中情况3调用//输入参数:pNew指向新节点的指针//返回值:对应单位节点指针 DEPT_NODE*insert_ACHS(ACHS_NODE*pNew){ DEPT_NODE*pDept;ACHS_NODE*pSearch; pDept=DEPT_search(pNew->first_dept_name); 68C语言课程设计实验报告if(pDept==NULL) return(pDept);//未找到对应学院则结束函数if(pDept->achs==NULL) pDept->achs=pNew;else{ pSearch=pDept->achs; while(pSearch->next!=NULL){ pSearch=pSearch->next;} pSearch->next=pNew;//找到后插入到后面} return(pDept);} //函数名:insert_ACHS //功能:插入完成人员节点函数,由Add_Node中情况4调用//输入参数:pNew指向新节点的指针//返回值:对应科技成果节点指针 ACHS_NODE*insert_MEMBER(MEMBER_NODE*pNew){ DEPT_NODE*pDept;ACHS_NODE*pAchs; MEMBER_NODE*pSearch; pDept=DEPT_search(pNew->dept_name);if(pDept==NULL) return(NULL);//未找到对应学院则结束函数pAchs=ACHS_search(pNew->achs_name,pDept->achs);if(pAchs==NULL) return(NULL);//未找到对应科技成果则结束函数if(pAchs->members==NULL) pAchs->members=pNew;else{ pSearch=pAchs->members;while(pSearch->next!=NULL){ pSearch=pSearch->next;} 69C语言课程设计实验报告pSearch->next=pNew;//找到后插入到后面} return(pAchs);} /**************** 删除节点 ****************///函数名:Del_Node //功能:删除3种节点统一函数,由“删除”按钮调用//输入参数://返回值:无 voidDel_Node(GtkWidget*button){ GtkWidget*dialog;intflag,type,error=0; type=Judge_NODE_Type(&selectediter);//判断现在选中节点类型if(type==TYPE_ROOT||type==0){ dialog_info(\"ROOT节点无法删除!\");return;} GtkTreeModel*model;GtkTreePath*path;GtkTreeIteriter;char*name; model=gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));path=gtk_tree_model_get_path(model,&selectediter);gtk_tree_model_get(model,&selectediter, COLUMN,&name,-1); dialog=gtk_message_dialog_new((gpointer)window,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,GTK_BUTTONS_OK_CANCEL, \"确定删除本节点(及其子节点)? \"); gtk_window_set_title(GTK_WINDOW(dialog),\"删除节点\");flag=gtk_dialog_run(GTK_DIALOG(dialog));switch(flag){ 70C语言课程设计实验报告caseGTK_RESPONSE_OK:{ switch(type){ caseTYPE_DEPT: error=Del_Dept(name);break; caseTYPE_ACHS:{ char*P_name; gtk_tree_path_up(path);//提升pathgtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&P_name,//得到对应科技 成果名称 -1); gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview),path);error=Del_Achs(name,P_name);break;} caseTYPE_MEMBER:{ char*P_name;char*PP_name; gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&P_name,-1); gtk_tree_path_up(path); gtk_tree_model_get_iter(model,&iter,path);gtk_tree_model_get(model,&iter, COLUMN,&PP_name,-1); error=Del_Member(name,P_name,PP_name);break;}} break;} caseGTK_RESPONSE_CANCEL: gtk_widget_destroy(dialog);error=1;} 71C语言课程设计实验报告if(error==0) dialog_info(\"删除成功!\");gtk_widget_destroy(dialog);}; //函数名:Del_Dept //功能:删除单位节点,由Del_Node函数case2调用//输入参数:name单位名称 //返回值:int1为有错,0为正常intDel_Dept(char*name){ DEPT_NODE*pSearch,*pPre;intflag=1; pSearch=gp_head; if(!(flag=strcmp(name,pSearch->name))){ gp_head=gp_head->next; gtk_tree_store_remove(treestore,&selectediter);//删除树状列表对应 iter return0;}do{ pPre=pSearch; pSearch=pSearch->next;if(pSearch==NULL) break; } while((flag=strcmp(name,pSearch->name)));if(!flag){ pPre->next=pSearch->next;//讲前一节点直接连至后一节点gtk_tree_store_remove(treestore,&selectediter);return(0);} else{ dialog_info(\"无对应名称单位!\");return(1);}} //函数名:Del_Achs 72C语言课程设计实验报告//功能:删除科技成果节点,由Del_Node函数case3调用//输入参数:name科技成果名称,P_name对应单位名称//返回值:int1为有错,0为正常intDel_Achs(char*name,char*P_name){ DEPT_NODE*pDept; ACHS_NODE*pSearch,*pPre; intflag=1; pDept=DEPT_search(P_name);//调用DEPT_search函数搜索对应单位名称pSearch=pDept->achs; if(!(flag=strcmp(name,pSearch->name))){ pDept->achs=pSearch->next; gtk_tree_store_remove(treestore,&selectediter);return0;}do{ pPre=pSearch; pSearch=pSearch->next;if(pSearch==NULL) break; } while((flag=strcmp(name,pSearch->name)));if(!flag){ pPre->next=pSearch->next; gtk_tree_store_remove(treestore,&selectediter);return(0);}else{ dialog_info(\"无对应名称科技成果!\");return(1);}}; //函数名:Del_Member 73C语言课程设计实验报告//功能:删除完成人员节点,由Del_Node函数case4调用 //输入参数:name完成人员名称,P_name对应科技成果名称,PP_name对应单位名称 //返回值:int1为有错,0为正常 intDel_Member(char*name,char*P_name,char*PP_name){ DEPT_NODE*pDept;ACHS_NODE*pAchs; MEMBER_NODE*pSearch,*pPre; intflag=1; pDept=DEPT_search(PP_name); pAchs=ACHS_search(P_name,pDept->achs);pSearch=pAchs->members; if(!(flag=strcmp(name,pSearch->name))){ pAchs->members=pSearch->next; gtk_tree_store_remove(treestore,&selectediter);return0;}do{ pPre=pSearch; pSearch=pSearch->next;if(pSearch==NULL) break; } while((flag=strcmp(name,pSearch->name)));if(!flag){ pPre->next=pSearch->next; gtk_tree_store_remove(treestore,&selectediter);return(0);}else{ dialog_info(\"无对应名称完成人员!\");return(1);} }; /**************** 编辑节点 74C语言课程设计实验报告****************///函数名:Edit_Node//功能:编辑节点//输入参数://返回值:无 voidEdit_Node(GtkWidget*button,structnodecreate*nodec){ char*str; GtkTreeIter*iter;switch(nodec->type){ caseTYPE_DEPT:{ DEPT_NODE*pDept;pDept=nodec->unp.dept; str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));if(strlen(str)==0)*str=\"无效\";strcpy(pDept->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[2]));strcpy(pDept->PIC,str);break;} caseTYPE_ACHS:{ ACHS_NODE*pAchs;pAchs=nodec->unp.achs; str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));strcpy(pAchs->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[2]));strcpy(pAchs->field,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[4]));strcpy(pAchs->first_dept_number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[5]));strcpy(pAchs->first_member_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[6]));strcpy(pAchs->award_name,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[7]));strcpy(pAchs->award_level,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[8]));strcpy(pAchs->award_grade,str);break;} caseTYPE_MEMBER: 75C语言课程设计实验报告{ MEMBER_NODE*pMember;pMember=nodec->unp.member;iter=&pMember->iter; str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[0]));strcpy(pMember->number,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[1]));strcpy(pMember->name,str);gtk_tree_store_set(treestore,iter, COLUMN,str,-1); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[3]));strcpy(pMember->sex,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[4]));pMember->age=atoi(str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[5]));strcpy(pMember->title,str); str=(char*)gtk_entry_get_text(GTK_ENTRY(nodec->entry[6]));pMember->rank=atoi(str);break; }} gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),GTK_TREE_MODEL(treestore)); gtk_widget_hide(nodec->window); Show_Node(selectediter);//编辑框确定后将数据更新} 8)query.c #include\"achsMIS.h\"/**************查询节点**************/ //函数名:Query_Dept//功能:查询学院 //输入参数:in包含iter和名称的结构//返回值:无 voidQuery_Dept(GtkWidget*button,structquery_judge*in){ char*str; 76C语言课程设计实验报告str=(char*)gtk_entry_get_text(GTK_ENTRY(in->entry));//获取输入框数据DEPT_NODE*pDept;pDept=DEPT_search(str);if(pDept!=NULL){ expand_select(pDept->iter);}} //函数名:Query_Achs//功能:查询科技成果 //输入参数:in包含iter和名称的结构//返回值:无 voidQuery_Achs(GtkWidget*button,structquery_judge*in){ char*str; str=gtk_entry_get_text(GTK_ENTRY(in->entry));//获取输入框数据staticDEPT_NODE*pDept; intif_head=in->flag; staticDEPT_NODE*pDept;//使用静态变量保证从上一次搜索处开始staticACHS_NODE*pAchs; if(if_head==1||pDept==NULL)//若是由从头查询或到尾再次初始化 pDept=gp_head;intflag=1; while(pDept!=NULL){ if(if_head==0)//若是查询(继续)不改变,直接从最内层继续 搜索 pAchs=pDept->achs;while(pAchs!=NULL){ if(!(flag=strcmp(pAchs->name,str))){ expand_select(pAchs->iter);pAchs=pAchs->next;return;} pAchs=pAchs->next;} if_head=0; pDept=pDept->next;} if(flag!=0){ 77C语言课程设计实验报告dialog_info(\"未发现此科技成果!\");}} //函数名:Query_Member//功能:查询完成人员 //输入参数:in包含iter和名称的结构//返回值:无 voidQuery_Member(GtkWidget*button,structquery_judge*in){ char*str; str=gtk_entry_get_text(GTK_ENTRY(in->entry));//获取输入框数据intif_head=in->flag; staticDEPT_NODE*pDept;//使用静态变量保证从上一次搜索处开始staticACHS_NODE*pAchs; staticMEMBER_NODE*pMember;if(if_head==1||pDept==NULL) pDept=gp_head;intflag=1; while(pDept!=NULL){ if(if_head==1) pAchs=pDept->achs;while(pAchs!=NULL){ if(if_head==1) pMember=pAchs->members;while(pMember!=NULL){ if(!(flag=strcmp(pMember->name,str))){ expand_select(pMember->iter);pMember=pMember->next;return;} pMember=pMember->next;} if_head=1; pAchs=pAchs->next;} pDept=pDept->next;} if(flag!=0){ 78C语言课程设计实验报告dialog_info(\"未发现此完成人员!\");}} //函数名:expand_select //功能:展开并跳转至指定iter //输入参数:itertreeview中的一个目标iter//返回值:无 voidexpand_select(GtkTreeIteriter){ GtkTreeModel*model;GtkTreeSelection*select;GtkTreePath*path; select=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));model=gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));path=gtk_tree_model_get_path(model,&iter); gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview),path);gtk_tree_selection_select_iter(select,&iter);Show_Node(iter);} /************** 搜索节点**************//**,返回*/ //函数名:DEPT_search//功能:按名称搜索单位 //输入参数:D_name单位名称//返回值:单位节点指针 DEPT_NODE*DEPT_search(char*D_name){ DEPT_NODE*pSearch;intflag=1; pSearch=gp_head; while((flag=strcmp(D_name,pSearch->name))&&pSearch->next!=NULL){ pSearch=pSearch->next;} if(!flag) return(pSearch);else{ dialog_info(\"无对应名称单位!\"); 79C语言课程设计实验报告return(NULL);}} //函数名:ACHS_search //功能:按名称搜索科技成果节点 //输入参数:A_name科技成果节点名称,ACHS所在学院头科技成果节点指针 //返回值:科技成果节点节点指针 ACHS_NODE*ACHS_search(char*A_name,ACHS_NODE*ACHS){ ACHS_NODE*pSearch;pSearch=ACHS;intflag=1; while((flag=strcmp(A_name,pSearch->name))&&(pSearch->next)!=NULL){ pSearch=pSearch->next;} if(!flag) return(pSearch);else{ dialog_info(\"无对应名称成果!\");return(NULL);}} //函数名:MEMBER_search //功能:按名称搜索完成人员节点 //输入参数:M_name完成人员节点名称,ACHS所属科技成果头完成人员节点指针 //返回值:完成人员节点节点指针 MEMBER_NODE*MEMBER_search(char*M_name,MEMBER_NODE*MEMBER){ MEMBER_NODE*pSearch;pSearch=MEMBER;intflag=1; while((flag=strcmp(M_name,pSearch->name))&&pSearch->next!=NULL){ pSearch=pSearch->next;} if(!flag) return(pSearch);else 80C语言课程设计实验报告{ dialog_info(\"无对应名称成员!\");return(NULL);}} 9)statistic.c #include\"achsMIS.h\" /************** 统计信息**************/ //函数名:statis_func1 //功能:统计各单位科技成果数量,调用Statis_info显示统计结果//输入参数://返回值:无 voidstatis_func1(GtkWidget*button){ intnum_ach=0,i=0,j,k;DEPT_NODE*pDept;ACHS_NODE*pAchs;charnum_str[5];pDept=gp_head; GtkTreeIteriter;structsort{ intnum_ach; GtkTreeIteriter[4];intna;intpro;intci; }sort_dept[31];GtkListStore*store; store=gtk_list_store_new(2, //定义结构遍历时暂时存储方便排序 G_TYPE_STRING,G_TYPE_STRING); while(pDept!=NULL){ num_ach=0; pAchs=pDept->achs;sort_dept[i].na=0;sort_dept[i].pro=0; 81C语言课程设计实验报告sort_dept[i].ci=0;while(pAchs!=NULL){ num_ach+=1;//统计各级奖项 if(!strcmp(pAchs->award_level,(char*)\"国家级\")) sort_dept[i].na++; if(!strcmp(pAchs->award_level,(char*)\"省级\")) sort_dept[i].pro++; if(!strcmp(pAchs->award_level,(char*)\"市级\")) sort_dept[i].ci++;pAchs=pAchs->next; } sort_dept[i].num_ach=num_ach;itoa(num_ach,num_str); gtk_list_store_append(store,&sort_dept[i].iter[0]);gtk_list_store_set(store,&(sort_dept[i].iter[0]), COLUMN,pDept->name,COMMENT,(char*)num_str,-1); gtk_list_store_append(store,&sort_dept[i].iter[1]);gtk_list_store_append(store,&sort_dept[i].iter[2]);gtk_list_store_append(store,&sort_dept[i].iter[3]);itoa(sort_dept[i].na,(char*)num_str); gtk_list_store_set(store,&sort_dept[i].iter[1], COLUMN,\"国家级\ COMMENT,(char*)num_str,-1); itoa(sort_dept[i].pro,(char*)num_str); gtk_list_store_set(store,&sort_dept[i].iter[2], COLUMN,\"省级\ COMMENT,(char*)num_str,-1); itoa(sort_dept[i].ci,(char*)num_str); gtk_list_store_set(store,&sort_dept[i].iter[3], COLUMN,\"市级\ COMMENT,(char*)num_str,-1); pDept=pDept->next;i++; } Statis_info(\"各单位科技成果数量排名\标题等 82//三个函数传递各自的 C语言课程设计实验报告\"单位\ \"科技成果数\store); } //函数名:statis_func2 //功能:统计各单位完成人员成果排名,调用Statis_info显示统计结果//输入参数://返回值:无 voidstatis_func2(GtkWidget*button){ intk;inti,j; DEPT_NODE*pDept;ACHS_NODE*pAchs; MEMBER_NODE*pMember;pDept=gp_head;GtkTreeIteriter;structsort{ intach_rank;charname[20];GtkTreeIteriter;}sort_dept[31];GtkListStore*store; store=gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_INT); while(pDept!=NULL){ i=0; pAchs=pDept->achs; gtk_list_store_append(store,&iter);gtk_list_store_set(store,&iter, COLUMN,pDept->name,-1); while(pAchs!=NULL){ pMember=pAchs->members;while(pMember!=NULL){ strcpy(sort_dept[i].name,pMember->name); 83C语言课程设计实验报告sort_dept[i].ach_rank=pMember->rank;pMember=pMember->next;i++; } pAchs=pAchs->next;} for(k=i-1;k>=0;k--)//冒泡法排序{ for(j=k-1;j>=0;j--){ if(sort_dept[k].ach_rank for(j=0;jif(sort_dept[j+1].ach_rank==sort_dept[j].ach_rank) 复人员 continue; gtk_list_store_append(store,&sort_dept[j].iter);gtk_list_store_set(store,&sort_dept[j].iter, COLUMN,sort_dept[j].name, COMMENT,sort_dept[j].ach_rank,-1); printf(\"%s,%d\} pDept=pDept->next; } Statis_info(\"各单位人员成果排名\ \"单位\\"成果排名\store);} //函数名:statis_func3 //功能:统计所有50岁以下第一完成人,调用Statis_info显示统计结果//输入参数://返回值:无 84//避免插入重 C语言课程设计实验报告voidstatis_func3(GtkWidget*button){ DEPT_NODE*pDept;ACHS_NODE*pAchs; MEMBER_NODE*pMember;GtkTreeIteriter;GtkListStore*store; store=gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_STRING); char*name;pDept=gp_head;while(pDept!=NULL){ pAchs=pDept->achs;while(pAchs!=NULL){ pMember=MEMBER_search(pAchs->first_member_name,pAchs->members); if(pMember->age<50){ gtk_list_store_append(store,&iter);gtk_list_store_set(store,&iter, COLUMN,pMember->name,COMMENT,pMember->sex,-1); } pAchs=pAchs->next;} pDept=pDept->next;} Statis_info(\"有50岁以下第一完成人\ \"姓名\\"性别\store); } 10)help.c #include\"achsMIS.h\" //函数名:help_about //功能:弹出软件信息及作者信息//输入参数://返回值:无 85C语言课程设计实验报告voidhelp_about(GtkWidget*button){ dialog_info(\"AchsMISisainformationmanagementsystem.\\n\\ \\n\\ ZhuDi'sCprogramminglanguagecoursedesign\\n\\ \\n\\Class:CS1204Stu'ID:U201214908\"); } 86 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务