学生成绩管理系统

  1. 题目描述

要求使用链表、文件。

输入一个班级的学生的基本信息(包括学号,姓名,性别,5门课程成绩)。

按姓名或者学号查找、增加、修改、删除和保存各个学生的信息。

计算每个学生各门功课总分和平均分,按学号或总分排序输出每个学生的基本信息及总分、平均分和名次。

计算全班各门功课的平均分,显示每门课程中低于平均分的每一个学生的学号,姓名,性别,科目,成绩。

显示每门科目中,成绩在90分以上的学生信息,以及每门科目中不及格的学生信息。

用菜单进行管理

只有正确输入用户名密码才能使用此系统。

所有内容能够保存到文件中。下次进入系统是从文件中读取原有信息。

  1. 方案选择

文件法和链表法。因为学生成绩统计需要用文件来储存我们的数据,用户名、密码以及学生成绩,所以我选择使用文件读取或输入有关信息。这样操作起来比较简单,而且逻辑性也比较强。在这里面我还用了些数组,来存放我们读出的数据,后面进行比较的时候也是比较方便的。链表法写起来虽然有点复杂,但是他的效率还是比较高的。

  1. 项目功能分析
    1. 功能表

角色1:登陆

序号

功能描述

备注

1

登陆系统

 

2

登陆成功跳转界面

 

角色2:主菜单

序号

功能描述

备注

1

显示基本信息

 

2

查找学生信息

 

3

增加学生信息

 

4

修改学生信息

 

5

删除学生信息

 

6

学生信息排序

 

7

学生成绩处理

 

 

 

角色3:学生成绩处理

序号

功能描述

备注

1

低于平均分

 

2

高于90分

 

3

不及格

 

 

  1. 项目过程中遇到的问题和解决办法
    1. 问题1  使用文件操作数据
      1.  问题描述 

               怎么把文件中的数据读取出来并使用

      1.  解决方案

我第一步做的是登陆界面,这时我就需要使用一个文件把数据读取出来。在一开始的时候,自己对文件的掌握程度完全不够。于是就思考如何处理文件中的数据。先要输入自己的账号和密码,第二就是把输入的东西和文件里本有的数据进行比较,于是我就用了fscanf 这个函数,把文件里的数据读取出来,如果相同就登陆成功。

      1.  解决结果

               登陆界面已经可以成功操作了,而且对后面文件里数据的处理也会比较方便。

 

    1. 问题2 删除
      1.  问题描述 

             怎么将文件里的一串数据进行删除

      1.  解决方案

我想开始想的实施用链表,后面在网上看到一些与数据结构有关的东西,建立、初始化、删除、插入等12个基本操作,但是他与我前面写的代码不太吻合。于是按照自己的方法想,后面觉得文件还是可以操作的,我们可以使用“w”打开只写文件,若文件存在则长度清为0,及文件内容和会消失,重新写一份新的文件。先把文件里的数据放入数组里,然后进行比较,若与需要删除的学生姓名或学号不同,则即将他写入文件,大功告成

      1.  解决结果

               文件里一连串的数据能够删除了。

  1. 个人心得总结

工程时间分为了2各部分,第一部分是对模块化的使用,让我们清楚的了解到使用模块化操作的简便性。在第一部分完成后,我们进行第二部分的工作,自己独立完成一个项目。我选择的是学生成绩统计管理,以应用教材所学的C语言知识为主,综合课本知识完成一个接近实际需要的应用。我觉得它比较适合我目前的情况。在开始这个项目后,我就在构思,我到底需要一个呈现一个怎样的界面,能够清晰明白地造作好系统。在处理这些问题前,我先是对文件的运用做一个基本的掌握,方便后面的使用。

在做这些东西的时候,一定要有自己的构思和安排,想好后一定要写出自己的工作分解和时间节点,那么就可以清晰的按照自己的思路高效率地走下去。我把自己的工作分成了三个部分,主界面、模块化的处理、数据处理。主界面包括登陆和主菜单,我先做的第一部就是登陆,我想它就类似于我们学校网站的学生登陆界面一样,后台需要有存放账户和密码的地方,我把账户和密码都放进一个文件里,然后读取出来,后面很多基本上也是这一个操作。登陆成功后也有一个提示界面,未成功也会有4次重新登陆。第二部分我就开始做显示学生基本信息、学生信息查找、学生信息增加、学生信息修改、学生信息删除这几个部分,学生信息查找有细划分为按姓名查找和按学号查找。第三部分呢,我就开始做数据的排序和处理,感觉到这里已经是非常轻松了。这个项目里我是根据自己要做的操作,模块化的方方式进行处理的,每个模块都写完后,再把它们结合在一起。等我写完所有的模块,总合最后的主函数也是很简单了。

