资源描述
1引言
现今大学对学生成绩管理以及学生水平评估过程中,不但依托学生分数,并且把各个科目掌握状况通过学分来反映,众所周知,大学人数众多, 单靠人工在纸质介质上记录,既挥霍资源又不以便管理,并且错误率高,学分管理系统就是基于现今大学在学生成绩管理过程中采用学分制,应运而生计算机数据管理系统,对在校生进行学分数据录入、修改、删除、查找、排序以及对学分得分初步记录,并存储学生学分数据计算机数据管理系统。运用学分管理系统可以有效协助管理者,来管理学生学分数据,并可以理解各个班级学生学分完毕状况,从而节约了管理过程中人力物力,并且存贮以便、精确。
学生学分管理系统是运营于计算机系统下应用软件,重要用于对学生学号、姓名以及各项学科学分进行录入、删除、修改、查询、排序、记录、存盘等操作,为学校教师和学生提供了一种对学生学分进行管理和查看平台,给顾客提供了一种简朴和谐顾客接口,重要任务如下:
1.1查看所有学生信息
依照菜单提示,选取该功能,可以逐条显示所有学生学分记录
1.2输入学生记录
顾客依照菜单提示选取输入学生记录选项,进行关于学生学号、姓名、班级、基本课学分、专业课学分、选修课学分、人文类课学分以及实验课学分录入。可一次性输入多条学生学分信息记录。
1.3删除学生记录
依照提示,顾客输入要进行删除学生学号,如果在不存在该学号,则显示没有找到该学生;如果在文献中有该学号信息存在,则将该学号所相应姓名、学号、班级、各科学分等在相应文献中加以删除。
1.4修改学生记录
依照提示,顾客输入要进行修改学分记录学生学号,如果在文献中不存在该学号,则显示没有找到该学生;如果在文献中有该学生信息存在,则将提示顾客选取要修改某课程,当顾客选取某课程代码后,则将显示你所要修改课程。然后提示顾客选取与否继续进行修改操作。
1.5查询学生信息
查询学生信息,分为依照学号查询和依照班级查询两个详细需求,菜单选项分别提示顾客输入要查询学生信息学号或班级,如果在磁盘文献中有相应输入信息,则提示顾客已找到,并逐项列出相应查找到学生学分状况。
1.6依照学号排序学生记录
该项功能依照学生学号项进行排序,以便顾客对学生学分状况有较为直观以便理解,并可以让学号有规律排列学生项,在显示时集中浮现,让浏览者更加清晰明白。
1.7记录学生学分完毕状况
该项是记录各班学生学分完毕状况,可以很以便理解该班学生学习水平。
2总体设计
进行总体设计,以比较抽象方式概括拟定系统如何完毕预定任务,进而拟定构成系统每个子程序构造,从而将一种大程序按功能分割成某些模块,是每个模块具备功能单一、构造清晰、接口简朴易于理解小程序,并且拟定各个函数之间调用关系。
本系统重要应用构造化设计思想,实现学生学分输入、删除、修改、查询以及浏览等管理功能,各重要模块数据均存储在文献中,因而包括对文献读、写等基本操作。在软件开发过程中应用了高档语言程序设计中基本控制构造,如选取、循环、顺序等构造。系统设计办法是构造化设计办法,采用C语言进行开发。
系统功能构造图,如图1所示。
退出系统
查看所有学生信息
输入学生记录
删除学生记录
修改学生记录
依照学号查询学生记录
依照班级查询学生记录
依照学号排序学生记录
记录学生学分完毕状况
学分管理程序
图1 系统构造图
3详细设计
本系统采用主函数调用子函数设计办法,先整体在逐渐细化过程,详细办法如下:
在主函数前,进行子函数声明,如下:
void menu();//菜单函数
void to_menu();//返回菜单函数
void view_data();//查看所有学生信息
void save_data();//保存数据
void add_data();//输入学生数据
void read_data();//读取数据
void delete_data();//删除数据
void edit_data();//修改数据
void query_data_no();//查找(按学号)
void query_data_clas();//查找(按班级)
void sort_data_no();//排序(学号)
void tongji();//记录某班学生学分完毕状况
3.1主函数设计
编写主函数,主函数运营时,先调用void read_data()函数,将数据从文献读取到构造体数组中,再调用菜单函数void menu(),显示菜单选取项,设计一种while循环,让函数进入循环,设计switch函数,对菜单各项功能进行选取,使各项功能可以运营,最后退出循环,调用to_menu()函数,返回主菜单。
main()
{
int fun;
read_data();
menu();
while(1)
{
printf("请输入功能号[0-8]:",&fun);
scanf("%d",&fun);
switch(fun)
{
case 0:break; // 退出
case 1:view_data();break; // 查看所有学生信息
case 2:add_data();break; // 输入学生记录
case 3:delete_data();break; // 删除学生记录
case 4:edit_data();break; // 修改学生记录
case 5:query_data_no();break; // 查询(学号)
case 6:query_data_clas();break; // 查询(班级)
case 7:sort_data_no();break; // 排序(学号)
case 8:tongji();break; //记录某班学生学分完毕状况
default:printf("输入错误!");break;
}
if(fun==0) break;
to_menu();
}
}
3.2子函数设计
3.2.1菜单函数设计
菜单函数一方面运营库函数system("cls")进行清屏,然后运营各个printf语句,显示主菜单,如图2所示。
图2 系统主菜单
3.2.2返回主菜单函数设计
设计字符c1,c2,用c1来接受第一次输入回车,然后再次输入回车时,调用函数menu(),返回主菜单,来实现各次操作完毕后返回主菜单任务。
3.2.3查看所有学生信息函数设计
设计for循环,定义i=0,学生总数为dd.count,运用for循环,可以显示所有学生已经记录信息。如图3所示:
图3 查看所有学生信息
3.2.4数据从构造体数组保存到文献函数设计
创立文献data.txt,运用for循环,把数据逐个写入文献。
3.2.5输入学生记录函数设计
依照printf语句提示,逐个输入学号、姓名、班级,调用库函数strcpy(),把各个输入项,拷贝到数组中,再对各项分数进行赋值,如果不不大于最大值,则显示最大值,设计成循环模式,末尾提示与否继续添加数据,运用break终结循环,最后存盘,退出程序,显示主菜单。输入学号为106学生信息后如图4所示。
图4 输入学生信息
3.2.6删除学生记录函数设计
设计for循环以及库函数strcmp(),把输入学号,跟已有学号进行对比,如果没有相似窗号,则提示没有找到该学生,如果找到相似窗号,则把该学号后来数据向前移动一位,再把学生总数减一,实现删除学生。删除过程如下图5和图6所示。
图5 输入要删除学生
图6 删除后显示
3.2.7修改学生记录函数设计
依照printf语句提示,输入要修改学生学号,设计for循环和库函数strcmp,对输入学号进行查找,如果没有查找到,显示没有找到该学生,如果可以查找到给学生,则进一步提示输入学生姓名、班级,然后选取要修改学生记录项,最后提示,与否继续录入,退出后可返回主菜单。修改过程如下图7和图8所示。
图7 编辑学生信息窗口
图8 修改学生信息完毕
3.2.8查询学生记录函数设计
查询学生记录分为,依照学生学号查询和依照班级查询该班所有学生成绩,设计for循环和调用ctrcmp()函数,把要查询成果进行显示,如果没有找到与输入匹配字符,则显示没有找到该班级或没有找到该学生。查询显示如下图,依照学号查询如图9所示,依照班级查询如图10所示。
图9 依照学号查询学生信息
图10 依照班级查询学生信息
3.2.9排序函数设计
设计while循环,用for循环和库函数strcmp将学号依次比较,然后用冒泡排序法将学号数据由小到大排列,并且各数据互换,完毕排序。排序成果如下图11所示。
图11 依照学号排序成果
3.2.10记录函数设计
输入要记录班级号,调用strcmp函数,查找相似班级号学生数据,再设计for循环并调用strcmp函数,把差找出学生数据,与规定完毕学分原则进行对比,记录出符合规定和不符合规定学生个数,最后显示。记录成果如下图12所示。
图12 依照班级记录成果
4总结
本系统可以完毕学生学分录入、查询、修改、删除、排序以及班级总体水平记录功能,但是对于系统访问权限设立,访问途径(网络访问还是单机使用)等功能,还没有提出解决方案,在这些问题上尚有待于对系统进一步开发完善。学分管理系统是介于学生管理者和学生之间一种数据库平台,她让数据管理者可以以便录入修改学生成绩,在管理过程中可以节约时间,增长工作效率,如果学生可以通过网络来进行查询,就可以避免学分改动而引起矛盾,同步也可以给学生带来以便,因而在访问途径上可以设立为单机服务器管理,网络访问数据库模式,来为学生和学校之间提供一种信息查询平台。
本系统开发过程,重要运用了for循环、switch循环、库函数strcmp与strcpy等,在排序函数设计时,略显繁琐,有待于使用者在使用时,提出宝贵意见和建议。
通过对本程序开发,让我理解到一种完整系统开发过程,将一种大工程问题可以细化到各个模块,让每个模块可以独立去完毕各自功能,最后用函数之间调用来解决程序开发所有问题,让我在后来开发程序道路上更加拥有信心。
参照文献
[1] 赵启兰.库存管理[M].北京:高等教诲出版社,
[2] 谭浩强,张基温.C语言程序设计教程(第3版)[M].北京:高等教诲出版社,
[3] 黄明、梁旭、万洪莉.C语言课程设计[M].北京:电子工业出版社,
[4] 郭宁,郑小玲.管理信息系统[M].北京:人民邮电出版社,
[5] 赵池龙,杨林,陈伟.实用软件工程[M].北京:电子工业出版社,
附 录
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#define MAX 60
struct student
{
char no[10]; // 学号
char name[50];// 姓名
char clas[5]; // 班级
int score[5];// 学分
};
struct data
{
int count; // 当前学生数组中学生个数
struct student stu[MAX];// 学生数组
} dd;
//子函数声明
void menu();//菜单函数
void to_menu();//返回菜单函数
void view_data();//查看所有学生信息
void save_data();//保存数据
void add_data();//输入学生数据
void read_data();//读取数据
void delete_data();//删除数据
void edit_data();//修改数据
void query_data_no();//查找(按学号)
void query_data_clas();//查找(按班级)
void sort_data_no();//排序(学号)
void tongji();//记录某班学生学分完毕状况
// 主函数
main()
{
int fun;
read_data();
menu();
while(1)
{
printf("请输入功能号[0-8]:",&fun);
scanf("%d",&fun);
switch(fun)
{
case 0:break; // 退出
case 1:view_data();break; // 查看所有学生信息
case 2:add_data();break; // 输入学生记录
case 3:delete_data();break; // 删除学生记录
case 4:edit_data();break; // 修改学生记录
case 5:query_data_no();break; // 查询(学号)
case 6:query_data_clas();break; // 查询(班级)
case 7:sort_data_no();break; // 排序(学号)
case 8:tongji();break; //记录某班学生学分完毕状况
default:printf("输入错误!");break;
}
if(fun==0) break;
to_menu();
}
}
void menu()/*显示主菜单*/
{
system("cls");//清屏
printf("\n");
printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ ★☆学分管理系统☆★ ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [0] 退出 [1] 查看所有学生信息 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [2] 输入学生记录 [3] 删除学生记录 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [4] 修改学生记录 [5] 查询(学号) ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [6] 查询(班级) [7] 排序(学号) ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [8]记录某班学生学分完毕状况 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n\n");
}
void to_menu()// 等待顾客按回车后回到主菜单
{
char c1,c2;
printf("\n\n\n按回车键返回主菜单...");
scanf("%c%c",&c1,&c2);//第一种字符吸取上次确认回车键
menu();
}
void view_data()// 查看所有学生信息
{
int i;
printf("学号\t姓名\t 班级\t 基本课\t 专业课 选修课 人文类课 实验课\n");
printf("\n-------------------------------------------------------------------\n");
for(i=0;i<dd.count;i++)
printf("%s\t %s\t %s\t %d\t %d\t %d\t %d\t %d\n",dd.stu[i].no,dd.stu[i].name,dd.stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],dd.stu[i].score[3],dd.stu[i].score[4]);
}
void save_data()// 将数据从构造体数组保存到文献中
{
FILE *fp;//文献指针
int i,k;
k=dd.count;
fp=fopen("dada.txt","w");//文献存储位置:当前文献夹
fwrite(&k,sizeof(int),1,fp);
for(i=0;i<k;i++)
fwrite(&dd.stu[i],sizeof(struct student),1,fp);
fclose(fp);
}
void add_data()// 输入学生记录
{
struct student st;
int b;
int a;
int k;
while(1)
{
printf("\n请输入学生信息:");
printf("\n学号\t姓名\t班级");
printf("\n---------------------------------------------------------------\n");
scanf("%s%s%s",st.no,st.name,st.clas);
k = dd.count;
strcpy(dd.stu[k].no,st.no);
strcpy(dd.stu[k].name,st.name);
strcpy(dd.stu[k].clas,st.clas);
printf("\n请输入基本课学分(0-50):"); scanf("%d",&a);
if(a>50) dd.stu[k].score[0]=50;
else dd.stu[k].score[0]=a;
printf("\n请输入专业课学分(0-50):"); scanf("%d",&a);
if(a>50) dd.stu[k].score[1]=50;
else dd.stu[k].score[1]=a;
printf("\n请输入选修课学分(0-24):"); scanf("%d",&a);
if(a>24) dd.stu[k].score[2]=24;
else dd.stu[k].score[2]=a;
printf("\n请输入人文课学分(0-8):"); scanf("%d",&a);
if(a>8) dd.stu[k].score[3]=8;
else dd.stu[k].score[3]=a;;
printf("\n请输入实验课学分(0-20):"); scanf("%d",&a);
if(a>20) dd.stu[k].score[4]=20;
else dd.stu[k].score[4]=a;
dd.count++;
printf("\n\n继续添加学生信息[1-yes 0-no]:");
scanf("%d",&b);
if(b==0) break;
}
save_data();
}
void read_data()// 将数据从文献读到构造体数组中
{
FILE *fp;
int i,k;
struct student st;
k=0;
if(access("dada.txt",0)==-1) // 如果文献不存在
{
fp=fopen("dada.txt","w");
fwrite(&k,sizeof(int),1,fp);
fclose(fp);
}
fp=fopen("dada.txt","r");
fread(&k,sizeof(int),1,fp);
dd.count=k;
for(i=0;i<k;i++)
{
fread(&st,sizeof(struct student),1,fp);
strcpy(dd.stu[i].no,st.no);
strcpy(dd.stu[i].name,st.name);
strcpy(dd.stu[i].clas,st.clas);
dd.stu[i].score[4]=st.score[4];
dd.stu[i].score[3]=st.score[3];
dd.stu[i].score[2]=st.score[2];
dd.stu[i].score[1]=st.score[1];
dd.stu[i].score[0]=st.score[0];
}
fclose(fp);
}
void delete_data()// 删除学生记录
{
int i,k,j;
char no[10];
printf("\n请输入要删除学生学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf("\n\n没有找到该学生(学号-%s)!",no);
}
else
{
for(j=k;j<dd.count-1;j++)
{
dd.stu[j]=dd.stu[j+1];
}
save_data();
printf("\n\n删除学生(学号-%s)记录成功!",no);
dd.count--;
}
}
void edit_data()// 修改学生记录
{
struct student st;
int i,k,a,b,select;
char no[10];
printf("\n请输入要编辑学生学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf("\n\n没有找到该学生(学号-%s)!",no);
}
else
{
printf("\n姓名\t班级\n");
printf("\n----------------------------------\n");
scanf("%s%s",st.name,st.clas);
strcpy(dd.stu[k].name,st.name);
strcpy(dd.stu[k].clas,st.clas);
printf("1基本课***2专业课***3选修课***4人文类课***5实验课");
printf("请选取你要修改课程");
scanf("%d",&select);
switch(select)
{
case 1:printf("\n请输入基本课学分(0-50):"); scanf("%d",&a);
if(a>50) dd.stu[k].score[0]=50;
else dd.stu[k].score[0]=a;break;
case 2:printf("\n请输入专业课学分(0-50):"); scanf("%d",&a);
if(a>50) dd.stu[k].score[1]=50;
else dd.stu[k].score[1]=a;break;
case 3:printf("\n请输入选修课学分(0-24):"); scanf("%d",&a);
if(a>24) dd.stu[k].score[2]=24;
else dd.stu[k].score[2]=a;break;
case 4:printf("\n请输入人文课学分(0-8):"); scanf("%d",&a);
if(a>8) dd.stu[k].score[3]=8;
else dd.stu[k].score[3]=a;break;
case 5:printf("\n请输入实验课学分(0-20):"); scanf("%d",&a);
if(a>20) dd.stu[k].score[4]=20;
else dd.stu[k].score[4]=a;break;
}
printf("\n\n继续修改学生信息[1-yes 0-no]:");
scanf("%d",&b);
if(b==1)
edit_data();
else
save_data();
printf("\n\n编辑学生记录(学号-%s)成功!",no);
}
}
void query_data_no()// 查询(学号)
{
int i,k;
char no[10];
printf("\n请输入要查询学生学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
if(k==-1)
{
printf("\n\n学号\t姓名\t班级\t基本课\t专业课\t选修课\t人文类课\t实验课");
printf("\n-----------------------------------------------------------------\n");
}
k=i;
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",dd.stu[i].no,dd.stu[i].name,dd.stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],dd.stu[i].score[3],dd.stu[i].score[4]);
}
}
if(k==-1)
{
printf("\n\n没有找到该学生(学号-%s)!",no);
}
}
void query_data_clas()// 查询(班级)
{
int i,k;
char clas[10];
printf("\n请输入要查询学生班级:");
scanf("%s",clas);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].clas,clas)==0)
{
if(k==-1)
{
printf("\n\n学号\t姓名\t班级\t基本课\t专业课\t选修课\t人文类课\t实验课");
printf("\n-----------------------------------------------------------------\n");
}
k=i;
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",dd.stu[i].no,dd.stu[i].name,dd.stu[i].clas,dd.stu[i].score[0],dd.stu[i].score[1],dd.stu[i].score[2],dd.stu[i].score[3],dd.stu[i].score[4]);
}
}
if(k==-1)
{
printf("\n\n没有找到该班级-%s!",clas);
}
}
void sort_data_no()// 排序(学号)
{
int i,k;
struct student tmp;
k=dd.count-1;
while(k>0)
{
for(i=0;i<k;i++)
{
if(strcmp(dd.stu[i].no,dd.stu[i+1].no)>0)//最大放末尾
{
strcpy(tmp.no,dd.stu[i].no);
strcpy(tmp.name,dd.stu[i].name);
strcpy(tmp.clas,dd.stu[i].clas);
tmp.score[4]=dd.stu[i].score[4];
tmp.score[3]=dd.stu[i].score[3];
tmp.score[2]=dd.stu[i].score[2];
tmp.score[1]=dd.stu[i].score[1];
tmp.score[0]=dd.stu[i].score[0];
strcpy(dd.stu[i].no,dd.stu[i+1].no);
strcpy(dd.stu[i].name,dd.stu[i+1].name);
strcpy(dd.stu[i].clas,dd.stu[i+1].clas);
dd.stu[i].score[4]=dd.stu[i+1].score[4];
dd.stu[i].score[3]=dd.stu[i+1].score[3];
dd.stu[i].score[2]=dd.stu[i+1].score[2];
dd.stu[i].score[1]=dd.stu[i+1].score[1];
dd.stu[i].score[0]=dd.stu[i+1].score[0];
strcpy(dd.stu[i+1].no,tmp.no);
strcpy(dd.stu[i+1].name,tmp.name);
strcpy(dd.stu[i+1].clas,tmp.clas);
dd.stu[i+1].score[4]=tmp.score[4];
dd.stu[i+1].score[3]=tmp.score[3];
dd.stu[i+1].score[2]=tmp.score[2];
dd.stu[i+1].score[1]=tmp.score[1];
dd.stu[i+1].score[0]=tmp.score[0];
}
}
k--;
}
save_data();
printf("\n\n排序成功!");
}
void tongji() /*记录某班学生学分完毕状况*/
{ char clas[5]; int i,j=0,k=0;
printf("\n请输入要记录班级:");
scanf("%s",clas);
for(i=0;i<dd.count;i++)
{ if(strcmp(clas,dd.stu[i].clas)==0)
j++;}
for(i=0;i<dd.count;i++)
{ if(strcmp(clas,dd.stu[i].clas)==0&&dd.stu[i].score[0]>=50
&&dd.stu[i].score[1]>=50&&dd.stu[i].score[2]>=24&&
dd.stu[i].score[3]>=8&&dd.stu[i].score[4]>=20)
k++; }
printf("\n %s 班中有 %d 个学生完毕学分!!!\n有 %d 个学生未完毕!!!!",clas,k,j-k);
scanf("%*c"); /*******用于吸取上面所按下字符************/
printf("\n\n按回车键回主菜单!");
getchar();
menu();
}
展开阅读全文