教务信息管理系统课程设计报告

发布时间:   来源:文档文库   
字号:

《高级语言程序设计》课程设计

目:级:学生学号:学生姓名:指导老师:提交时间:




教务信息管理系统

软件R7201231001015麦建波姚金涛201356
华南农业大学软件学院




教务信息管理系统

1.系统分析

1.1问题描述
本程序为教务信息管理系统,通过输入学生的相关信息,对数据进行处理和统计,并按需要输入统计处理后的数据到文件中。

1.2系统功能
1)录入如下信息:
学生基本信息:如学号、姓名、性别、年龄、宿舍号码、电话号码等;课程基本信息:课程编号、课程名称、考试成绩、平时成绩、综合成绩、
学分、重修否等。如果重修,需要考虑重修学期、重修成绩,并且要考虑多次重修的情况。
2)录入选课信息3)录入学生成绩
4)按班统计学生选课情况及考试成绩5)按课程统计学生名单及考试成绩
6)统计并输出每个同学已修学分及不及格课程
1.3功能需求描述:
1加载学生信息及其课程成绩:从文件录入学生的基本资料和课程情况,
并覆盖原有数据。
2新增学生信息及其课程成绩:按要求录入学生的基本资料和课程情况,
通过提示信息逐步操作。
3按班统计学生选课情况及考试成绩:根据录入的数据,以班为单位逐个
输出选课情况及对应的成绩。
4按课程统计学生名单及考试成绩:按提示输入课程编号,查询对应课程
的学生名单及其成绩。5统计并输出每个同学已修学分及不及格课程根据录入的数据进行统计,
输出全部学生的已修学分及不及格课程的名称。
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在已有加载数据基础上新增新增学生信息学生,依照提示信息依次将学及其课程成绩生信息输入到程序
3
基于当前数据,按班级R1~R10按班统计学生
分类统计并输出学生所有信息到选课情况及考
屏幕和文件”case3.txt”试成绩




退



加载成功显示相关信息,并提示加载学生总数
学生学号输入0返回到主界面
输出完毕后自动返回到主界面继续工作



