学生成绩管理程序Word格式.docx
- 文档编号:22662688
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:36
- 大小:23.91KB
学生成绩管理程序Word格式.docx
《学生成绩管理程序Word格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理程序Word格式.docx(36页珍藏版)》请在冰豆网上搜索。
9.查询记录
〔1〕可以按“学号〞、“**〞或“名次〞方式查询记录;
〔2〕能给出查询记录的信息;
〔3〕如果查询的信息不存在,输出提示信息。
10.对记录进展排序
〔1〕可以按学号进展升序或降序排序;
〔2〕可以按名称进展升序或降序排序;
〔3〕可以按名次进展升序或降序排序;
〔4〕如果属于选择错误,可以立即退出排序;
11.头文件
〔1〕使用条件编译定义头文件;
〔2〕函数原型声明;
〔3〕数据构造及包含文件。
12.测试程序
〔1〕应列出测试大纲对程序进展测试;
〔2〕应保证测试用例测试到程序的各种边缘情况。
以上是根本要求,希望通过对此题设计的理解,重新考虑如何改进设计。
二.总体设计
最初的整体规划只是说明它们的可行性,不要求制定函数的具体实现,甚至不需要考虑函数原型。
完成整体规划后,可以按照流程描述各个模块之间的接口功能。
本课程设计对模块设计的要求如下:
(1)要求使用多文件方式实现设计;
(2)要求在各个文件内实现构造化设计
(3)每个模块作为一个单独的C文件,每个文件内的函数如表12-1所示,表中给出了各个函数的功能说明;
(4)宏和数据构造等放在头文件中,并使用条件编译。
本设计有5个C文件〔17个函数〕和一个头文件组成,每个C文件都代表着某
特定的功能,它们的关系如表12-1所示。
本章的设计将更加注意模块化,以便展示C语言的编程风格。
程序包含文件的存、取过程。
它的功能就是按输入顺序建立记录。
如果原来没有记录文件,可以重新建立一个文件;
如果已经有记录,可以先把文件内容输入,然后把新记录追加到原来记录的尾部;
也可以单独建立新文件,以后再使用读取文件的方法拼接。
由上述功能分析可以看到它的全貌。
因为它有并列选择,所以可以用选择菜单方便地实现。
这个菜单具有10个选择项,用switch语句可以实现这些选择。
可以用简洁的伪码对它们进展描述,因为并不复杂,所以不再赘述。
表12-1文件及函数组成
源文件
函数名或其他成分
功能
Student.c
main
总控函数
menu-select
菜单项选择择
handle-menu
菜单处理
newrecords
新建学生信息记录
quit
完毕运行
Add-disp.c
showtable
打印表头
getindex
按升序排序的位置
addrecord
在表尾追加信息
display
显示信息
Que-rewv-modi.c
removerecord
删除指定的记录
findrecord
查找指定的信息
queryinfo
查询指定学生的信息
copyrecord
复制记录
modifyrecord
修改指定学生的信息
Save-load
save
文件储存
load
文件读取
Sort.c
sortinfo
排序
Student.h
常数
提供常数
构造声明
学生成绩构造
库函数及函数原型声明
引用库函数及函数
三.函数设计
为一些函数设计两个返回值一曲分歧执行结果是否正确。
每个学生信息资料用一个stuinfo构造来保存,用stuinfo数组全局变量records来保存一批学生的信息资料。
其中的宏定义INITIIAL-SIZE表示数组初始大小,当已经分配的数组大小不够用时,将真假数组的大小,INCR-SIZE为当每次增加的大小。
全局变量numstus表示数组中记录的学生数,arraysize视为数组分配的空间大小。
全局变量savedtag是信息是否已保存的标志,当属组内容被文件保存值文件后,设为“已保存〞状态,当数组内容被修改之后,设为“未保存〞状态。
下面分别描述这些函数,建立它们的函数原型。
1.文件存储操作函数
函数原型:
intsaverecords(void)
功能:
将记录存入默认文件stu_info或者指定文件。
参数:
void
返回值:
成功0,失败-1
工作方式:
数组records被保存至指定文件。
要求:
报告是否有记录可存、是否能正常建立或翻开文件、根据要求执行存入操作并报告存入记录的条数。
2.文件读取操作函数
intloadrecords(void)
将默认文件stu_info或者指定文件里的记录取入内存。
records将为从指定文件中读取出的记录。
报告是否有记录可存、能否能正常翻开文件、是否覆盖已有记录以及读取记录的条数。
3.显示所有学生信息的函数
函数原型:
intdisplay(void)
显示内存里的记录信息
从头部开场逐个显示记录内容
报告是否有记录及记录条数和内容。
4.增加信息函数
函数原型:
voidaddrecord(void)
增加记录
从尾部开场逐个追加记录。
将新记录追加在记录尾部,并对记录进展计数。
5.打印表头函数
voidshowtable(void)
功能:
打印表头
输出一行表头信息
将表头按制表符打印要求。
6.输出在记录中按升序排序的位置
voidgetindex(floatsum)
找出总分为sum在第0至numstus-1个记录中按升序排序的
float,预找出其位置的总分
返回值:
int,sum在第0至numstus-1个记录中按升序排序的
查找并计数
输出位置整数
7.删除记录函数
voidremoverecord(void)
删除内存数组中的制定记录
工作方式:
根据给定的关键字,查找符合的记录并删除。
将后面的记录前移,同时改变名次并给出相关信息。
8.查找指定记录函数
voidfindrecord(char*,int,int)
查找指定的记录。
char*target:
预查找记录的某一项与target一样
intbtargettype:
说明通过哪一项来查找,0为学号,1为**,2为名次
intform:
从第from个记录开场找
int找到的记录的序号,假设找不到那么返回-1。
根据给定的关键字,查找符合记录的序号。
找不到那么返回-1。
9.查询指定学生信息的函数
voidqueryinfo(void)
将一个文件的内容追加到另一个文件的尾部。
可以按照学号、**或名次来查询。
打印查询到的学生的信息或给出相关信息。
10.记录复制函数
voidcopyrecord(stuinfo*,stuinfo*)
将stc指向的一条记录复制给dest指向的记录。
stuinfo*src:
源记录stuinfo*dest:
目的记录。
将源记录逐条复制到目的记录
正确复制字符串。
11.修改指定学生信息函数
voidmodifyrecord(void)
找到指定记录并修改
可以按照学号、**或名次找到要修改的记录,确认前方可修改。
同时需调整名次
12.学生信息排序函数
voidsortinfo(void)
对记录进展排序
可以按照学号、**或名次排序。
升序或降序排序。
13.菜单处理函数
voidhandle_menu(void)
处理选择的菜单命令。
参数:
根据命令,调用相应函数。
给出完毕信息。
14.菜单项选择择函数
intmenu_select(void)
承受用户选择的命令代码。
int
返回命令代码的整数值。
只允许选择规定键,如果输入不合要求,那么提醒用户重新输入。
15.新建学生信息记录的函数
voidnewrecords(void)
重新建立输入信息记录。
根据修要调用saverecords函数。
假设原来信息没有保存,那么保存原来的信息,然后重新输入信息记录。
16.完毕程序运行函数
voidquit(addr*)
完毕程序运行.
根据要求决定在推出前是否将修改的记录存入文件。
完毕运行之前,询问是否对修改的记录进展存储。
17.主函数
voidmain(void)
控制程序。
管理菜单命令并完成初始化。
18.头部文件
文件名称:
student.h
功能:
声明函数原型,包含文件及自定义宏和数据构造。
要求:
报告是否能正常翻开文件执行存入操作及记录的条数。
三.参考程序
1.student.h文件
#ifndefH_STUDENT_HH
#defineH_STUDENT_HH
#include<
stdio.h>
#defineINITIAL_SIZE100//树组初始大小
#defineINCR_SIZE50//数组每次增加的大小
#defineNUM_SUBJECT5//科目数
structstudent_info
{
charnumber[15];
//学号
charname[20];
//**
chargender[4];
//性别
floatscore[NUM_SUBJECT];
//分别为该学生5门课的成绩
floatsum;
//总分
floataverage;
//平均分
intindex;
//名次
};
typedefstructstudent_infostuinfo;
externintnumstus;
//记录的学生数
externstuinfo*records;
//记录学生信息的数组
externcharsavetag;
//信息是否已保存的标志,0为以保存,1位未保存
externintarraysize;
//数组大小
externchar*subject[];
voidhandle_menu(void);
intmenu_select(void);
voidaddrecord(void);
voiddisplay(void);
voidqueryinfo(void);
voidremoverecord(void);
voidsortinfo(void);
intsaverecords(void);
intloadrecords(void);
voidnewrecords(void);
voidquit(void);
voidshowtable(void);
intfindrecord(char*target,inttargettype,intfrom);
intgetindex(floatsum);
voidcopyrecord(stuinfo*src,stuinfo*dest);
#endif//H_STUDENT_HH
2.student.c
student.h>
intnumstus=0;
stuinfo*records=null;
charsavedtag=0;
intarraysize;
char*subject[]={“语文〞,“数学〞,“英语〞,“物理〞,“化学〞};
intmain()
{
//初始化数组
records=(stuinfo*)malloc(stuinfo)*INITIAL_SIZE);
if(records==null)
printf(“memoryfail!
〞);
exit(-1);
}
arraysize=INITIAL_SIZE;
printf(“\n〞);
printf(“\t******************************\n〞);
printf(“\t*这是一个*\n〞);
printf(“\t*学生成绩管理程序*\n〞);
printf(“\t可以对学生成绩进展管理*\n〞);
printf(“\t欢迎使用管理程序*\n〞);
handle_menu();
}
for(;
;
)
switch(menu_select())
case0:
addrecord();
break;
case1:
modifyrecord();
case2:
display();
case3:
queryinfo();
case4:
removerecord();
case5:
sortinfo();
case6:
saverecords();
case7:
loadrecords();
case8:
newrecords();
case9:
quit();
intmenu_select()
chars[2];
int=0;
printf(“\t0.增加学生信息\n〞);
printf(“\t1.修改学生信息\n〞);
printf(“\t2.显示学生信息\n〞);
printf(“\t3.查询学生信息\n〞);
printf(“\t4.删除学生信息\n〞);
printf(“\t5.对学生信息进展排序\n〞);
printf(“\t6.保存学生信息至记录文件\n〞);
printf(“\t7.从记录文件读取学生信息\n〞);
printf(“\t8.新建学生信息文件\n〞);
printf(“\t9.完毕运行\n〞);
printf(“\n\t左边数字对应功能选择,请选0-9:
gets(s);
=atoi(s);
if(==0&
&
(strcmp(s,〞0〞)!
=0))=11;
//处理键入的非数字键,过滤出数字0
if(<
0||>
9)printf(“\n\t输出错误,重选0—9:
〞);
elsebreak;
return;
//新建学生信息记录
voidnewrecords(void)
charstr[5];
if(numstus!
=0)
printf(“现在已经有记录,选择处理已有记录的方法。
\n〞);
printf(“是否保存原来的记录?
(Y/n)〞);
gets(str);
if(str[0]!
=‘n’&
str[0]!
=‘N’)
numstus=0;
//完毕运行,退出
voidquit(void)
if(savedtag==1)
free(records);
exit(0);
3.add_disp.c
#include<
//打印表头
voidshowtable(void)
intj;
printf(“学号\t**\t性别〞);
for(j=0;
j<
num_subject;
j++)printf(“\t%s〞,subject[j]);
printf(“\t总分\t平均分\t名次\n〞);
//显示所有的学生信息
voiddisplay(void)
inti,j;
if(numstus==0)
printf(“没有可供显示记录!
return;
shoetable();
for(i=0;
i<
numstus;
i++)
//打印学生信息
printf((“%s\t%s\t%s〞,records[i].number,records[i].name,records[i].gender);
for(j=0;
j++)
printf(“\t%.1f〞,records[i].score[j]);
printf(“\t%.1f\t%.1f\t%d\n〞,records[i].sum,records[i].average,records[i].index);
//打印满20个记录后停下来
if(i%20==0&
i!
printf(“输入任意字符后继续…\n〞);
getch();
printf(“\n\n〞);
showtable();
//在当前表的末尾增加新的信息
voidaddrecord(void)
charstr[10];
intj;
floatmark,sum;
printf(“原来没有记录,现在建立新表\n〞);
else
printf(“下面在当前表的末尾增加新的信息\n〞);
while
(1)
printf(“您将要添加一组信息,确定吗?
if(str[0]==‘n’||str[0]==‘N’)//不再添加新的信息
break;
if(numstus>
=arraysize)//数组空间缺乏,需要重新申请空间
records=realloc(records,(arraysize+INCR_SIZE)*sizeof(stuinfo));
if(records==NULL)
printf(“memoryfailed!
exit(-1);
arraysize=arraysize+INCR_SIZE;
printf(“请输入学号:
gets(records[numstus].number);
printf(“请输入**:
gets(records[numstus].name);
printf(“请输入性别〔0为女,1为男〕:
if(str[0]==‘0’)
strcpy(records[numstys].gender,‘女’);
else
strcpy(records[numstys].gender,‘男’);
sum=0;
NUM_SUBJECT;
printf(“请输入%s成绩:
〞,subject[j]);
mark=(float)atof(str);
records[numstus].score[j]=mark;
sum+=mark;
records[numstus].sum=sum;
records[numstus].average=sum/NUM_SUBJE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩 管理程序
![提示](https://static.bdocx.com/images/bang_tan.gif)