科技成果信息管理系统_大学C语言课程设计实验报告.docx_第1页
科技成果信息管理系统_大学C语言课程设计实验报告.docx_第2页
科技成果信息管理系统_大学C语言课程设计实验报告.docx_第3页
科技成果信息管理系统_大学C语言课程设计实验报告.docx_第4页
科技成果信息管理系统_大学C语言课程设计实验报告.docx_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

华中科技大学计算机科学与技术学院c语言程序设计课程设计基础部分实验报告题目: 科技成果信息管理系统 专业: 计算机科学与技术 班级: 1204 学号: 姓名: 成绩: 指导教师: 目录一、系统功能结构设计 1二、数据结构设计 1三、程序结构 4四、函数原型及功能 9五、试验结果 13六、实验体会 29七、附录1:参考文献 31八、附录2:程序清单 31c语言课程设计实验报告一、 系统功能结构设计航科技成果信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。如下图所示: 二、 数据结构设计1. 单位信息链结点结构(dept_node)及用法typedef struct dept_node char number8; /*单位编号*/ char name30; /*单位名称*/ char pic20; /*负责人*/ struct dept_node *next; /*指向下一结点*/ struct archs_node *achs; /*指向科技成果信息链结点的指针*/ gtktreeiter iter;/*treeview中对应treeiter*/ dept_node;中文字段名类型及长度变量名举例单位编号char8number43007401单位名称char30namehuazhong_university_of_sci&tech负责人char20picli_peigeng2. 科技成果信息链结点结构(achs_node)及用法typedef struct achs_node char 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; /*指向完成人员信息结点的指*/ gtktreeiter iter; /*treeview中对应treeiter*/ achs_node;86中文字段名类型及长度变量名举例成果编号char12numbe200703150001成果名称char40namethe_method_of_study所属技术领域char20fieldcomputer第一完成单位char30first_dept_namehuazhong_university_of_sci&tech第一完成单位编号first_dept_numberfirst_dept_number43007401第一完成人char20first_member_namelu_zhengding获奖名称char30award_namenatural_science_of_hubie_province 获奖档次char10award_levelprovince /*省级*/获奖等级intaward_grade1 /*一等奖*/3. 完成人员信息链结点结构(member_node)及用法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;/*指向下一个结点*/ gtktreeiter iter; /*treeview中对应treeiter*/ member_node;中文字段名类型及长度举例姓名char20numberlu_zhengding身份证号char18nam作单位char30dept_namehuazhong_university_of_sci&tech性别charsexm年龄intage60职称char15titleprofessor成果排名intrank1所属成果名称char40achs_namethe_method_of_study4. 三方向的十字交叉链表结构科技成果1 科技成果2科技成果n单位1 单位2单位n 主链头gp_head经停航班1 经停航班n 5. 登陆窗体控件结构体(wgt)及用法 struct login_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种节点的指针联合及用法typedef union nodep struct dept_node *dept; struct achs_node *achs; struct member_node *member; nodep;说明:用于3种结构都会用到但不会同时用到的情形7. 两个传递参数的结构及其用法struct nodecreate gtkwidget *window; gtkwidget *entry9; nodep unp; int type;struct query_judge gtkwidget *entry; int flag;说明:gtk信号连接g_signal_connected将函数与信号链接后之内传递一个参数给函数,所以定义这两个结构分别将几个参数结合在一起传递三、 程序结构1. 主程序运行流程主界面初始化加载数据或重新添加系统功能模块的选择及运行退出系统前提示保存链表数据清理内存中的缓存信息,关闭系统开始结束登陆框出现输入用户名与密码2. 数据保存流程开始 打开航班,经停机场,经停航班信息文件p1=null y n在文件1写入一条单位信息 p2=nullp1=p1-nexty n在文件2写入一条科技成果信息p2=p2-next p3=null y关闭文件退出系统n在文件3写入一条完成人员信息p3=p3-next 结束3. 添加流程4. 单位查询流程5. 统计50岁以下第一完成人流程开始调用统计函数 statis_func3p1=null创建一个gtkliststore,p1=gp_head取链表的链头指针p1yp1=p1-next n获取第二级链表的链头指针p2=p1-achsp2=null yp2=p2-nextp3=member_search(p2-first_member_name,p2-members) np3-age50n n 插入liststore y将liststore传递给statis_info展示出来取链表的链头指针p1 结束四、 函数原型及功能(所有gtkwidget *button参数均为与消息链接用)1. 登陆模块/功能:登录框初始化函数/输入参数:/返回值:无void init_login_widget()/功能:登录验证函数,点击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 statusbar)/功能:将选中的节点信息在显示栏中显示出来/输入参数:iter/返回值:无int show_node(gtktreeiter iter)/值传递不影响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为成功int loaddata(gtkwidget *button)/功能:读取数据文件中数据到链表中/输入参数:phead 单位节点头指针的地址/返回值:re 的二进制前3位记录了三个数据文件是否成功打开,1为成功int loadlist(dept_node *phead)/功能:将链表中节点添加到左侧树状列表中/输入参数:/返回值:void rebuildtree()/功能:存储数据文件/输入参数:/返回值: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(gtktreeiter 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)/功能:删除完成人员节点,由del_node函数case 4调用/输入参数:name 完成人员名称,p_name 对应科技成果名称,pp_name 对应单位名称/返回值:int 1为有错,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 统计框标题,col1 第一列标题,col2 第二列标题,in 传入的model/返回值:无void statis_info(char *title,char *col1,char *col2,gtkliststore *in)/功能:统计各单位科技成果数量,调用statis_info显示统计结果/输入参数:/返回值:无void statis_func1(gtkwidget *button)/功能:统计各单位完成人员成果排名,调用statis_info显示统计结果/输入参数:/返回值:无void statis_func2(gtkwidget *button)/功能:统计所有50岁以下第一完成人,调用statis_info显示统计结果/输入参数:/返回值:无void statis_func3(gtkwidget *button)9. 帮助模块/功能: 弹出软件信息及作者信息/输入参数:/返回值:无void help_about(gtkwidget *button)五、 试验结果编译环境:ubuntu linux64位 mingw gcc(源代码配置好后可跨平台编译)gtk版本:gtk+ 2.41开发ide:codeblocks 12.111. 系统登陆输对自动进入输错显示错误2. 登陆成功进入主界面3. 全屏模式4. 读取数据(标准gnome菜单栏在最上面)5. 读取成功点击相应节点右侧显示相关信息6. 添加单位(添加成功提示)7. 添加科技成果8. 添加完成人员9. 添加错误返回信息10. 编辑结点(选中节点后点击左下角编辑按钮)更改生效11. 删除节点弹出确认框删除成功12. 查询单位查询成功,左侧已跳转至并展开机械学院13. 查询科技成果查询成功,左侧已跳转至并展开网络磁盘阵列未查询到时弹出提示14. 查询完成人员从头查询,跳转至并展开第一个张江点击查询,跳转至并展开第二个张江15. 统计各单位科技成果总数及各类成果数16. 统计各单位成果排名17. 统计50岁以下第一完成人18. 软件信息及作者信息19. 退出前提示保存六、 实验体会首先我看了一下实验书上的编程规范和几个基本模块的实现思想,但当我开始做的时候我发现光用face.c自己看不懂文本菜单操作肯定会有很多问题的,于是我想同样是学,不如直接学图形界面的开发。因为之前有些linux下的经验,所以选择了gtk+在linux下开发。之前完全没有接触过gtk+和图形界面开发的东西,于是便开始了两个多星期的gtk+学习。gtk+的资料并不如windows sdk等一些主流技术那么多,中文资料的情况基本就是少,乱,老。没有合适的书,只找到一份网页中文教程,但做得还挺不错,边看教程边实验边查官网的reference manual ,算是学了个大概。我觉得经过这次我对在网上学技术有了更多的认识,的确是最佳的方式。在一开始我通过头文件和多个.c文件来划分了一下整个程序的模块,虽然不是一开始规划完整体的结构,但边写边规划还是很不错的,这个可以根据各处开头的注释看出那种模块化的感觉。我在开发的过程中,一直都重点地考虑了重用性,抽取定义了一些多处重复使用的函数, io.c里面的函数基本都是这样的。我也定义了许多函数指针数组、枚举常量等等来将3种节点的情况在一个函数里完成,包括输入框等的生成也是同一个for循环不同的条件。我写完主界面后因为比较顺利,一次写完了3块东西才一起调试,结果大量的问题一下涌现,调试毫无头绪。那段时间真是绝望到怀疑自己能不能写出能运行的成品。后来只能又重新学习更多调试方法与技巧,然后再循序渐进地先看warning,再看代码,再用gdb,一个问题一个问题解决,经过同学的给力帮助还有自己在网上学习查找相关内容终于在解决了几个关键问题后跨过了这一步。那将近一个星期完全没有新代码,花了好几倍的时间调试之前的那几个模块,不过感觉很多基本调试方法之前都没掌握,还是很值得很有收获的,之后的调试便顺利多了。c语言的问题很多都是极小的问题但经过最后进入写报告阶段,之前就做了一些准备,也有很多word排版的经验,所以效果自认为还不错吧,主要是电子版。就是流程图上因为和图形界面交互的操作比较繁琐,不知道处理得是否得当。回顾整个课设的历程,第一次做这种实用的大型程序,又是边学边用gtk+,确实是边写边积累了很多宝贵的经验。收获在前面已经说了很多了,另一方面真的是深感自己知识与能力的不足,不要好高骛远,想着要学什么什么多少,学了后踏踏实实地写出点东西才是真的学到了,还好感觉这次已经弥补了足够多的欠缺。系统本身也还有许多有待完善的地方,也如果有需要的话接下来可以做下。我用的各种查找的方法都有点太依赖于名称,和遍历的方法比起来有很多缺点,但在大量数据的情况也有优势,可以结合一下。跟真正使用的系统比起里又更是差距甚远,这次感觉到软件的体验方面对程序员来说也真的是个大问题,这个以后可以在工作中和pm好好合作做好把。就是这样了,c语言的入门算是以课设结束了吧,接下来还有很多用c的地方,下次再见吧。七、 附录1:参考文献1 gtk2-tutorial22 gtk2 reference manual3 李开,卢萍,曹计昌. c语言实验与课程设计,北京:科学出版社,2011.八、 附录2:程序清单1) achsmis.h#ifndef _achsmis_h#define _achsmis_h/*-头文件-*/#include #include #include #include #define name root#define pwd 123456/* 结构声明*/*完成人员信息链结点结构*/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;/*指向下一个结点*/ gtktreeiter iter; /*treeview中对应treeiter*/ member_node;/*科技成果信息链结点结构*/typedef struct achs_node char 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; /*指向完成人员信息结点的指针*/ gtktreeiter iter; /*treeview中对应treeiter*/ achs_node;/*单位信息链结点结构*/typedef struct dept_node char number8; /*单位编号*/ char name30; /*单位名称*/ char pic20; /*负责人*/ struct dept_node *next; /*指向下一结点*/ struct archs_node *achs; /*指向科技成果信息链结点的指针*/ gtktreeiter iter; /*treeview中对应treeiter*/ dept_node;/*将登陆窗体独立成一个结构体*/struct login_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;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 query_judge /*传递参数*/ gtkwidget *entry; int flag;/* 全局变量*/gtkwidget *window; /*主界面窗口*/gtkwidget *showlist; /*显示属性的位置*/gtkliststore *liststore;gtkliststore *lstore3; /*显示栏左边项目名liststore组*/gtktreestore *treestore; /*树形储存*/gtkwidget *treeview; /*树状列表目录*/gtktreeiter rootiter; /*根位置*/gtktreeiter selectediter; /*选中的位置*/*显示属性liststore的控件组*/gtktreeiter dept_iter3;gtktreeiter achs_iter9;gtktreeiter 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 node_ins;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 ;/* 函数声明*/*main.c*/void init_menubar(gtkwidget *menubar);void create_view_and_model (void);void init_show(gtkwidget *list);void on_changed(gtkwidget *widget, gpointer statusbar);/*file.c*/int loaddata(gtkwidget *button);int loadlist(dept_node *phead);void rebuildtree();int savedata(gtkwidget *button);int savelist(dept_node *phead);void quit_save(gtkwidget *button);/*operate.c*/void add_node(gtkwidget *button,struct nodecreate *nodec);dept_node * insert_achs(achs_node *pnew);achs_node *insert_member(member_node *pnew);int delnode(gtkwidget *button);void del_node(gtkwidget *button);int del_dept(char *name);int del_achs(char *name,char *p_name);int del_member(char *name,char *p_name,char *pp_name);void edit_node(gtkwidget *button,struct nodecreate *nodec);/*io.c*/void dialog_info(char *show);void entry_info(gtkwidget *button,int type);int edit_info(gtkwidget *button);void query_info(gtkwidget *button,int type);void f_cancel(gtkwidget *button,gtkwidget *win);gint judge_node_type(gtktreeiter *iter);int show_node(gtktreeiter iter);gtkliststore *show_dept(char *name);gtkliststore *show_achs(char *name,char *p_name);gtkliststore *show_member(char *name,char *p_name,char *pp_name);void itoa(int i,char* str);/*query.c*/void query_dept(gtkwidget *button,struct query_judge *in);void query_achs(gtkwidget *button,struct query_judge *in);void query_member(gtkwidget *button,struct query_judge *in);void expand_select(gtktreeiter iter);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*/void statis_func1(gtkwidget *button);void statis_func2(gtkwidget *button);void statis_func3(gtkwidget *button);/*login.c*/void gtk_win_destroy(gtkwidget *widget,gpointer data);void login(gtkwidget *widget,gpointer data);void init_login_widget();/*help.c*/void help_about(gtkwidget *button);#endif2) 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类信息需填资料个数*/int node_ins= 0,0,3,9,8 ;/*3类信息需填资料字符串数组*/char *dept_str= 单位编号:, 单位名称:, 负责人:;char *achs_str= 成果编号:, 成果名称:, 所属技术领域:, 第一完成单位:, 第一完成单位编号:, 第一完成人:, 获奖名称:, 获奖档次:, 获奖等级:;char *member_str= 身份证号:, 姓名:, 工作单位:, 性别:, 年龄:, 职称:, 成果排名:, 所属成果名称;3) main.c#include achsmis.h/* main函数*/int main( int argc, char *argv) gtkwidget *vbox = null; gtkwidget *hbox,*hb

温馨提示

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

评论

0/150

提交评论