南邮学生基本信息管理系统程序设计报告.docx
- 文档编号:11541638
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:45
- 大小:189.45KB
南邮学生基本信息管理系统程序设计报告.docx
《南邮学生基本信息管理系统程序设计报告.docx》由会员分享,可在线阅读,更多相关《南邮学生基本信息管理系统程序设计报告.docx(45页珍藏版)》请在冰点文库上搜索。
南邮学生基本信息管理系统程序设计报告
程序设计报告
(2014/2015学年第二学期)
题目:
学生基本信息管理系统
专业信息管理与信息系统
组长学号姓名
组员学号姓名
指导教师
指导单位计算机软件中心
日期2015年6月25日
成员分工
组长()
组员()
组员()
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级共五种:
优秀、良好、中等、及格、不及格
学生基本信息管理系统
一、课题内容和要求
此系统是可实现最基本功能的学生管理系统。
具体的管理信息应包括:
两个txt文件,其中a.txt为学生基本信息文件,应该包括学号、姓名、性别、宿舍号码、电话号码;b.txt为学生成绩基本信息文件,应包括学号、课程编号、课程名称、学分、平实得分、实验成绩、卷面成绩、综合成绩、实得学分。
①a.txt文件不需要编程录入数据,可用文本编辑工具直接生成
②数据录入功能:
对b.txt进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据.综合成绩、学分由程序根据条件自动运算。
③学生基本情况查询
1)输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
2)输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
④成绩查询:
输入一个学号时,查询出此生的所有课程情况,
⑤删除功能:
当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
⑥排序功能:
能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
二、需求分析
学生基本信息管理系统的功能框架图如图2.1所示。
调用mysort函数
调用mycreat函数
主函数
调用myprint函数
调用mydelete函数
调用mysearch函数
调用mydisplay函数
调
用
创建文件
显示
菜单
删除
输出
排序
查询
图2.1功能框架图
本次课程设计主要利用了结构体数组、结构体指针以及与文件有关的基本操作,通过采用模块化设计的思想,首先创建好各个模块的函数,然后被主函数调用。
主函数通过多次调用不同的函数实现创建文件、查询、删除学生信息模块和排序得基本功能,其总体框图如图2.1。
各个模块的程序编写比较容易,各个函数的接口是否处能理好,是本次课程设计能否成功的关键。
通过合理处理各函数得接口,使之能结合为一个完整的具有多功能的程序,从而顺利完成本次课程设计。
三、概要设计
3.1主函数模块
在主函数中需要输出主菜单选择界面,简单菜单的制作可利用myprint()函数实现。
获取用户的输入选择,存放在choose中,接着判断用户是否继续选择,若选择,则重新获得用户输入;否则,推出程序,其流程图见图3.1。
图3.1主函数模块的流程图
3.2显示菜单模块
myprint()函数不需要传递参数,也不需要再定义任何变量,主要是实现输出主菜单。
其函数的流程图见图3.2.
图3.2myprint()函数的流程图
3.3创建文件模块
3.3创建文件模块
mycreat()函数主要实现打开b.txt文件,并通过fscanf()函数从磁盘上读取文件b.txt的学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩信息然后依据学分、平时成绩、实验成绩、卷面成绩计算得到综合成绩和实得学分并借助临时文件c.txt将综合成绩和实得学分也加到b.txt文件中。
其中第一个for循环语句主要实现计算综合成绩和实得学分的功能,通过fsanf()语句将文件b.txt得数据一一读入,同时计算综合成绩和实得学分,并将这些数据通过fprintf语句写入临时文件c.txt。
rewind(fp)函数是将fp指示的文件位置指针置于文件开头位置,并清除文件结束标志和错误标志,以便将临时文件c.txt中的数据写入b.txt文件中。
getc与putc函数与文件指针将临时文件c.txt的信息写入b.txt文件中。
其流程图见图3.3。
其流程图见图3.3。
图3.3mycreat()函数流程图
3.4显示信息模块设计
本模块主要设计mydisplay(……)函数。
将文件b.txt的数据通过fscanf()语句写入内存,然后通过printf()语句将读到的信息显示到屏幕上。
若文件中无记录,则显示文件中没有记录。
其流程图见图3.4。
输出“无记录”
打开成功?
记录数=0?
记录数增1
到文件尾?
输出学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩、综合成绩、实得学分
假
真
输出记录数
关闭文件
出口
打开文件
真
假
真
假
图3.4显示信息模块流程图
3.5查询模块的设计
本模块主要设计mysearch(……)函数、mysearchbase(……)函数、mysearchscore(……)函数、print()函数。
mysearchbase(……)函数的流程图见图3.5,sch_num()函数的流程图见图3.6,sch_name()函数的流程图见图3.7,sch_dom()函数的流程图见图3.8。
mysearch(……)函数主要是查询菜单的显示、输出你要查询的信息。
查询菜单主要包括查询基本情况和查询成绩。
它首先在屏幕上显示查询显示菜单,然后利用getch()与if语句判断查询方式以确定需要调用的函数。
数据结构说明:
学生结构体数组同3.3.
c选择的不同方式
tempnum[10]要查询的学号
tempname[10]要查询的姓名
tempdom[10]要查询的宿舍号码
假
打开文件
打开成功
输入查询类型
按学号查询?
按宿舍查询?
按姓名查询?
按舍查询
调用sch_num
调用sch_name
调用sch_dom
关闭文件
非法字符
入口
出口
假
假
假
真
真
真
真
图3.5mysearchbase(……)函数的流程图
真
真
入口
输入查询姓名
到文件尾?
找到相同姓名
首行记录
输出表头
输出记录
找到记录标记
记录数增1
记录数=0?
输出“无记录”
flag==0?
输出无此人
出口
真
假
假
假
假
真
真
入口
输入查询学号
到文件尾?
找到相同学号
首行记录
输出表头
输出记录
找到记录标记
记录数增1
记录数=0?
输出“无记录”
flag==0?
输出无此人
出口
真
真
真
假
假
假
假
真
真
输入查询宿舍号码
到文件尾?
找到相同宿舍
首行记录
输出表头
输出记录
找到记录标记
记录数增1
记录数=0?
输出“无记录”
输出此宿舍n人
出口
真
真
假
假
假
开始
真
真
假
图3.8sch_dom()函数的流程图
3.5.2查询成绩信息模块设计
本模块主要设计mysearchscore(……)函数。
真
真
入口
输入查询学号
到文件尾?
找到相同学号
首行记录
输出表头
输出记录
找到记录标记
记录数增1
记录数=0?
输出“无记录”
flag==0?
输出无此人
出口
真
假
假
假
真
假
假
打开文件
打开成功
输入查询学号
调用sch_num
关闭文件
入口
出口
真
假
mysearchscore(……)函数通过调用绩信息。
其流程图见图3.9
schscore_num()函数实现按学号查询学生成绩。
其流程图见图3.10
图3.9mysearchscore()函数的流程图
图3.10schscore_num()函数的流程图
3.6删除信息模块设计
本模块主要设计mydelete(……)函数。
mydelete(……)函数按学号删除信息。
先以只读方式打开文件,进行读取。
如找到相应的信息,结束本次循环,并将a.txt文件删除后的数据写入临时文件c.txt中,同时释放文件a.txt的空间。
再创建一个文件a.txt,并将临时文件c.txt中的数据一次通过fpintf()语句写到文件a.txt上。
如没有找到则显示文件中无此信息。
文件b.txt的删除与文件a.txt类似。
mydelete()模块的流程图见图3.11。
del_num()函数实现按学号删除学生成绩。
由于任务要求在文件a.txt中删除某学生的基本信息,在文件b.txt中该生的成绩信息也相应的被删除,所以需要通过学号对文件a.txt与b.txt均进行删除操作。
这是定义函数del_num()的关键,其流程图见图3.12。
(其中对b.txt的操作与对文件a.txt的操作相似,在此仅画出对文件a.txt的操作)
数据结构说明:
学生结构体数组同3.3.c选择的不同方式tempnum[10]要删除学生的学号FILE*fp*fp1文件指针
假
打开文件a.txt
打开成功
调用del_num
关闭文件
入口
出口
真
打开文件b.txt
图3.11mydelete()模块的流程图
入口
输入删除学号
到文件尾?
找到相同学号
结束本次循环
关闭文件
到文件尾?
出口
真
假
假
假
将该生信息写入文件c.txt
打开文件a.txt
删除后的数据写入a.txt
真
真
读文件
图3.12函数del_num()的流程图
3.7排序模块设计
本模块主要设计mysort(……)函数、print()函数。
mysearchsort(……)函数主要是排序菜单的显示、输出排序后的信息。
排序菜单主要包括按综合成绩和实得学分两种方式实现升序与降序不同方式得排序。
它首先在屏幕上显示排序显示菜单,然后利用getch()与if语句判断排序方式以确定需要调用的函数,然后以只读方式打开文件,进行读取。
通过插入排序法分别实现不同的排序方式。
如找到相应的信息,则将该信息通过调用printf()函数输出到屏幕上。
所谓插入排序就是将无序序列中的各各元素依次插入到已经有序的线性表中。
mysort(……)函数的流程图见图3.13,sort_sumscore()函数的流程图见图
按综合成绩排序?
打开文件
打开成功
输入排序类型
按实得学分查询?
调用sort_sumscore
调用sort_count
关闭文件
非法字符
入口
出口
假
假
假
真
真
真
图3.13mysort(……)函数的流程图
四、源程序代码
#include
#include
#include
#include
#defineN100
structstudent
{
charnum[10];
charname[10];
chartel[11];
charsex[2];
intdom;/*宿舍*/
charcousenum[3];/*课程编号*/
floatcousecount;/*课程学分*/
charcousename[25];/*课程名称*/
floatcomscore;/*平时成绩*/
signedintexpscore;/*实验成绩*/
floatpaperscore;/*卷面成绩*/
floatsumscore;/*综合成绩*/
floatcount;/*实得学分*/
}stu[12];
/*以下是函数原型说明,被调函数的定义在主调函数后面时,要加此部分*/
voidmyprint();/*创建主菜单*/
voidmycreate();/*创建管理系统*/
voidmydisplay();/*显示*/
voidmysearchbase();/*基本情况查询*/
/*schbase_numsch_dom与schbase_name函数被mysearchbase调用*/
voidsch_num(FILE*fp);
voidsch_name(FILE*fp);
voidsch_dom(FILE*fp);
voidmysearch();/*查询*/
voidmysearchscore();/*成绩查询*/
voidschscore_num(FILE*fp,FILE*f);/*成绩查询*/
voidmydelete();/*删除*/
/*del_num函数被mydelete调用*/
voiddel_num(FILE*fp,FILE*f);
voidmysort();/*排序*/
/*sort_sumscore与sort_count函数被mysort调用*/
voidsort_sumscore();
voidsort_count();
/*主函数*/
voidmain()
{
charchoose,yes_no;
/*system("color8e");
system("cls");*/
do
{
myprint();/*显示主菜单*/
printf("");
choose=getch();
switch(choose)
{
case'1':
mycreate();break;/*创建*/
case'2':
mydisplay();break;/*显示*/
case'3':
mysearch();break;/*查询*/
case'4':
mydelete();break;/*删除*/
case'5':
mysort();break;/*排序*/
case'0':
break;
default:
printf("\n%c为非法选项!
\n",choose);
}
if(choose=='0')
break;
printf("\n要继续选择吗(Y/N)?
\n");
do
{
yes_no=getch();
}while(yes_no!
='Y'&&yes_no!
='y'&&yes_no!
='N'&&yes_no!
='n');
}while(yes_no!
='Y'||yes_no!
='y');
}
voidmyprint()/*显示菜单界面*/
{
/*clrscr();*/
printf("\n\n\n\n\n\n\n\n");
printf("学生管理系统\n");
printf("\n");
printf("|*************************************************************|\n");
printf("|请输入选项编号(0-5):
|\n");
printf("|-----------------------------------------|\n");
printf("|1--创建学生信息|\n");
printf("|2--显示学生信息|\n");
printf("|3--查询学生信息|\n");
printf("|4--删除学生信息|\n");
printf("|5--排序学生信息|\n");
printf("|0--退出|\n");
printf("|-----------------------------------------|\n");
printf("|*****************************************************************|\n");
printf("\n");
printf("欢迎进入学生管理系统——请选择要进行的操作!
\n");
}
/*定义创建信息管理系统的函数*/
voidmycreate()
{
inti,n;
FILE*fp;
fp=fopen("e:
\\源程序2\\b.txt","r+");
if(fp==NULL)
{
printf("\n打开文件失败!
\n");
return;
}
rewind(fp);
printf("\n\n");
printf("\t\t\t\t请输入学生个数");
scanf("%d",&n);
for(i=0;i { printf("请输入学生学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩\n"); scanf("%s%s%s%f%f%d%f",&stu[i].num,&stu[i].cousenum,&stu[i].cousename,&stu[i].cousecount,&stu[i].comscore,&stu[i].expscore,&stu[i].paperscore); } for(i=0;i { if(stu[i].expscore==-1) stu[i].sumscore=stu[i].comscore*3/10+stu[i].paperscore*7/10; else stu[i].sumscore=stu[i].comscore*15/100+stu[i].expscore*15/100+stu[i].paperscore*7/10; if(90 stu[i].count=stu[i].cousecount; if(80 stu[i].count=stu[i].cousecount*8/10; if(70 stu[i].count=stu[i].cousecount*3/4; if(60<=stu[i].sumscore&&stu[i].sumscore<=70) stu[i].count=stu[i].cousecount*3/5; if(stu[i].sumscore<60) stu[i].count=0; fprintf(fp,"%-10s%-7s%-15s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[i].num,stu[i].cousenum,stu[i].cousename,stu[i].cousecount,stu[i].comscore,stu[i].expscore,stu[i].paperscore,stu[i].sumscore,stu[i].count); } fclose(fp); printf("创建成功! ! \n\n"); } /*定义显示信息管理系统的函数*/ voidmydisplay() {inti=0; intn=0; structstudenttemp; FILE*fp; fp=fopen("e: \\源程序2\\b.txt","r"); if(fp==NULL) { printf("\n打开文件失败! \n"); return; } printf("\n学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分\n"); while(feof(fp)==0) {fscanf(fp,"%s%s%s%f%f%d%f%f%f\n",&stu[i].num,&stu[i].cousenum,&stu[i].cousename,&stu[i].cousecount,&stu[i].comscore,&stu[i].expscore,&stu[i].paperscore,&stu[i].sumscore,&stu[i].count); printf("%-4s%-7s%-12s%-5.0f%-8.2f%-5d%-8.2f%-8.2f%-8.2f\n",stu[i].num,stu[i].cousenum,stu[i].cousename,stu[i].cousecount,stu[i].comscore,stu[i].expscore,stu[i].paperscore,stu[i].sumscore,stu[i].count); n++; } if(n==0) printf("\n文件中无记录! \n"); else printf("\n文件中共有%d个记录! \n",n); fclose(fp); } /*定义查询信息的函数*/ voidmysearch() { charc; FILE*fp; fp=fopen("e: \\源程序2\\a.txt","r"); if(fp==NULL) { printf("\n打开文件失败! \n"); return; } printf("\n查询基本信息(b),还是查询成绩(r)? "); c=getch(); if(c=='b'||c=='B') mysearchbase();/*查询基本信息*/ if(c=='r'||c=='R') mysearchscore();/*查询成绩*/ if(c! ='b'&&c! ='B'&&c! ='r'&&c! ='R') printf("\n非法字符! \n"); fclose(fp); } /*定义查询信息管理系统的函数(基本情况)*/ voidmysearchbase() { charc; FILE*fp; fp=fopen("e: \\源程序2\\a.txt","r"); if(fp==NULL) { printf("\n打开文件失败! \n"); return; } pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 基本信息 管理 系统 程序设计 报告