c语言课程设计学生成绩管理系统.docx

上传人:b****7 文档编号:9658585 上传时间:2023-02-05 格式:DOCX 页数:52 大小:370.30KB
下载 相关 举报
c语言课程设计学生成绩管理系统.docx_第1页
第1页 / 共52页
c语言课程设计学生成绩管理系统.docx_第2页
第2页 / 共52页
c语言课程设计学生成绩管理系统.docx_第3页
第3页 / 共52页
c语言课程设计学生成绩管理系统.docx_第4页
第4页 / 共52页
c语言课程设计学生成绩管理系统.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

c语言课程设计学生成绩管理系统.docx

《c语言课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统.docx(52页珍藏版)》请在冰豆网上搜索。

c语言课程设计学生成绩管理系统.docx

c语言课程设计学生成绩管理系统

中国地质大学

C语言课程设计

院系:

工程学院

姓名:

、、俊

学号:

班号:

051163

指导老师:

日期:

2016-12-4

1、题目要求

2、需求分析

三、总体设计

四、详细设计

1.菜单函数和主函数

2.各功能模块设计

(1)输入模块

(2)追加模块

(3)修改模块

(4)删除模块

(5)修改成绩模块

(6)排序模块

(7)浏览模块

3.公共函数

(1)保存函数

(2)加载函数

(3)学号输入函数

(4)输入三科成绩函数

(5)求总分函数

(6)输入一个记录的函数

(7)修改成绩函数

(8)修改记录函数

(9)显示数据结构项目函数

(10)显示一个记录的函数

五、上机操作

六、总结

 

学生成绩管理系统

一.题目要求

对在校某班学生几门课程的考试成绩进行统一管理。

每个学生记录包括学号、姓名、年龄、数学、英语、物理成绩,默认以学号为序存放。

(1)建立一个文件,以班为单位存储学生记录。

(2)将允许的操作分为四种,以A、B、C、D、E、F为标志(若设置菜单操作更佳):

A:

插入一个新的学生记录(录入学生信息);

B:

修改学生记录;

C:

删除一个学生记录;

D:

登记成绩;

E:

修改成绩;

F:

浏览全班成绩。

(3)计算学生的总成绩。

(4)按学号排序输出全班成绩表。

二.需求分析

学生记录用文件存储,因而要提供文件的输入、输出等操作;要实现插入一个新生的学生记录,因而要提供文件的插入操作;要实现学生记录的修改和删除,以及登记成绩修改成绩,因而要提供文件记录的修改和删除操作;要浏览全班成绩,故要提供显示操作;计算学生总成绩需要提供简单的统计操作;要按学号排序输出全班成绩表,因而要提供排序操作;另外还应提供键盘式选择菜单实现功能选择。

三.总体设计

根据上面的需求分析,可以将这个系统的设计分为8个模块,数据输入,添加数据,修改数据,删除数据,修改成绩,学号排序,浏览成绩,退出模块.

学生成绩管理系统

数据输入

添加数据

修改数据

删除数据

修改成绩

学号排序

浏览成绩

退出模块

四.详细设计

1.菜单函数和主函数

将各个功能模块设置为菜单选项,方便调用,且执行完每部分功能模块后能够方便返回到系统界面.

[流程图]

 

显示一系列功能选项

N

输入n,判断n是否是A-H

Y

根据n的值调用各功能模块函数

voidmenu()/*主界面*/

{intw1;

charn;/*.变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/

do

{

puts("\t\t****************MENU****************\n\n");

puts("\t\t\t\tA.Enternewdata");

puts("\t\t\t\tB.Additiondata");

puts("\t\t\t\tC.Modifydata");

puts("\t\t\t\tD.Deletedata");

puts("\t\t\t\tE.Modifyscore");

puts("\t\t\t\tF.Orderbynumber");

puts("\t\t\t\tG.Browseall");

puts("\t\t\t\tH.Exit");

puts("\n\n\t\t************************************\n");

printf("Choiceyournumber(A-H):

[]\b\b");

n=getchar();

printf("\n");

if(n<'A'||n>'H')w1=1;/*对选择的数字作判断*/

elsew1=0;

}while(w1==1);

switch(n)/*选择功能*/

