资源描述
《高级语言程序设计》课程设计
教务信息管理系统
题 目:
班 级: 软件R7班
学生学号: 5
学生姓名: 麦建波
指导老师: 姚金涛
提交时间: 5月6日
华南农业大学 软件学院
教务信息管理系统
1. 系统分析
1.1 问题描述
本程序为教务信息管理系统,通过输入学生有关信息,对数据进行处理和记录,并按需要输入记录处理后数据到文献中。
1.2 系统功能
(1)录入如下信息:
学生基本信息:如学号、姓名、性别、年龄、宿舍号码、电话号码等;
课程基本信息:课程编号、课程名称、考试成绩、平时成绩、综合成绩、 学分、重修否等。假如重修,需要考虑重修学期、重修成绩,并且要考虑多次重修状况。
(2)录入选课信息
(3)录入学生成绩
(4)按班记录学生选课状况及考试成绩
(5)按课程记录学生名单及考试成绩
(6)记录并输出每个同学已修学分及不及格课程
1.3 功能需求描述:
(1)加载学生信息及其课程成绩:从文献录入学生基本资料和课程状况,并覆盖原有数据。
(2)新增学生信息及其课程成绩:按规定录入学生基本资料和课程状况,通过提醒信息逐渐操作。
(3)按班记录学生选课状况及考试成绩:根据录入数据,以班为单位逐一输出选课状况及对应成绩。
(4)按课程记录学生名单及考试成绩:按提醒输入课程编号,查询对应课程学生名单及其成绩。
(5)记录并输出每个同学已修学分及不及格课程:根据录入数据进行记录,输出所有学生已修学分及不及格课程名称。
(6)保留学生信息及其课程成绩并退出:将目前学生基本资料和课程状况保留到文献,并覆盖原有文献。
1.4 开发平台及工具简介
(1)硬件环境:
u 处 理 器:Intel Pentium 166或更高
u 内 存:32MB以上
u 硬盘空间:2G以上
u 显 卡:SVGA显示适配器
(2)软件环境:
u 操作系统:Windows98/Me//XP//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学生信息数据构造
typedef struct student
{
int age,sub,cla; //年龄,选课数量,班级
double poi; //已修学分
char stun[15],name[30],sex[5],dorn[10],phon[20]; //学号,姓名,性别,宿舍号码,短号电话号码
course les[10]; //课程信息
struct student*next;
}student;
2.3.2课程信息数据构造
typedef struct course
{
char lessonn[15],lessonname[50],re[5]; //课程编号,课程名称,与否重修
double textmark,formalmark,mark,point; //考试成绩,平时成绩,综合成绩,学分
restudy res[5]; //重修状况
int restime; //重修次数
}course;
2.3.3重修状况数据构造
typedef struct restudy
{
int term; //重修学期
double resmark; //重修分数
}restudy;
2.4 界面设计
程序界面应遵照简洁美观、以便使用原则。
2.4.1主界面
充足考虑界面易于操作系统需求,用printf语句构造简朴文字界面,详细主界面设计效果如图所示。
2.4.2新增信息界面
根据有关文字提醒,顾客输入对应信息。
3. 系统实现
基于系统需求分析与系统总体设计成果,本系统采用Code::Blocks12.11软件平台基于C语言实现各模块功能,下面按照模块功能划分来分别论述系统详细设计和实现过程。
3.1头文献:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
3.2主界面模块
功能:功能选择界面
输入:顾客选择功能选项编号
处理:根据顾客选项跳转到有关功能函数
输出:有关功能函数处理或显示界面
程序清单:
student *insstu(); //加载学生信息及其课程成绩
student *inspoint(student *head,student *stud); //插入链表结点
void clalesmark(student *head); //按班记录学生选课状况及考试成绩
void lesstumark(student *head); //按课程记录学生名单及考试成绩
void pointfail(student *head); //记录并输出每个同学已修学分及不及格课程
student *adds(student *hd); //新增学生信息及其课程成绩
student *savestu(student *head); //保留学生信息及其课程成绩
int main(void)
{
student *head,*p;
int num,n;
int size=sizeof(struct student);
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)
{
case 1:head=insstu();break;
case 3:clalesmark(head);break;
case 4:lesstumark(head);break;
case 5:pointfail(head);break;
case 2:head=adds(head);break;
case 6:savestu(head);break;
default :break;
}
}while(n!=0&&n!=6);
printf("\n\t\t* ----------------------------------!谢谢使用!---------------------------------- *\n");
return 0;
}
3.3加载信息模块
功能:从根文献夹加载记录学生信息文献
输入:无
处理:将所有学生信息形成链表
输出:加载成功状况
程序清单:
student *insstu()
{
student *p,*hd,*pt;
int i,j,n=0;
FILE *fp;
fp = fopen( "stu.txt" , "r" ); //从根目录读取文献
int size=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;j<p->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);
return hd;
}
3.4新增信息模块
功能:增长学生,并完整录入有关个人信息及选课信息
输入:学生信息
处理:将所得学生信息插入链表
输出:无
程序清单:
student *adds(student *hd)
{
student *p,*q,*r;
int i,j;
int size=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;j<p->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"); //清屏
return hd;
}
3.5按班级记录模块
功能: 按班级有序地查看学生状况
输入:无
处理:按班级R1~R10分类记录学生信息
输出:输出学生所有信息到屏幕和文献”case3.txt”
程序清单:
void clalesmark(student *head) //同步输出数据到屏幕和文献
{
int i,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<s->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<s->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”
程序清单:
void lesstumark(student *head)
{
int i;
char lessonn[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;i<s->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”
程序清单:
void pointfail(student *head)
{
int i;
char lessonn[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<s->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;
int i,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")==0)break;
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);
展开阅读全文