好文档 - 专业文书写作范文服务资料分享网站

基于c语言的学分管理系统

天下 分享 时间: 加入收藏 我要投稿 点赞

.

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]:\ scanf(\ 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(\输入错误!\ }

if(fun==0) break; to_menu(); } }

3.2子函数设计

3.2.1菜单函数设计

菜单函数首先运行库函数system(\进行清屏,然后运行各个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所示。

.

.

图8 修改学生信息完成 图7 编辑学生信息窗口

3.2.8查询学生记录函数设计

查询学生记录分为,根据学生学号查询和根据班级查询该班所有学生的成绩,设计for循环和调用ctrcmp()函数,把要查询的结果进行显示,如果没有找到与输入匹配的字符,则显示没有找到该班级或没有找到该学生。查询显示如下

.

.

图,根据学号查询如图9所示,根据班级查询如图10所示。

图10 根据班级查询学生信息 图9 根据学号查询学生信息

3.2.9排序函数设计

设计while循环,用for循环和库函数strcmp将学号依次比较,然后用冒泡排序法将学号数据由小到大排列,并且各数据交换,完成排序。排序结果如下图

.

.

11所示。

图11 根据学号排序结果

3.2.10统计函数设计

输入要统计的班级号,调用strcmp函数,查找相同班级号的学生数据,再设计for循环并调用strcmp函数,把差找出的学生数据,与要求完成的学分标准进行对比,统计出符合要求和不符合要求的学生个数,最后显示。统计结果如下图12所示。

.

.

.

12 根据班级统计结果

图 .

4总结

本系统可以完成学生学分的录入、查询、修改、删除、排序以及班级总体水平的统计功能,但是对于系统的访问权限设置,访问途径(网络访问还是单机使用)等功能,还没有提出解决的方案,在这些问题上还有待于对系统的进一步开发完善。学分管理系统是介于学生管理者和学生之间的一个数据库平台,他让数据管理者可以方便的录入修改学生成绩,在管理过程中可以节省时间,增加工作效率,假如学生可以通过网络来进行查询,就可以避免学分改动而引发的矛盾,同时也可以给学生带来方便,因此在访问途径上可以设置为单机服务器管理,网络访问的数据库模式,来为学生和学校之间提供一个信息查询的平台。

本系统的开发过程,主要利用了for循环、switch循环、库函数strcmp与strcpy等,在排序函数设计时,略显繁琐,有待于使用者在使用时,提出宝贵的意见和建议。

通过对本程序的开发,让我了解到一个完整系统的开发过程,将一个大的工程问题可以细化到各个模块,让每个模块可以独立去完成各自的功能,最后用函数之间的调用来解决程序开发的全部问题,让我在以后开发程序的道路上更加拥有信心。

.

.

参考文献

[1] 赵启兰.库存管理[M].:高等教育出版社,2005

[2] 谭浩强,张基温.C语言程序设计教程(第3版)[M].:高等教育出版社,2006 [3] 黄明、梁旭、万洪莉.C语言课程设计[M].:电子工业出版社,2006 [4] 郭宁,郑小玲.管理信息系统[M].:人民邮电出版社,2006 [5] 赵池龙,杨林,陈伟.实用软件工程[M].:电子工业出版社,2006

.

.

.

.

#include #include #include #include #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]:\ scanf(\ 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(\输入错误!\ }

if(fun==0) break; to_menu(); } }

