《C语言程序设计_综合实训课件》由会员分享,可在线阅读,更多相关《C语言程序设计_综合实训课件(30页珍藏版)》请在金锄头文库上搜索。
1、,综合实训,实训目标 掌握面向过程的编程思想以及程序设计过程; 掌握实训报告的编写。,实训准备,10.1 程序设计步骤,进行程序设计时一般遵循以下步骤: 需求分析 在这个环节,根据用户的具体要求进行以下工作: 用户需求分析。 数据及处理分析。 可行性分析。 运行环境分析。 对初学者而言,关键处理好需求分析和数据及处理分析这两个方面的工作。 系统设计 分为总体设计和详细设计。,系统实现 选择适当的程序设计语言,把详细设计的结果描述出来,即形成源程序,并上机运行调试源程序,修改发现的错误,直到得出正确的结果。 建立文档资料 整理分析程序结果,建立相应的文档资料,以便日后对程序进行维护或修改。,10
2、.2 程序设计应用实例,开发一个学生成绩管理系统,用于对班级的学生成绩进行处理。班级有N个学生,每个学生的信息包括学号、姓名、性别和3门课成绩。系统功能要求为: 录入学生数据; 查询学生数据; 更新学生数据; 统计学生数据; 保存学生数据。,系统分析 系统设计 总体设计,详细设计 主控程序设计,成绩输入模块 输入模块主要完成将数据输入到单链表中的工作。在成绩管理系统中,可以从键盘逐个输入学生记录,也可以从以二进制形式存储的数据中读入。学生记录由学生的基本信息和成绩信息构成。,成绩查询模块 查询模块按学号或者姓名查找满足条件的学生记录。用户可以按照学生的学号或者姓名进行查找,若找到相应记录则返回
3、指向该学生记录的指针;否则,返回一个NULL的空指针,并打印“没找到该学生”的提示信息。,成绩更新模块 此模块完成对学生记录的管理维护,主要是对学生记录的修改、删除、排序操作。 修改记录模块 删除记录模块 排序模块 统计模块 数据结构设计,学生成绩信息结构 struct student char num10; /学号 char name20; /姓名 char sex4; /性别 int cgrade; /C语言成绩 int mgrade; /数学成绩 int egrade; /英语成绩 int total; /总分 int ave; /平均分 char neartime10; /最近更新时间
4、 ;,结构体student将用于存储学生基本信息,作为单链表的数据域。 单链表node结构 typedef struct node struct student data; struct node *next; Node,*Link;,系统实现 printstart() 函数原型:void printstart() printstart()函数用于在以表格形式显示学生记录时,打印出表头信息。 printc() 函数原型:void printc() printc()函数用于显示以表格形式打印学生记录时,打印输出单链表学生信息。 Locate() 函数原型:Node*Locate(Link l,c
5、har findmess,char nameornum) Locate函数用于定位链表中符合要求的结点,并返回该指针。,Add() 函数原型:void Add(Link l) Add函数用于在单链表l中增加学生记录结点。 Qur() 函数原型:void Qur(Link l) Qur()函数用于在单链表l中按学号或者姓名查找满足条件的学生,并显示出来。 Del() 函数原型:void Del(Link l) Del()函数用于先在单链表l中找到满足条件的学生记录结点,然后删除该结点。 Modify() 函数原型:void Modify(Link l) Modify()函数用于在单链表l中修改学
6、生记录。,Count() 函数原型:void Count(Link l) Count()函数用于统计单链表l中所有的学生成绩总分、平均最高分及各单科成绩最高的学生。 Sort() 函数原型:void Sort(Link l) Sort()函数用于单链表l中完成利用插入排序算法实现单链表的总分字段的降序排序。 Save() 函数原型:void Save(Link l) Save()函数用于将单链表l中的数据写入磁盘中的数据文件。,Disp() 函数原型:void Disp(Link l) Disp()用于显示资料。 printe() 函数原型:void printe(Node *p) print
7、e() 用于输出学生信息。 Nofind() 函数原型:void Nofind() Nofind() 用于提示没有找到记录。 Wrong() 函数原型:void Wrong() Wrong() 用于提示输入错误。 main() 整个成绩管理系统控制部分。,拓展提升,10.3 链表应用,链表是C语言提供的可动态进行存储分配的数据结构。 它与数组不同:数组只能定义固定长度,一旦定义就不能在运行时再改变数组的维数和大小。而如果需要在程序运行期间动态改变大小,则定义结构体数组不能满足要求;而链表却可以根据需要开辟内存,从而达到该目的。 链表由若干节点构成,简单链表(又称为单向链表)如图l0-8所示。,
8、ma1loc函数 函数原型: void * malloc(unsigned int size) 函数功能: 在内存的动态存储区域中分配sizeB的连续空间。如果申请成功,函数将返回所分配空间的起始地址,否则函数返回空指针(NULL)。 函数说明: 由于该函数定义为void类型,一般在使用时用强制类型转换将其转换为所需类型。,如,有以下定义: struct exam char name20; float score3; *p; 可以使用malloc函数申请一段内存用以存放一个上述结构体类型的数据,并使p指向该变量的起始地址: p=( struct exam *)malloc(sizeof(str
9、uct exam); sizeof(struct exam)用来计算定义的结构体类型总共占据的字节数。使用函数malloc(sizeof(struct exam)来申请分配struct exam结构体类型长度的一段连续空间,然后将其强制转换为struct exam类型的指针,并将它赋给同类型的指针变量p。,calloc函数 函数原型: void * calloc(unsigned int n, unsigned int size) 函数功能: 在内存的动态存储区域中分配n个长度为sizeB的连续空间。如果申请成功,函数将返回所分配空间的起始地址,否则函数返回空指针(NULL)。 函数说明: 该
10、函数一般用来为一维数组分配内存空间。在使用时通常也使用强制类型转换将其转换为所需类型。,如:对于上例中定义的结构体类型,可声明一个同类型的指针变量,并使其指向用calloc函数申请的长度为12的一维数组的内存空间的起始地址,写法如下: struct exam *b; b=( struct exam *)calloc(12,sizeof(struct exam);,free函数 函数原型: void free(void * p) 函数功能: 释放指针变量p所指向的内存区域,此函数无返回值。 如:要释放上例中指针变量b指向的内存区域,可写成: free(b);,10.4.1 单向动态链表的建立,创
11、建链表的过程就是逐个开辟空间创建节点,而后输入节点数据并建立节点之间的链接关系的过程。 使用有关动态链表操作的函数可以创建一个动态链表。,10.4 单向动态链表,做中学10-1 建立一个包含有若干个考生信息的单向动态链表。,10.4.2 单向动态链表的输出,设一个指针指向单向链表的第一个节点(head),并输出该节点的数据。 将指针后移到下一个节点,然后输出该节点的数据。 反复执行步骤2,直至输出到尾节点。,做中学10-2 输出上例中建立的链表,可以设计一个函数 outchain实现该功能,其算法如下图所示。,10.4.3 单向动态链表中的节点插入,插入步骤 在一个单向动态链表中插入节点,首先
12、要找到插入的位置。 如果要插入的位置在表头,那么就将待插入的节点连接在第一个节点的前面,并使头指针(head)指向刚插入的节点; 如果要插入的位置在表尾,那么就设置表尾节点的指针域,使其指向待插入的节点,并将刚插入的节点的指针域置空; 如果要插入的位置在中间某个位置,那么就需要断开该位置两个节点之间的连接,并将待插入的节点连接到两个节点中间。,做中学10-3 将一个考生的节点按照考号从小到大的顺序插入到一个空链表(head=NULL)中。 设计实现的算法如右图,10.4.4 单向动态链表中的节点删除,删除步骤 在一个单向链表中删除一个节点,也需要首先找到待删除的节点。 如果待删除的节点在表头,那么使头指针指向第二个节点; 如果待删除的节点在表尾,那么就断开此节点与其前一个节点之间的连接,并使前一个节点的指针域置空; 如果待删除的节点在链表中间的某个位置,那么就断开此节点与其前后两个节点之间的连接,然后将它前后的两个节点连接在一起。,做中学10-4 删除上例中所建立的链表中某指定考号的节点。 设计实现的算法如右图,谢 谢,