{case'A':

enter();break;/*输入模块*/

case'B':

add();break;/*添加模块*/

case'C':

modify();break;/*修改数据模块*/

case'D':

del();break;/*删除模块*/

case'E':

modify_score();break;/*修改成绩模块*/

case'F':

order();break;/*排序模块*/

case'G':

browse();break;/*浏览模块*/

case'H':

exit(0);/*退出模块*/

}

}

main()/*主函数*/

{

menu();

}

2.各功能模块设计

(1)输入模块

[数据分析]

单看各数据信息,学号﹑年龄以及数学﹑英语﹑物理各科成绩和总分均是整型,姓名可以采用字符型数组.数据信息存放在文件中,一条记录对应一个学生,既符合习惯也方便信息管理.

把学生的学号﹑姓名﹑年龄﹑各科成绩及总分作为结构体成员,存放若干个学生信息就用结构体数组.

structstudent

{

intnum;

charname[20];

intage;

intMath;

intEnglish;

intPhysical;

longintsum;

}stu[N];/*stu[N]中每个数组元素对应一个学生*/

[注意]

stu[N] 中的N为学生个数,程序中采用宏定义的方式,可以随时在源程序宏定义中修改,本程序宏定义#defineN30

[流程图]

输入用户要输入学生记录的个数n

i从0到n-1调用输入函数input(i)

 

Y

调用保存函数save(n)

[程序]

/**********************输入模块********************/

voidenter()/*输入模块*/

