logo资料库

学生管理系统模板.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
实验三 学生管理系统
一、实验目的和要求
二、主要仪器设备及开发环境
三、实验原理
四、实验内容
五、思考题
实验三 学生管理系统 一、实验目的和要求 1、掌握软件设计开发调试的完整过程; 2、掌握单链表,结构体,指针的使用方法; 3、掌握使用 CodeBlocks 软件编程和调试的方法。 二、主要仪器设备及开发环境 1、计算机 2、CodeBlocks 集成开发环境 V13.12 三、实验原理 1、链表 链表是线性表的链式存储结构,它相比于顺序表,在插入和删除元素时,效 率要高很多。链表是用一组任意的存储单元存储线性表的数据元素(这组存储单 元可以是连续的,也可以是不连续的)。每个数据单元有两部分组成,一个是数 据域,存储数据值;另一个是指针域,指向下一个数据单元。这样的数据单元叫 做结点。当多个结点通过指针指向,关联起来,就形成了一个链,即链表。 2、单链表 链表可分为单链表、双链表、循环链表。 单链表就是沿着单方向的链表。例如:A->B->C->D->... 只能顺序的连下去, 即可以从 A 往下找其他元素,但是反之则不行。单链表结点的结构可表示如下: typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; } LNode, *LinkList; 3、单链表的基本算法 A:插入结点
假设要在单链表的 a 结点和 b 结点之间插入一个值为 x 的新结点。指针 s 指 向一个值为x 的结点,为了插入s,首先让s 的next 指针指向b,即s->next = p->next; 然后,让 a 的 next 指针指向 s,即 p->next = s; B:删除结点 假设要删除单链表中的 b 结点。首先,找到 b 结点前面的结点 a,p 指针指 向 a 结点。b 的下一个结点就是 p->next->next。所以,只要让 p 的 next 指针跳过 b 结点,指向 b 的下一个结点就 OK 了,即 p->next = p->next->next。 由上可知,根据单链表的特性,插入或删除结点时,必须先找到插入或删除 结点上一结点的位置(指针),并在操作时注意指针变量的赋值顺序,避免结点 位置(指针)丢失。 4、内存分配的方式: A:在静态存储区域中进行分配 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存 在。例如全局变量,static 变量。 B:在栈中进行分配 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时,这些存储但愿自动被释放。效率很高,但是分配的内存容量比较有限。 C:在堆中进行分配 在堆上分配也称为动态内存分配:程序在运行的时候用 malloc 等函数申请 任意多少的内存,程序员自己负责在何时用 free 释放内存。动态内存分配的生存 期由程序员决定,使用非常灵活,但是问题相对也比较多。 注意:如果没有释放的话,很容易就会造成内存溢出,因为堆中的内存块是 全局的,因此不会因为函数的调用而结束。 5、动态内存分配 A:malloc 函数(需要用到的头文件 stdlib.h) void *malloc(size_t size) 返回的是一个通用类型的指针,根据需要去进行强转。 功能:允许从空闲内存池中分配连续内存但不初始化。 参数:size 参数实际就是一个所需字节数的整数 malloc(20)。
返回:若分配成功则返回一个指向该内存块的指针,在使用时可根据需要做 强制类型转换,否则返回 NULL(空指针)。 malloc 的生命周期:只要没有调用 free 这个函数,进程没有结束,那么此时, 这个函数的生命周期就会一直存在在内存中;它是存放在堆空间中的,它不会因 为你去 函数调用的结束自动去释放,堆当中的内存是全局的。如:int p = (int )malloc(n*sizeof(int)); 。 B:free(p)函数 释放内存空间,将内存释放出来给系统,free 函数与 malloc 函数是成对出现 的。申请 malloc 的时候尽量去给它进行一下初始化,防止后面出现一些不确定 性的东西。 free 之后如果还有这块内存地址的话,此时这块内存归还给了系统,(可能 这块内存还处于一个空闲状态)但是还是可以对其进行操作。里面的值短暂的会 保留。free 之后,申请内存的那个指针就会变成野指针(声明了,但是没有任何 指向的指针),有时候会出现野指针错误; 所以尽量在操作之后:将指针置为 NULL。 注意:申请和释放是成对的,所以程序是不能进行多次 free,否则会崩溃。 malloc 的相关实例代码如下: void out(int *p,int n) { int i; for(i=0;i
scanf("%d",&n); //申请 int *p = (int *)malloc(n * sizeof(int)); //内存申请成功 if(p != NULL){ out(p,n); int i; for(i=0;i
E:释放内存之后却继续去使用这一块内存 避免方式:使用 free 内存之后,把指针置为 NULL。 7、根据设计要求,因为学生的人数不确定,使用链表存储存储学生信息更为适 宜。 8、文件操作 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做 文件名。在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通 过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为: FILE*指针变量标识符;其中 FILE 应为大写,它实际上是由系统定义的一个结 构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不 必关心 FILE 结构的细节。例如:FILE *fp;表示 fp 是指向 FILE 结构的指针变 量,通过 fp 即可找存放某个文件信息的结构变量,然后按结构变量提供的信息 找到该文件,实施对文件的操作。习惯上也笼统地把 fp 称为指向一个文件的指 针。文件的打开与关闭文件在进行读写操作之前要先打开,使用完毕要关闭。所 谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以 便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件 进行操作。 在C语言中,文件操作都是由库函数来完成的。 C 语言中没有输入输出语句,所有的输入输出功能都用 ANSI C 提供的一组 标准库函数来实现。文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件; 文件的关闭操作 fclose 关闭一个文件; 文件的读写操作 fgetc 从文件中读取一个字符; fputc 写一个字符到文件中去; fgets 从文件中读取一个字符串; fputs 写一个字符串到文件中去; fprintf 往文件中写格式化数据; fscanf 格式化读取文件中数据; fread 以二进制形式读取文件中的数据;
fwrite 以二进制形式写数据到文件中去; getw 以二进制形式读取一个整数; putw 以二进制形式存贮一个整数; 文件状态检查函数 feof 文件结束; ferror 文件读/写出错; clearerr 清除文件错误标志; ftell 了解文件指针的当前位置; 文件定位函数 rewind 反绕; fseek 随机定位。 9、scanf 函数 功能:执行格式化输入。 用法:int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘)读取输 入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为:scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回 EOF。 scanf("%d", &pstu->num)操作,要求读入十进制整数,输入正确时,成功读 入数据返回 1,若错输为字母,读取不成功返回 0。 当 scanf()读取到错误的数据时,会将数据退回到缓冲区。如使用“%d”格 式读取 45d,会读入 45,d 不是整数,退回到缓冲区。这样会导致会面的读取出 现错误。此时可使用“fflush(stdin);”指令清除缓冲区。 四、实验内容 1、完成一个简易的控制台窗口显示的学生管理系统,功能包括:添加学生信息, 删除某个学生信息,显示某个学生信息,修改学生信息,删除所有学生信息,显 示所有学生信息,显示信息数量,读取文件学生信息,保存学生信息至文件,退 出系统; 2、自己设计管理系统采用的数据结构(不局限于单链表)及文件操作方式; 3、要有容错代码,如对无效数据、错误指针、无效操作的判断。
五、思考题 1、如何提高程序的健壮性和鲁棒性? 2、指针有哪些类型?在使用中需要注意哪些问题? 3、不同类型链表的优势和缺点是什么?
分享到:
收藏