4
输入课程编号,查找出已修该课课程编号输入0按课程统计学
程所有学生并输出其成绩及重修返回到主界面生名单及考试
与否到屏幕和文件”case4.txt”成绩


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"==0break;//学号为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"==0break;//课程编号为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;j->les[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"==0break;
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"==0break;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;j->les[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;j->sub;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;k->les[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"==0break;
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;i->sub;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学号姓名班级已修学分不及格课程\n";
fprintf(fp,"\t\t----------------------------------------------------------------------\n";printf("\t\t----------------------------------------------------------------------\n";s=head;
while(s!=NULL{
fprintf(fp,"\t\t%11s%8s%d%.1lf",s->stun,s->name,s->cla,s->poi;printf("\t\t%11s%8s%d%.1lf",s->stun,s->name,s->cla,s->poi;for(i=0;i->sub;i++{
if(s->les[i].mark<60{fprintf(fp,"%s",s->les[i].lessonname;printf("%s",s->les[i].lessonname;}}
fprintf(fp,"\n";printf("\n";

s=s->next;}}}

3.8保存信息模块
功能:保存当前学生信息输入:无
处理:将原有学生信息及新增学生信息写出到根目录的文件,并覆盖原来的文件输出:保存成功情况程序清单:
student*savestu(student*head{
student*p;inti,j,n=0;FILE*fp;
fp=fopen("stu.txt","w";//写出到根文件夹的文件,并覆盖原有文件p=head;
while(p!=NULL{
fprintf(fp,"%s\n",p->stun;
if(strcmp(p->stun,"0"==0break;fprintf(fp,"%d\n",p->cla;fprintf(fp,"%s\n",p->name;fprintf(fp,"%s\n",p->sex;fprintf(fp,"%d\n",p->age;fprintf(fp,"%s\n",p->dorn;fprintf(fp,"%s\n",p->phon;p->sub=0;p->poi=0;for(i=p->sub;i<=10;i++{
fprintf(fp,"%s\n",p->les[i].lessonn;
if(strcmp(p->les[i].lessonn,"0"==0break;fprintf(fp,"%s\n",p->les[i].lessonname;fprintf(fp,"%lf\n",p->les[i].textmark;fprintf(fp,"%lf\n",p->les[i].formalmark;fprintf(fp,"%lf\n",p->les[i].mark;fprintf(fp,"%lf\n",p->les[i].point;p->poi+=p->les[i].point;
fprintf(fp,"%s\n",p->les[i].re;if(strcmp(p->les[i].re,""==0{
fprintf(fp,"%d\n",p->les[i].restime;

for(j=0;j->les[i].restime;j++{
fprintf(fp,"%d\n",p->les[i].res[j].term;fprintf(fp,"%lf\n",p->les[i].res[j].resmark;}}
p->sub++;}n++;
p=p->next;}
fprintf(fp,"0";//为了下次能加载该文件成功,需要加上0作为退出标志
printf("保存学生数据成功!共保存%d位学生信息\n",n;returnp;}
4.系统测试
4.1主界面测试


输入0-6:系统执行指定操作。输入其他数字或字符(串)清屏并重新显示主界面。
4.2无加载信息情况下各功能模块测试


选择输入2建立一个新链表,并连接输入的数据。选择输入345因链表为空,提示“没有信息”,并返回主界面。选择输入6写出一个空文件,原有数据丢失!
4.3新增学生功能模块测试


按提示输入:
学号输入0返回到主界面。
课程编号输入0课程信息输入结束,继续跳到输入学号步骤。是否需要重修:
输入是:继续执行,按提示输入重修情况。输入否:进入下一门课程输入步骤。
输入其他字符:进入下一门课程输入步骤。
4.4按课程统计功能模块测试


输入数字串:显示标题栏,若查找到已修该课的学生,输出该学生成绩情况。输入其他字符:只显示标题栏。输入0返回到主界面。

5.系统运行界面
5.1初始界面


5.2加载界面


5.3新增学生界面


5.4按班级统计界面



5.5按课程统计界面


5.6输出已修学分及不及格课程界面


5.7保存界面



5.8退出界面


6.总结
本课程设计进行了教务信息管理系统的分析、设计、实现。主要运用C语言实现在EXE程序下对学生基本信息、选课信息、重修情况进行数据录入和整理。并通过文件实现对数据的读写操作。
本次课程设计,编写程序耗费了我大概半个月的时间,由于对C语言链表和文件部分知识掌握的不够透彻,期间多次查阅课本及从互联网搜索相关知识。
不得不说,在此之前,我对C语言知识的掌握程度主要还停留在理论的级别,上机实践操作也仅仅懂得最基本的操作。通过本次程序设计实习,我学会了更深层次的知识,体会到了C语言的魅力所在。
同时,本次课程设计的征程也并非一帆风顺,由于知识有限,途中无数次遇到调试出错、功能实现失败、输出死循环、程序强制停止运行等情况,失败乃成功之母,我通过互联网向网友求助、搜索文库资料,向同学和老师咨询等等途径,最终将难题一一解决。
正如马克思所说:“生活就像海洋,只有意志坚强的人才能到达成功的彼岸。”如今,我终于尝到成功的滋味,敲代码的日子的确很煎熬,但在这段日子里,我学到了很多的东西,我觉得这段日子十分有意义,同时更加同意“实践是检验理论的唯一途径”这一观点。
由于知识和时间的局限,本程序仍存在功能的不足和未知BUG,比如学生信息的修改和删除功能的缺失,造成对错误数据无法进行处理,对用户操作带来不便。我对此表示遗憾,我会继续巩固并强化我的专业知识,为以后的类似情况做好准备。
不管怎样,这是我编写的第一个程序,尽管略显简陋,但我仍有很大的成就感,同时感谢给我提供帮助的同学老师和网友,我会再接再厉,迎接更大的挑战。

7.参考文献
C语言程序设计(第2版)》何钦铭颜晖


本文来源:https://www.2haoxitong.net/k/doc/9d84badba200a6c30c22590102020740bf1ecde5.html

《教务信息管理系统课程设计报告.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式