{inti,n;

printf("Howmanystudents(1-%d)?

:

",N);

scanf("%d",&n);/*要输入的记录个数*/

printf("\nEnterdatanow\n\n");

for(i=0;i

{printf("\nInput%dthstudentrecord.\n",i+1);

input(i);/*调用输入函数*/

}

if(i!

=0)save(n);/*调用保存函数*/

printf_back();/*一个任务结束时让用户选择是浏览还是返回*/

}

(2)追加模块

[需求分析]

该模块的功能是用户需要增加新的学生记录,请从键盘输入并逐条写到原来的输入文件中.

[流程图]

[程序]

/***************************添加模块**************************/

voidadd()/*添加模块*/

{inti,n,m,k;

FILE*fp;

n=load();

printf("Howmanystudentsareyouwanttoadd(1-%d)?

:

",N-n);

scanf("%d",&m);/*输入要添加的记录个数*/

k=m+n;

for(i=n;i

{printf("\nInput%dthstudentrecord.\n",i+1);

input(i);/*调用输入函数*/

}

if((fp=fopen("score.txt","ab"))==NULL)/*以ab方式打开文件,添加保存*/

{printf("Cannotopenfile.\n");

}

for(i=n;i

if(fwrite(&stu[i],sizeof(structstudent),1,fp)!

=1)

printf("filewriteerror.\n");

fclose(fp);

printf_back();/*一个任务结束时的选择浏览还是返回*/

}

(3)修改模块

[需求分析]

该模块的功能是显示所有学生信息,考虑到记录很多,故采用分屏显示。

显示完所有记录后,用户输入要修改学生的学号,根据学号查找学生记录,并提示用户修改该记录的哪部分信息,是学号、姓名、年龄或某科成绩、总分还是所有信息都修改,根据用户选择修改相应信息。

[流程图]

N

[程序]

/***************************修改模块*******************/

voidmodify()/*修改模块*/

{structstudents;

FILE*fp;

inti,n,k,w0=1,w1,w2=0;

n=load();

do

{

k=-1;/*给用户看全部记录以便确认要修改的记录*/

printf_face();/*调用显示数据结构项目函数*/

for(i=0;i

{if((i!

=0)&&(i%10==0))/*目的是分屏显示*/

{printf("\n\nRememberNO.051163hneededmodify.Passanykeytocontinue...");

getch();

puts("\n\n");

}

printf_one(i);/*调用显示一个记录的函数*/

printf("\n");

}

do

{

printf("\n\nEnterNO.051163youwanttomodify!

NO.:

051163-");

scanf("%d",&s.num);/*输入要修改的数据的学号*/

for(i=0;i

if(s.num==stu[i].num)

{k=i;/*找到要修改的记录*/

s=stu[i];/*把stu[i]备份给s,以便用户反悔时恢复*/

}

if(k==-1)printf("\n\nNOexist!

pleaseagain");

}

while(k==-1);/*当k=-1表示没有找到*/

printf_face();/*调用显示一个记录的函数*/

printf_one(k);

w1=modify_data(k,n);/*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/

if(w1==1)/*确认修改*/

{printf("\nSuccessful^_^.\n\nAreyoumodifyanother?

\n\n\t1.Yes2.Backwithsave\t[]\b\b");

scanf("%d",&w0);

w2=1;/*来控制保存,使w2=1是标记已有过修改*/

}

else

{w0=0;/*end*/

if(w2==1)

stu[k]=s;

}/*没有修改,把备份的s恢复,使w0=0是为了让循环终止*/

if(w0!

=1&&w2==1)save(n);/*正常返回,且有过修改*/

}

while(w0==1);

menu();

}

(4)删除模块

[需求分析]

该模块的功能是与修改模块一样先显示所有的学生信息,同样考虑到记录很多,采用分屏显示。

显示完所有记录后,用户输入要删除学生的学号,根据学号查找学生记录并删除。

删除一般的做法是将数据从文件中删除,删除位置后面的记录往前挪。

[流程图]

 

[程序]

voiddel()/*删除模块*/

{structstudents;

FILE*fp;

inti,n,k,w0=1,w1,w2=0;

n=load();

do

{

k=-1;

printf_face();

for(i=0;i

{if((i!

=0)&&(i%10==0))/*分屏显示*/

{printf("\n\nRememberNO.051163-whichneededdelete.Passanykeytocontinue...");getch();

puts("\n\n");

}

printf_one(i);

printf("\n");

}

do

{

printf("\n\nEnterNO.051163-thatyouwanttodelete!

NO.:

051163-");

scanf("%d",&s.num);

for(i=0;i

if(s.num==stu[i].num)

{k=i;

s=stu[i];/*将要删除的记录备份给s*/

}

if(k==-1)printf("\n\nNOexist!

pleaseagain");

}

while(k==-1);

printf_face();

printf_one(k);

printf("\nAreyousure?

\n\n\t1.Sure2.Backwithoutsaveinthistime[]\b\b");

scanf("%d",&w1);

if(w1==1)

{

stu[k].sum=0;/*标记为0后,保存时便不保存*/

printf("\nSuccessful^_^.\n\nAreyoudeleteanother?

\n\n\t1.Yes2.Backwithsave\t[]\b\b");

scanf("%d",&w0);

w2=1;/*确认删除*/

}

else

{w0=0;/*end*/

if(w2==1)

stu[k]=s;

}

if(w0!

=1&&w2==1)save(n);/*正常返回且已删除*/

}

while(w0==1);

menu();

}

(5)修改成绩模块

[需求分析]

该模块的功能是修改各科成绩或全体成绩。

[流程图]

N

[程序]

voidmodify_score()/*修改成绩模块*/

{structstudents;

FILE*fp;

inti,n,k,w0=1,w1,w2=0;

n=load();

do

{

k=-1;

printf_face();

for(i=0;i

{if((i!

=0)&&(i%10==0))/*分屏显示*/

{printf("\n\nRememberNO.051163whichscoreneededmodify.Passanykeytocontinue...");

puts("\n\n");

}

printf_one(i);

printf("\n");

}

do

{printf("\n\nEnterNO.051163-thatyouwanttomodify!

NO.:

051163-");

scanf("%d",&s.num);/*输入要修改的学生学号*/

for(i=0;i

if(s.num==stu[i].num)

{k=i;

s=stu[i];/*将要修改的记录备份*/

}

if(k==-1)printf("\n\nNOexist!

pleaseagain");

}

while(k==-1);

printf_face();

printf_one(k);

w1=modify_score1(k);/*调用修改成绩函数*/

if(w1==1)

{printf("\nSuccessful^_^.\n\nAreyoumodifyanotherscore?

\n\n\t1.Yes2.Backwithsave\t[]\b\b");

scanf("%d",&w0);

w2=1;/*确认修改*/

}

else

{w0=0;/*end*/

if(w2==1)

stu[k]=s;

}

if(w0!

=1&&w2==1)save(n);/*w0!

=1returnw2==1modify*/

}

while(w0==1);/*正常返回且已修改*/

menu();

}

(6)排序模块

[需求分析]

该模块的功能是要求将学生记录按照学号排序,这里采用选择法排序。

[流程图]

[程序]

voidorder()/*排序模块*/

{inti,j,k,n;

structstudents;

n=load();

for(i=0;i

{k=i;

for(j=i+1;j

if(stu[j].num

s=stu[i];stu[i]=stu[k];stu[k]=s;

}

save(n);

puts("\n\n");

printf_back();

}

(7)浏览模块

[需求分析]

该模块的功能是显示所有学生记录信息。

[流程图]

[程序]

voidbrowse()/*浏览模块*/

{inti,n;

n=load();/*加载记录*/

printf_face();/*调用显示数据结构项目函数*/

for(i=0;i

{if((i!

=0)&&(i%10==0))/*分屏显示*/

{printf("\n\nPassanykeytocontiune...");

getch();

puts("\n\n");

}

printf_one(i);/*调用显示一个记录的函数*/

printf("\n");

}

printf("\tThereare%drecord.\n",n);

printf("\nPassanykeytoback...");

getch();/*按任意键*/

menu();

}

3.公共函数

下面是在每个模块中都有可能用到的一些公共函数。

(1)保存函数save(intn)

[说明]

形参n控制保存的个数。

当stu[k].sum=0表示删除,不保存该记录。

[程序]

voidsave(intn)/*保存函数,保存n个记录*/

{FILE*fp;

inti;

if((fp=fopen("score.txt","wb"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/

{printf("\nCannotopenfile\n");

}

for(i=0;i

if(stu[i].sum!

=0)/*stu[i].sum=0表示该记录已删除*/

if(fwrite(&stu[i],sizeof(structstudent),1,fp)!

=1)

printf("filewriteerror\n");

fclose(fp);

}

(2)加载函数load()

[说明]

该函数可以用来加载所有记录,并且可以返回所有记录的个数。

[程序]

intload()/*加载记录或可以计算记录个数的函数*/

{FILE*fp;

inti;

if((fp=fopen("score.txt","rb"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/

{printf("\nCannotopenfile\n");

return0;

}

for(i=0;!

feof(fp);i++)

fread(&stu[i],sizeof(structstudent),1,fp);

fclose(fp);

return(i-1);/*返回记录个数*/

}

(3)学号输入函数no_input(inti,intn)

[说明]

该函数对输入学号进行判断,确保输入的学号唯一。

形参i表示第i个学生记录,形参n表示总共有n个学生记录。

[程序]

voidno_input(inti,intn)/*学号输入函数*/

{intk,w1;

do

{w1=0;

printf("NO.:

051163-");

scanf("%d",&stu[i].num);

if(stu[i].num<1||stu[i].num>N)/*判断学号是否在1到N之间*/

{puts("Inputerror!

Onlybemadeupof(1-N).Pleasereinput!

\n");

w1=1;

}

if(w1!

=1)

for(k=0;k

if(k!

=i&&(stu[k].num==stu[i].num))/*判断学号是否有雷同*/

{puts("Thisrecordisexist.Pleasereinput!

\n");

w1=1;break;

}

}

while(w1==1);

}

(4)输入三科成绩函数enter_score(inti)

[说明]

形参i表示第i个学生记录。

[程序]

voidenter_score(inti)

{printf("MathEnglishPhysical");

scanf("%d%d%d",&stu[i].Math,&stu[i].English,&stu[i].Physical);/*对分数输入*/

(5)}求总分函数sum(inti)

[说明]

形参i表示第i个学生记录。

[程序]

voidsum(inti)/*对第i个记录的分数求总分*/

{

stu[i].sum=stu[i].Math+stu[i].English+stu[i].Physical;

}

(6)输入一个记录的函数input(inti)

[说明]

形参i表示第i个学生记录。

[程序]

voidinput(inti)

{no_input(i,i);/*调用学号输入函数*/

printf("name:

age:

");

scanf("%s%d",stu[i].name,&stu[i].age);/*输入姓名、年龄*/

enter_score(i);/*调用分数输入函数*/

sum(i);/*调用求总分函数*/

}

(7)修改成绩函数modify_score1(inti)

[说明]

形参i表示第i个学生成绩记录,此函数带回保存控制值w1,当w1=1时表示确认保存。

[程序]

intmodify_score1(inti)

{int

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1