学生信息管理系统设计.docx
- 文档编号:8619310
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:34
- 大小:659.64KB
学生信息管理系统设计.docx
《学生信息管理系统设计.docx》由会员分享,可在线阅读,更多相关《学生信息管理系统设计.docx(34页珍藏版)》请在冰豆网上搜索。
学生信息管理系统设计
目录
第1章课题分析1
1.1问题的描述1
1.2要求分析1
1.2.1程序所要实现的功能1
第2章总体设计2
2.1程序设计组成框图2
2.2模块功能说明2
2.3程序流程图2
第3章详细设计及程序实现4
3.1主要函数和结构体4
3.1.1主函数4
3.1.2定义的结构体4
3.2程序中各函数分析4
第4章问题与解决10
第5章程序测试11
第6章总结17
参考文献18
附录:
源代码清单19
第1章课题分析
1.1问题的描述
课程设计题目:
学生信息管理系统设计;
要求设计一个程序,实现以下功能:
1)系统以菜单方式工作;
2)学生信息录入功能(学生信息用文件保存);
3)学生信息浏览功能;
4)查询、排序功能(至少两种查询依据和两种排序依据);
5)学生信息删除、修改功能
1.2要求分析
学生信息包括:
学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等
1.2.1程序所要实现的功能
程序需要实现的功能有:
1)系统以菜单方式工作;
2)学生信息录入功能(学生信息用文件保存);
3)学生信息浏览功能;
4)查询、排序功能(至少两种查询依据和两种排序依据);
5)学生信息删除、修改功能
第2章总体设计
2.1程序设计组成框图
图2-1学生信息管理设计框图
2.2模块功能说明
1输出功能:
完成全部学生记录的显示。
2查询功能:
输入姓名可以查询学生的详细信息。
3增加功能:
增加新学生的信息。
4删除功能:
删除学生信息。
5修改功能:
修改学生的错误信息。
6保存功能:
保存已输入信息。
7读取功能:
读取已输入信息。
8显示功能:
按要求显示学生记录。
9排序功能:
按要求完成对学生信息的排序。
10退出系统。
2.3程序流程图
图2-2学生信息管理流程图
第3章详细设计及程序实现
3.1主要函数和结构体
3.1.1主函数
voidmain()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
3.1.2定义的结构体
typedefstructSTUDENT
{
charstudentNumber[10];/*学生学号*/
charstudentName[20];/*学生姓名*/
intage;/*学生年龄*/
charsex[10];/*学生性别*/
struct
{intmonth;
intday;
intyear;
}birth;/*出生年月*/
charad[100];/*学生地址*/
charphone[20];/*联系电话*/
charemail[30];/*E-mail*/
structSTUDENT*next;
}STUDENT;
3.2程序中各函数分析
表3-1程序中的函数列表
函数
功能
voidReadInfoFormFile(void)
从文件中读学生信息到链表中
voidDesplayMenu(void)
显示菜单,根据用户的输入完成相应的功能
voidCreateHeadLink(void)
建立链表表头
STUDENT*MallocNode(void)
申请一个新结点,并将其初始化
voidGetInformation(STUDENT*t)
取得用户输入的学生信息
voidDesplayInfoBystudentName(void)
根据用户输入的学生姓名显示该学生的信息
voidDesplayOneNode(STUDENT*t)
输出一个结点的信息
voidInsertOneNode(STUDENT*t)
在链表的结尾处增加一个结点
voidDeleteNodeBystudentNumber(void)
根据用户输入的学号删除该学生
voidChangeMarkByName(void)
根据输入的学号修改
voidChangeMarkByNumber(void)
根据输入的学号查询
voidSaveLinkToFile(void)
保存链表数据到文件中
voidDesplayMarkSegment(void)
按学号进行排序并输出
voidCompositorByTotalMark(void)
按年龄大小排序
voidOutputInformation(void)
显示所有学生的信息
(1)voidReadInfoFormFile(void)
该函数的主要功能是从文件中读学生信息到链表中。
以只读方式打开文件,然后定义一个指针读取信息。
FILE*fp;/*定义指向该文件的FILE类型的指针变量*/
STUDENT*p;/*定义一个结构体指针*/
fp=fopen("student.txt","r");/*以只读的方式打开文件*/
if(!
fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%d%s%d%d%d%s%s%s",p->studentNumber,p->studentName,&(p->age),p->sex,&(p->birth.month),&(p->birth.day),&(p->birth.year),p->ad,p->phone,p->email)>0)/*从文件中读取信息*/
{
InsertOneNode(p);/*调用函数*/
p=MallocNode();
}
fclose(fp);
(2)voidDesplayMenu(void)
该函数功能是显示菜单,根据用户的输入完成相应的功能。
STUDENT*p;
printf("-------请选择相应功能------------\n\n");
printf("|1学生信息浏览功能|\n");
……
printf("|10退出|\n\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)/*进行选择*/
{
case1:
OutputInformation();/*显示所有学生的信息*/
break;
……
case10:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);/*释放链表空间*/
……
DesplayMenu();/*递归调用*/
(3)voidCreateHeadLink(void)
该函数的功能是建立链表表头。
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));/*开辟空间,并初始化赋给p*/
headLink=p;
p->next=NULL;
(4)STUDENT*MallocNode(void)
该函数的功能是申请一个新结点,并将其初始化
STUDENT*p;
inti;
p=(STUDENT*)malloc(sizeof(STUDENT));/*开辟空间,并初始化赋给p*/
if(p==NULL)
returnNULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';/*利用for循环进行初始化赋值*/
for(i=0;i<20;i++)
……
p->next=NULL;
returnp;
(5)voidGetInformation(STUDENT*t)
该函数的功能是取得用户输入的学生信息
printf("请输入学生学号:
\n");
scanf("%s",t->studentNumber);/*从键盘上得到信息*/
……
printf("请输入学生email:
\n");
scanf("%s",t->email);
(6)voidInsertOneNode(STUDENT*t)
该函数的功能是在链表的结尾处增加一个结点
STUDENT*p;
p=headLink;
while(p->next)/*链表结束的判断*/
{
p=p->next;
}
p->next=t;
(7)voidDesplayInfoBystudentName(void)
该函数的功能是根据用户输入的学生姓名显示该学生的信息
……
printf("请输入学生姓名:
\n");
scanf("%s",studentName);
……
if(strcmp(p->studentName,studentName)==0)/*以姓名判断是不是该人*/
……
printf("学号\t姓名\t年龄\t性别\t出生年月\t地址\t\t电话\t\temail\n\n");
DesplayOneNode(p);
……
if(!
flag)
printf("对不起,不存在姓名为%s的学生\n",studentName);
(8)voidDesplayOneNode(STUDENT*t)
该函数的功能是输出一个结点的信息
printf("%s\t",t->studentNumber);
……
printf("%s\n",t->email);
(9)voidDeleteNodeBystudentNumber(void)
该函数的功能是根据用户输入的学号删除该学生
……
printf("请输入要删除的学生学号:
");
scanf("%s",studentNumber);
……
if(strcmp(q->studentNumber,studentNumber)==0)/*判断是不是该学号*/
……
free(q);/*释放掉q*/
……
(10)voidOutputInformation(void)
该函数的功能是显示所有学生的信息
……
printf("学号\t姓名\t年龄\t性别\t出生年月\t地址\t\t电话\t\temail\n\n");
while(p)
{
DesplayOneNode(p);/*调用函数*/
p=p->next;/*指针移位*/
}
(11)voidChangeMarkByName(void)
该函数功能是根据输入的学号修改
……
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的地址:
\n");
scanf("%s",p->ad);
……
(12)voidChangeMarkByNumber(void)
该函数的功能是根据输入的学号查询
……
printf("请输入学生学号:
\n");
scanf("%s",studentNumber);
……
if(strcmp(p->studentNumber,studentNumber)==0)/*根据学号查询*/
……
(13)voidSaveLinkToFile(void)
该函数的功能是保存链表数据到文件中
……
fp=fopen("student.txt","w+");以读写操作建立一个新的文本文件*/
……
fprintf(fp,"%s%s%d%s%d%d%d%s%s%s\n",p->studentNumber,p->studentName,p->age,p->sex,p->birth.month,p->birth.day,p->birth.year,p->ad,p->phone,p->email);
……
(14)voidDesplayMarkSegment(void)
该函数的功能是按学号进行排序并输出
……
if(strcmp((q->studentNumber),(p->studentNumber))<0)/*比较学号大小*/
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
……
exchange.birth.year=q->birth.year;
strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
……
q->birth.year=p->birth.year;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
……
p->birth.year=exchange.birth.year;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
(15)voidCompositorByTotalMark(void)
该函数的功能是按年龄大小排序
……
if(((q->birth.year)>(p->birth.year))||((q->birth.year)==(p->birth.year)&&(q->birth.month)>(p->birth.month))||((q->birth.year)==(p->birth.year)&&(q->birth.month)==(p->birth.month)&&(q->birth.day)>(p->birth.day)))/*比较年龄的大小*/
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
……
第4章问题与解决
编写程序的过程中遇到了很多问题,但是通过询问和与讨论都一一解决了。
这些问题分别是:
1.对链表的不熟,两个指针交换不是太明白。
2.排序的不熟悉。
3.文件的使用不太清楚
4.链表的建立不够了解
5.菜单的建立
虽然在这一周实训中出现了这些问题,但是我通过课本内容的复习和网上质询和图书馆查阅书籍,我逐渐的又重新掌握了这些重点难点的知识点,让我收获颇多,简洁的也为下周的期末考试做出了很好的复习。
一开始拿到题目,毫无头绪,不知从何处下手,通过网上资料的参考和查阅书籍,渐渐地找到了一些头绪,知道问题的所在。
所谓的学生信息管理,就是将信息制成链表存储在文件中然后再通过菜单的选项查询、修改、删除、排序学生信息。
而菜单及信息的显示,主要是通过主函数调用所要查询功能的函数来实现的。
第5章程序测试
图5-1:
程序菜单界面显示
图5-2:
学生信息的浏览功能
输入1,进行学生信息浏览
图5-3:
按学号查询学生信息
从屏幕上输入6,选择按学号查询功能。
图5-4:
按姓名进行查询学生信息
输入2,选择姓名查找功能
图5-5、5-6:
输入选项3,增加一个学生信息
图5-5:
增加一个学生
图5-6:
增加一个学生
图5-5、5-6:
输入选项3,增加一个学生信息
图5-7:
删除一位学生信息
输入4,按学号删除文件的该学生的信息
图5-8:
按学号修改学生信息
图5-9:
按学号修改学生信息
输入5,进行按学号修改信息
图5-10:
按年龄大小排序
输入9,按年龄大小排序
图5-11:
学号查询
输入6,按学号进行排序
图5-12:
退出
输入10,退出系统
第6章总结
经过一周的程序设计实习,并在后一段的报告总结,我对C语言这门科有新的认识,我实在是获益不浅!
要想编写一个准确、高效并有使用价值的程序,一定先要对课本知识熟悉,还要掌握必要的上机操作能力,写程序其实很容易而关键在于调试程序。
这次设计让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验。
其次,通过此次编程我也发现了自己在学习中的错误和不足,复习了以前学过的知识。
同时也学到了一些没学过的知识,让我从中收益非浅,也为期末考试准备了一下!
更重要的是培养了独立思考问题和解决问题的能力,熟悉了一些基本操作和解决问题的方法!
第三,因为初次接触等原因此次设计遇到了许多问题,我深刻体会到老师发挥的重要作用,C语言程序对我们来说比较难,在匆忙的学习中更是难上加难,似乎觉得自己仅是个匆匆过客。
完成程序的编写,决不意味着万事大吉。
你认为万无一失的程序,实际上机运行时可能不断出现麻烦。
如编译程序检测出一大堆错误。
有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。
开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。
程序的调试是一个技巧性很强的工作。
但在经过这一周的努力我学会了如何调试,如何查找系统没有提示的错误,最后终于排除万难把程序搞定,体会到原来编程也挺有意思。
参考文献
1.吉顺如,C语言程序设计教程与实验,清华大学出版社,2011.
2.吉顺如,刘新铭等.C语言程序设计教程(第二版).北京:
机械工业出版社,2010.
3.谭浩强,C语言设计(第三版),北京:
清华大学出版社,2007.
4.夏耘,吉顺如.大学程序设计(C)实践手册.上海:
复旦大学出版社,2008.
附录:
源代码清单
#include
#include
#include
#include
#include
typedefstructSTUDENT
{
charstudentNumber[10];
charstudentName[20];
intage;
charsex[10];
struct
{intmonth;
intday;
intyear;
}birth;
charad[100];
charphone[20];
charemail[30];
structSTUDENT*next;
}STUDENT;
STUDENT*headLink;
voidReadInfoFormFile(void);
voidDesplayMenu(void);
voidCreateHeadLink(void);
STUDENT*MallocNode(void);
voidGetInformation(STUDENT*t);
voidOutputInformation(void);
voidDesplayInfoBystudentName(void);
voidDesplayOneNode(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidChangeMarkByName(void);
voidChangeMarkByNumber(void);
voidSaveLinkToFile(void);
voidDesplayMarkSegment(void);
voidCompositorByTotalMark(void);
intchoose;
voidmain()
{
CreateHeadLink();
ReadInfoFormFile();
DesplayMenu();
}
voidReadInfoFormFile(void)
{
FILE*fp;
STUDENT*p;
fp=fopen("student.txt","r");
if(!
fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%d%s%d%d%d%s%s%s",p->studentNumber,p->studentName,&(p->age),p->sex,&(p->birth.month),&(p->birth.day),&(p->birth.year),p->ad,p->phone,p->email)>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
voidDesplayMenu(void)
{
STUDENT*p;
printf("-------请选择相应功能------------\n\n");
printf("|1学生信息浏览功能|\n");
printf("|2按姓名查询|\n");
printf("|3增加学生|\n");
printf("|4删除学生|\n");
printf("|5按学号修改学生信息|\n");
printf("|6按学号查找|\n");
printf("|7保存所有学生信息|\n");
printf("|8按学号进行排序并输出|\n");
printf("|9按年龄大小排序并输出|\n");
printf("|10退出|\n\n");
scanf("%d",&choose);
switch(choose)
{
case1:
OutputInformation();
break;
case2:
DesplayInfoBystudentName();
break;
case3:
p=MallocNode();
GetInformation(p);
InsertOneNode(p);
break;
case4:
DeleteNodeBystudentNumber();
break;
case5:
ChangeMarkByName();
break;
case6:
ChangeMarkByNumber();
break;
case7:
SaveLinkToFile();
break;
case8:
DesplayMarkSegment();
break;
case9:
CompositorByTotalMark();
break;
case10:
SaveLinkToFile();
free(headLink);
exit
(1);
break;
default:
break;
}
DesplayMenu();
}
voidCreateHeadLink(void)
{
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
STUDENT*MallocNode(void)
{
STUDENT*p;
inti;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
returnNULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
p->age=0;
for(i=0;i<10;i++)
p->sex[i]='\0';
p->birth.month=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 信息管理 系统 设计