我觉得里面比较麻烦的就是要设计自己的排版,工作量不算大,但就是考虑美观性,一点一点地去修改也是挺麻烦的,但是要做就一定要做的好看,让自己感官上比较舒服。我在构思如何书写自己的程序时,有时按照自己的逻辑发现可能这条路是走不通的,有的换一种方法去思考,在这个过程中,我也有和我的同学交流,有时发现与他们交流一些问题,自己会收获很多,而且,每个人争对同一个问题都有不同的解决方案,有时也会给自己一种茅塞顿开的感觉。

  1. 源代码

     int login()//登陆                            

{

FILE *fp;

char name[10],password[10];

char usename[10],usepassword[10];

int num=1,flag=0;

system("mode con cols=60 lines=20");//改变界面大小

system ("color F9");//白底蓝字               

printf("\n\n\n\n       --------------学生成绩管理系统--------------\n\n\n\n");

printf("             账号:");

printf("\n\n");

printf("             密码:");

gotoxy(19,9);

scanf("%s",name);//输入账号

getchar();

gotoxy(19,11);

scanf("%s",password);//输入密码

getchar();

fp=fopen("user.txt","r");//只读的方式打开文件

while(fscanf(fp,"%s %s",usename,usepassword)!=EOF)//格式化的方式读出已有的账号和密码

{

if(strcmp(name,usename)==0&&strcmp(password,usepassword)==0)//对比

{

flag=1;//相同返回1

break;

}

}

if(flag==1)//相同返回1

{

return 1;

}

else//不同返回0

{

while(num<4)//循环共5次

{

printf("\n\n\n账号或密码错误!你还有%d次输入得机会。",(4-num));

num++;

Sleep(2000);

system("cls");

printf("\n\n\n\n       --------------学生成绩管理系统--------------\n\n\n\n");

printf("             账号:");

printf("\n\n");

printf("             密码:");

gotoxy(19,9);scanf("%s",name);

getchar();

gotoxy(19,11);

scanf("%s",password);

getchar();

rewind(fp);

while(fscanf(fp,"%s %s",usename,usepassword)!=EOF)

{

if(strcmp(name,usename)==0&&strcmp(password,usepassword)==0)

{

    flag=1;

break;

}

}

if(flag==1)

{

return 1;

}

}

return 0;

}

void seach()//查找         

{

int c;

    system("color F9");

system("mode con cols=60 lines=20");

while(1)

{

printf("\n\n\n       --------------学生信息查找--------------\n\n");

printf("                    [1]按姓名查找\n");

printf("                    [2]按学号查找\n\n");

printf("       ----------------------------------------\n\n");

printf("                    请输入以上编号:");

scanf("%d",&c);

getchar();

if(c==1)//按姓名查找

{

seach_name();

break;

}

else if(c==2)//按学号查找

{

seach_num();

break;

}

}

}

void add()//增加信息              

{

FILE *fp;

int flag=1;

system("cls");

system("color F9");

system("mode con cols=90 lines=30");

printf("\n\n\n                      ------------【增加学生信息】------------\n\n\n");

if((fp=fopen("student.txt","a"))==NULL)//向文件尾部追加数据

{

printf("文件打开失败!\n");

flag=0;

}

if(flag==1)//成功打开文件

{

printf("           请按以下顺序输入学生信息(学号 姓名 性别 语文 数学 英语 物理 体育):\n\n");

gotoxy(12,9);

scanf("%s %s %s %f %f %f %f %f",stu.num,stu.name,stu.sex,&stu.yw,&stu.sx,&stu.yy,&stu.wl,&stu.ty);//输入

getchar();

if(fprintf(fp,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty)==EOF)//向文件写入数据结束

{

printf("学生信息增加失败!\n\n");

flag=0;//失败返回0

}

if(flag==1)//增加成功

{

printf("           学生信息增加成功!\n\n");

printf("           你输入得学生信息为:\n           %s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty);

}

fclose(fp);

}

}

void change()//修改             

{

struct stu student[50];//定义数组存放修改的数据

char Scanf[20];

FILE *fp1,*fp2;

int flag=0,i=0,j=0,f,mark;

system("cls");

system("color F9");

system("mode con cols=90 lines=30");

printf("\n                       --------------修改学生信息--------------\n");

printf("                       请输入需要修改的学生的【姓名】或【学号】:");

scanf("%s",Scanf);

getchar();

if((fp1=fopen("student.txt","r"))==NULL)//只读的方式打开文件

{

printf("学生基本信息读取失败!");

}

printf("            --------------------------------------------------------------\n");

printf("             学    号    姓  名   性别   语文   数学   英语   物理   体育\n");

while(fscanf(fp1,"%s %s %s %f %f %f %f %f",stu.num,stu.name,stu.sex,&stu.yw,&stu.sx,&stu.yy,&stu.wl,&stu.ty)!=EOF)//从文件中读出数据

{

if(strcmp(Scanf,stu.name)==0 || strcmp(Scanf,stu.num)==0)//比较

{

printf("            --------------------------------------------------------------\n");

printf("             %-12s %-8s %-3s   %-6.1f %-6.1f %-6.1f %-6.1f %-6.1f\n",stu.num,stu.name,stu.sex,stu.yw,stu.sx,stu.yy,stu.wl,stu.ty);

flag=1;

mark=j;

}

strcpy(student[j].num,stu.num);

strcpy(student[j].name,stu.name);

strcpy(student[j].sex,stu.sex);

student[j].yw=stu.yw;

student[j].sx=stu.sx;

student[j].yy=stu.yy;

student[j].wl=stu.wl;

student[j].ty=stu.ty;

j++;

}

printf("            --------------------------------------------------------------\n");

fclose(fp1);

printf("\n                              请输入需要更改的项目:");

scanf("%s",Scanf);

getchar();

if(flag==0)

{

printf("                           你输入的项目错误!\n\n");

}

else

{

if(strcmp(Scanf,"学号")==0)

   f=1;

else if(strcmp(Scanf,"姓名")==0)

     f=2;

else if(strcmp(Scanf,"性别")==0)

   f=3;

else if(strcmp(Scanf,"语文")==0)

   f=4;

else if(strcmp(Scanf,"数学")==0)

   f=5;

else if(strcmp(Scanf,"英语")==0)

   f=6;

else if(strcmp(Scanf,"物理")==0)

   f=7;

else if(strcmp(Scanf,"体育")==0)

   f=8;

  

switch(f)

{

case 1:{

                        fp2=fopen("student.txt","w");

        printf("                             将学号【%s】修改为:",student[mark].num);

        scanf("%s",Scanf);

        getchar();

        strcpy(student[mark].num,Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 2:{

                        fp2=fopen("student.txt","w");

        printf("                             将姓名【%s】修改为:",student[mark].name);

        scanf("%s",Scanf);

        getchar();

        strcpy(student[mark].name,Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 3:{

                        fp2=fopen("student.txt","w");

        printf("                             将性别【%s】修改为:",student[mark].sex);

        scanf("%s",Scanf);

        getchar();

        strcpy(student[mark].sex,Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 4:{

                        fp2=fopen("student.txt","w");

        printf("                             将语文成绩【%.1f】修改为:",student[mark].yw);

        scanf("%s",Scanf);

        getchar();

        student[mark].yw=atof(Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 5:{

                        fp2=fopen("student.txt","w");

        printf("                             将数学成绩【%.1f】修改为:",student[mark].sx);

        scanf("%s",Scanf);

        getchar();

        student[mark].sx=atof(Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 6:{

                        fp2=fopen("student.txt","w");

        printf("                             将英语成绩【%.1f】修改为:",student[mark].yy);

        scanf("%s",Scanf);

        getchar();

        student[mark].yy=atof(Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 7:{

                        fp2=fopen("student.txt","w");

        printf("                             将物理成绩【%.1f】修改为:",student[mark].wl);

        scanf("%s",Scanf);

        getchar();

        student[mark].wl=atof(Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

            case 8:{

                        fp2=fopen("student.txt","w");

        printf("                             将体育成绩【%.1f】修改为:",student[mark].ty);

        scanf("%s",Scanf);

        getchar();

        student[mark].ty=atof(Scanf);

        for(i=0;i<j;i++)

        {

         fprintf(fp2,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",student[i].num,student[i].name,student[i].sex,student[i].yw,student[i].sx,student[i].yy,student[i].wl,student[i].ty);

         }

         printf("\n                                     修改成功!\n");

        fclose(fp2);

       };break;

}  

}

}

void Delete()//删除

{

struct stu aa[50];  

FILE *fp1,*fp2;

int i=0,j,flag=0,f;

char Scanf[20];

system("cls");

system("color F9");

system("mode con cols=90 lines=30");

printf("\n                       --------------删除学生信息--------------\n");

printf("                       请输入需要删除的学生的【姓名】或【学号】:");

scanf("%s",Scanf);

getchar();

printf("            --------------------------------------------------------------\n");

printf("             学    号    姓  名   性别   语文   数学   英语   物理   体育\n");

if((fp1=fopen("student.txt","r"))==NULL)//用只读的方式打开文件

{

printf("学生基本信息读取失败!");

}

while(fscanf(fp1,"%s %s %s %f %f %f %f %f",aa[i].num,aa[i].name,aa[i].sex,&aa[i].yw,&aa[i].sx,&aa[i].yy,&aa[i].wl,&aa[i].ty)!=EOF)

{

 

if(strcmp(Scanf,aa[i].num)==0 || strcmp(Scanf,aa[i].name)==0)//比较

{

printf("            --------------------------------------------------------------\n");

printf("             %-12s %-10s %-3s %-6.1f %-6.1f %-6.1f %-6.1f %-6.1f\n",aa[i].num,aa[i].name,aa[i].sex,aa[i].yw,aa[i].sx,aa[i].yy,aa[i].wl,aa[i].ty);

flag=1;//找到返回1

}

i++;

}

printf("            --------------------------------------------------------------\n");

fclose(fp1);

if(flag==0)

{

printf("\n                      没有找到姓名或学号为【%s】的学生!\n",Scanf);

}

else

{

printf("\n                        确认删除输入【1】,放弃删除输入【0】:");

scanf("%d",&f);

getchar();

if(f==1)

{

fp2=fopen("student.txt","w");// 用只写的方式打开文件

for(j=0;j<i;j++)

{

 

if(strcmp(Scanf,aa[j].num)!=0 && strcmp(Scanf,aa[j].name)!=0)//重新写入其他人的数据放入文件

{

fprintf(fp1,"%s %s %s %5.1f %5.1f %5.1f %5.1f %5.1f\n",aa[j].num,aa[j].name,aa[j].sex,aa[j].yw,aa[j].sx,aa[j].yy,aa[j].wl,aa[j].ty);

}

}

printf("\n                                 删除成功!\n\n");

}

else

{

printf("\n                      你已放弃删除该学生的成绩信息!\n");

}

}

fclose(fp2);

}

备注:自己的作业,想保存一下,没别的意思,写的也很丑。

 

  • 52
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
1.基于数组的“学生信息管理系统” 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号姓名、专业、班级、3成绩。N定义为符号常量,定义N名学生信息的结构体数组。 实验要求: main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 功能: (1)定义函数Input:功能是可以从键盘输入任意个学生信息。 (2)定义函数Save:将输入学生信息全部或者选择性的存入指定文件(如:输入5个学生信息,选择其中前3或者2个存入文件,或者全部存入文件)。 (3)定义函数Output:将某个学生信息格式化输出(学生信息从文件中读取,并且提供可选择的学号)。 (4)定义函数Fetch:从文件中随机读取某个学生的信息。 (5)定义函数Del:删除指定学号学生信息,并保存到原文件中。 (6)定义函数:实现输出所有学生信息的功能(包括学生的平均分和总分)。 (7)定义函数Max:求所有学生课程的最高分,并将此学生的分数以及学生姓名输出(注意:当有多名相同最高分数时,可将所有学生姓名输出)。 (8)定义函数Sort_select:对某个专业的学生,按总平均成绩由低到高进行简单选择排序。 (9)定义函数Sort_buble:对某个专业中某个班级的学生,按总平均成绩由高到低进行起泡排序。 (10)定义函数Sort_insert:对某个专业中某个班级的学生,按某课程成绩由低到高进行直接插入排序。 (11)定义函数Search:实现某专业中某班级的成绩综合查找(如智能专业1班,总分240分以上同学)。 (12) 定义函数printmenu: 打印菜单 退出 2.基于链表的“学生信息管理系统” 实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号姓名、班级、专业、3成绩。 实验要求: (1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。 (2)定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。 (3)定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。 (4)定义函数Save:将某个学生信息存入文件。 (5)定义函数Fetch:从文件中随机读取某个学生的信息。 (6)定义函数Search_num:查找指定学号学生,返回指向该学生结点的指针。 (7)定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。 (8)定义函数Delete_num:从链表中删除指定学号学生。 (9)定义函数Search_major _subject_score:查找某个专业的、某课程成绩小于某个分数的学生,返回指向该学生结点的指针。 (10)定义函数Delete_ major _subject:从链表中删除某个专业的、某课程成绩小于某个分数的学生

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值