1、工业大学计算机学院程序设计综合实习报告 题目:现代教学管理系统 :忻 学号:129074228 学院:计算机学院 班级:软件123班 指导老师:王森玉 完成日期:2013/5/22 题目: 现代化成绩管理系统 课程设计容简介:高校中对于学生的考核主要通过考试来进行,传统不通过计算机网络发放考试的成绩容易出现发错,漏发等问题,使用计算机来解决这个问题是十分必要的。程序可以在登陆时选择登陆身份,并给予不同权限对成绩系统进行访问,以达到教师可修改,可查询,可记录;学生可查询的目的。 设计
2、者名称: 忻 指导教师意见: 指导教师签名: 一、问题定义:4 二、可行性研究:4 I、项目的由来:4 II、可选方案:4 III、可行性:4 1、技术可行性:4 2、经济可行性:5 3、操作可行性:5 4、法律可行性:5 IV、结论:5 三、需求规格说明6 I、目标:6 II、数据需求:6 1、数据量:6 2、数据定义和结构7 III、功能需求:7 四、总体设计:8 I、软件的结构(HIPO图):8 五、各模块详细设计9 I、编译预处理模块9 II、主函数模块10 III、browse()函数模块10 I
3、V、insert()函数模块11 V、deletel()函数模块11 VI、scorein()函数模块12 VII、change()函数模块12 VIII、load()函数模块12 IX、save()函数模块13 X、mima()函数模块13 六、程序源代码14 七、程序测试25 I、测试抓图:25 II、测试容:26 八、总结27 一、 问题定义: 现代化的校园对学生进行考核的主要方式是通过考试,而传统的发布成绩方式存在着不同的问题,通过计算机网络可对这些问题进行解决,包括登陆时选择登陆身份,并给予不同权限对成绩系统进行访问,以达到教师可修改,可查询,可记录;学
4、生可查询的目的。 二、 可行性研究: I、 项目的由来: 某高校教师需要对学生的成绩进行管理,包括学生信息的录入,学生成绩的录入,成绩的修改以及学生的成绩查询并保存。学生需要对成绩进行查询。 II、 可选方案: 一、 可选用人工进行学生的基本信息的管理,进行平时成绩,期末成绩以及总评成绩的计算,再人工将成绩发放到学生的手中。 二、 可选用直接从文件进行成绩的导入,直接得到学生的基本信息及考试成绩、总评成绩,或者通过人手工录入学生的基本信息及考试成绩、总评成绩。学生也可对其进行查找。 III、 可行性: 1、 技术可行性: 学校每一门学科的考试人数都很多,若每场考试的成绩都需要
5、老师人工计算并发布成绩,任务量大且出错率高。使用计算机自动计算学生考试成绩的方式大大降低了出错率,而且使用计算机省时省力,方便进行成绩的管理及查询。 2、 经济可行性: 利用计算机技术,开发学生成绩管理系统,可以重复使用,对学生的管理很有用,有必要开发。 3、 操作可行性: 操作计算机简单易行,并且不需要花费太多的人力。 4、 法律可行性: 开发学生成绩管理系统有利于学校对学生的管理,不违反法律及相关法规。 IV、 结论: 面对高校学生成绩管理的巨大工作量,采用计算机的管理是极其必要的,若采用方案2的方法不单单可以减少很多的人力使用,使教师的工作量得到大量减少,而且出现错误的机
6、率更低,更能够直接对学生的成绩进行管理,方便教师和学生的成绩的查询。 三、 需求规格说明 I、 目标: 登陆身份选择 教师 学生 登陆身份验证 系统对请求进行处理 教师输入学生的信息。或从文件导入成绩。 学生系统 学生学号,姓名,编号 平时、期末成绩比例 平时成绩 期末成绩 系统对数据进行记录以及处理,并将数据记录在链表中 可以对储存在链表中的成绩进行访问查询 教师 对储存在链表中的数据进行修改 教师可以选择成绩的保存路径 II、 数据需求: 1、 数据量: 教师的登陆账户及密码,学生学号,,平时成绩,期末成绩,总评成绩。
7、 2、 数据定义和结构 :教师的登陆用 = teacher ,密码 = 0000; :学号 = 学生在校自动分配的学号; 平时成绩 = 教师给学生所打的平时分数; 期末成绩 = 学生期末考试的成绩; 总评成绩 = 平时成绩 × 平时成绩所占的比例 + 期末成绩× 期末成绩所占的比例; III、 功能需求: 性能:能快速响应,界面颜色多元化,清晰,数据对应整齐。在使用过程中容易操作,错误操作的次数少。 功能:(IPO) 处理 输出 输入 登录身份 根据身份信息给予相应的权限 输入相应的操作,包括学生信息、成绩 将成绩输入链表中,并自动计算成绩 学生的基本信息和
8、总评成绩 权限记录 响应要求 四、 总体设计: I、 软件的结构(HIPO图): 现代化学生成绩管理系统 教师入口 学生入口 输入学生的基本信息,成绩 从文件中导入学生的基本信息,成绩 输入 系统处理 将数据保存在链表中,可以修改 系统自动计算学生的总评成绩 输出 将链表中的数据显示在屏幕上 将链表中的数据显示在屏幕上 五、 各模块详细设计 I、 编译预处理模块 使用的函数库:stdio.h、windows.h、string.h、conio.h 学生数据结构体的声明:typedef struct student{}stu 包括学号num,姓名n
9、ame,班级bclass,平时分数score1,期末成绩score2,总评成绩score,指向下一结构体的next指针 选择学生或教师函数声明int xuanze() 教师选单函数声明char menu1() 学生选单函数声明char menu2() 密码函数函数声明void mima() 导入函数声明stud*load() 查询函数声明stud*search(stud*,int*) 导出函数声明void save(stud*) 成绩录入函数声明void scorein(stud*) 插入函数声明void insert(stud*) 删除函数声明void deletel(s
10、tud*) 修改函数声明void change(stud*) 浏览函数声明void browse(stud*) II、 主函数模块 定义字符型表头选择量choice1,choice,choice1用于登录身份选择,choice用于表头选择; 定义字符型变量c用于接收Y或N的选择 定义stu型指针变量head与p,用于数据链表的连接 跳转loop部分 Choice1的值 1 2 调用函数mima() 调用函数char menu2() 调用函数menu1() 调用函数menu2() 值4:调用函数deletel() 值5:调用函数scorein() 值
11、6:调用函数change() 值7:调用函数load() 值8:调用函数save() 值9:将链表指针重置 值0:goto跳转 值3:printf链表中的数据 值2:调用函数insert() 值1:调用函数browse() Choice的值 Choice的值 值1: 调用函数browse() 值2:printf链表中的数据 值3:将链表指针重置 III、 browse()函数模块 i= 0,p = head -> next while(p != NULL) 输出链表中全部的学生信息及成绩 p = p ->next I
12、V、 insert()函数模块 an,xh[10],xm[9],bc[11],*p,*q while(an == ‘Y’) p = head,输入得到学生的学号,姓名,班级。strcmp(xh,0000) while((p->next!=NULL)&&(strcmp(xh,p->next->num)>=0)) p=p->next strcpy(q->num,xh) strcpy(q->name,xm) strcpy(q->bclass,bc) q->next=p->next;p->next=q 继续输入,判断输入是否为Y V、 deletel()函数模块 while
13、p->next!=NULL&&i
14、f(q == NULL) T F 输出未找到数据 确认是否删除数据,p->next=q->next,free(q) VI、 scorein()函数模块 i=0 ps qm *p p=head->next 输入平时成绩所占的百分比qm=100-ps 输入平时成绩,期末成绩 while(p!=NULL) 计算总评成绩:p->score=p->score1*ps/100+p->score2*qm/100 p=p->next VII、 change()函数模块 p=search(head,&i) while(!p) if(p) 输出找到的数据
15、 T F 输出未找到 i=0 xz x y *p VIII、 load()函数模块 *fp fn[12] *head,*p,*q 从文件中进行导入 if((fp=fopen(fn,"rb"))==NULL) T F 输出打开文件时发生错误并退出 while(! feof(fp)) if(fread(p,sizeof(stud),1,fp)==1) T F p->next=q->next q->next=p;q=p IX、 save()函数模块 *fp fn[12] *p 从文件中进行导入 if((fp=f
16、open(fn,"wb"))==NULL) T F 输出打开文件时发生错误并退出 while(p!=NULL) if(fwrite(p,sizeof(stud),1,fp)!=1) T F 输出文件打开错误 p=p->next X、 mima()函数模块 i n name[8] name1[21] password1[21] flag1 flag2,输入用户名,密码 for(i = 0; i < 20;) *(password1 + i) = getch() if(*(password1 + i) == '\b') T F if(i>0)
17、T
F
i-- 输出“退格”
输出“空格退格”
continue
if(*(password1 + i) == '\r')
T
F
break
i++ printf("*")
*(password1 + i) = '\0' flag2 = strcmp(password,password1)
if(flag1 == 0&&flag2 == 0)
T
F
登陆成功
登陆失败
六、 程序源代码
#include 18、ws.h>
#include 19、/密码函数
stud*load(); //导入
stud*search(stud*,int*); //查询
void save(stud*); //导出
void scorein(stud*); //成绩录入
void insert(stud*); //插入
void deletel(stud*); //删除
void change(stud*); //修改
void browse(stud*); //浏览
//********************** 20、
int main(void)
{
char choice1, choice, c;
int i;
stud *head,*p;
head=(stud*)malloc(sizeof(stud)); //准备好表头
head->next=NULL;
loop:
choice1 = xuanze(); //进入选择系统
if(choice1 == 1)
{
mima(); //密码函数
while(1)
{
choice=m 21、enu1(); //教师系统的表头
switch(choice)
{
case '1':system("cls");
printf("浏览成绩情况。\n");
browse(head);
getchar();
break;
case '2':system("cls");
printf("插入学生成绩。\n");
insert(head);
22、break;
case '3':system("cls");
printf("查询学生成绩。\n");
p=search(head,&i);
if(p!=NULL) //输出数据
{ printf("%2d%10s %8s %10s",i,p->num,p->name,p->bclass);
printf("%5.1f %5.1f %5.1f",p->score1,p->score2,p->score);
}
23、else printf("未找到!");
break;
case '4':system("cls");
printf("删除学生记录。\n");
deletel(head);break;
case '5':system("cls");
printf("学生成绩录入。\n");
scorein(head);break;
case '6':system("cls");
printf("修改学生记录。\n");
change(head);break;
24、
case '7':system("cls");
printf("从文件中将成绩情况导入链表。\n");
head=load();break;
case '8':system("cls");
printf("将链表中成绩情况保存到文件。\n");
save(head);break;
case '9':system("cls");
printf("系统初始化。\n");
head=(stud*)malloc(sizeof(stud));
25、 head->next=NULL;
printf("%d %d\n",head,head->next);
break;
case '0':system("cls");
printf("返回上一级\n");
printf("是否保存当前数据到文件?(Y/N):");
c=toupper(getchar());getchar();
if(c=='Y')
save(head);
else
{
26、 system("cls");
goto loop;
}
break;
default:printf("输入错误!");
}
if(choice == '0')break;
printf("\n按任意键继续......!");
getchar();
}
}
if(choice1 == 2) //学生系统的表头
{
while(1)
{
choice=menu2();
switch(choice)
{ 27、
case '1':system("cls");
printf("浏览成绩情况。\n");
browse(head);
getchar();
break;
case '2':system("cls");
printf("查询学生成绩。\n");
p=search(head,&i);
if(p!=NULL) //输出数据
{ printf("%2d%10s %8s % 28、10s",i,p->num,p->name,p->bclass);
printf("%5.1f %5.1f %5.1f",p->score1,p->score2,p->score);
}
else printf("未找到!");
break;
case '3':
system("cls");
goto loop;
default:printf("输入错误!");
}
if(choice == '3')brea 29、k;
printf("\n按任意键继续......!");
getchar();
}
}
if(choice1 == 3)
printf("Goodbay!");
exit(0);
}
//***********************************************
int xuanze()
{
int choice;
system("color 21");
printf("你好!请选择入口:\n");
printf("1.老师入口\n2.学生入口\n3.退出系统\n请选择:");
scanf("%d" 30、 &choice);
fflush(stdin);
return choice;
}
char menu1() //教师表头
{
char c;
system("cls");
system("color 31");
printf("\n\n\n\n\n\n =======成绩管理系统========\n");
printf(" --------------\n");
printf(" 1.浏览成绩情况\n");
printf(" 2.插入成绩学生\n 31、");
printf(" 3.查询成绩学生\n");
printf(" 4.删除学生记录\n");
printf(" 5.学生成绩录入\n");
printf(" 6.修改学生记录\n");
printf(" 7.将文件中成绩情况导入到链表\n");
printf(" 8.将链表中成绩情况导出到文件\n");
printf(" 9.系统初始化\n");
printf(" 0 32、返回上一级\n");
printf("\n\n 请选择。。。。。。。\n\n\n\n");
c=getchar();getchar();
return c;
}
char menu2() //学生表头
{
char c;
system("cls");
system("color 34");
printf("\n\n\n\n\n\n =======成绩管理系统========\n");
printf(" --------------\n");
printf(" 33、 1.浏览成绩情况\n");
printf(" 2.查询学生成绩\n");
printf(" 3.返回上一级\n");
printf("\n\n 请选择。。。。。。。\n\n\n\n");
c=getchar();getchar();
return c;
}
void browse(stud*head)
{
//将链表中各个结点数据依次输出
int i=0;
stud * p; //工作指针
p=head->next 34、 //指向首结点
printf("序号 学号 班级 平时成绩期末成绩总评成绩\n");
while(p!=NULL) //指针不空
{
printf(" %2d %-10s %-8s %-10s",++i,p->num,p->name,p->bclass);
printf(" %5.1f %5.1f %5.1f\n",p->score1,p->score2,p->score);
p=p->next; //工作指针p移动
35、 }
}
//*****************************
void insert(stud*head)
{
//插入新结点,并使链表各结点按学号升序排列
char an,xh[10],xm[9],bc[11];
stud*p,*q;
do
{
p=head;
printf("请输入学生的学号、、班级:\n");
gets(xh);
gets(xm);
gets(bc); //输入数据
if( 36、strcmp(xh,"0000"))
return; //以“0000“作为结束标记
while((p->next!=NULL)&&(strcmp(xh,p->next->num)>=0))
p=p->next; // 查找新结点的插入位置
q=(stud*)malloc(sizeof(stud)); //生成新结点由q指向
strcpy(q->num,xh); //把数据送 37、入新结点
strcpy(q->name,xm);
strcpy(q->bclass,bc);
q->next=p->next;p->next=q; //吧新结点插入链表
printf("继续吗?");
an=toupper(getchar());
getchar();
}
while(an=='Y');
}
//****************************
stud*search(stud*head,int*i)
{ // 38、在链表中按或学号进行查找
int xz;
char xh[10],xm[9];
stud*p; //工作指针
p=head->next;
*i=1;
//指向首结点
printf("1.按查找 0.按学号查找\n");
scanf("%d",&xz);
getchar();
if(xz)
{
printf("请输入学生:\n");
gets(xm); //输入
while(p!=N 39、ULL&&strcmp(xm,p->name)!=0) //按查找
{
p->next;
(*i)++;
}
}
else
{
printf("请输入学生:\n");
gets(xh); //输入学号
while(p!=NULL&&strcmp(xh,p->num)!=0) //按学号查找
{p=p->next;(*i)++;}
}
retu 40、rn p;
}
//*******************************
void deletel(struct st*head)
{ //删除结点
int i,xz,n;
char c,xm[9],xh[10];
struct st*p,*q; //工作指针
p=head; //指针p指向头结点
if(p->next!=NULL)
{ printf("1.按学号删除 2.按删除 3.按序号删除\n");
scanf("% 41、d",&xz);
switch(xz)
{
case 1:printf("请输入学生学号:\n");
getchar();
gets(xh); //输入学号
while(p->next!=NULL&&strcmp(xh,p->next->num)!=0)
//按学号查找
p=p->next 42、
break;
case 2:printf("请输入学生:\n");
getchar();
gets(xm); //输入
while(p->next!=NULL&&strcmp(xm,p->next->name)!=0)//按学号查找
p=p->next;
break;
case 3:printf 43、"请输入序号:\n");i=1;
scanf("%d",&n);
getchar(); //输入序号
while(p->next!=NULL&&i 44、tf("选择错误!\n");
return;
}
q=p->next; //指针q指向p的直接后继
if(q==NULL)
{
printf("未找到指定结点,没有执行删除!\n");
return;
}
printf(" %-10s %-8s 请确认(Y/N)",q 45、>num,q->name);
c=getchar();
getchar();
if(tolower(c)=='y')
{
p->next=q->next; //把结点从链表中删除
free(q);
return; //释放q所指的结点
}
}
printf("无结点可删除 46、\n");
}
//***********************************
void scorein(stud*head)
{ //依次给链表中各结点的数据录入成绩
int i=0;
int ps,qm;
stud*p; //工作指针
p=head->next; //指向首结点
printf("请输入平时成绩在总评成绩中所占的百分比:\n");
scanf("%d",&ps);
qm=100-ps;
while(p!=NULL 47、)
{
printf("%2d%10s %8s %10s\n",++i,p->num,p->name,p->bclass);
printf("平时成绩期末成绩:");
scanf("%f%f",&p->score1,&p->score2); //录入平时成绩和期末成绩
p->score=p->score1*ps/100+p->score2*qm/100;//计算出总评成绩
printf("%5.1f\t%5.1f\t%5.1f\n",p->score1,p->score2,p->sc 48、ore);
p=p->next; // 工作指针p移动
}
getchar();
}
//*********************************
void change(stud*head)
{ //对链表中指定结点的数据进行修改
int i=0,xz;
float x,y;
stud*p; //工作指针
do
{
p=search(head,&i); //查找要修改的结点 49、
if(p)
{
printf("%2d%10s %8s %10s",i,p->num,p->name,p->bclass);
printf("%5.1f %5.1f %5.1f\n",p->score1,p->score1,p->score);
}
else printf("未找到!\n");
}
while(!p);
printf("哪部分信息?\n");
printf("1.修改学号\n");
50、 printf("2.修改\n");
printf("3.修改班级\n");
printf("4.修改平时成绩\n");
printf("5.修改期末成绩\n");
printf("0.不修改\n");
scanf("%d",&xz);getchar();
switch(xz)
{
case 1:printf("请重新输入学号:");gets(p->num);break;
case 2:printf("请重新输入:");gets(p->name);br






