1、C 语言上机实践报告专 业:冶金工程班 级:冶金 1102姓 名: 学 号:任课教师: 张丽华 时 间:2012 年 8 月- 2 -1、题目学生信息管理系统设计 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail 等。 试设计一学生信息管理系统,使之能提供以下功能:a) 系统以菜单方式工作b) 学生信息录入功能(学生信息用文件保存)-输入c) 学生信息浏览功能-输出d) 查询、排序功能-算法(1) 按学号查询(2) 按姓名查询e) 学生信息的删除与修改(可选项)1、系统功能模块结构图修改学生信息删除学生信息按姓名搜索按学号搜索显示学生信息保存学生信息插入学生信息输入学生
2、信息初始化链表目 录 选 择学 生 信 息 管 理 系 统- 3 -2、数据结构设计及用法说明#include“stdio.h“#include“stdlib.h“#include“string.h“/*定义结构体用作创建链表*/typedef struct z1char no11; /学生学号char name15; /学生姓名int age; /学生年龄char sex; /学生性别char birthday8; /学生出生年月char address20; /学生住址char tel12; /学生联系电话char e_mail20; /学生 e-mailstruct z1 *next;
3、/指向下一链表STUDENT;/*声明用户自定义函数*/STUDENT *init();STUDENT *create();STUDENT *del(STUDENT *h);STUDENT *insert(STUDENT *h);STUDENT *revise(STUDENT *h);void print(STUDENT *h);void search1(STUDENT *h);void search2(STUDENT *h);void save(STUDENT *h);int menu_select();void inputs(char *prompt,char *s,int count);
4、/*主函数,用于选择功能*/void main()STUDENT *head;head=init(); /初始化链表表头for(;)switch(menu_select()- 4 -case 0:head=init();break; /初始化case 1:head=create();break; /创建列表case 2:head=insert(head);break; /插入节点case 3:save(head);break; /以文件形式保存case 4:print(head);break; /显示case 5:search1(head);break; /搜索学号case 6:search2
5、(head);break; /搜索姓名case 7:head=del(head);break; /删除case 8:head=revise(head);break; /修改case 9:exit(0); /退出程序/*目录选择函数,返回用户输入的数字 */int menu_select()char *menu=“*菜单*“,“0. 初始化链表 “,“1. 输入学生信息 “,“2. 插入学生信息 “,“3. 保存学生信息 “,“4. 显示学生信息 “,“5. 按学号查找学生信息“,“6. 按姓名查找学生信息“,“7. 删除指定学号的学生信息“,“8. 修改指定学号的学生信息“,“9. 退出系统
6、“;int c,i;for(i=0;i10);return c;/*初始化函数,作用是返回空指针初始化链表 */STUDENT *init()return NULL;- 5 -/*创建函数,输入学生信息*/STUDENT *create()STUDENT *h=NULL,*info;for(;)info=(STUDENT *)malloc(sizeof(STUDENT);if(!info)printf(“n 内存不足“);return NULL;inputs(“输入学号:“,info-no,11); if(info-no0=)break;inputs(“输入姓名:“,info-name,15)
7、;printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);scanf(“%s“,info-birthday);inputs(“输入地址:“,info-address,20);inputs(“输入电话:“,info-tel,12);inputs(“输入 E-mail:“,info-e_mail,20);info-next=h;h=info;return h;/*输入函数,用于判断输入的字符是否超出程序定义避免数据溢出*/void inputs(char *prompt,
8、char *s,int count)char p255;doprintf(prompt);scanf(“%s“,p);if(strlen(p)count)printf(“n 太长了!n“);while(strlen(p)count);strcpy(s,p);- 6 -/*插入函数,插入学生成绩*/STUDENT *insert(STUDENT *h)STUDENT *p,*q,*info;char s11;printf(“请输入插入点的学生学号n“);scanf(“%s“,s);printf(“n 请输入新的学生信息n“);info=(STUDENT *)malloc(sizeof(STUDE
9、NT);inputs(“输入学号:“,info-no,11); inputs(“输入姓名:“,info-name,15);printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);scanf(“%s“,info-birthday);inputs(“输入地址:“,info-address,20);inputs(“输入电话:“,info-tel,12);inputs(“输入 E-mail:“,info-e_mail,20);info-next=NULL;p=h;q=h;wh
10、ile(strcmp(p-no,s)p=p-next;if(p=NULL)if(p=h)h=info;elseq-next=info;else if(p=h)info-next=p;h=info;elseinfo-next=p;q-next=info;- 7 -printf(“n 已经插入了%s 这个学生n“,info-name);return(h);/*保存函数,以文件的形式保存学生信息 */void save(STUDENT *h)FILE *fp;STUDENT *p;char outfile50;printf(“请输入保存文件的文件名,例如 c:f1te.txt:n“);scanf(“
11、%s“,outfile);if(fp=fopen(outfile,“wb“)=NULL)printf(“不能打开文件n“);exit(1); printf(“n 正在保存n“);p=h;while(p!=NULL)fwrite(p,sizeof(STUDENT),1,fp);p=p-next;fclose(fp); printf(“-保存成功!-n“);/*显示函数,显示学生信息*/void print(STUDENT *h)int i=0;STUDENT *p;p=h;printf(“nnn*学生*n“);printf(“|学号 | 姓名 |年龄|性别| 出生年月| 地址 | 电话 | E-
12、mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);while(p!=NULL)i+;printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);- 8 -p=p-next;printf(“*end*n“);/*搜索函数,按学号搜索学生信息并显示 */void search1(STUDENT *h)STUDENT *p;char s11;printf(“请输入你要查找的同学的学号n“);scanf(“%s“,s
13、);p=h;while(strcmp(p-no,s)if(p=NULL)printf(“n 没有学号为%s 的学生n“,s);elseprintf(“nnn*找到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话 | E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);/*搜索
14、函数,按姓名搜索学生信息并显示 */void search2(STUDENT *h)STUDENT *p;char s15;printf(“请输入你要查找的同学的姓名n“);scanf(“%s“,s);p=h;while(strcmp(p-name,s)- 9 -if(p=NULL)printf(“n 没有姓名为%s 的学生n“,s);elseprintf(“nnn*找到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话 | E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);printf(“|%-8s|%-8s|%4d|%4
15、c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);/*删除函数,删除指定学号的学生信息 */STUDENT *del(STUDENT *h)STUDENT *p,*q;char s11;printf(“请输入要删除的学生的学号n“);scanf(“%s“,s);q=p=h;while(strcmp(p-no,s)p=p-next;if(p=NULL)printf(“n 链表中没有学号为%s 的学生n“,s);elseprintf(“nnn*找
16、到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话 | E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);- 10 -printf(“请按任意键删除n“);getchar();if(p=h)h=p-next;elseq-next=p-next;free(p);printf(
17、“n 已经删除学号为%s 的学生n“,s);return h;/*修改函数,修改指定学号的学生信息 */STUDENT *revise(STUDENT *h)STUDENT *p,*q;char s11;printf(“请输入您希望修改的学生学号n“);scanf(“%s“,s);printf(“n 请输入新的学生信息n“);p=h;q=h;while(strcmp(p-no,s)p=p-next;inputs(“输入学号:“,p-no,11); inputs(“输入姓名:“,p-name,15);printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.
18、女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);scanf(“%s“,p-birthday);inputs(“输入地址:“,p-address,20);inputs(“输入电话:“,p-tel,12);inputs(“输入 E-mail:“,p-e_mail,20);return (h);3、程序结构- 11 -开 始声 明 结 构 体 STUDENT定 义 STUDENT型 指 针 *head初 始 化 headfor(;)switch(menu_select()Menu_select()=0? Y head=init() break;NMenu_se
19、lect()=1?NY head=create() break;Menu_select()=2? Y head=insert(head) break;NMenu_select()=3? Y save(head) break;NMenu_select()=4? Y print(head) break;NMenu_select()=5? Y search1(head) break;NMenu_select()=6? Y search2(head) break;NMenu_select()=7? Y head=del(head) break;NMenu_select()=8? Y head=revi
20、se(head) break;NMenu_select()=9? Y exit(0)N结 束- 12 -create()函 数 流 程 图开 始for(;)开 辟 一 个 长 度 为 STUDENT的 内 存 空 间 , 并 返 回 一个 指 向 该 存 储 区 地 址 的 STUDENT型 指 针 给 infoinfo=0? NY输 出 “内 存 不 足 ”returnNULL输 入 学 号info-no0=? Y breakNinput函 数 输 入 姓 名input函 数 输 入 年 龄输 入 性 别 编 号输 入 出 生 年 月input函 数 输 入 地 址input函 数 输 入
21、电 话input函 数 输 入 e-mailinfo-next=hh=head结 束定 义 并 初 始 化 字符 型 数 组 menui=0i10?输 入 c输 出 “请 选 择 09中 的 某 一 个 选 项 : ”结 束结 束return NULL开 始init()函 数 的 流 程 图- 13 -结 束将 p 的 内 容 赋 给 sY输 出 “太 长 了 ! ”N 判 断 p 的 长 度 是否 大 于 count?输 入 字 符 串 p函 数 传 递 过 来 的 值 : 字 符 型 指针 prompt,s 以 及 整 型 变 量 count开 始inputs()函 数 流 程 图inse
22、rt()函 数 流 程 图开 始定 义 STUDENT型 指 针p,q,info以 及 字 符 型 数 组 s输 入 插 入 点 的 学 生 学 号开 辟 一 个 长 度 为 STUDENT的 内 存 空 间 , 并 返 回 一个 指 向 该 存 储 区 地 址 的 STUDENT型 指 针 给 info输 入 新 的 学 生 信 息info-next=NULLp=h q=hq=pp=p-nextNp=NULL?p=h?YYYNp=h?NYstrcmp(p-no,s)char name15;int age;char sex;char birthday8;char address20;char
23、tel12;char e_mail20;struct z1 *next;STUDENT;STUDENT *init();STUDENT *create();STUDENT *del(STUDENT *h);STUDENT *insert(STUDENT *h);STUDENT *revise(STUDENT *h);void print(STUDENT *h);void search1(STUDENT *h);void search2(STUDENT *h);void save(STUDENT *h);int menu_select();void inputs(char *prompt,cha
24、r *s,int count);void main()STUDENT *head;head=init();for(;)switch(menu_select()case 0:head=init();break;case 1:head=create();break;case 2:head=insert(head);break;case 3:save(head);break;case 4:print(head);break;case 5:search1(head);break;case 6:search2(head);break;- 24 -case 7:head=del(head);break;c
25、ase 8:head=revise(head);break;case 9:exit(0);int menu_select()char *menu=“*菜单 *“,“0. 初始化链表“,“1. 输入学生信息“,“2. 插入学生信息“,“3. 保存学生信息“,“4. 显示学生信息“,“5. 按学号查找学生信息“,“6. 按姓名查找学生信息“,“7. 删除指定学号的学生信息“,“8. 修改指定学号的学生信息“,“9. 退出系统“;int c,i;for(i=0;i10);return c;STUDENT *init()return NULL;STUDENT *create()STUDENT *h=N
26、ULL,*info;for(;)info=(STUDENT *)malloc(sizeof(STUDENT);if(!info)printf(“n 内存不足“);return NULL;- 25 -inputs(“输入学号:“,info-no,11); if(info-no0=)break;inputs(“输入姓名:“,info-name,15);printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);scanf(“%s“,info-birthday);inputs(
27、“输入地址:“,info-address,20);inputs(“输入电话:“,info-tel,12);inputs(“输入 E-mail:“,info-e_mail,20);info-next=h;h=info;return h;void inputs(char *prompt,char *s,int count)char p255;doprintf(prompt);scanf(“%s“,p);if(strlen(p)count)printf(“n 太长了!n“);while(strlen(p)count);strcpy(s,p);STUDENT *insert(STUDENT *h)ST
28、UDENT *p,*q,*info;char s11;printf(“请输入插入点的学生学号n“);scanf(“%s“,s);printf(“n 请输入新的学生信息n“);info=(STUDENT *)malloc(sizeof(STUDENT);inputs(“输入学号 :“,info-no,11); inputs(“输入姓名 :“,info-name,15);printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);- 26 -scanf(“%s“,info-b
29、irthday);inputs(“输入地址 :“,info-address,20);inputs(“输入电话 :“,info-tel,12);inputs(“输入 E-mail:“,info-e_mail,20);info-next=NULL;p=h;q=h;while(strcmp(p-no,s)p=p-next;if(p=NULL)if(p=h)h=info;elseq-next=info;else if(p=h)info-next=p;h=info;elseinfo-next=p;q-next=info;printf(“n 已经插入了%s 这个学生n“,info-name);return
30、(h);void save(STUDENT *h)FILE *fp;STUDENT *p;char outfile50;printf(“请输入保存文件的文件名,例如 c:f1te.txt:n“);scanf(“%s“,outfile);if(fp=fopen(outfile,“wb“)=NULL)printf(“不能打开文件n“);exit(1); printf(“n 正在保存n“);p=h;- 27 -while(p!=NULL)fwrite(p,sizeof(STUDENT),1,fp);p=p-next;fclose(fp); printf(“-保存成功!-n“);void print(
31、STUDENT *h)int i=0;STUDENT *p;p=h;printf(“nnn*学生*n“);printf(“|学号 | 姓名 |年龄|性别|出生年月| 地址 | 电话 | E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);while(p!=NULL)i+;printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);p=p-next;printf(“*end*n“);/*搜索函数,按学号搜索学
32、生信息并显示*/void search1(STUDENT *h)STUDENT *p;char s11;printf(“请输入你要查找的同学的学号n“);scanf(“%s“,s);p=h;while(strcmp(p-no,s)if(p=NULL)printf(“n 没有学号为%s 的学生n“,s);elseprintf(“nnn*找到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话 | E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);- 28 -printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|
33、%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);void search2(STUDENT *h)STUDENT *p;char s15;printf(“请输入你要查找的同学的姓名n“);scanf(“%s“,s);p=h;while(strcmp(p-name,s)if(p=NULL)printf(“n 没有姓名为%s 的学生n“,s);elseprintf(“nnn*找到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话
34、| E-mail |n“);printf(“|-|-|-|-|-|-|-|-|n“);printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);STUDENT *del(STUDENT *h)STUDENT *p,*q;char s11;printf(“请输入要删除的学生的学号n“);scanf(“%s“,s);q=p=h;while(strcmp(p-no,s)p=p-next;if(p=NULL)
35、printf(“n 链表中没有学号为%s 的学生 n“,s);elseprintf(“nnn*找到了*n“);printf(“|学号 | 姓名 |年龄| 性别|出生年月| 地址 | 电话 | E-mail |n“);- 29 -printf(“|-|-|-|-|-|-|-|-|n“);printf(“|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|n“,p-no,p-name,p-age,p-sex,p-birthday,p-address,p-tel,p-e_mail);printf(“*end*n“);printf(“请按任意键删除n“);getchar();i
36、f(p=h)h=p-next;elseq-next=p-next;free(p);printf(“n 已经删除学号为%s 的学生 n“,s);return h;STUDENT *revise(STUDENT *h)STUDENT *p,*q;char s11;printf(“请输入您希望修改的学生学号n“);scanf(“%s“,s);printf(“n 请输入新的学生信息n“);p=h;q=h;while(strcmp(p-no,s)p=p-next;inputs(“输入学号 :“,p-no,11); inputs(“输入姓名 :“,p-name,15);printf(“输入年龄:“);scanf(“%d“,printf(“输入性别编号(0.男 1.女):“);scanf(“%s“,printf(“输入出生年月(XXXX/XX):“);scanf(“%s“,p-birthday);inputs(“输入地址 :“,p-address,20);inputs(“输入电话 :“,p-tel,12);inputs(“输入 E-mail:“,p-e_mail,20);return (h);