C语言实践课程报告附源码(学生成绩管理系统 )

声明:本课程报告比较简陋,仅供学习参考哦!!(源码见文章末尾)


目录

1. 引言

1.1  研究背景

1.2  研究意义

2. 需求分析

3. 概要设计设计

3.1 功能模块设计

3.2 主函数的流程设计

4.  详细设计和实施

4.1 主界面设计

4.2 录入信息

4.3 查询信息

4.4 修改信息

4.5 添加学生

4.6 删除学生信息

4.7 统计学生信息

5.   测试数据与测试结果

5.1 系统测试

5.2 问题分析

5.3 总结

参考文献


 

1. 引言

1.1  研究背景

随着科技的不断发展,计算机的应用领域越来越广。在我国的各类学校,尤其是高等院校,近些年由于阔招生员,大大增加了学校的管理体制的负担,管理信息系统已经进入高校,但还未普及,而对于学生成绩管理来说,目前还没有一套完整的,统一的系统。因此,开发一套适合、 兼容性好的系统是很有必要的。

1.2  研究意义

根据开发要求,学生成绩管理系统全要应用于教育系统,完成对学生成绩信息的计算机管理,使学院职员工轻工作压力,同时,可以减少劳动力的使用,加快查询速度、加强管理,加快国家和部门关于信息化的步伐,使管理更加规范化。学生成绩管理系统是时代发展的必然产物。

2. 需求分析

编写一个学生成绩管理系统,每个学生信息包括:姓名、学号、C语言、编译原理、数据库以及离散数学的成绩。具体功能如下:

(1)创建学生信息并以磁盘文件保存;

(2)读取磁盘文件并显示输出所有学生的成绩;

(3)按学号或姓名查询成绩;

(4)添加成绩记录;

(5)修改指定姓名或学号的学生的成绩并可存盘;

(6)删除指定姓名或学号的学生成绩并可存盘;

(6)只显示C语言成绩60分以下、60~79、80~89、90分以上各分数段的学生信息;

(7)打印所有学生成绩单。

3. 概要设计设计

3.1 功能模块设计

功能模块如下图1所示:

                                                                                         图1 功能模块结构图

3.2 主函数的流程设计

(1)主界面系统

  可分别输入0—7数字来实现对学生信息的执行。各个按键的功能如下:

“0”:可退出程序;

“1”:录入信息,调用input()函数;

“2”:查询信息,先调用search()函数,根据姓名或学号分别调用xingming()和xuehao()函数;

“3”:修改信息,先调用modiway()函数,根据姓名或学号分别调用modify1 ()和modify2()函数;

“4”:添加学生信息,直接调用insert()函数;

“5”:删除学生信息,先调用deleteway()函数,根据姓名或学号分别调用delete1 ()和delete2()函数;

“6”:显示打印成绩,直接调用print()函数;

“7”:统计C语言成绩,直接调用count()函数。

 

4.  详细设计和实施

4.1 主界面设计

(1)  功能介绍

本模块主要是调用以上每个自定义函数,在界面中输入相对应的数字便可进入相关模块。保证了本程序的完美运行。

(2)  关键函数及其描述

void main()

{

    char ch;

    while(1)

    {

      menu();// 显示菜单

      ch=getch();//选择菜单

      if(ch=='0')

          break;

      switch(ch)//判断功能项

      {

      case '1':input();break;

      case '2':search();break;

      case '3':modiway();break;

      case '4':insert();break;

      case '5':deleteway();break;

      case '6':print();break;

      case '7':count();break;

      }

    }

    printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n");

}

4.2 录入信息

(1)功能简介

该模块主要实现学生信息的录入。在界面中输入“1 ”进入学生成绩的录入,录入信息是一直到姓名为“End”时结束录入。

(2)流程图

录入信息模块流程图如图2所示:

                                                                                  图2 录入信息

 

(3) 关键代码及其描述

void input()

