科技成果信息管理系统_大学C语言课程设计实验报告.docx
华中科技大学计算机科学与技术学院C语言程序设计课程设计基础部分实验报告题目:科技成果信息管理系统专业:计算机科学与技术班级:1204学号:姓名:成绩:指导教师:目录一、系统功能结构设计1二、数据结构设计1三、程序结构4四、函数原型及功能9五、试验结果13六、实验体会29七、附录1:参考文献31八、附录2:程序清单31、系统功能结构设计航科技成果信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。如下图所示:二、数据结构设计1 .单位信息链结点结构(DEPT NODE)及用法char number8;char name30;char PIC20;struct dept_node *next;/*单位编号*/*单位名称*/*负责人*/*指向下一结点*/struct archs_node *achs;/*指向科技成果信息链结点的指针*/GtkTreelter iter;/*treeview 中对应 treeiter*/ DEPT_NODE;中文字段名类型及长度变量名举例单位编号char8number43007401单位名称char30nameHuazhong_university_of_sci&tech负责人char20PICLi_peigeng2 .科技成果信息链结点结构(ACHS_NODE)及用法typedef struct achs_nodechar number12;char name50;char field20;char first_dept_name30;char first_dept_number8;/*成果编号*/*成果名称*/*所属技术领域*/*第一完成单位*/*第一完成单位编号*/char first_member_name20;/*第一完成人*/char award_name30;/*获奖名称*/char award_level10;/*获奖档次*/char award_grade10;/*获奖等级*/struct arhs_node *next;/*指向下一节点*/struct member_node * members;/*指向完成人员信息结点的指*/GtkTreelter iter;/*treeview 中对应 treeiter*/ ACHS_NODE;中文字段名类型及长度变量名举例成果编号char12numbe200703150001成果名称char40nameThe_method_of_study所属技术领域char20fieldcomputer第一完成单位char30first_dept_nameHuazhong_university_of _sci&tech第一完成单位编号first_dept_numberfirst_dept_number43007401第一完成人char20first_member_nam eLu_zhengding获奖名称char30award_nameNaturalsci ence_of_hub ie_province获奖档次char10awardjevelprovince/*省级*/获奖等级intaward_grade1/*一等奖*/3 .完成人员信息链结点结构(MEMBER_NODE)及用法typedef struct member_nodechar number18;/*身份证号*/char name20;/*姓名*/char dept_name30;/*工作单位*/char sex4;/*性别*/int age;/*年龄*/char title15;/*职称*/int rank;/*成果排名*/charachs_name40;/*所属成果名称*/struct member_node *next;/*指向下一个结点*/GtkTreelter iter;/*treeview 中对应 treeiter*/ MEMBER_NODE;中文字段名类型及长度举例姓名char20numberLu_zhengding身份证号char18name420111194801012216工作单位char30dept_nameHuazhong_university_of_sci&tech性别charsexm年龄intage60职称char15titleprofessor成果排名intrank1所属成果名称char 40The_method_of_studyachs_name4 .三方向的十字交叉链表结构5 .登陆窗体控件结构体(wgt)及用法struct login_widgetGtkWidget *window;主窗体GtkWidget *label_tips;用于信息提示的标签GtkWidget *buttonogin;两个按钮,一个点击后登录,一个点击后退出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种节点的指针联合及用法typedef union nodepstruct dept_node *dept;struct achs_node *achs;struct member_node * member; nodep;说明:用于3种结构都会用到但不会同时用到的情形7 .两个传递参数的结构及其用法struct nodecreateGtkWidget *window;GtkWidget *entry9;nodep unp;int type;);struct queryjudgeGtkWidget *entry;int flag;);说明:GTKg_signal_connected将函数与信号链接后之内传递一个参数给函数,所以定义这两个结构分别将几个参数结合在一起传递三、程序结构1.主程序运行流程3.添加流程试川entry_inf。函数 a根提type生成对应的输入框点击理定Add.nodegiJx传递的参数structnodecreate包含了 entry里的text和 type措入夫败调用相应的insert函数将pNew琏在相应住置4.单位查询流程试用限制H5.统计50岁以下第一完成人流程四、函数原型及功能(所有GtkWidget *button参数均为与消息链接用)1 .登陆模块功能:登录框初始化函数输入参数:返回值:无void init_login_widgetO/功能:登录验证函数,点击login按钮时调用输入参数:返回值:无void login(GtkWidget *widget,gpointer data)2 .图形界面模块/*初始化部分变量,再依次调用各函数初始化界面各部分*/int main( int argc, char *argv)/*初始化菜单栏*/void init_menubar(GtkWidget *menubar)/*初始化目录*/void create_view_and_model (void)/*初始化显示栏*/void init_show(GtkWidget *list)/*改变状态栏及显示栏*/void on_changed(GtkWidget *widget, gpointer status bar)功能:将选中的节点信息在显示栏中显示出来输入参数:iter返回值:无int Show_Node(GtkTreeIter iter)/值传递彳:影响 selected iter/*对应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为成功int LoadData(GtkWidget *button)功能:读取数据文件中数据到链表中输入参数:phead单位节点头指针的地址返回值:re的二进制前3位记录了三个数据文件是否成功打开,1为成功int LoadList(DEPT_NODE *phead)功能:将链表中节点添加到左侧树状列表中输入参数:返回值:void rebuildtreeQ功能:存储数据文件输入参数:返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveData(GtkWidget * button)功能:将链表中数据存储在数据文件中输入参数:phead单位节点头指针返回值:flag的二进制前3位记录了三个数据文件是否成功打开,1为成功int SaveList(DEPT_NODE *phead)功能:推出前提示保存输入参数:返回值:void quit_save(GtkWidget *button)4 .查询模块功能:根据type弹出一个查询框,再分别调用对应的Query函数输入参数:type对应枚举的几种类型返回值:无void Query_info(GtkWidget "button,int type)功能:查询学院输入参数:in包含iter和名称的结构返回值:无void Query_Dept(GtkWidget *button,struct query Judge *in)功能:根据type弹出一个查询框,再分别调用对应的Query函数输入参数:type对应枚举的几种类型返回值:无void Query_info(GtkWidget "button,int type)功能:查询完成人员输入参数:in包含iter和名称的结构返回值:无void Query_Member(GtkWidget *button,struct query_judge *in)功能:展开并跳转至指定iter输入参数:iter treeview中的一个目标iter返回值:无void expand_select(GtkTree!ter iter)功能:按,称搜索单位输入参数:D_name单位名称返回值:单位节点指针DEPT_NODE *DEPT_search(char *D_name)功能:按名称搜索藉技成果节点输入参数: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对应枚举的几种类型返回值:无void entry_info(GtkWidget *button,int type)功能:添加3种节点统一函数,由entry_info确定按钮调用输入参数:返回值:无void Add_node(GtkWidget *button,struct nodecreate *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种节点统一函数,由''删除"按钮调用输入参数:返回值:无void Del_Node(GtkWidget "button)功能:删除单位节点,由Del_Node函数case 2调用输入参数:name单位名称返回值:int 1为有错,0为正常int Del_Dept(char *name)功能:删除科技成果节点,由Del_Node函数case 2调用输入参数:name科技成果名称,P_name对应单位名称返回值:int 1为有错,0为正常int Del_Achs(char *name,char *P_name)功能:删除完成人员节点,由DeLNode函数case4调用输入参数:name完成人员名称,P_name对应科技成果名称,PP_name对应单位名称返回值:inti为有错,0为正常int Del_Member(char *name,char *P_name,char *PP_name)7 .编辑模块功能:弹出一个编辑框输入参数:返回值:无int Edit_info(GtkWidget *button)功能:编辑节点输入参数:返回值:无void Edit_Node(GtkWidget *button,struct nodecreate *nodec)8 .统计模块功能:弹出一个统计框,由传入参数设置具体内容输入参数:title统计框标题,coll第一列标题,col2第二列标题,in传入的 model返回值:无void Statis_info(char *title,char *coll,char *col2,GtkListStore *in)功能:豪计各单位科技成果数量,调用Statis_info显示统计结果输入参数:返回值:无void statis_funcl(GtkWidget *button)功能:委计各单位完成人员成果排名,调用Statis_info显示统计结果输入参数:返回值:无void statis_func2(GtkWidget *button)功能:统计所有50岁以下第一完成人,调用Statis_info显示统计结果输入参数:返回值:无void statis_func3(GtkWidget *button)9 .帮助模块功能:弹出软件信息及作者信息输入参数:返回值:无void help_about(GtkWidget *button)五、试验结果编译环境:Ubuntulinux64MingwGcc(源代码配置好后可跨平台编译)GTK 版本:GTK+2.41开发 IDE: Codeblocks 12.111.系统登陆输对自动进入输错显示错误2.登陆成功进入主界面3.全屏模式»水电2倍应)猊» HtsiaaKR H<BStn«AM!TA0t2餐;I拿不 BtAftTH*几U!f"化河»美Vifl修东绕的N快冷进 VIMTR*足金门机日人ifi劲投制WQAB惘谑号:64424n«:费江it机竽就ffM;RKH:4S*林:RHI应辨名4M底各约分布式效鼻*11星UI4.读取数据Projectt Symbols QWorktpcc MIS_CTK Sources Headen文件4so am蟾计ffiwi-2。71ZHU aBuild target Drbug:ini jm«nub“(ctkW,d9ef menubar): voidC 口:,、IC .,pc,Kc . X ',/“ e IC '«(p.c x1819x2122!:24”262r28”加3132”U*华中Hfll大学m自内sw 位名样 ARA:I »»»,3/:5«U|LwrziocIMLirtr/inrliw/«tia Mt/(«»1»除华中科技大竽«4'«»tr-i .«.«4+«,0”.»*»»|«UBW|a-*K»raait-int' B.'wwl CMnKt Mtrna 4 tVBMWBaSMH.inuavi/homc/zhu/*/cours? de$ign/M6_GTK/nMin.cutf-8 une 120. column i insertRMd/Writ«(标准gnome菜单栏在最上面)5.读取成功点击相应节点右侧显示相关信息6.添加单位(添加成功提示)7.添加科技成果8 .添加完成人员二.$UtK_hjnciClkWtd9c<* button): voidProjEt Symbols分布式数曰第tt内内000ffl 3文件用加ttit fflttI A cod, tt«l字残*«r7aeaa«sZIMM? Mlli 司与1543 QWork»p«ce MIS_CTK » OSoury DhmQeK>ct_dei e(o* nt 金海80 ki sinK山石峰 R«8SA*R40MM50江计机3ne 1«»传R: VB.VWdsMl5.h *-»-,.,:. IC ,<.二.>C .口曲化学几S3星贝匕向«A«n阳,XRSaifUKItmH机帔学除»足3行机。人道动在1«aunc 31. column iReati/Wrlte dtfault9 .添加错误返回信息目录计篝机学院水电综合信息集成系统项目身份证号:姓名:内容46546456张江彭根网络碍盘阵列张江金海冯丹分布式数据库管理系曹忠张江李东自动化学院几类管理优化问题肖人彬欧阳关联基砒设施系统的机械学院多足步行机器人运动控W删除张江10.编辑结点(选中节点后点击左下角编辑按钮)更改生效11.删除节点弹出确认框删除成功12.查询单位sutH_func i(ctkwtdge<* button): voidPro|«cttMakhei4Gg»»»llhi'-"i 5':>C,r,D、:,:» I。.,quc 小心<>C upc,tc; X Q Workspace,1|MI5_GTK» a Sourer* OHMdcnlata*|t* il (Matt1(»*« tar«t iaa>'' I -IMMM-MT1MUI<Ql0t>4l>Hun«31. Column)martRe«d/Write def«u<tBuild target: DebugF文忤*加av mi+d Qsort_dei eo)*c 1nt 金海8<A mKiBN «c 2 m *y|fl000 tbH1(31.'IM/MHr/rtw70B/ra tl查询成功,左侧已跳转至并展开机械学院13.查询科技成果查询成功,左侧已跳转至并展开网络磁盘阵列未查询到时弹出提示14.查询完成人员从头查询,跳转至并展开第一个张江点击查询,跳转至并展开第二个张江15.统计各单位科技成果总数及各类成果数16.统计各单位成果排名17.统计50岁以下第一完成人科技成果信息管理系统by祝迪目录华中科技:计算机W水电,。©有50岁以下第一完成人姓名 性别骋涉海用 例张金冯 PS张江肖人彬陈平事03里学院分布4 曹忠 张江李东自动化:几类首关联w机械学彳确定多足步行机器人运动性期张江18.软件信息及作者信息3® 科技成果信息管理系统by祝迪目录华中科技大学计算机学院水电综合信息集成系统网络碾盘阵列张江金海冯丹分布式数据库;曹忠项目身份证号:姓名:工作单位:性别:年龄:职称:内容644564张江计算机学院 男45教授张江李东自动化学院几类管理优化I关联基础设施.O通知Class: CS1204 Stu'ID:U201214908机械学院多足步行机器人运动控制19.退出前提示保存六、实验体会首先我看了一下实验书上的编程规范和几个基本模块的实现思想,但当我开始做的时候我发现光用face.c自己看不懂文本菜单操作肯定会有很多问题的,于是我想同样是学,不如直接学图形界面的开发。因为之前有些linux下的经验,所以选择了 GTK+在linux下开发。之前完全没有接触过GTK+和图形界面开发的东西,于是便开始了两个多星期的GTK +学习。GTK+的资料并不如windowsSDK等一些主流技术那么多,中文资料的情况基本就是少,舌L老。没有合适的书,只找到一份网页中文教程,但做得还挺不错,边看教程边实验边查官网的Reference Manual,算是学了个大概。我觉得经过这次我对在网上学技术有了更多的认识,的确是最佳的方式。在一开始我通过头文件和多个C文件来划分了一下整个程序的模块,虽然不是一开始规划完整体的结构,但边写边规划还是很不错的,这个可以根据各处开头的注释看出那种模块化的感觉。我在开发的过程中,一直都重点地考虑了重用性,抽取定义了一些多处重复使用的函数,IO.C里面的函数基本都是这样的。我也定义了许多函数指针数组、枚举常量等等来将3种节点的情况在一个函数里完成,包括输入框等的生成也是同一个for循环不同的条件。我写完主界面后因为比较顺利,一次写完了3块东西才一起调试,结果大量的问题一下涌现,调试毫无头绪。那段时间真是绝望到怀疑自己能不能写出能运行的成品。后来只能又重新学习更多调试方法与技巧,然后再循序渐进地先看warning,再看代码,再用GDB,一个问题一个问题解决,经过同学的给力帮助还有自己在网上学习查找相关内容终于在解决了几个关键问题后跨过了这一步。那将近一个星期完全没有新代码,花了好几倍的时间调试之前的那几个模块,不过感觉很多基本调试方法之前都没掌握,还是很值得很有收获的,之后的调试便顺利多了。C语言的问题很多都是极小的问题但经过最后进入写报告阶段,之前就做了一些准备,也有很多word排版的经验,所以效果自认为还不错吧,主要是电子版。就是流程图上因为和图形界面交互的操作比较繁琐,不知道处理得是否得当。回顾整个课设的历程,第一次做这种实用的大型程序,又是边学边用GTK+,确实是边写边积累了很多宝贵的经验。收获在前面已经说了很多了,另一方面真的是深感自己知识与能力的不足,不要好高鹫远,想着要学什么什么多少,学了后踏踏实实地写出点东西才是真的学到了,还好感觉这次已经弥补了足够多的欠缺。系统本身也还有许多有待完善的地方,也如果有需要的话接下来可以做下。我用的各种查找的方法都有点太依赖于名称,和遍历的方法比起来有很多缺点,但在大量数据的情况也有优势,可以结合一下。跟真正使用的系统比起里又更是差距甚远,这次感觉到软件的体验方面对程序员来说也真的是个大问题,这个以后可以在工作中和PM好好合作做好把。就是这样了,C语言的入门算是以课设结束了吧,接下来还有很多用C的地方,下次再见吧。七、附录1:参考文献1 gtk2-tutorial22j gtk2ReferenceManual3李开,卢萍,曹计昌.C语言实验与课程设计,北京:科学出版社,2011.八、附录2:程序清单1) achsMIS.h#ifndef_ACHSMIS_H#define _ACHSMIS_H/*头文件*/#indude <stdlib.h>#include <string.h>#include <stdio.h>#include <gtk/gtk.h>#define NAME"root"#define PWD"123456"结构声明*I/*完成人员信息链结点结构*/typedef struct member_node(char number18;/*身份证号*/char name20;/*姓名*/char dept_name30;/*工作单位*/char sex4;/*性别*/int age;/*年龄*/char title15;/*职称*/int rank;/*成果排名*/char achs_name40;/*所属成果名称*/struct member_node *next;/*指向下一个结点*/GtkTreelter iter;/*treeview 中对应 treeiter*/ MEMBER_NODE;/*科技成果信息链结点结构*/typedef struct achs_node(char number12;/*成果编号*/char name50;/*成果名称*/char field201;/*所属技术领域*/*第一完成单位*/*第一完成单位编号*/*第一完成人*/*获奖名称*/*获奖档次*/*获奖等级*/char first_dept_name30;char first_dept_number8;char first_member_name20;char award_name30;char award_level10;char award_grade10;struct arhs_node *next;/*指向下一节点*/struct member_node * members;/*指向完成人员信息结点的指针*/GtkTreelter iter;/*treeview 中对应 treeiter*/ ACHS_NODE;/*单位信息链结点结构*/typedef struct dept_nodechar number8;char name30;char PIC20;struct dept_node *next;struct archs_node *achs;GtkTreelter iter; DEPT_NODE;/*单位编号*/*单位名称*/*负责人*/*指向下一结点*/*指向科技成果信息链结点的指针*/*treeview 中对应 treeiter*/*将登陆窗体独立成一个结构体*/struct login_widgetGtkWidget *window;主窗体GtkWidget *label_tips;用于信息提示的标签GtkWidget *buttonogin;两个按钮,一个点击后登录,一个点击后退出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;typedef union nodep/*指向节点的指针联合*/(struct dept_node *dept;struct achs_node *achs;struct member_node * member; nodep;struct nodecreate/*传递参数*/(GtkWidget *window;GtkWidget *entry9;nodep unp;int type;);struct queryjudge/*传递参数*/GtkWidget *entry;int flag;;/*全局变量*/GtkWidget *window;/*主界面窗口*/GtkWidget *showlist;/*显示属性的位置*/GtkListStore *liststore;GtkListStore *lstore3;/*显示栏左边项目名 liststore 组*/GtkTreeStore *treestore;/*树形储存*/GtkWidget *treeview;/*树状列表目录*/GtkTreelter rootiter;/*根位置*/GtkTreelter selectediter;/*选中的位置*/*显示属性liststore的控件组*/GtkTreelter dept_iter3;GtkTreelter achs_iter9;GtkTreelter member_iter8;DEPT_NODE *gp_head;/*主链头指针*/char *Str_Pointer3;void (*query_node3)();/*mylib.c中已初始化的全局变量*/extern char *gp_dept_info_filename;extern char *gp_achs_info_filename;extern char *gp_member_info_filename;extern char *Node_Str;extern int NODEJNSQ;extern char *Dept_Str;extern char *Achs_Str;extern char *Member_Str;enum iter里的列号(COLUMN =0,COMMENT);enum(TYPE_ROOT =1,TYPE_DEPT,TYPE_ACHS,TYPE.MEMBER;函数声明*