运行环境:codeblocks
2.2 主控main()函数流程设计
1.1 问题提出
在本实验中,主要实现以下几个问题:
1.输入选手数据(班级,编号,姓名,十个评委评分并储存数据到文件);
2.输出选手数据(班级,编号,姓名,总分,去掉最高分和最低分后的平均分);
3.显示评委均分(排序出十个评委的打分平均分,根据高低判断谁是严厉裁判谁 是温柔裁判);
4.实现选手的排序(按照平均分来排序);
5.成绩查询(按照姓名查询,编号查询,并且查询过后能进行修改 删除等的操作);
6.信息修改(能够修改选手的信息如班级,姓名,编号,某些评委的分数,并且修改了分数后,平均分和总分能够随之刷新);
7.删除分数(能够根据选手的编号或者姓名来删除选手的成绩);
8.修改登录密码(保护程序的安全性,实现登录密码的修改,五次机会输入密码,五次密码输入错误,显示退出程序,并且提醒密码的查看地址。就像app的找回密码功能);
9.进入修改界面想要返回主菜单却没有功能键,新增一个break语句,能够跳出循环
10删除成绩前面应该显示出选手的成绩,不然不知道删除谁
11能够修改输出颜色,让提示更加醒目
12能改变背景颜色而不是单一的黑色
13选择退出会有缓冲的时间
14顶部时间显示,到点就下班
1.2 本系统涉及的知识点
1.结构体变量:struct Student
{
}stu[1000];
struct Student stu[1000],*p=stu; 定义全局p->struct Student stu[];
2.数组:char cla[20]:输入选手班级
Char name[20]输入选手姓名
Float score[10]输入十个评委的打分
char tempname[20]用来定义名字的临时变量
char tempcla[20]用来定义班级的临时变量
char password[20],key[20];初始密码
3.循环:for(i=0;i<count;i++)
if(stu[count].num==stu[i].num)判断输入的选手编号是否重复
if(strcmp(searchname,stu[i].name)==0)查找名字
if(searchnum==stu[i].num)查找编号
for(j=0;j<10;j++)
if(max<stu[count].score[j]);
max=stu[count].score[j];找出分数最大值
for(k=0;k<10;k++)
if(max<stu[count].score[k]);
min=stu[count].score[k];找出分数最小值
for(i=0;i<count;i++)
printf();显示数据;
for(i=searchindex;i<count-1;i++)
strcpy(stu[i].cla,stu[i+1].cla);
stu[i].num=stu[i+1].num;删除相关信息
4.函数
void input(struct Student stu[])选手分数输入
void print(struct Student stu[])选手分数显示
void average(struct Student stu[])评委打的平均分
void sort(struct Student stu[])选手按平均分排序(分数排序子函数)
void projectsort(struct Student stu[])分数排序
void findnum(struct Student stu[])按编号查找(分数查询子函数)
void findname(struct Student stu[])按姓名查找(分数查询子函数)
void find(struct Student stu[])分数查询
void del(struct Student stu[])分数删除
void delnum(struct Student stu[])按照编号删除(分数删除子函数)
void delname(struct Student stu[])按照姓名删除(分数删除子函数)
void change(struct Student stu[])修改信息
void read(struct Student stu[])文件导入
void save(struct Student stu[])文件储存
int up()修改密码
void save_password(char s[])保存密码的修改
void hidepassword(char *pswd, unsigned maxlen)隐藏密码的输入
void color(const unsigned short textColor)颜色输出
5.分支
If语句:
if(stu[count].num==stu[i].num)判断输入是否为重复编号
if(max<stu[count].score[j]);判断最大值
if(min>stu[count].score[k]);判断最小值
if(searchindex==-1)判断输入的数据是否有效
if(strcmp(searchname,stu[i].name)==0)判断名字是否存在
if(count==0)判断是否输入了选手信息
if(fread(&stu[i],sizeof(struct Student),1,fp)!=1)判断文件字节数
if(key[i]!=password[i])判断密码是否正确
if else语句:
if(count==0)
printf("\n\n您尚未录入选手信息,请返回菜单进行录入!\n");
else//否则输出选手信息
switch 语句:
switch(choose)
case 1: //成绩录入
case 2: //成绩显示和排序
case 3: //均科成绩
case 4: //成绩排序
case 5: //成绩查找
case 6: //成绩修改
case 7: //成绩删除
case 8: //密码修改
case 0: //退出系统
6.指针
struct Student stu[1000],*p=stu;
7.goto语句;
1.3 功能要求
- 输入选手的班级,编号,姓名,十个评委分数
- 输出选手的班级,编号,姓名,十个评委分数,总分以及去掉最高分和最低分的平均分
- 显示每个评委打的平均分
- 对选手的平均分进行排序,分数高的在前面
- 按照编号或者姓名对选手分数进行查找
- 能对选手的所有信息进行修改
- 能够根据编号或者姓名对选手分数进行删除
- 修改登录密码
- 退出系统
2.总体设计
2.1 功能模块设计
2.2 主控main()函数流程设计
2.3 数据结构设计
1.struct Student //定义结构体变量
{
char cla[20];//班级
int num;//编号
char name[20];//姓名
float score[10];//分数
float aver;//平均分
float sum;//总分
}stu[1000];
struct Student stu[1000],*p=stu; //定义全局p->struct Student stu[]
2.int count=0; //定义全局变量count,录入一个选手信息,count就加一;
3.float min,max,Max,Min;//用来找出十个评委中的最高分和最低分
4.int choose;//用来反馈用户的输入情况
5.int i,j;用来循环输入输出
7 char tempname[20];
char tempcla[20];//定义姓名和班级的临时变量,用来排序
8. int searchnum;//用来查找选手编号
9. char searchname[20];//用来查找学生姓名
10.int sum2=0;//用来循环密码的输入次数
2.4 子模块设计
2.4.1 添加记录模块
2.4.2 查询记录模块
编号查找 |
姓名查找 |
全部显示 |
返回菜单 |
找到 |
2.4.3 更新记录模块
2.4.4文件读写模块
2.4.5 其他模块
2.4.5.1密码模块
2.4.5.2输出颜色模块
2.4.5.3背景颜色模块
system("color 3E");蓝色背景
2.4.5.4系统时间模块
time_t timep; //系统时间
struct tm *p_1;
time (&timep);
p_1=gmtime(&timep);
2.5 函数功能描述
(1)输入模块
1)函数原形:void input(struct student stu[ ])
2)功能:
实现选手的班级编号姓名十个评委打分的输入,并保存在文件中
3)变量及类型:
Float min,max:浮点型形参变量,用于找出最大值最小值
Int ij:循环控制变量
void save(struct Student stu[]);保存数据到文件
char tempcla[10]={"-1"};定义临时姓名字符串,用于按(-1)返回菜单
(2)输出模块
- 函数原型:void print(struct Student stu[])
- 功能:
实现选手的信息输出
- 变量及类型:
sort(struct Student stu[]);调用排序函数,将信息排序后输出
if(count==0):用全局变量count判断是否录入了数据
(3)评委均分模块
- 函数原型:void average(struct Student stu[])
- 功能:
计算出每个评委打分的平均分
- 变量及类型:
Int i:循环控制变量
float aver[10]:均分变量
float total[10]={0}:存放评委打分变量
(4)分数排序模块
- 函数原型:void sort(struct Student stu[])
- 功能:对数据选手数据按照平均分进行排序
- 变量及类型:
char tempname[20];
char tempcla[20];字符型临时变量,用于存放班级姓名
int ij:循环控制变量
float t:排序分数的中间变量
int t1;排序编号的中间变量
(5)分数查找模块
- 函数原型:void findnum(struct Student stu[]):按照编号查询
void findname(struct Student stu[]):按照姓名查询
void find(struct Student stu[]):查询
- 功能:实现对数据的查询
按照姓名编号查询
- 变量及类型:
int choose,n;整型变量 对下一步操作进行指定
int i;循环控制变量
char searchname[20];字符型变量用来查找名字
int searchnum;整型变量 用来查找编号
(6)信息修改
- 函数原型:void changescore(struct Student stu[])
- 功能:实现选手信息的修改并更新修改后的数据
- 变量及类型:
int ij:循环控制变量
int choose:下一步操作变量
int searchnum,tempnum:修改编号的临时变量
(7)删除分数模块
- 函数原型:
void delnum(struct Student stu[]):按编号删除
void delname(struct Student stu[]):按姓名删除
void dell(struct Student stu[]):删除数据
- 功能:实现对数据的删除,能够根据姓名和编号删除,删除后能显示剩下的信息
- 变量及类型:
Int i:控制循环变量
Int choose:整型变量,用于进行下一步操作
char tempname[10]={"-1"};字符型变量,用于输入名字和返回操作
(8)修改密码
- 函数原型:
int up();密码的修改
void save_password(char s[]);修改密码的保存
void yincangpassword(char *pswd, unsigned maxlen);隐藏密码输入
- 功能:
实现密码的输入和更改,并保存在文件里面
- 变量及类型:
FILE *fp= fopen("password.txt","w+");定义文件指针
char buff = '\0';
4)说明:
参考csdn源代码,并未全懂隐藏密码的输入。
3.程序实现
3.1 主界面
图表 1
3.2 子模块界面
3.2.1密码验证界面(见图表2)
图表 2
3.2.2分数录入(见图表3)
图表 3
3.2.3分数显示(见图表4)
图表 4
3.2.4评委均分(见图表5)
图表 5
3.2.5分数排序(见图表6)
图表 6
3.2.6分数查找(见图表7)
图表 7
3.2.7信息修改(见图表8)
图表 8
3.2.8分数删除(见图表9)
图表 9
3.2.8密码修改(见图表10)
4 总结
4.1程序调试情况
程序运行无误无警告
4.2本人在程序设计中感想
当初选择这个校园歌手比赛系统项目,最初呢是觉得它和学生成绩管理系统版有点相似,做起来会比较轻松。因为我的编程水平不怎么行,所以光是构思框架,我便用了很长时间。为了少走弯路,我还参考了B站的学生成绩管理系统视频,csdn上的学生成绩管理系统源代码,而最主要的模板是书上的学生管理系统系统v2.0。
先说说编程:根据题目的要求要做到输入输出,评委打分,成绩排序,数据查询,追加学生数据,存储,导入,退出。我根据自己的想法,将评委打分包含在输入选手信息中。为了便捷性,我直接将存储功能放在每个操作最后,实现自动存储而不是手动存储,毕竟我在编程的时候经常忘记ctrl+s。另外,为了保护程序的安全性,我设置了用密码来登录系统。用户有五次机会输入密码,一但五次密码输入错误,便会退出程序。后来我又为了用户的体验舒适度,增加了一个如同QQ忘记密码找回密码的超级低配版功能,即提示用户在保存密码的文件里面查看登录密码。
为了程序的健壮性,我并没有用循环来输入数据,而是定义全局变量来记录输入的选手人数。根据现实生活,选手的编号是唯一的,但是可能出现同班同名的情况。因此我仅对编号进行了查重处理。但是在修改信息或者删除信息的时候,需要用独立的编号来删除同名者的信息。最开始我定义的评委分数是整型变量,但是偶然看见电视上的打分有小数,我便改成了浮点型,并且对输入范围进行了提示和规范。输入完成后,便会有继续输入操作和退出操作供用户选择。
我增加了一个评委均分选项,可对每个评委打分的平均分进行显示,进而判断谁是严厉(无情)裁判谁是仁慈(宽松)裁判。
在进行分数查找的测试中,我发现查找选手信息后就不能进行下一步了,仅仅一个光秃秃的显示查找的选手信息,为了完善功能,我在查找成功后增加了修改和删除的选项。
对于信息修改。我实现了对选手的各项信息皆能修改,并且对评委分数修改后,能够刷新平均分和总分并显示。
对于修改密码,我将密码用*隐藏,并且在修改密码的阶段,去掉了验证旧密码的过程,这为开源文件省去了不必要的麻烦(但是极易被他人随意的篡改),进而直接输入新密码并提醒用户退出去重新登陆。
在UI界面,我用自己喜欢的蓝色作为背景色,在登陆界面显示了音乐符号的图案,与歌手比赛更加贴近。对于输错5次密码后,我用红色的输出字体来提示用户查找密码,红色字体更加醒目。
这次项目最大的收获,就是一个人完成了整个项目,并且过程中修改错误没有寻求他人的帮助。当看到程序成功编译并且无警告时,顿感所付出的一切都是值得的。前前后后大概七天时间,有时候遇到障碍就查找资料或者等明天想法出来再弄,过程有些许曲折。
尤其是在参考程序时,才发现原来还可以这样处理,让我大开眼界无比兴奋。这次成功做出项目,使我增强了对编程的信心,强烈提高了我对编程的兴趣,巩固了我所学的知识点并让我学以致用。不仅如此,我还学到了新的知识点,减少了自己的知识盲区。
我感觉全部程序并不是我自己编写出来是我的不足,比如隐藏密码我就是借鉴了csdn的代码。另外程序的功能还是不够完善,比如在退出信息查询的时候 需要点击多次才能回车,信息修改只能修改一次不能重复修改,排序只能按照平均分排序而不能按照编号排序等等等等
但是正因为有不足,才让我有前进的动力,我会不断改进丰富该系统,并且用新知识改善它。在我自身方面,我更会严格要求自己,给自己的人生交上一份满意的答卷!