{

    FILE *fp;

    stu xs;           /*定义一个结构体变量来装从文件中读出来的数据*/

    if((fp=fopen("student.dat","ab"))==NULL)  //判断文件能否打开

    {

       printf("can't open the file!\n");exit(0);     //正常退出

    }

    printf("\n录入格式: 姓名 学号 C语言 编译原理 数据库 离散数学 \n");

    printf("当输入姓名为<End>结束录入\n");

    while(1)                               

    {

        scanf("%s",xs.name);

        if(strcmp(xs.name,"End")==0) break; //判断姓名是否为END,用字符串判断

        scanf("%d%f%f%f%f",&xs.num,&xs.c,&xs.by,&xs.sjk,&xs.lssx);

        fwrite(&xs,sizeof(stu),1,fp);        //将成绩信息写入文件

    }

    fclose(fp);

}

4.3 查询信息

(1) 功能简介

本模块先定义了学生姓名和学号两项信息,然后再自定义一个search函数,利用switch函数来通过这两种方式来查询。在界面中输入“2”进入查询信息模块。接着输入“1”则是按姓名查询,输入“2”则是按学号查询。

(2)流程图

查询信息模块流程图如图3所示:

 

                                                                                  图3 查询信息

(3) 关键代码及其描述

void search()

{

       char ch1;

       system("cls");

    printf("请选择何种方式查询<编号>:\n");

    printf("1->姓名,2->学号:");

    ch1=getchar();              /*用字符接收*/

    switch(ch1)                 /*判断*/

  {

    case '1':xingming();break;

    case '2':xuehao();break;

  }

getch(); 

4.4 修改信息

(1) 功能简介

本模块主要实现修改学生信息的功能,modify1和modify2分别定义两种修改信息的方式,然后利用modiway函数,使用switch函数判断选择修改的方式,在界面中输入“3”进入修改成绩模块,接着输入“1”则是按姓名修改成绩,输入“2”则是按学号修改成绩。

(2)流程图

修改信息模块流程图如图4所示:

                                                                                 图4 修改信息

 

(3) 关键代码及其描述

void modiway()

{

    char ch1;

    system("cls");

    printf("请输入按何种方式修改<编号>:\n");

    printf("1->姓名,2->学号:");

    ch1=getchar();       /*用字符接收*/

    switch(ch1)          /*判断*/

       {

      case '1':modify1();break;

      case '2':modify2();break;

       }

 

    getch();/*让屏幕停留同时按任意键返回*/

}

4.5 添加学生

(1)功能简介

本模块主要实现了学生的添加,在界面中输入“4”进入添加学生模块,依次输入姓名、学号、C语言,编译原理,数据库以及离散数学成绩、和插入的位置。

(2)流程图

添加学生模块流程图如图5所示:

                                                                                 图5 添加学生

 

(3) 关键代码及其描述

void insert()

{

       int i=0,j,k,lenth;

    FILE *fp;

    stu s,xs[N];

    system("cls");

    printf("\n请输入添加的学生的姓名:");

       scanf("%s",&s.name);

    printf("\n学生的学号:");scanf("%d",&s.num);

    printf("\n学生的成绩:C语言、编译原理、数据库、离散数学:");scanf("%f %f %f %f",&s.c,&s.by,&s.sjk,&s.lssx);

    printf("\n请输入插入到第几行:");scanf("%d",&k);

    if((fp=fopen("student.dat","rb"))==NULL)

       {

           printf("can't open the file!\n");exit(0);

       }

    while(!feof(fp))

       {

        fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/

        if(feof(fp)) break;

        i++;

       }

    fclose(fp);

    lenth=i;                            //记录此时lenth最大

    if(k<lenth && k>=0)                 /*k的位置要位于数组范围之内*/

       {

       for(j=lenth-1;j>=k;j--)

           xs[j+1]=xs[j];               /*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/

           xs[k]=s;                     /*将输入的学生信息加入这个k位置*/

           lenth++;                   //增加一个学生空间,否则会少一个数据

       if((fp=fopen("student.dat","wb"))==NULL)

          {

               printf("不能建立文件!!\n");exit(0);

          }

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

       fwrite(&xs[i],sizeof(stu),1,fp);  //存入数据

       }

    else/*不再数组范围之内*/

       {

        if((fp=fopen("student.dat","ab"))==NULL)

              {

              printf("不能建立文件!!\n");exit(0);

              }

    fwrite(&s,sizeof(stu),1,fp);

       }

       fclose(fp);

}

4.6 删除学生信息

(1) 功能介绍

根据学生的姓名或学号来删除学生的信息,在主界面点击“6”,接着选择删除学生信息的方式。

(2)删除学生模块流程图如图6所示:

                                                                                 图6 删除学生

(3) 关键代码及其描述

//删除:输入学生学号,若该学生存在,则删除,并显示删除后余下的学生成绩信息

void deleteway()

{

    char ch1;

    system("cls");

    printf("请输入按何种方式删除:\n");

    printf("1->姓名,2->学号:");

    ch1=getchar();/*用字符接收*/

    switch(ch1)/*判断*/

       {

       case '1':delete1();break;

    case '2':delete2();break;

       }

       getch();/*让屏幕停留同时按任意键返回*/

}

4.7 统计学生信息

(1) 功能介绍

本模块主要实现了对学生成绩的统计,对不同分数段的学生进行划分并逐个显示。在界面中输入“6”,则进入统计学生信息模块。按任意键退出。

(2)流程图

统计学生模块流程图如图7所示:

                                                                                图7 统计学生

(3)  关键代码及其描述

void count()

{

int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;

stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];   /*用指针数组*/

fread(&s[i++],sizeof(stu),1,fp);         /*读入数据*/

t=i;i=0;

for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/

{

if(s[i].c<60) {p1[j++]=&s[i++];continue;

} /*每个学生信息只能位于一个分数段,各分数段都是如此*/

printf("不及格:姓名 学号 C语言\n");

printf("%10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c}//显示指针内的信息

//显示不及格学生成绩,各分数段都是如此

 

5.   测试数据与测试结果

5.1 系统测试

(1)主界面设计

具体效果如图8所示。

 

                                                                               图8 主函数界面

(2)学生成绩信息录入测试

学生成绩录入界面如图9所示。

                                                                                  图9 学生成绩录入

(3) 查询信息系统测试

    可以通过姓名和学号两种方式来查询信息。图10为通过姓名来查询,图11为通过学号来查询。

                                                                               图10姓名查询

                                                                               图11学号查询

(4) 修改信息系统测试

     可以通过学生姓名和学号来修改信息,图12为通过姓名修改信息,图13为通过学号来修改信息。

                                                                               图12 姓名修改

                                                                               图13 学号修改

(5)添加学生系统测试

添加学生的界面如图14所示。

                                                                               图14 添加学生

(6)删除学生信息系统测试

可以通过学生姓名和学号来删除学生信息,图15为通过姓名修改信息,图16为按学号删除学生信息。最终看下所剩下的学生信息,如图17所示:

                                                                               图15 按姓名删除

                                                                               图16按学号删除

                                                                               图17查询删除后的信息

 

 

(7)显示成绩系统测试

对添加、修改、删除学生信息的所有学生成绩单进行统计打印,具体如图18所示:

                                                                               图18 显示打印成绩

(8)统计成绩系统截图

     因为C语言课程需要单独统计学生成绩情况,所以对学生C语言成绩进行分类。具体的统计后界面如图19所示。

                                                                               图19 统计C语言

5.2 问题分析

1、编写程序的过程中有很多问题,首先就是总的大体布局,该如何构造函数,该构造哪些函数……解决的办法其实也很简单,大概看书上的学生信息管理系统的布局,然后根据自己的构思在纸上简单写出来。最好先画好流程图,然后才慢慢地编写程序。

2、接着就有很多小问题接踵而来,虽然这只是个小程序,但是运用的东西还真不少。整个程序中都需要定义文件指针,这就需要对文件指针的概念及运用有着深入的了解。这就需要看书了,具体的细节就需要百度来获取了。例如while(!feof)就是读取文件失败的情况。还有fread和fwrite的格式。而且本程序中大部分都运用指针,对于指针的运用,还不能熟练的掌握,例如P1[i++]=&s[i++],将s[i++]赋值给指针P1,这就需要对指针的表示和指针所指向的内容要了解。

3、除了指针,还有struct结构体类型的定义。每一个地址对应必须要准确,稍不留意就会出错。例如在printf()和scanf()中,后面的地址就容易出错。尤其地址符&经常会忘。这就需要自己细心,反复编译查找出错的地方。

4、另外,再录入信息时,需要输入一定的数据后中断程序。一时不清楚如何解决,百度了一下。可以利用strcmp函数来检查name是否与LAST一致,一致后就可以中断程序。并且在使用strcmp函数时要注意字符要加引号,而引用的变量可不加。

5、还有就是如何保存修改后的学生的成绩,之前无论如何都保存不了学生信息,后来查了百度,可以利用“fseek(fp,-sizeof(stu),1);fwrite(&xs,sizeof(stu),1,fp”,这就可以覆盖之前的信息并显示修改后的信息。

 

5.3 总结

通过本次实训,我对C语言程序设计有了更深入的了解。虽然实训的只有两天,但是从上周我就开始考虑并设计程序了。C语言是真的有趣,复杂却有条理的代码是真的有意思。虽然免不了枯燥乏味,但是将程序编写出来是非常有成就感的。本次实训我选择这个题目,就是因为题目中包含C语言,想着如何将这个程序编好,作为我学习C语言的结束的标志。在编写程序的过程中,当然陆陆续续地出现很多问题,出了参观以下别人写的程序外,还得专门百度来解决个别问题,这样就可以深入地了解这个问题,处理起来就比较容易。尤其对文件有了更深入的了解。更重要的是,通过这次实训,培养了自己的逻辑能力和独立思考的能力,我想这个才是最重要的。

 

 

参考文献

[1] 陈珂,陈静.实用C语言程序设计教程.中国电力出版社.2016.6

[2] 谭浩强.软件工程导论[M].清华大学出版社,2013.6

[3] 姜仲秋. C语言程序设计.南京大学出版社,1998.1.

[4] K.N.King. C语言程序设计.人民邮电出版社.1998.2

 

参考源码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20
typedef struct
{
  char name[10];
  int num;
  float c;
  float by;
  float sjk;
  float lssx;
}stu;
void menu() 
{
   system("cls");  //清屏
   printf("\n\n\n\n\t\t\t*********   学生成绩管理系统  ***********\n");
   printf("\t\t\t             Time:2020年6月6日              \n");       
   printf("\t\t\t|==========================================|\n");
   printf("\t\t\t|*************1.  录入信息  ***************|\n");
   printf("\t\t\t|*************2.  查询成绩  ***************|\n");
   printf("\t\t\t|*************3.  修改信息  ***************|\n");
   printf("\t\t\t|*************4.  添加学生  ***************|\n");
   printf("\t\t\t|*************5.  删除成绩  ***************|\n");
   printf("\t\t\t|*************6.  显示成绩  ***************|\n");
   printf("\t\t\t|*************7.    统计    ***************|\n");
   printf("\t\t\t|*************0.    退出    ***************|\n");
   printf("\t\t\t|==========================================|\n");
   printf("\t\t\t|******************************************|\n");
   printf("\n\n\t\t\t      请选择相应的功能<输入编号>:");
}
//录入信息

void input()
{
    FILE *fp;
    stu xs;                                   /*定义一个结构体变量来装从文件中读出来的数据*/
    if((fp=fopen("student.dat","ab"))==NULL)  //判断文件能否打开
	{
	   printf("can't open the file!\n");exit(0);     //正常退出
	}
    printf("\n录入格式: 姓名 学号 C语言 编译原理 数据库 离散数学 \n");
	printf("当输入姓名为<End>结束录入\n");
    while(1)                                
	{
        scanf("%s",xs.name);
        if(strcmp(xs.name,"End")==0) break;   //判断姓名是否为LAST,用字符串判断
        scanf("%d%f%f%f%f",&xs.num,&xs.c,&xs.by,&xs.sjk,&xs.lssx);
        fwrite(&xs,sizeof(stu),1,fp);        //将成绩信息写入文件
	}
    fclose(fp);
}
//姓名定义

void xingming()
{
    FILE *fp;
    stu xs;
    char name[10];
    printf("\n请输入需要查询的学生姓名: ");
	scanf("%s",name);
    if((fp=fopen("student.dat","rb"))==NULL) 
	{
	   printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))                           //判断文件是否到达末尾,即读取文件失败时
	{
        fread(&xs,sizeof(stu),1,fp);
        if(strcmp(xs.name,name)==0)//按姓名查询时判断输入的姓名是否存在,会循环从数据中找取
		{
           printf(" 学生的信息如下:\n");
           printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
           printf("%10s %6d %6.2f %6.2f   %6.2f  %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
           break;
		}
	}
    if(feof(fp))
		printf("ERROR,查找失败!!!"); /*学生不存在*/
    fclose(fp);
}

//学号定义

void xuehao()
{
    FILE *fp;
    stu xs;
    int num;
    printf("\n请输入需要查询的学生学号: ");
	scanf("%d",&num);
    if((fp=fopen("student.dat","rb"))==NULL)
	{
	    printf("can't open the file");exit(0);
	}
    while(!feof(fp))
	{
        fread(&xs,sizeof(stu),1,fp);
        if(xs.num==num)/*按学号查询时判断输入的学号是否存在,会循环从数据中找取*/
		{
             printf(" 学生的信息如下:\n");
           printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
           printf("%10s %6d %6.2f %6.2f   %6.2f   %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
             break;
		}
	}
     if(feof(fp)) 
		 printf("ERROR,查找失败!!!");
     fclose(fp);
}

//查询

void search()
{
	char ch1;
	system("cls");
    printf("请选择何种方式查询<编号>:\n");
    printf("1->姓名,2->学号:");
    ch1=getchar();              /*用字符接收*/
    switch(ch1)                 /*判断*/
  {
    case '1':xingming();break;
    case '2':xuehao();break;
  }
getch();                       /*让屏幕停留同时按任意键返回*/ }

//修改:输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;

void modify1()
{

    stu xs;
    FILE *fp;
    char name[10];
    printf("\n请输入要修改的学生姓名: ");
	scanf("%s",name);
    if((fp=fopen("student.dat","rb+"))==NULL)
	{
     	printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))
	{
         fread(&xs,sizeof(stu),1,fp);
         if(strcmp(xs.name,name)==0)                      /*判断输入要修改的姓名是否存在*/
		 {
            printf(" 修改前学生的信息:\n");
            printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
            printf("%10s %6d %6.2f %6.2f  %6.2f  %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
            printf("\n请依次输入 C语言 编译原理 数据库 离散数学的成绩:");
			scanf("%f%f%f%f",&xs.c,&xs.by,&xs.sjk,&xs.lssx);
            break;
		 }
	}
    if(!feof(fp))
	{
         printf(" \n 修改后的学生的信息如下:\n");
         printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
         printf("%10s %6d %6.2f %6.2f  %6.2f  %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
		 fseek(fp,-sizeof(stu),1);   //负号表示后退,1表示文件当前位置
		 fwrite(&xs,sizeof(stu),1,fp);  //再重新写入,同时把之前的要修改的覆盖掉
	}
    else
         printf("\nERROR,学生不存在,修改失败!!");
    fclose(fp);
	getch();
    
}

//修改:输入学生的学号,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;

void modify2()
{
    stu xs;
    FILE *fp;
    int num;
    printf("\n请输入要修改的学生学号: ");
	scanf("%d",&num);
    if((fp=fopen("student.dat","rb+"))==NULL)
	{
	    printf("can't open the file!\n");exit(0);
	}

    while(!feof(fp))
	{
       fread(&xs,sizeof(stu),1,fp);
         if(xs.num==num)/*判断输入要修改的姓名是否存在*/
		 {
            printf(" 修改前学生的信息如下:\n");
            printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
            printf("%10s %6d %6.2f %6.2f  %6.2f  %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
            printf("\n请依次输入C语言 编译原理 数据库以及离散数学的成绩:");
			scanf("%f%f%f%f",&xs.c,&xs.by,&xs.sjk,&xs.lssx);
            break;
		 }
	}
    if(!feof(fp))
	{
        printf(" \n 修改后的学生的信息如下:\n");
         printf("\n%10s %6s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
         printf("%10s %6d %6.2f %6.2f  %6.2f  %6.2f \n",xs.name,xs.num,xs.c,xs.by,xs.sjk,xs.lssx);
		fseek(fp,-sizeof(stu),1);
		fwrite(&xs,sizeof(stu),1,fp);
	}
    else
        printf("\nERROR,学生不存在,修改失败!!");
	getch();
    fclose(fp);
    
}
//选择修改方式
void modiway()
{
    char ch1;
    system("cls");
    printf("请输入按何种方式修改<编号>:\n");
    printf("1->姓名,2->学号:");
    ch1=getchar();       /*用字符接收*/
    switch(ch1)          /*判断*/
	{
      case '1':modify1();break;
      case '2':modify2();break;
	}

    getch();/*让屏幕停留同时按任意键返回*/ 
}

//插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果
void insert()
{
	int i=0,j,k,lenth;
    FILE *fp;
    stu s,xs[N];
    system("cls");
    printf("\n请输入添加的学生的姓名:");
	scanf("%s",&s.name);
    printf("\n学生的学号:");scanf("%d",&s.num);
    printf("\n学生的成绩:C语言、编译原理、数据库、离散数学:");scanf("%f %f %f %f",&s.c,&s.by,&s.sjk,&s.lssx);
    printf("\n请输入插入到第几行:");scanf("%d",&k); 
    if((fp=fopen("student.dat","rb"))==NULL)
	{
	    printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))
	{
        fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
        if(feof(fp)) break;
        i++;
	}
    fclose(fp);
    lenth=i;                            //记录此时lenth最大
    if(k<lenth && k>=0)                 /*k的位置要位于数组范围之内*/
	{
       for(j=lenth-1;j>=k;j--)
           xs[j+1]=xs[j];               /*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/
           xs[k]=s;                     /*将输入的学生信息加入这个k位置*/
           lenth++;                   //增加一个学生空间,否则会少一个数据
       if((fp=fopen("student.dat","wb"))==NULL)
	   {
	        printf("不能建立文件!!\n");exit(0);
	   }
       for(i=0;i<lenth;i++)
       fwrite(&xs[i],sizeof(stu),1,fp);  //存入数据
	}
    else/*不再数组范围之内*/
	{
        if((fp=fopen("student.dat","ab"))==NULL) 
		{
	       printf("不能建立文件!!\n");exit(0);
		}
    fwrite(&s,sizeof(stu),1,fp);
	}
	fclose(fp);
}

//显示

void print()
{
    FILE *fp;
    stu s;
    system("cls");
    if((fp=fopen("student.dat","rb"))==NULL)
	{
	    printf("can't open the file!\n");exit(0);
	}
    printf("\n%10s %s %6s %6s %6s %6s \n","姓名","学号","C语言","编译原理","数据库","离散数学");
    while(!feof(fp))
	{
        fread(&s,sizeof(stu),1,fp);  //从文件中读取成绩信息
           if(feof(fp)) break;       //判断是否文件尾
              printf("%10s %4d %6.2f %6.2f  %6.2f  %6.2f \n",s.name,s.num,s.c,s.by,s.sjk,s.lssx);
	}
    fclose(fp);
    getch();
}

//删除:输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息

void delete1()
{

    stu xs[N];
    FILE *fp;
    char name[10];
    int i=0,len,k=-1/*k<0是为后面if判断用的*/;
    system("cls");
    printf("\n请输入要删除的学生姓名: ");scanf("%s",name);
    if((fp=fopen("student.dat","rb+"))==NULL) 
	{
	    printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))
	{
       fread(&xs[i],sizeof(stu),1,fp);
       if(feof(fp)) break;
       if(strcmp(xs[i].name,name)==0) k=i;
       i++;
	}
    fclose(fp);

//以下是删除后重新写文件

    len=i;/*结构体数组上限*/
    if(k>=0)/*k>0说明找到删除学生位置*/
	{
      if((fp=fopen("student.dat","wb+"))==NULL) 
	  {
	      printf("can't open the file!\n");exit(0);
	  }
      for(i=0;i<len;i++)
	  {
      if(i==k) continue;/*从这个位置开始写入*/
      fwrite(&xs[i],sizeof(stu),1,fp);
	  }
      fclose(fp);
	}
      else {printf("ERROR,删除失败!!!\n");getch();} /*失败后重新返回菜单*/
      print();
}


//删除:输入学生学号,若该学生存在,则删除,并显示删除后余下的学生成绩信息

void delete2()
{
    stu xs[N];
    FILE *fp;
    int num;
    int i=0,len,k=-1/*k<0是为后面if判断用的*/;
    system("cls");
    printf("\n请输入要删除的学生学号: ");
	scanf("%d",&num);
    if((fp=fopen("student.dat","rb+"))==NULL) 
	{
	printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))
	{
        fread(&xs[i],sizeof(stu),1,fp);
        if(feof(fp)) break;
        if(xs[i].num==num)
			k=i;
            i++;
	}
    fclose(fp);
//以下是删除后重新写文件

    len=i;/*结构体数组上限*/
    if(k>=0)/*k>0说明找到删除学生位置*/
	{
    if((fp=fopen("student.dat","wb+"))==NULL) 
	{
	     printf("can't openfile!\n");exit(0);
	}
    for(i=0;i<len;i++)
	{
       if(i==k) continue;/*从这个位置开始写入*/
       fwrite(&xs[i],sizeof(stu),1,fp);
	}
    fclose(fp);
	}
    else {printf("ERROR,删除失败!!!\n");getch();} /*失败后重新返回菜单*/
    print();
}


//删除

void deleteway()
{
    char ch1;
    system("cls");
    printf("请输入按何种方式删除:\n");
    printf("1->姓名,2->学号:");
    ch1=getchar();/*用字符接收*/
    switch(ch1)/*判断*/
	{
	case '1':delete1();break;
    case '2':delete2();break;
	}
	getch();/*让屏幕停留同时按任意键返回*/
}

//统计C语言成绩情况

void count() 
{
    int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;   //j,k,m,l分别是指各个分数段,n,p,q,r也是
    FILE *fp;
    stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
    system("cls");
    if((fp=fopen("student.dat","rb"))==NULL)
	{
	    printf("can't open the file!\n");exit(0);
	}
    while(!feof(fp))
	{
        fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/
        if(feof(fp)) break;  //到文件末尾中断程序
	}
    t=i;i=0;           //t 指最大
    for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/
	{
        if(s[i].c<60) 
		{
			p1[j++]=&s[i++];continue;
		}                                     /*每个学生信息只能位于一个分数段*/
        if(s[i].c>=60 && s[i].c<80) 
		{
			p2[k++]=&s[i++];continue;
		}
        if(s[i].c>=80 && s[i].c<90) 
		{
			p3[l++]=&s[i++];continue;
		}
        if(s[i].c>=90)
		{
			p4[m++]=&s[i++];continue;
		}
	}
    printf("     不及格:姓名 学号 C语言\n");
    for(n=0;n<j-1;n++)
	{
        printf("%14s %4d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);      //逐个显示个分数段信息,显示上面指针的内容
	}
    printf(" 60-79分之间:姓名 学号 C语言\n");
    for(p=0;p<k;p++)
	{
        printf("%16s %4d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
	}
    printf(" 80-89分之间:姓名 学号 C语言\n");
    for(q=0;q<l;q++)
	{
        printf("%16s %4d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
	}
    printf("90以上:姓名 学号 C语言\n");
    for(r=0;r<m;r++)
	{
        printf("%12s %4d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
	}
    fclose(fp);
    getch();
}


//菜单选择

void main()
{
	char ch;
    while(1)
	{
      menu();// 显示菜单
      ch=getch();//选择菜单
      if(ch=='0') 
		  break;
      switch(ch)//判断功能项
	  {
      case '1':input();break;
      case '2':search();break;
      case '3':modiway();break;
      case '4':insert();break;
	  case '5':deleteway();break;
      case '6':print();break;
	  case '7':count();break;
	  }
	} 
	printf("\n\n\n\t\t\t\tWelcome to use,Goodbye!\02!\n");
}

 

  • 51
    点赞
  • 246
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核的无脸man~

你的鼓励是我创作的最大功力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值