学生成绩管理系统
学 院 计算机科学与技术
专 业 计算机科学与技术(师范)
学 号
学 生 姓 名
指导教师姓名
2012年9月 18 日
一、设计目的与内容
设计一个学生成绩管理系统,通过系统可以输入学生记录(包括
学号、姓名、C 语言成绩、英语成绩、高数成绩、总分、平均分和名次等),然后查询学生记录,并可以更新(修改、删除、插入、排序)和输出学生记录。
二、算法的基本思想
(此处可加框图描述基本功能模块)
1. 学生记录应该包括学号、姓名、C 语言成绩、英语成绩、高数成绩、总分、平均分和名次等信息,是本程序的核心数据结构,定义如下:
struct student
{
char name[10];//姓名
int number;//学号
float cscore;//c语言成绩
float enscore;//英语成绩
float mascore;//高数成绩
float sum;//总分
float average;//平均分
int mingci;//名次
};
程序应具有以下基本功能:
(1)以菜单形式显示主界面,提示用户进行选择,完成相应任务,如图 1-1 所示
(2)输入记录:将学生记录存入单链表中,记录可从以二进制形式存储的数据文件中读入, 也可以从键盘逐个录入。
(3) 查询记录:在文件中查找满足相关条件的学生记录。用户可以按学生的学号或姓名进行查找。
(4)更新记录:完成对学生记录的修改、删除、插入和排序操作。执行更新后,需要将修 改的记录重新存入数据文件中。
(5)统计记录:完成对不及格人数及各门功课最高分的统计。
输出记录:实现对学生记录的存盘操作并将其以表格的形式在屏幕上显示出。
三、主要功能模块流程图
用指针对总成绩排序,定义函数如下:
//函数功能:实现按总成绩排序
void sore(struct student *parr,int len)
{
int i,j;
struct student t;
for( i = 0; i < len - 1; i++)
{
for(j = 0; j < len; j++)
if( parr[j+1].sum > parr[j].sum )
{
t = parr[j+1];
parr[j+1] = parr[j];
parr[j] = t;
}
}
output(parr,&len);
return;
}
流程图如下
四:系统测试
程序运行实例如下:
选择1,写入学生信息,运行界面如下:
选择2,查看学生信息,运行界面如下:
选择3,按总成绩排序,运行界面如下:
选择4,按学号查找,运行界面如下:
选择5,修改学生信息,运行界面如下:
6.选择7,保存,运行界面如下:
五、结论
该函数用链表的形式,完成了如下功能:
1.系统使用菜单,所有功能可以反复使用。用户界面使用方便、简洁明了、美观大方、格式统一。
2.使用文件进行存储和管理。程序启动时可从文件中读取学生成绩信息, 或从键盘输入学生成绩信息;运行过程中如添加或删除记录时也可对文件进 行存取;退出前可根据需要提醒是否保存学生成绩信息到文件中。
3.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
六、源程序及系统文件使用说明
# include
# include
# include
# include
# include
void menu(struct student *parr,int len);
void sore(struct student *parr,int len);
void output(struct student *parr,int *len);
void input(struct student *parr,int len);
void write(struct student *parr,int len);
void read(struct student *parr,int len);
void find(struct student *parr,int len);
void logout(struct student *parr,int len);
void exit(struct student *parr,int len);
void modify(struct student *parr,int len);
void insert(struct student*parr,int *len);
struct student
{
char name[10];//姓名
int number;//学号
float cscore;//c语言成绩
float enscore;//英语成绩
float mascore;//高数成绩
float sum;//总分
float average;//平均分
int mingci;//名次
};
int main(void)
{
struct student * parr;
int len = 0;
char ch = '\0';
printf("请输入需要存入的学生人数:");
scanf("%d",&len);
parr = (struct student *)malloc((sizeof(struct student) * len));
menu(parr, len);
printf("按回车键继续
");
while(1)
{
system("cls");
printf("
");
printf("\t\t|******************************************|
");
printf("\t\t|--------------- 学生管理系统 -------------|
");
printf("\t\t|------------ 1.写入学生信息 ---------|
");
printf("\t\t|------------ 2.查看全部学生信息 ---------|
");
printf("\t\t|------------ 3.按总成绩排序 ---------|
");
printf("\t\t|------------ 4.按学号查找 ---------|
");
printf("\t\t|------------ 5.修改学生信息 ---------|
");
printf("\t\t|------------ 6.添加学生 ---------|
");
printf("\t\t|------------ 7.保存 ---------|
");
printf("\t\t|------------ 0.退出 ---------|
");
printf("\t\t|******************************************|
");
printf("\t\t
");
scanf(" %c",&ch);
switch(ch)
{
case '1' : input(parr,len); break;
case '2' : output(parr,&len); break;
case '3' : sore(parr,len); break;
case '4' : find(parr,len); break;
case '5' : modify(parr,len); break;
case '6' : insert(parr,&len); break;
case '7' : write(parr,len); break;
case '0' : exit(parr,len); break;
default : printf("
\t输入错误!按回车键返回主菜单!");
getch();
}
}
free(parr);
return 0 ;
}
//函数功能:实现按总成绩排序
void sore(struct student *parr,int len)
{
int i,j;
struct student t;
for( i = 0; i < len - 1; i++)
{
for(j = 0; j < len; j++)
if( parr[j+1].sum > parr[j].sum )
{
t = parr[j+1];
parr[j+1] = parr[j];
parr[j] = t;
}
}
for( i = 0; i < len - 1; i++)
parr[i].mingci=i+1;
output(parr,&len);
return;
}
//函数功能:打印信息
void output(struct student *parr,int *len)
{
int i;
printf("姓名\t学号\tc语言\t英语\t高数\t总分\t平均分\t名次
");
for(i = 0;i < *len; i++)
printf("%-6s\t%4d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d
",parr[i].name,parr[i].number,parr[i].cscore,parr[i].enscore,parr[i].mascore,parr[i].sum,parr[i].average,parr[i].mingci);
getchar();
getchar();
return;
}
//函数功能:输入数据
void input(struct student *parr,int len )
{ int i;
for( i = 0; i < len; i++)
{
printf("请输入第%d个学生信息:",i + 1);
printf("姓名:"); scanf("%s",parr[i].name);//name是数组名 本身就是地址
printf("学号:"); scanf("%d",&parr[i].number);
printf("c语言成绩: "); scanf("%f",&parr[i].cscore);
printf("英语成绩"); scanf("%f",&parr[i].enscore);
printf("高数成绩:");scanf("%f",&parr[i].mascore);
printf("总分");
parr[i].sum=parr[i].cscore+parr[i].enscore+parr[i].mascore;
printf("%.2f
",parr[i].sum);
printf("平均分"); parr[i].average=parr[i].sum/3;
printf("%.2f
",parr[i].average);
parr[i].mingci=0;
printf("
");
}
printf("
");
return;
}
/*函数功能:将数据写入文件*/
void write(struct student *parr,int len)
{
int i;//控制循环
FILE *fp = NULL;//定义文件指针
fp = fopen("D:\\student.txt","w");//打开文件并使文件指针指向它,以写的方式
if(fp == NULL)//如果文件没有打开,提示错误并退出
{
printf("
\t文件没有打开!程序结束!");
getchar();//等待用户观察
exit(0);//结束整个程序
}
else
{
for(i=0; i");
getch();
fclose(fp);
return;
}
/*函数功能:读取文件数据*/
void read(struct student *parr,int len)
{
int i;
FILE * fp = NULL;
fp = fopen("D:\\student.txt","r");//以只读的方式打开文件
if(fp == NULL)
{
printf("数据读取失败!
");
getchar();
exit(0);
}
else
{
for(i=0; i");
printf("%-6s\t%4d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d
",parr[i].name,parr[i].number,parr