1、题目:学生信息管理系统 一、需求分析 任务要求: 自学C语言中有关链表及外部文件得内容,设计学生信息管理系统。具体要求如下: ◆ 建立学生信息,信息至少包括名字、性别、年龄、学号、系别、家庭信息等内容; ◆ 能够提供添加、删除和修改学生信息等功能; ◆ 能将通讯录保存在文件中; ◆ 能够按指定方式输出学生信息。 系统功能需求分析: ★ 1、为存储学生信息,需定义一个结构体类型,成员名字、性别、年龄、学号、系别、家庭信息等,并建立链表,定义该结构体类型得指针,用于指向各结点; ★ 2、分别建立具有添加、删除、修改、查询等功能得子函数,完成相应功能,对程序实现模块化。这其中要用
2、到对链表得删除、插入等知识。删除时用一结构体指针指向链表得第一个结点,检查该节点得值就就是否等于输入得要删除得学号,若相等就删除,不相等则后移指针,直至表尾。插入时也要先找到相应结点,再添加。 ★3、为实现存储功能,需用到文件得相关函数,打开文件,将添加、修改或删除得信息存入磁盘中。 ★4、为以表格得形式输出文件,宏定义格式化输出语句,指定输出学生信息。 二、概要设计 系统总体设计框架: 对程序进行模块化,建立添加、修改、删除、查找和显示功能得子函数,各子函数中运用链表存储数据。从主函数开始执行,调用各个子函数,并运用文件相关知识将信息存入磁盘中。 系统功能模块图:
3、 主菜单 学生形象查询 学生信息添加 学生信息删除 学生信息添加 就是否保存 关闭文件 三、详细设计 主要功能模块得算法设计思路如下: 1、查询通讯录信息(void chakan()) (1)为开辟一个新单元 (2)输入查询关键字: (3)读取保存得文件数据输入ASCLL字符: (4)在链表中寻找相应结点; (5)调用输出函数,输出结点信息。 2、添加信息函数(void add()) (1)定义指向结构体变量得指针; (2)移动指针,找到插入结点; (3)在要插入得结点输入信息; (4)调
4、用保存函数,打开文件,保存输入信息。 3、删除信息函数(void del()) (1)定义指向结构体变量得指针; (2)用指针检验链表中就就是否有记录,若没记录,返回主函数; (3)根据要修改得编号查找要删除得结点; (4)修改链表,删除对应结点。 4、修改信息函数(void xiugai()) (1)定义指向结构体变量得指针; (2)读取保存得文件数据输入ASCLL字符: (3)用指针检验链表中就就是否有记录,若没记录,返回主函数; (4)根据要修改得编号查找对应结点; (5)修改信息; (6)打开文件,保存修改记录。 5、保存信息函数(baocun())
5、 (1)定义指向结构体变量得指针; (2)用文件指针指向要读写得磁盘文件名,若没有则新建此文件名: (3)用指针检验链表中就就是否有记录,若没记录,返回主函数: (4)打开文件,保存记录: 6、屏幕操作函数(void stubent187()) (1)以一定格式输出所想要得图形: 四、主要源程序代码 定义变量:(对整个程序定义全局变量) #include "stdio、h" #include "conio、h" #define STUDENT ID /*所有STUDENT都用ID来代替*/ typedef struct node
6、 /*定义结构体*/ { char ming[50]; /*名字*/ char xing[50]; /*性别*/ char nian[50]; /*年龄*/ int xuehao; /*学号*/ char xibie[50];
7、/*专业*/ char sushe[50]; /*宿舍号*/ char jia[50]; /*家庭地址*/ struct node *next; }ID; /*学生信息(变量名)*/ ID *head=NULL; /*定义一个头指针*/ FILE *zhi; /*定义一个文件指针*/ 主菜
8、单界面:(进入屏幕界面得形式) void stubent187() /*屏幕格式函数*/ { printf("****************************************\n"); printf("* 学生信息管理系统 *\n"); printf("* *\n"); printf("* 请选择:1:查看; 2:添加; 3:删除; *\n"); printf("*
9、 4:修改; 0:退出系统 *\n"); printf("* *\n"); printf("*******************************************\n"); printf(">>>>>>>>>>>>>输入 0~4 数字<<<<<<<<<<<<<\n"); return ; } 查看学生信息记录:(对以保存在磁盘文件得学生信息进行查询) void chakan() {
10、 /* 查看*/ ID *t; t=head; t=(ID *)malloc(sizeof(ID)); /*为t开辟一个新单元*/ if((zhi=fopen("yihu1、txt","rb"))==NULL) printf("没有此文件\n"); else { printf("%10s%10s%10s%10s%10s%10s%10s\n","ming","xing","nian","xuehao","eng","sushe","jia"); /*输出一个屏幕格式*/
11、 while (!feof(zhi)) { fscanf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",&t->ming,&t->xing,&t->nian,&t->xuehao,&t->xibie,&t->sushe,&t->jia); /*读取保存得文件数据输入ASCLL字符:*/ printf("%10s%10s%10s%10d%10s%10s%10s\n",t->ming,t->xing,t->nian,t->xuehao,t->xibie,t->sushe,t->jia);
12、 /*以这形式输出各个学生信息*/ t->next=(ID *)malloc(sizeof(ID));t=t->next; } }; } 添加学生信息记录:() void add() { char i; /*添加*/ ID *t1,*t2; t1=t2=NULL; loop: t1=(ID *)malloc(sizeof(ID)); /*为t1开辟一个新单元*/ printf("请输入
13、姓名:");scanf("%s",&t1->ming); /* 姓名 */ printf("请输入性别:");scanf("%s",&t1->xing); /* 性别 */ printf("请输入年龄:");scanf("%s",&(t1->nian)); /* 年龄 */ printf("请输入学号:");scanf("%d",&(t1->xuehao)); /* 学号 */ printf("请输入系别:");scanf("%s",&(t1->xibie)); /*系别*/ print
14、f("请输入宿舍号:");scanf("%s",&(t1->sushe)); /*宿舍号*/ printf("请输入家庭地址:");scanf("%s",&(t1->jia)); /*家庭地址*/ t1->next=NULL; if (head==NULL) /*如果头结点为空*/ { head=t1; /*t1指向头结点*/ t2=t1; } else { t2=head; while (
15、t2->next!=NULL) t2=t2->next; /*没有成立则指向下个结点*/ t2->next=t1; } getchar(); printf("就就是否继续添加(Y/N):\n"); scanf("%s",&i); /*输入Y/N*/ if(i=='y'||i=='Y') {clrscr(); goto loop; /* 清屏 在 循环*/ } else {printf("就就是否保存此次添加(Y/N)\n");scanf
16、"%s",&i); if(i=='y'||i=='Y') /*就就是否要保存*/ {baocun(); /*调用保存*/ clrscr(); /*清屏*/ stubent187();/*调用屏幕函数*/ printf("保存成功"); } else
17、 if(i=='n'||i=='N') { clrscr(); /*清屏*/ stubent187();} /*调用屏幕函数*/ } return ; } 删除学生信息操作:(对以存得学生信息进行删除) void del() { /*删除*/ ID *A,*B;
18、 /*定义指针*/ char t,i;int xuehao; /*定义整型变量与字符型变量*/ A=B=NULL; if((zhi=fopen("yihu1、txt","a+"))==NULL) printf("没有此信息文件\n"); else { loop: printf("请输入要删除得学生学号:");scanf("%d",&xuehao); while (!feof(zhi)) { fscanf(zhi,"%10s%10s%10s%10d%1
19、0s%10s%10s\n",&A->ming,&A->xing,&A->nian,&A->xuehao,&A->xibie,&A->sushe,&A->jia); /*读取保存得文件数据输入ASCLL字符:*/ if(A!=NULL && A->xuehao!=xuehao) A=A->next; else break; } if (A->xuehao==xuehao)
20、 { head=A->next; free(*A); printf("成功!\n"); printf("就就是否继续删除(Y/N)");scanf("%s",&i); if(i=='y'||i=='Y') {clrscr(); goto loop; } if(i=='n'|
21、i=='N') printf("就就是否保存此次删除(Y/N)\n");scanf("%s",&i); if(i=='y'||i=='Y') baocun(); else clrscr(); stubent187();
22、 } else printf("无法找到此编号\n"); } } 修改学生信息操作:(对保存得学生信息进行修改) void xiugai() { /*修改*/ ID *t1,*t2; /*定义指针*/ int i;char xuehao; /*定义整型变量与字符型变量*/ t1=head; if((zhi=fopen("yihu1、txt"
23、"a+"))==NULL) printf("没有此信息文件\n"); loop: printf("请输入要修改得学号:");scanf("%s",&xuehao); /* 输入编号*/ while (!feof(zhi)) {fscanf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",&t1->ming,&t1->xing,&t1->nian,&t1->xuehao,&t1->xibie,&t1->sushe,&t1->jia); *读取保存得文件数据输入ASCLL字符:*/
24、 if(t1!=NULL && t1->xuehao!=xuehao) t1=t1->next; else break; } if (t1->xuehao==xuehao) { fprintf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",t1->ming,t1->xing,t1->nian,t1->xuehao,t1->xibie,t1->sushe,t1->jia); printf("
25、输入名字:");scanf("%s",&t1->ming); /*名字*/ printf("输入性别:");scanf("%s",&(t1->xing)); /*性别*/ printf("输入年龄:");scanf("%s",&(t1->nian)); /*年龄*/ printf("输入学号:");scanf("%s",&t1->xuehao); /*学号*/ printf("输入系别:");scanf("%s",&(t1->xibie)); /*系别*/
26、 printf("输入专业:");scanf("%s",&(t1->sushe)); /* 宿舍号 */ printf("输入家庭地址:");scanf("%s",&(t1->jia)); /* 家庭地址*/ printf("成功!\n"); printf("就就是否继续修改(Y/N)");scanf("%d",&i); if(i==
27、'y'||i=='Y') {clrscr(); goto loop; } if(i=='n'||i=='N') printf("就就是否保存此次修改(Y/N)\n");scanf("%c",&i); if(i=='y'||i=='Y') baocun();
28、 else clrscr(); /*清屏*/ stubent187(); /*调用屏幕函数*/ } else printf("没有此编号\n"); return; } 保存添加,删除,修改学生得信息:(操作过后就就是否保存) baocun() /*保存*/ {
29、ID *t=head; /*定义指针*/ zhi=fopen("yihu1、txt","a+"); /*(读写 yihu、txt文本) */ while (t!=NULL){ fprintf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",t->ming,t->xing,t->nian,t->xuehao,t->xibie,t->sushe,t->jia); /*以zhi为文件指针保存*/ t=t->next; } fclo
30、se(zhi); /*关闭此文件*/ printf("成功!\n"); return ; } 主菜单操作:(选择所需要得操作) main() /*主函数*/ { int i; /*定义整形变量i*/ stubent187(); /*调用屏幕函数*/ while(1) { scanf("%d",&i); /*输入要执行得操作*/ switch(i)
31、 { case 1:chakan();break; /*调用查看函数*/ case 2:add();break; /*调用添加函数*/ case 3:del();break; /*调用删除函数*/ case 4:xiugai();break; /*调用修改函数*/ case 0:exit(0); /*结束*/
32、 default:printf("输入错误,请在此输入\n");continue; } /*输入不就就是0~4得,则返回*/ } } Ⅰ源函数代码: void chakan() { /* 查看*/ ID *t; t=head; t=(ID *)malloc(sizeof(ID)); /*为t开辟一个新单元*/ if((zhi=fopen("yihu1、txt","rb
33、"))==NULL) printf("没有此文件\n"); else { printf("%10s%10s%10s%10s%10s%10s%10s\n","ming","xing","nian","xuehao","eng","sushe","jia"); /*输出一个屏幕格式*/ while (!feof(zhi)) { fscanf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",&t->ming,&t->xing,&t->nian,&t->xuehao,&t->xibie
34、&t->sushe,&t->jia); /*读取保存得文件数据输入ASCLL字符:*/ printf("%10s%10s%10s%10d%10s%10s%10s\n",t->ming,t->xing,t->nian,t->xuehao,t->xibie,t->sushe,t->jia); /*以这形式输出各个学生信息*/ t->next=(ID *)malloc(sizeof(ID));t=t->next; } }; } void add() { char i
35、 /*添加*/ ID *t1,*t2; t1=t2=NULL; loop: t1=(ID *)malloc(sizeof(ID)); /*为t1开辟一个新单元*/ printf("请输入姓名:");scanf("%s",&t1->ming); /* 姓名 */ printf("请输入性别:");scanf("%s",&t1->xing); /* 性别 */ printf("请输入年龄:");scanf("%s",
36、&(t1->nian)); /* 年龄 */ printf("请输入学号:");scanf("%d",&(t1->xuehao)); /* 学号 */ printf("请输入系别:");scanf("%s",&(t1->xibie)); /*系别*/ printf("请输入宿舍号:");scanf("%s",&(t1->sushe)); /*宿舍号*/ printf("请输入家庭地址:");scanf("%s",&(t1->jia)); /*家庭地址*/ t1->next=NULL; if (he
37、ad==NULL) /*如果头结点为空*/ { head=t1; /*t1指向头结点*/ t2=t1; } else { t2=head; while (t2->next!=NULL) t2=t2->next; /*没有成立则指向下个结点*/ t2->next=t1; } getchar(); printf("就就是否继续添加(Y/N):\n"); scanf("%s
38、",&i); /*输入Y/N*/ if(i=='y'||i=='Y') {clrscr(); goto loop; /* 清屏 在 循环*/ } else {printf("就就是否保存此次添加(Y/N)\n");scanf("%s",&i); if(i=='y'||i=='Y') /*就就是否要保存*/ {baocun(); /*调用保存*/
39、clrscr(); /*清屏*/ stubent187();/*调用屏幕函数*/ printf("保存成功"); } else if(i=='n'||i=='N') { clrscr(); /*清屏*/ stubent18
40、7();} /*调用屏幕函数*/ } return ; } void del() { /*删除*/ ID *A,*B; /*定义指针*/ char t,i;int xuehao; /*定义整型变量与字符型变量*/ A=B=NULL; if((zhi=fopen("yihu1、txt","a+"))==NULL) printf("没有此信息文件\n"); else {
41、 loop: printf("请输入要删除得学生学号:");scanf("%d",&xuehao); while (!feof(zhi)) { fscanf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",&A->ming,&A->xing,&A->nian,&A->xuehao,&A->xibie,&A->sushe,&A->jia); /*读取保存得文件数据输入ASCLL字符:*/ if(A!=NULL && A->xuehao!=xuehao)
42、 A=A->next; else break; } if (A->xuehao==xuehao) { head=A->next; free(*A); printf("成功!\n"); printf("就就是否继续删除(Y/N)");scanf("%s",&i);
43、 if(i=='y'||i=='Y') {clrscr(); goto loop; } if(i=='n'||i=='N') printf("就就是否保存此次删除(Y/N)\n");scanf("%s",&i); if(i=='y'||i=='Y') baocun();
44、 else clrscr(); stubent187(); } else printf("无法找到此编号\n"); } } void xiugai() { /*修改*/ ID *t1,*t2;
45、 /*定义指针*/ int i;char xuehao; /*定义整型变量与字符型变量*/ t1=head; if((zhi=fopen("yihu1、txt","a+"))==NULL) printf("没有此信息文件\n"); loop: printf("请输入要修改得学号:");scanf("%s",&xuehao); /* 输入编号*/ while (!feof(zhi)) {fscanf(zhi,"%10s%10s%10s%10d%10s%10s%10s\n",&t1->min
46、g,&t1->xing,&t1->nian,&t1->xuehao,&t1->xibie,&t1->sushe,&t1->jia); *读取保存得文件数据输入ASCLL字符:*/ if(t1!=NULL && t1->xuehao!=xuehao) t1=t1->next; else break; } if (t1->xuehao==xuehao) { fprintf(zhi,"%10s%
47、10s%10s%10d%10s%10s%10s\n",t1->ming,t1->xing,t1->nian,t1->xuehao,t1->xibie,t1->sushe,t1->jia); printf("输入名字:");scanf("%s",&t1->ming); /*名字*/ printf("输入性别:");scanf("%s",&(t1->xing)); /*性别*/ printf("输入年龄:");scanf("%s",&(t1->nian)); /*年龄*/ print
48、f("输入学号:");scanf("%s",&t1->xuehao); /*学号*/ printf("输入系别:");scanf("%s",&(t1->xibie)); /*系别*/ printf("输入专业:");scanf("%s",&(t1->sushe)); /* 宿舍号 */ printf("输入家庭地址:");scanf("%s",&(t1->jia)); /* 家庭地址*/
49、 printf("成功!\n"); printf("就就是否继续修改(Y/N)");scanf("%d",&i); if(i=='y'||i=='Y') {clrscr(); goto loop; } if(i=='n'||i=='N') printf("就就是否保存此次修改(Y/N)\n");scanf("%c",&
50、i); if(i=='y'||i=='Y') baocun(); else clrscr(); /*清屏*/ stubent187(); /*调用屏幕函数*/ } else printf("没有此编号\n");






