C语言 校园歌手比赛系统

源码点这里

运行环境:codeblocks

1.引言... 

1.1 问题提出... 

1.2 本系统涉及的知识点... 

1.3 功能要求... 

2.总体设计... 

2.1 功能模块设计... 

2.2 主控main()函数流程设计 

2.3 数据结构设计... 

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背景颜色模块... 

2.4.5.4系统时间模块... 

2.5 函数功能描述... 

3.程序实现... 

3.1 主界面... 

3.2 子模块界面... 

3.2.1密码验证界面(见图表2)... 

3.2.2分数录入(见图表3)... 

3.2.3分数显示(见图表4)... 

3.2.4评委均分(见图表5)... 

3.2.5分数排序(见图表6)... 

3.2.6分数查找(见图表7)... 

3.2.7信息修改(见图表8)... 

3.2.8分数删除(见图表9)... 

3.2.8密码修改(见图表10)... 

3.2.8密码修改(见图表10)... 

4 总结... 

4.1程序调试情况... 

4.2本人在程序设计中感想... 

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 功能要求

  1. 输入选手的班级,编号,姓名,十个评委分数
  2. 输出选手的班级,编号,姓名,十个评委分数,总分以及去掉最高分和最低分的平均分
  3. 显示每个评委打的平均分
  4. 对选手的平均分进行排序,分数高的在前面
  5. 按照编号或者姓名对选手分数进行查找
  6. 能对选手的所有信息进行修改
  7. 能够根据编号或者姓名对选手分数进行删除
  8. 修改登录密码
  9. 退出系统

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 minmax:浮点型形参变量,用于找出最大值最小值

Int ij:循环控制变量

void save(struct Student stu[]);保存数据到文件

char tempcla[10]={"-1"};定义临时姓名字符串,用于按(-1)返回菜单

  2)输出模块

  1. 函数原型:void print(struct Student stu[])
  2. 功能:

实现选手的信息输出

  1. 变量及类型:

sort(struct Student stu[]);调用排序函数,将信息排序后输出

if(count==0):用全局变量count判断是否录入了数据

3)评委均分模块

  1. 函数原型:void average(struct Student stu[])
  2. 功能:

计算出每个评委打分的平均分

  1. 变量及类型:

Int i:循环控制变量

float aver[10]:均分变量

float total[10]={0}:存放评委打分变量

4)分数排序模块

  1. 函数原型:void sort(struct Student stu[])
  2. 功能:对数据选手数据按照平均分进行排序
  3. 变量及类型:

    char tempname[20];

char tempcla[20];字符型临时变量,用于存放班级姓名

int ij:循环控制变量

float t:排序分数的中间变量

int t1;排序编号的中间变量

     5)分数查找模块

 

 

  1. 函数原型:void findnum(struct Student stu[]):按照编号查询

             void findname(struct Student stu[]):按照姓名查询

             void find(struct Student stu[]):查询

  1. 功能:实现对数据的查询

         按照姓名编号查询

  1. 变量及类型:

    int choose,n;整型变量 对下一步操作进行指定

     int i;循环控制变量

     char searchname[20];字符型变量用来查找名字

     int searchnum;整型变量 用来查找编号

6)信息修改

  1. 函数原型:void changescore(struct Student stu[])
  2. 功能:实现选手信息的修改并更新修改后的数据
  3. 变量及类型:

   int ij:循环控制变量

     int choose:下一步操作变量

int searchnum,tempnum:修改编号的临时变量

7)删除分数模块

 

 

  1. 函数原型:

            void delnum(struct Student stu[]):按编号删除

            void delname(struct Student stu[]):按姓名删除

            void dell(struct Student stu[]):删除数据

  1. 功能:实现对数据的删除,能够根据姓名和编号删除,删除后能显示剩下的信息
  2. 变量及类型:

Int i:控制循环变量

Int choose:整型变量,用于进行下一步操作

   char tempname[10]={"-1"};字符型变量,用于输入名字和返回操作

8)修改密码

 

 

  1. 函数原型:

        int up();密码的修改

        void save_password(char s[]);修改密码的保存

        void yincangpassword(char *pswd, unsigned maxlen);隐藏密码输入

  1. 功能:

       实现密码的输入和更改,并保存在文件里面

  1. 变量及类型:

    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的代码。另外程序的功能还是不够完善,比如在退出信息查询的时候 需要点击多次才能回车,信息修改只能修改一次不能重复修改,排序只能按照平均分排序而不能按照编号排序等等等等

但是正因为有不足,才让我有前进的动力,我会不断改进丰富该系统,并且用新知识改善它。在我自身方面,我更会严格要求自己,给自己的人生交上一份满意的答卷!

猜你喜欢

转载自blog.csdn.net/qq_62315940/article/details/127890997