资源描述
工业大学计算机学院程序设计综合实习报告
题目:现代教学管理系统
:忻
学号:129074228
学院:计算机学院
班级:软件123班
指导老师:王森玉
完成日期:2013/5/22
题目:
现代化成绩管理系统
课程设计容简介:高校中对于学生的考核主要通过考试来进行,传统不通过计算机网络发放考试的成绩容易出现发错,漏发等问题,使用计算机来解决这个问题是十分必要的。程序可以在登陆时选择登陆身份,并给予不同权限对成绩系统进行访问,以达到教师可修改,可查询,可记录;学生可查询的目的。
设计者名称:
忻
指导教师意见:
指导教师签名:
一、问题定义: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
IV、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
一、 问题定义:
现代化的校园对学生进行考核的主要方式是通过考试,而传统的发布成绩方式存在着不同的问题,通过计算机网络可对这些问题进行解决,包括登陆时选择登陆身份,并给予不同权限对成绩系统进行访问,以达到教师可修改,可查询,可记录;学生可查询的目的。
二、 可行性研究:
I、 项目的由来:
某高校教师需要对学生的成绩进行管理,包括学生信息的录入,学生成绩的录入,成绩的修改以及学生的成绩查询并保存。学生需要对成绩进行查询。
II、 可选方案:
一、 可选用人工进行学生的基本信息的管理,进行平时成绩,期末成绩以及总评成绩的计算,再人工将成绩发放到学生的手中。
二、 可选用直接从文件进行成绩的导入,直接得到学生的基本信息及考试成绩、总评成绩,或者通过人手工录入学生的基本信息及考试成绩、总评成绩。学生也可对其进行查找。
III、 可行性:
1、 技术可行性:
学校每一门学科的考试人数都很多,若每场考试的成绩都需要老师人工计算并发布成绩,任务量大且出错率高。使用计算机自动计算学生考试成绩的方式大大降低了出错率,而且使用计算机省时省力,方便进行成绩的管理及查询。
2、 经济可行性:
利用计算机技术,开发学生成绩管理系统,可以重复使用,对学生的管理很有用,有必要开发。
3、 操作可行性:
操作计算机简单易行,并且不需要花费太多的人力。
4、 法律可行性:
开发学生成绩管理系统有利于学校对学生的管理,不违反法律及相关法规。
IV、 结论:
面对高校学生成绩管理的巨大工作量,采用计算机的管理是极其必要的,若采用方案2的方法不单单可以减少很多的人力使用,使教师的工作量得到大量减少,而且出现错误的机率更低,更能够直接对学生的成绩进行管理,方便教师和学生的成绩的查询。
三、 需求规格说明
I、 目标:
登陆身份选择
教师
学生
登陆身份验证
系统对请求进行处理
教师输入学生的信息。或从文件导入成绩。
学生系统
学生学号,姓名,编号
平时、期末成绩比例
平时成绩
期末成绩
系统对数据进行记录以及处理,并将数据记录在链表中
可以对储存在链表中的成绩进行访问查询
教师
对储存在链表中的数据进行修改
教师可以选择成绩的保存路径
II、 数据需求:
1、 数据量:
教师的登陆账户及密码,学生学号,,平时成绩,期末成绩,总评成绩。
2、 数据定义和结构
:教师的登陆用 = teacher ,密码 = 0000;
:学号 = 学生在校自动分配的学号;
平时成绩 = 教师给学生所打的平时分数;
期末成绩 = 学生期末考试的成绩;
总评成绩 = 平时成绩 × 平时成绩所占的比例 + 期末成绩× 期末成绩所占的比例;
III、 功能需求:
性能:能快速响应,界面颜色多元化,清晰,数据对应整齐。在使用过程中容易操作,错误操作的次数少。
功能:(IPO)
处理
输出
输入
登录身份
根据身份信息给予相应的权限
输入相应的操作,包括学生信息、成绩
将成绩输入链表中,并自动计算成绩
学生的基本信息和总评成绩
权限记录
响应要求
四、 总体设计:
I、 软件的结构(HIPO图):
现代化学生成绩管理系统
教师入口
学生入口
输入学生的基本信息,成绩
从文件中导入学生的基本信息,成绩
输入
系统处理
将数据保存在链表中,可以修改
系统自动计算学生的总评成绩
输出
将链表中的数据显示在屏幕上
将链表中的数据显示在屏幕上
五、 各模块详细设计
I、 编译预处理模块
使用的函数库:stdio.h、windows.h、string.h、conio.h
学生数据结构体的声明:typedef struct student{}stu
包括学号num,姓名name,班级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(stud*)
修改函数声明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()
值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
IV、 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(p->next!=NULL&&i<n)
p=p->next
i,xz,n, c,xm[9],xh[10], st*p,*q
p = head
if(p->next!=NULL)
T
F
值2
值3
其他
输入xz switch(xz)
值1:
输入学号
while(p->next!=NULL&&strcmp(xh,p->next->num)!=0)
p=p->next
输入姓名
while(p->next!=NULL&&strcmp(xm,p->next->name)!=0)
p=p->next
输入序号
输出错误
q= p-> next
if(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)
输出找到的数据
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=fopen(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)
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<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
typedef struct st
{
char num[10],name[9],bclass[11]; //学号、、班级
float score1,score2,score; //平时成绩、期末成绩、总评成绩
struct st*next;
}stud;
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(stud*); //删除
void change(stud*); //修改
void browse(stud*); //浏览
//**************************************
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=menu1(); //教师系统的表头
switch(choice)
{
case '1':system("cls");
printf("浏览成绩情况。\n");
browse(head);
getchar();
break;
case '2':system("cls");
printf("插入学生成绩。\n");
insert(head);
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);
}
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;
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));
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
{
system("cls");
goto loop;
}
break;
default:printf("输入错误!");
}
if(choice == '0')break;
printf("\n按任意键继续......!");
getchar();
}
}
if(choice1 == 2) //学生系统的表头
{
while(1)
{
choice=menu2();
switch(choice)
{
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 %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')break;
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", &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");
printf(" 3.查询成绩学生\n");
printf(" 4.删除学生记录\n");
printf(" 5.学生成绩录入\n");
printf(" 6.修改学生记录\n");
printf(" 7.将文件中成绩情况导入到链表\n");
printf(" 8.将链表中成绩情况导出到文件\n");
printf(" 9.系统初始化\n");
printf(" 0.返回上一级\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(" 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; //指向首结点
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移动
}
}
//*****************************
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(!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); //把数据送入新结点
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)
{ //在链表中按或学号进行查找
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!=NULL&&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)++;}
}
return 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("%d",&xz);
switch(xz)
{
case 1:printf("请输入学生学号:\n");
getchar();
gets(xh); //输入学号
while(p->next!=NULL&&strcmp(xh,p->next->num)!=0)
//按学号查找
p=p->next;
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("请输入序号:\n");i=1;
scanf("%d",&n);
getchar(); //输入序号
while(p->next!=NULL&&i<n) //查找第n个结点
{
p=p->next;
i++;
}
break;
default:printf("选择错误!\n");
return;
}
q=p->next; //指针q指向p的直接后继
if(q==NULL)
{
printf("未找到指定结点,没有执行删除!\n");
return;
}
printf(" %-10s %-8s 请确认(Y/N)",q->num,q->name);
c=getchar();
getchar();
if(tolower(c)=='y')
{
p->next=q->next; //把结点从链表中删除
free(q);
return; //释放q所指的结点
}
}
printf("无结点可删除!\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)
{
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->score);
p=p->next; // 工作指针p移动
}
getchar();
}
//*********************************
void change(stud*head)
{ //对链表中指定结点的数据进行修改
int i=0,xz;
float x,y;
stud*p; //工作指针
do
{
p=search(head,&i); //查找要修改的结点
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");
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
展开阅读全文