教务信息管理系统课程设计报告.docx
《教务信息管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《教务信息管理系统课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
教务信息管理系统课程设计报告
教务信息管理系统课程设计报告
《高级语言程序设计》课程设计
教务信息管理系统
题目:
班级:
软件R7班
学生学号:
201231001015
学生姓名:
麦建波
指导老师:
姚金涛
提交时间:
2013年5月6日
分及不及格课程:
根据录入的数据进行统计,输出全部学生的已修学分及不及格课程的名称。
(6)保存学生信息及其课程成绩并退出:
将当前的学生基本资料和课程情况保存到文件,并覆盖原有文件。
1.4开发平台及工具介绍
(1)硬件环境:
处理器:
IntelPentium166或更高
内存:
32MB以上
硬盘空间:
2G以上
显卡:
SVGA显示适配器
(2)软件环境:
操作系统:
Windows98/Me/2000/XP/2007/Vista/7/8等
2.系统设计
2.1系统总体结构设计
教务信息管理系统
保存学生信息及其课程成绩并退出
统计学生已修学分及不及格课程
按课程统计学生名单及考试成绩
按班统计学生选课情况及考试成绩
新增学生信息及其课程成绩
加载学生信息及其课程成绩
2.2系统各个功能模块设计
(1)
加载成功显示相关信息,并提示加载学生总数
系统自动从根文件夹读取文件”stu.txt”,依照程序步骤将学生信息输入到程序
加载学生信息及其课程成绩
(2)
学生学号输入“0”返回到主界面
在已有加载数据基础上新增学生,依照提示信息依次将学生信息输入到程序
新增学生信息及其课程成绩
(3)
输出完毕后自动返回到主界面继续工作
基于当前数据,按班级R1~R10分类统计并输出学生所有信息到屏幕和文件”case3.txt”
按班统计学生选课情况及考试成绩
(4)
输入课程编号,查找出已修该课程所有学生并输出其成绩及重修与否到屏幕和文件”case4.txt”
课程编号输入“0”返回到主界面
按课程统计学生名单及考试成绩
(5)
基于当前数据,将每位学生已修课程的学分总和及不及格课程输出到屏幕和文件”case5.txt”
输出完毕后自动返回到主界面继续工作
统计学生已修学分及不及格课程
(6)
保存成功显示相关信息,并提示保存学生总数,最后退出程序
将当前数据以与加载相同的格式输出到文件”stu.txt”,并覆盖原本存在的该文件
保存学生信息及其课程成绩并退出
2.3数据结构的设计
2.3.1学生信息数据结构
typedefstructstudent
{
intage,sub,cla;//年龄,选课数量,班级
doublepoi;//已修学分
charstun[15],name[30],sex[5],dorn[10],phon[20];//学号,姓名,性别,宿舍号码,短号电话号码
courseles[10];//课程信息
structstudent*next;
}student;
2.3.2课程信息数据结构
typedefstructcourse
{
charlessonn[15],lessonname[50],re[5];//课程编号,课程名称,是否重修
doubletextmark,formalmark,mark,point;//考试成绩,平时成绩,综合成绩,学分
restudyres[5];//重修情况
intrestime;//重修次数
}course;
2.3.3重修情况数据结构
typedefstructrestudy
{
intterm;//重修学期
doubleresmark;//重修分数
}restudy;
2.4界面设计
程序界面应遵循简洁美观、方便使用的原则。
2.4.1主界面
充分考虑界面易于操作的系统需求,用printf语句构造简单的文字界面,具体主界面设计效果如图所示。
2.4.2新增信息界面
根据相关的文字提示,用户输入对应信息。
3.系统实现
基于系统需求分析与系统总体设计的结果,本系统采用Code:
:
Blocks12.11软件平台基于C语言实现各模块的功能,下面按照模块的功能划分来分别阐述系统的详细设计和实现过程。
3.1头文件:
#include
#include
#include
3.2主界面模块
功能:
功能选择界面
输入:
用户选择的功能选项编号
处理:
根据用户选项跳转到相关功能函数
输出:
相关功能函数的处理或显示界面
程序清单:
student*insstu();//加载学生信息及其课程成绩
student*inspoint(student*head,student*stud);//插入链表结点
voidclalesmark(student*head);//按班统计学生选课情况及考试成绩
voidlesstumark(student*head);//按课程统计学生名单及考试成绩
voidpointfail(student*head);//统计并输出每个同学已修学分及不及格课程
student*adds(student*hd);//新增学生信息及其课程成绩
student*savestu(student*head);//保存学生信息及其课程成绩
intmain(void)
{
student*head,*p;
intnum,n;
intsize=sizeof(structstudent);
head=NULL;
printf("\t\t*****************************欢迎使用教务信息管理系统*****************************");
do
{
printf("\n\t\t*------------------------------------请选择------------------------------------*\n");
printf("\t\t*1、加载学生信息及其课程成绩\t\t\t2、新增学生信息及其课程成绩*\n");
printf("\t\t*3、按班统计学生选课情况及考试成绩\t\t4、按课程统计学生名单及考试成绩*\n");
printf("\t\t*5、统计并输出每个同学已修学分及不及格课程\t6、保存学生信息及其课程成绩并退出*\n");
printf("\t\t*-----------------------------------0、退出------------------------------------*\n\n");
fflush(stdin);//清除缓冲区
scanf("%d",&n);
switch(n)
{
case1:
head=insstu();break;
case3:
clalesmark(head);break;
case4:
lesstumark(head);break;
case5:
pointfail(head);break;
case2:
head=adds(head);break;
case6:
savestu(head);break;
default:
break;
}
}while(n!
=0&&n!
=6);
printf("\n\t\t*----------------------------------!
谢谢使用!
----------------------------------*\n");
return0;
}
3.3加载信息模块
功能:
从根文件夹加载记录学生信息的文件
输入:
无
处理:
将所有学生信息形成链表
输出:
加载成功情况
程序清单:
student*insstu()
{
student*p,*hd,*pt;
inti,j,n=0;
FILE*fp;
fp=fopen("stu.txt","r");//从根目录读取文件
intsize=sizeof(student);
hd=NULL;
while
(1)
{
p=(student*)malloc(size);
fscanf(fp,"%s",&p->stun);//读取学号
if(strcmp(p->stun,"0")==0)break;//学号为0返回
fscanf(fp,"%d",&p->cla);//读取班级
fscanf(fp,"%s",&p->name);//读取姓名
fscanf(fp,"%s",&p->sex);//读取性别
fscanf(fp,"%d",&p->age);//读取年龄
fscanf(fp,"%s",&p->dorn);//读取宿舍号码
fscanf(fp,"%s",&p->phon);//读取短号电话号码
p->sub=0;p->poi=0;
for(i=p->sub;i<=10;i++)
{
fscanf(fp,"%s",&p->les[i].lessonn);//读取课程编号
if(strcmp(p->les[i].lessonn,"0")==0)break;//课程编号为0返回
fscanf(fp,"%s",&p->les[i].lessonname);//读取课程名称
fscanf(fp,"%lf",&p->les[i].textmark);//读取考试成绩
fscanf(fp,"%lf",&p->les[i].formalmark);//读取平时成绩
fscanf(fp,"%lf",&p->les[i].mark);//读取综合成绩
fscanf(fp,"%lf",&p->les[i].point);//读取学分
p->poi+=p->les[i].point;//将该课程学分加入已修总学分
fscanf(fp,"%s",&p->les[i].re);//读取是否重修
if(strcmp(p->les[i].re,"是")==0)
{
fscanf(fp,"%d",&p->les[i].restime);//读取重修次数
for(j=0;jles[i].restime;j++)
{
fscanf(fp,"%d",&p->les[i].res[j].term);//读取重修学期
fscanf(fp,"%lf",&p->les[i].res[j].resmark);//读取重修成绩
}
}
p->sub++;
}
n++;
if(n==1)
{
hd=p;pt=p;
}
else
{
pt->next=p;pt=p;
}
}
pt->next=NULL;
printf("加载学生数据成功!
共加载%d位学生信息\n",n);
returnhd;
}
3.4新增信息模块
功能:
增加学生,并完整录入相关个人信息及选课信息
输入:
学生信息
处理:
将所得学生信息插入链表
输出:
无
程序清单:
student*adds(student*hd)
{
student*p,*q,*r;
inti,j;
intsize=sizeof(student);
while
(1)
{
p=(student*)malloc(size);
//hd=inspoint(hd,p);
//p->next=NULL;
printf("请输入学号(12位数字,返回请输入0):
");
scanf("%s",&p->stun);
if(strcmp(p->stun,"0")==0)break;
printf("请输入班级号(软件R()班):
");
scanf("%d",&p->cla);
printf("请输入姓名:
");
scanf("%s",&p->name);
printf("请输入性别:
");
scanf("%s",&p->sex);
printf("请输入年龄:
");
scanf("%d",&p->age);
printf("请输入宿舍号码(5位数字):
");
scanf("%s",&p->dorn);
printf("请输入电话号码(短号):
");
scanf("%s",&p->phon);
p->sub=0;p->poi=0;
for(i=p->sub;i<=10;i++)
{
printf("请输入课程编号(6位数字,返回请输入0):
");
scanf("%s",&p->les[i].lessonn);
if(strcmp(p->les[i].lessonn,"0")==0)break;
printf("请输入课程名称:
");
scanf("%s",&p->les[i].lessonname);
printf("请输入考试成绩:
");
scanf("%lf",&p->les[i].textmark);
printf("请输入平时成绩:
");
scanf("%lf",&p->les[i].formalmark);
printf("请输入综合成绩:
");
scanf("%lf",&p->les[i].mark);
printf("请输入学分:
");
scanf("%lf",&p->les[i].point);
p->poi+=p->les[i].point;
printf("是否需要重修(输入“是,否”,):
");
scanf("%s",&p->les[i].re);
if(strcmp(p->les[i].re,"是")==0)
{
printf("请输入重修次数:
");
scanf("%d",&p->les[i].restime);
for(j=0;jles[i].restime;j++)
{
printf("请输入重修学期:
");
scanf("%d",&p->les[i].res[j].term);
printf("请输入重修成绩:
");
scanf("%lf",&p->les[i].res[j].resmark);
}
}
p->sub++;
}
hd=inspoint(hd,p);//插入一个新结点以继续增加学生人数
p->next=NULL;
}
system("cls");//清屏
returnhd;
}
3.5按班级统计模块
功能:
按班级有序地查看学生的情况
输入:
无
处理:
按班级R1~R10分类统计学生信息
输出:
输出学生所有信息到屏幕和文件”case3.txt”
程序清单:
voidclalesmark(student*head)//同时输出数据到屏幕和文件
{
inti,j,k;
student*s;
FILE*fp;
fp=fopen("case3.txt","w");//输出文件到根目录
if(head==NULL)
{fprintf(fp,"没有信息。
\n");printf("没有信息。
\n");}
else
{
fprintf(fp,"学号姓名性别年龄宿舍号电话号码课程编号课程名称平时成绩考试成绩综合成绩学分是否重修重修次数重修情况\n");
printf("学号姓名性别年龄宿舍号电话号码课程编号课程名称平时成绩考试成绩综合成绩学分是否重修重修次数重修情况\n");
printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
fprintf(fp,"-----------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
for(i=1;i<=10;i++)
{
fprintf(fp,"软件R%d班:
\n",i);printf("软件R%d班:
\n",i);
s=head;
while(s!
=NULL)
{
if(s->cla==i)
{
fprintf(fp,"%13s%8s%s%d%9s%10s\n",s->stun,s->name,s->sex,s->age,s->dorn,s->phon);
printf("%13s%8s%s%d%9s%10s\n",s->stun,s->name,s->sex,s->age,s->dorn,s->phon);
for(j=0;jsub;j++)
{
fprintf(fp,"%s%12s%5.1lf%5.1lf%5.1lf%3.1lf%s",s->les[j].lessonn,s->les[j].lessonname,s->les[j].formalmark,s->les[j].textmark,s->les[j].mark,s->les[j].point,s->les[j].re);
printf("%s%12s%5.1lf%5.1lf%5.1lf%3.1lf%s",s->les[j].lessonn,s->les[j].lessonname,s->les[j].formalmark,s->les[j].textmark,s->les[j].mark,s->les[j].point,s->les[j].re);
if(strcmp(s->les[j].re,"是")==0)
{
fprintf(fp,"%d",s->les[j].restime);printf("%d",s->les[j].restime);
for(k=0;kles[j].restime;k++)
{
fprintf(fp,"/第%d次:
第%d学期,%.1lf分/",k+1,s->les[j].res[k].term,s->les[j].res[k].resmark);
printf("/第%d次:
第%d学期,%.1lf分/",k+1,s->les[j].res[k].term,s->les[j].res[k].resmark);
}
}
fprintf(fp,"\n");printf("\n");
}
}
s=s->next;
}
}
}
}
3.6按课程统计模块
功能:
按课程查看已修该课的学生的成绩情况
输入:
课程编号
处理:
逐个学生查找是否已修该课程
输出:
输出学生成绩情况到屏幕和文件”case4.txt”
程序清单:
voidlesstumark(student*head)
{
inti;
charlessonn[15];
student*s;
FILE*fp;
fp=fopen("case4.txt","w");
if(head==NULL)
{fprintf(fp,"没有信息。
\n");printf("没有信息。
\n");}
else
{
while
(1){
printf("请输入课程编号(返回请输入0):
");
scanf("%s",&lessonn);
if(strcmp(lessonn,"0")==0)break;
fprintf(fp,"\n\t\t课程名称学号姓名平时成绩考试成绩综合成绩学分是否重修\n");
printf("\n\t\t课程名称学号姓名平时成绩考试成绩综合成绩学分是否重修\n");
fprintf(fp,"\t\t--------------------------------------------------------------------------------\n");
printf("\t\t--------------------------------------------------------------------------------\n");
s=head;
while(s!
=NULL)
{
for(i=0;isub;i++)
{
if(strcmp(s->les[i].lessonn,lessonn)==0)//查找该学生是否已修该课
{
fprintf(fp,"\t\t%12s%13s%8s%5.1lf%5.1lf%5.1lf%3.1lf%s\n",s->les[i].lessonname,s->stun,s->name,s->les[i].formalmark,s->les[i].textmark,s->les[i].mark,s->les[i].point,s->les[i].re);
printf("\t\t%12s%13s%8s%5.1lf%5.1lf%5.1lf%3.1lf%s\n",s->les[i].lessonname,s->stun,s->name,s->les[i].formalmark,s->les[i].textmark,s->les[i].mark,s->les[i].point,s->les[i].re);
break;
}
}
s=s->next;
}
fprintf(fp,"\n");
printf("\n");
}
}
}
3.7输出已修学分及不及格课程模块
功能:
查看所有学生已修学分及不及格课程
输入:
无
处理:
从头到尾检索每个学生已修学分及不及格课程
输出:
输出所有学生已修学分及不及格课程到屏幕和文件”case5.txt”
程序清单:
voidpointfail(student*head)
{
inti;
charlessonn[15];
student*s;
FILE*fp;
fp=fopen("case5.txt","w");
if(head==NULL)
{fprintf(fp,"没有信息。
\n");printf("没有信息。
\n");}
else
{
fprintf(fp,"\t\t学号姓名班级已修学分不及格课程\n");printf("\t\t学号姓名班级已修学分不