大致分为以下几个摸块:
系统一运行,显示菜单的同时,
并打开文件,若文件存在(打开文件成功),则输入模块无效(文件指针pfile!= NULL),并立即关闭文件;
若文件不存在(打开文件不成功),则输入模块有效(pfile = NULL)。
**********************************************************************************************
【信息输入模块(int input( ) ): 】
(返回1—成功;返回0—失败)
主要让用户输入学生的档案信息(姓名,年龄,班级,性别,家庭住址,电话,学号);
若pfile = NULL,则做以下工作:
1,让用户输入学生总数;
2,系统根据学生总数创建一个结构数组;
3,依次输入各数据域,并读入结构数组;
4,建立文件,并写文件;
5,关闭文件;
若pfile = NULL,则不执行此模块,并显示出错信息,按任意键返回菜单;
【信息输出模块(int output( ) ): 】
(返回1—成功;返回0—失败)
主要让用户输出已做改动的档案信息;
若pfile != NULL,则做以下工作:
利用数组存储数据;
利用表头的形式显示信息;
若pfile = NULL , 则不执行此模块,并显示出错信息,按任意键返回菜单;
***********************************************************************************************
【信息修改模块(int modify(int number[]) ): 】
(返回1—成功;返回0—失败)(number为学号)
主要让用户修改学生的档案信息;(&M)
若pfile != NULL,则做以下工作:
1,输入用户想修改的学生记录的学生学号;
2,查找此学生记录,若存在就继续;如不存在则显示出错信息;
3,显示此学生信息;
4,提示用户修改信息(每字段提示一下);
5,修改完毕,返回菜单。
若pfile = NULL , 则不执行此模块,并显示出错信息,按任意贱返回菜单;
【信息添加模块(int add( ) ): 】
(返回1—成功;返回0—失败)
主要让用户增加不在数据库中的某个学生信息;(&A)
若pfile != NULL,则做以下工作:
1,显示输入信息界面;
2,以学号为关键字查找此学生信息,如存在,则显示出错信息;否则继续。
3,若输入完毕,则退出此模块并返回至菜单界面。
若pfile = NULL , 则不执行此模块,并显示出错信息,按任意键返回菜单;
【信息删除模块(int delete(int number[]) ): 】
(返回1—成功;返回0—失败)(number为学号)
主要让用户删除已不在校的学生信息;(&D)
若pfile != NULL,则做以下工作:
1,要求用户输入想删除的学生记录的学号;
2,以学号为关键字查找此记录,若存在则显示信息并释放节点;不存在,则显示出错信息;
3,退出模块并返回至菜单界面。
若pfile = NULL , 则不执行此模块,并显示出错信息,按任意键返回菜单;
【信息查找模块(int find(int number[]) ): 】
(返回1—成功;返回0—失败)(number为学号)
主要让用户查找某个特定的学生信息;(&F)
本模块在删除和修改中要用到,所以宜设为外部函数;
若pfile != NULL,则做以下工作:
1,要求用户输入要查找的学生学号;
2,以学号为关键字查找信息;
3,如存在,则显示此信息并返回至菜单界面;若不存在则显示出错信息。
若pfile = NULL , 则不执行此模块,并显示出错信息,按任意键返回菜单;
**********************************************************************************************
【信息存盘模块(int save(char string[]) ): 】
(返回1—成功;返回0—失败)(string为文件名)
主要让用户保存档案信息,以便下次读取;
【信息读盘模块(int read(char string[]) ): 】
(返回1—成功;返回0—失败)(string为文件名)
主要让用户读取已保存的档案信息;
**********************************************************************************************
【数据存储结构:】
对于单个学生采取一个结构:
struct STUDENT
{
char name[20];
int number[8];
char sex; //f&m
int age;
int class;
int phcde[7];
char address[30];
};
对于全班的所有同学(最多30人)采取链式存储结构。
为了采取这种存储结构,在学生的结构中要再加一个next指针指向节点。
为了节省存储空间,采取动态申请的方法( malloc() )。
除此之外,还有各种其他的数据:
循环变量: register int i,j....
【预计难点:】
1, 文件的存储是个关键。
当以"r"为打开方式时,只读;若文件不存在,则返回空指针。
当以"w"为打开方式时,只写;若文件不存在,则生成文件。
当以"a"为打开方式时,追加;此时要求文件一定存在,若不存在,则失败。
r+,w+,a+类似;rb,wb,ab也相似,只不过是以二进制方式!
结合以上,可以通过返回指针是否为空来判断文件是否打开成功!
【文件的存取<read,write>基本算法:】
void Data_Save(struct record *p) /*记录文件的存取*/
{
int j;
fp = fopen( "tele_rec.txt " , "w" ); /*以可写方式打开记录文件*/
while( p != NULL ) /*若未到队尾,徨将记录存储到文件中*/
{
fwrite(p, sizeof(struct record), 1, fp);
p = p->next;
}
fclose( fp ); /*关闭指定的文件*/
}
struct event * Data_Load() /*从记录文件中读取记录*/
{
long k;
struct record *p, *q;11
p = event_head.next;
fp = fopen("tele_rec.txt", "r+t"); /*以读方式打开记录文件*/
if ( fp != NULL )
{
while( !feof(fp)) /*依次读取记录并执行入队操作*/
{
fread(q, sizeof( struct record ), 1, fp);
p->next = q; /*这里p为尾指针,q为指向新节点的指针*/
p = q;
}
p->next = NULL;
event_end = p;
}
else
{
fp = fopen("tele_rec.txt","w"); /*若文件不存在,创建指定文件名的新文件*/
event_head.next = NULL;
event_end = event_head.next;
}
}
其实,文件操作有很多函数,除fopen,fclose外,还有fwrite,fread,fprintf,fscanf,
rewend,ftell,fseek,ferror,fputc,fgetc等;
2, 其次,输入的界面也是个问题。
如果用表头,则要注意回车和制表符的控制。
如果用一行行的提示,就显得有点老套。
结合以上,还是采取表头的输入比较好点。
****从这个问题中也就要求在今后的的实践中多注意UI的设计,尽量设计出一个比较通用的界面。
3, 删除或添加记录时,移动记录也是个关键:
由于数据是以结构数组存储的,所以每变动一条记录,就需移动之后的所有记录,时间是个问题!
5,进入系统之前下载(读取)文件;退出系统之前保存文件。
6,菜单要显示,特别是功能键要加上大小写的处理。
7,要注意函数的设计,每个函数功能要单一,函数最好被控制在50行之内!(学以致用嘛!^_^)
【制作目的:】
1,弄清楚函数返回值以及参数传递的问题。
2,指针是另一个方面!
3,弄懂读盘和存盘的基本形式(即文件的基本操作)
4,熟悉各种常用函数的运用。