void menu()/*显示主菜单*/ {

system(\清屏 printf(\

printf(\★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\\n\ printf(\☆ ☆\\n\ printf(\☆ ★☆学分管理系统☆★ ☆\\n\ printf(\☆ ☆\\n\ printf(\☆ [0] 退出 [1] 查看所有学生信息 ☆\\n\ printf(\☆ ☆\\n\ printf(\☆ [2] 输入学生记录 [3] 删除学生记录 ☆\\n\

.

.

printf(\☆ ☆\\n\ printf(\☆ [4] 修改学生记录 [5] 查询(学号) ☆\\n\ printf(\☆ ☆\\n\ printf(\☆ [6] 查询(班级) [7] 排序(学号) ☆\\n\ printf(\☆ ☆\\n\ printf(\☆ [8]统计某班学生学分完成情况 ☆\\n\ printf(\☆ ☆\\n\ printf(\★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\\n\\n\}

void to_menu()// 等待用户按回车后回到主菜单 {

char c1,c2;

printf(\按回车键返回主菜单...\

scanf(\第一个字符吸收上次的确认回车键 menu(); }

void view_data()// 查看所有学生信息 { int i;

printf(\学号\\t姓名\\t 班级\\t 基础课\\t 专业课 选修课 人文类课 实验课\\n\

.

.

printf(\------\\n\

for(i=0;i

printf(\%s\\t %s\\t %d\\t %d\\t %d\\t %d\\t %d\\n\e,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(\文件存储位置:当前文件夹 fwrite(&k,sizeof(int),1,fp); for(i=0;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(\请输入学生信息:\ printf(\学号\\t姓名\\t班级\

printf(\--\\n\

scanf(\ 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(\请输入基础课学分(0-50):\ scanf(\ if(a>50) dd.stu[k].score[0]=50; else dd.stu[k].score[0]=a;

.

.

printf(\请输入专业课学分(0-50):\ scanf(\ if(a>50) dd.stu[k].score[1]=50; else dd.stu[k].score[1]=a;

printf(\请输入选修课学分(0-24):\ scanf(\ if(a>24) dd.stu[k].score[2]=24; else dd.stu[k].score[2]=a;

printf(\请输入人文课学分(0-8):\ scanf(\ if(a>8) dd.stu[k].score[3]=8; else dd.stu[k].score[3]=a;;

printf(\请输入实验课学分(0-20):\ scanf(\ if(a>20) dd.stu[k].score[4]=20; else dd.stu[k].score[4]=a; dd.count++;

printf(\继续添加学生信息[1-yes 0-no]:\ scanf(\ if(b==0) break; }

save_data(); }

void read_data()// 将数据从文件读到结构体数组中 {

.

.

FILE *fp; int i,k;

struct student st; k=0;

if(access(\如果文件不存在 {

fp=fopen(\ fwrite(&k,sizeof(int),1,fp); fclose(fp); }

fp=fopen(\ fread(&k,sizeof(int),1,fp); dd.count=k; for(i=0;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(\请输入要删除学生的学号:\ scanf(\ k=-1;

for(i=0;i

if(strcmp(dd.stu[i].no,no)==0) { k=i; break; } }

.

.

if(k==-1) {

printf(\没有找到该学生(学号-%s)!\ } else {

for(j=k;j

{ }

dd.stu[j]=dd.stu[j+1];

save_data();

printf(\删除学生(学号-%s)记录成功!\ } }

void edit_data()// 修改学生记录 {

struct student st; int i,k,a,b,select; char no[10];

printf(\请输入要编辑学生的学号:\

dd.count--;

.

.

scanf(\ k=-1;

for(i=0;i

if(strcmp(dd.stu[i].no,no)==0) { k=i; break; } } if(k==-1) {

printf(\没有找到该学生(学号-%s)!\ } else {

printf(\姓名\\t班级\\n\

printf(\ scanf(\ strcpy(dd.stu[k].name,st.name); strcpy(dd.stu[k].clas,st.clas);

printf(\基础课***2专业课***3选修课***4人文类课***5实验课\

.

.

printf(\请选择你要修改的课程\ scanf(\ switch(select) {

case 1:printf(\请输入基础课学分(0-50):\ scanf(\ if(a>50) dd.stu[k].score[0]=50; else dd.stu[k].score[0]=a;break;

case 2:printf(\请输入专业课学分(0-50):\ scanf(\ if(a>50) dd.stu[k].score[1]=50; else dd.stu[k].score[1]=a;break;

case 3:printf(\请输入选修课学分(0-24):\ scanf(\ if(a>24) dd.stu[k].score[2]=24; else dd.stu[k].score[2]=a;break;

case 4:printf(\请输入人文课学分(0-8):\ scanf(\ if(a>8) dd.stu[k].score[3]=8; else dd.stu[k].score[3]=a;break;

case 5:printf(\请输入实验课学分(0-20):\ scanf(\ if(a>20) dd.stu[k].score[4]=20; else dd.stu[k].score[4]=a;break;

}

printf(\继续修改学生信息[1-yes 0-no]:\ scanf(\

.

.

if(b==1)

edit_data();

else save_data();

printf(\编辑学生记录(学号-%s)成功!\ } }

void query_data_no()// 查询(学号) { int i,k; char no[10];

printf(\请输入要查询学生的学号:\ scanf(\ k=-1;

for(i=0;i

if(strcmp(dd.stu[i].no,no)==0) {

if(k==-1) {

printf(\学号\\t姓名\\t班级\\t基础课\\t专业课\\t选修课\\t人文类课\\t实验

.

.

课\

printf(\----\\n\ } k=i;

printf(\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(\没有找到该学生(学号-%s)!\ } }

void query_data_clas()// 查询(班级) { int i,k; char clas[10];

.

.

printf(\请输入要查询学生的班级:\ scanf(\ k=-1;

for(i=0;i

if(strcmp(dd.stu[i].clas,clas)==0) {

if(k==-1) {

printf(\学号\\t姓名\\t班级\\t基础课\\t专业课\\t选修课\\t人文类课\\t实验课\

printf(\----\\n\ } k=i;

printf(\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(\没有找到该班级-%s!\ } }

void sort_data_no()// 排序(学号) { int i,k;

struct student tmp; k=dd.count-1; while(k>0) {

for(i=0;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];

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]; }

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];

.

.

} k--; }

save_data();

printf(\排序成功!\ }

void tongji() /*统计某班学生学分完成情况*/ { char clas[5]; int i,j=0,k=0; printf(\请输入要统计的班级:\ scanf(\ for(i=0;i

{ if(strcmp(clas,dd.stu[i].clas)==0) j++;}

for(i=0;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(\%s 班中有 %d 个学生完成学分!!!\\n有 %d 个学生未完成!!!!\

scanf(\ /*******用于吸收上面所按下的字符************/

.

.

printf(\按回车键回主菜单!\ getchar(); menu(); }

.

基于c语言的学分管理系统

.1引言现今大学对学生成绩管理以及学生水平评定过程中,不仅依靠学生分数,而且把各个科目的掌握情况通过学分来反映,众所周知,大学人数众多,单靠人工在纸质介质上记录,既浪费资源又不方便管理,并且错误率高,学分管理系统就是基于现今大学在学生成绩管理过程中采用学分制,应运而生的计算机
推荐度:
点击下载文档文档为doc格式
3i7kf6vuzm0088t3x4ji0cqsi0v0jd00p9n
领取福利

微信扫码领取福利

微信扫码分享