1、 目录一、课程设计题目3二、 课程设计项目名称3三、 课程设计目的及意义3四、 课程设计题目功能分析3(一) 设计题目功能描述3(二) 数据结构设计4(三)数据存取5(四) 数据录入方法设计5五、算法分析与流程6(一)函数定义6(二)函数流程图6(三)部分函数实现代码10六、项目实现过程12(一) 在Linux操作系统下的源文件编写12(二) 在Linux操作系统下完成源文件的编译14(1) 使用make命令完成源程序的编译14(三) 在Linux操作系统下运行程序15七、项目测试结果15(一)查看桌面的生成文件15八、总结16(一)项目小结16(二)项目改进17(三) 体会17一、课程设计题
2、目在Linux操作系统下实现C语言版本的学生信息管理系统。要求:1. 实现管理系统的基本功能:数据录入,数据存取,数据浏览,数据查询等2. 所有和输入输出相关的函数全部写在gui.c文件中3. 所有管理功能函数写在smsfunc.c文件中4. 主函数写在main.c文件中5. 编写makefile对源文件进行编译和安装二、 课程设计项目名称简易学生信息管理系统三、 课程设计目的及意义1、熟悉和掌握Linux操作系统的常用命令2、学习在Linux操作系统上完成简单的C语言编程3、学习Makefile文件的功能和作用,并掌握Makefile文件的编写规则4、学习将多个C语言源文件通过Makefil
3、e文件建立联系,并使用Make命令完成对源文件的编译。5、通过这次课程设计,比较Linux操作系统与Windows操作系统的异同点四、 课程设计题目功能分析(一) 设计题目功能描述 1、输入学生的基本数据(包括学号、姓名、性别和5门课的成绩) 2、输出全部学生信息(按指定课程成绩降序排列,按平均成绩降序排列) 3、修改指定学生的信息 4、删除指定学生的信息 5、在指定的学生前或后再插入一个学生的信息 6、统计指定课程不及格的人数 7、将信息文件存入磁盘中 8、从磁盘中读入存储的信息(二) 数据结构设计 通过对系统所要实现的功能进行详细的分析后,本次设计采用线性的数据结构。具体来说,本次设计所采
4、用的数据结构就是线性表,其存储结构为链式存储结构。即用一组任意的存储单元存储线性表当中的数据元素,这组存储单元在内存中的物理状态并不是连续的。这些在逻辑上相连的元素在物理结构上并不是互相连续的。 这种链式存储结构称为链表。其特点是:存放数据的节点包括两个域,即数据域和指针域。数据域用于存放当前节点的数据信息,二指针域则用于存放后继节点在存储器中的地址信息。数据元素的节点结构如下:本次设计使用的链表结构为单向链表,其节点的基本数据结构及内容如下所示: 1、建立结构体节点信息如下:strut ST 建立名为ST的结构体其中包含有学的 char xh20; 基本信息学号(xh)、姓名(name)、性
5、 char name20; 别(sex)、五科成绩和平均分(grade), char sex3; 以及保存下一节点地址的指针*next。 float grade6; struct ST *next;struct *SI; *SI为指向结构体ST的的指针变量。 2、单向链表的建立 这里采用动态建立链表的方法,即每次在满足条件的前提下,向内存动态申请大小为一个节点数据类型大小的内存空间,并输入当前节点的相关信息。将新节点通过指针域与已建立的链表相连。由此建立包含N个节点信息的单向链表。 3、有关数据结构的基本操作 (1)单链表的插入 (2)单链表的删除 (3)单链表的查找 (4)单链表的排序(三)
6、数据存取数据存取采用的是线性链表的存取结构,其特点是:使用一组任意的存储单元存储线性表中的数据元素,这些存储单元之间在逻辑结构上虽然是相互关联的,但是其在物理结构上并不是连续的。数据元素之间的逻辑关系是由节点中的指针域指示的,这种存储结构是非顺序映像或者叫做链式映像。在使用中,我们只需关心数据元素的逻辑次序而不必关心它的真正存储地址。我们在单链表第一个元素所在的节点之前设置一个节点头结点。头结点的指针域存储第一个元素所在节点的存储位置;而数据域并没有存储任何信息。基于以上建立单向链表的思想,我们在对节点元素进行存取的过程中只需找到该链表的头结点,即可完成对数据元素的存取操作。(四) 数据录入方
7、法设计链表是一种动态存储结构,所需的存储空间只有在执行malloc之后,才能申请到一个可用节点空间;free的作用是系统回收一个节点,回收后的空间可以备作再次生成节点时使用。动态建立链表共有两种基本方法:方向建立链表、正向建立链表。这里采用反向建立链表的数据录入方法。数据录入的方法是:从线性表的最后一个元素开始,从后向前依次插入到当前链表的第一个节点之前。在满足循环条件的前提下,依次输入当前节点的相关信息,并通过节点的指针域将当前节点插入已建立的链表当中。五、算法分析与流程(一)函数定义void display(int Max);信息展示函数定义void menu();菜单函数定义int di
8、splay_module(int Max);输出全部学生信息(按指定课程成绩降序排列,按平均成绩降序排列)int read_imformation();在指定的学生前或后再插入一个学生的信息int add_module(int Max); 输入学生的基本数据(包括学号、姓名、性别和5门课的成绩)int find_num_module(int Max);从磁盘中读入存储的信息int find_name_module(int Max);int modify_module(int Max);修改指定学生的信息int sort_module(int Max);统计指定课程不及格的人数 int save
9、_module(int Max);将信息文件存入磁盘中int del_module(int Max);删除指定学生的信息(二)函数流程图(三)部分函数实现代码1、 主函数void main() int sel;SI=(struct ST *)malloc(sizeof(struct ST);SI-next=NULL;selloadINFO();while (1) menu();scanf(%d,&sel);switch (sel)case 0: exit(0);case 1: input();break; case 2: output();break; case 3: changeINFO()
10、;break; case 4: deleteINFO();break;case 5: countgrade();break;case 6: insertINFO();break;case 7: saveINFO();break;2、 信息显示函数void outlist() struct ST *q;q=SI-next;printf( 学生成绩基本信息n);printf(-n);printf( 学号 姓名 性别 语文 数学 英语 物理 政治 平均分 n); printf(-n);while(q!=NULL) printf(%4st,q-xh);printf(%4st,q-name);print
11、f(%4st,q-sex);printf(%6.1ft,q-grade0);printf(%6.1ft,q-grade1);printf(%6.1ft,q-grade2);printf(%6.1ft,q-grade3);printf(%6.1ft,q-grade4);printf(%6.1fn,q-grade5); q=q-next;printf(-n);printf( 制表: mr-choun); 六、项目实现过程(一) 在Linux操作系统下的源文件编写(1) 利用vi命令编写文件main.c,gui.c,smsfunc.c,makefile,global.h;具体实现过程如下:图16 编
12、写文件main.c图17 编写文件gui.c图18 编写文件smsfunc.c图19 编写global.h文件图20 编写文件Makefile(二) 在Linux操作系统下完成源文件的编译(1) 使用make命令完成源程序的编译图21 使用make命令编译后的结果(三) 在Linux操作系统下运行程序图22 运行结果图七、项目测试结果(一)查看桌面的生成文件图23 桌面效果图24 程序运行部分结果图八、总结(一)项目小结 本次实验课程设计不仅涉及到有关Linux操作系统的知识,还与C语言程序设计有着密切的联系,由于在学习的过程中,我们没有加强C语言程序能力的锻炼,因此,在这个项目中遇到了许多难
13、题。不过在老师的指导和同学的帮助下,最终解决了相关难题。完成了整个项目的要求。从以上描述和分析可以看出,在编写C语言程序时,巧妙地利用Makefile文件对其进行描述,就可以起到事半功倍的效果。在默认的方式下,也就是我们只输入make命令。那么,make会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“myfile”这个文件,并把这个文件作为最终的目标文件。如果myfile文件不存在,或是myfile所依赖的后面的 .o 文件的文件修改时间要比myfile这个文件新,那么,他就会执行后面所定
14、义的命令来生成myfile这个文件。如果myfile所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件myfile了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖 的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只
15、管文件的依赖性,即,如果在 我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。通过上述分析,我们知道,像main.c这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令“make clean”,以此来清除所有的目标文件,以便重编译。于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如main.c,那么根据我们的依赖性,我们的目标main.o会被重编译 (也就是在这个依性关系后面所定义的命令),于是main.o的文件也是最新的啦,于是main.o的文件修改时间要比myfile要新,所
16、以myfile也会被 重新链接了。而如果我们改变了“global.h”,那么,main.o、gui.o和smsfunc.o都会被重编译,并且,myfile会被重链接。(二)项目改进 通过对系统进行测试发现,这个系统存在许多漏洞,例如,当用户被要求录入学生成绩信息的时候,输入的是-90.系统并没有报错,而是正常工作。这与现实里的成绩信息相互矛盾,因此,我们可以对系统进行改进,将成绩信息的域限制在0-100之间。 此外,当用户被要求录入学生性别信息时,我们测试的输入是K,系统并没有报错。这说明该系统在性别录入模块也存在漏洞,这也是该项目可以改进的地方。 另外,该系统只是实现了一些简单的学生信息录入
17、、存储及其查询操作。如果我们想将其变得更加完美,则还需要增加许多功能查询。比如,查询某门课程不及格的人数及其不及格的学生的有关信息;怎样通过该系统计算某门课程的及格率等;这些都是可以改进的功能。(三) 体会此次程序设计加深了我对C语言程序函数模板化设计的优点的理解,例如便于改写程序代码的错误,使自己对程序的读写能力进一步加强,对程序实现过程的流程达到深一步的了解。与此同时也认识到自己的不足之处,比如在实现链表的排序问题时对其过程不太理解以至于在编写时出现较多的错误。其次,自己的读程序的能力还不足,速度过慢,尤其是在链表与结构体的读写方面明显的不足。对C语言的熟练是一个积累的过程,在以后我会更多
18、的去读程序,加深理解程序实现的具体过程。此外,此次程序设计还加深了我对Linux操作系统的理解,以及对Linux操作系统的一些常用命令的熟练使用。总之,每次实验都让我获益匪浅。每次实验都会增长知识。不过,这次项目设计所给我带来的不仅仅是知识,更多的是解决问题的方法。在项目设计的过程中,遇到许多难以理解和解决的问题。我常用的解决方法就是百度一下。当然和同学一起交流解决会是一个更好的方法,这不仅能够加深同学之间的感情,还可以增强自己分析问题、解决问题的能力。通过这次实验,我对Makefile文件的理解更加深刻和广泛。在这里和大家分享:什么是makefile?或许很多Winodws的程序员都不知道这
19、个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系 列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell 脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是 一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C+的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。