难易程度中等开发语言C《课程案例
——案例管理系统
3.1.1 系统系统硬件环境
处理器:Intel Pentium 166 MX或更高
内存:32MB
硬盘空间:1GB
显卡:SVGA显示适配器
软件环境
操作系统:Windows 98/ME/2000/XP设计
设计思路
3.2.3数据结构设计
{
char no[10]; //学号
char name[20]; //姓名
float score[N]; //各门课成绩
float sum; //总分
float ave;//平均分
int order;//名次
struct student *next;//指向后继结点的指针
}STU;//结构体类型名
3.2.4功能模块设计
、main()主函数
程序采用模块化设计,主函数是程序的入口,主函数不宜复杂,功能尽量在各模块中实现。main()函数执行流程图如图3-2所示。
首先声明一些必要的变量,然后作一无限循环程序,循环体为一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
二、menu_select()主菜单
直接利用输出函数printf输出字符串,在屏幕上显示一个菜单,并显示一个提示输入选项,输入0-1之间的数字,将此数字作为菜单函数的返回值返回主函数,主函数根据这个数字调用相应的功能函数。制作简便,操作简单,界面如图所示。
图 主菜单界面
、输入模块
。按照文件的读写要求,先定义一个指向文件的指针,
四、模块
4.插入⑴ 指针p为空,如果p等于头指针h,说明链表为空,则新结点即为头结点,修改指针h=info。否则,说明表中没有指定结点,则新结点插入在表尾部,此时q所指结点是最后一个结点,所以修改指针q->next=info,如图3-6所示。
⑵ 指针p不为空,如果p等于h,说明新结点插入在当前第一个结点之前,为新的头结点,修改指针info->next=p,h=info,如图3-7所示。否则,说明新结点的位置应在p和q两个结点之间,修改指针info->next=p,q->next=info,如图3-8所示。
五、⑴ 先将原表头结点作为新排好序表的头结点h,原表下一个结点作为原表头结点h1,设原表如图3-9所示,表中只列出总分数据。
⑵ 原表头结点为待排序结点,将其总分与新表结点的总分进行比较,如果待排序结点总分大,则插在新表的头,否则插入在其后,原表头结点后移一位,如图3-10所示。
⑶ 重复第二步,则将原表头结点的总分和新表结点的总分进行比较,如果待排序结点总分小,则移动新表指针,直到找到合适的位置将其插入,直到原表为空,所有结点排序完毕,如图3-11所示。
六、模块
为了保存数据,防止意外发生,为数据做备份是很有必要的。
本是将文件读写功能结合到一起的应用。输入目标文件名,然后利用文件读写函数将源文件中的信息写到目标文件中。按照文件的读写要求,先定义一个指向文件的指针,建立好后,更频繁的操作是显示和查找记录,本实现显示所有功能。输出界面如图所示。
图 输出界面
程序预处理
包括加载头文件,定义结构体、常量和变量,并对它们进行初始化。
#include "stdio.h" //I/O函数
#include "stdlib.h" //标准库函数
#include "string.h" //字符串函数
#include "ctype.h" //字符操作函数
#include "conio.h"//控制台输入输出函数"malloc.h" //动态地址分配函数
#include "memory.h" //内存操作函数
#define N 3 //定义课程门数,可以根据情况设定
typedef struct student//定义数据结构
{
char no[10]; //学号
char name[20]; //姓名
float score[N]; //各门课成绩
float sum; //总分
float ave;//平均分
int order;//名次
struct student *next;//指向后继结点的指针
}STU;//结构体类型名
/**********以下是函数原型***********/
; //初始化函数
STU *create(); //创建链表
void print(STU *h); //显示记录;//查找记录(STU *h); //插入记录
(STU *h); //修改记录
delete(STU *h); //删除记录
void save(); //记录保存为文件
load(); //从文件