基于数组的学生信息管理系统实验报告

时间:2024.4.13

《C语言程序设计实训1》报告

设   计   题  目:  基于数组的学生信息管理系统                                                                                                      

学   院  名   称:     信息科学技术学院         

专            业:     软件工程                 

班            级:     x                       

姓            名:    xxx  学  号 xxx

    提   交   日  期:       20146             

一、实验内容

编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。N定义为符号常量(学生数)。全局类型的定义如下:

 

二、实验要求  

(1)    main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。

STU student[N]; //保存输入的N名学生信息

(2)    定义函数Input:从键盘输入N个学生的信息。

(3)    定义函数Save:将学生信息存入文件。

(4)    定义函数Output:将某个学生信息表格化屏幕输出。

(5)    定义函数Fetch:从文件中随机读取第n个(0<=n<=N-1)学生的信息。

(6)    定义函数Max:求所有学生某门课程的最高分和分数最高的学生的姓名。

(7)    定义函数Sort_select:对所有学生,按平均成绩由低到高进行简单选择排序。

(8)    定义函数Sort_buble:对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出。

定义局部变量:

STU stu_class_ave[N]; //按平均成绩排序后的某个班级的学生信息;

int count; //实际元素个数

(9)    定义函数Sort_insert:对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出。

定义局部变量:

STU stu_class_ subject [N]; //按某门课程成绩排序后的某个专业的学生信息;

int count; //实际元素个数

(10)定义函数Search:实现班级和成绩的综合查找(如1班,总分240分以上同学)。

三、算法流程图

函数Sort_select的算法流程图

四、程序清单(关键语句和变量加注释)

#include<stdio.h>//预编译的文件包含指令

#include<stdlib.h>//exit()的函数声明

#include<string.h>//字符串的头文件

//------------------------------------------类型定义--------------------------------------------------------------

struct Student

{      char num[15];//学号

       char name[15];//姓名

       char major[10];//专业(computer,software,network)

       int classNo;//班级(1-2)

       int score[3];//3门课的成绩(0-2)

};

typedef struct Student STU;

//---------------------------------------------函数声明-----------------------------------------------------------

void input(STU *p);//从键盘输入N个学生的信息

void save(STU *p,int n);//将学生信息存入文件

void output(STU *p);//将某个学生信息表格化屏幕输出

void fetch();//从文件中随机读取第n个(0<=n<=N-1)学生的信息

void Max();//求所有学生某门课程的最高分和分数最高的学生的姓名

void sort_buble();//对某个班级的学生,按平均成绩由高到低进行起泡排序。并调用Output输出

void sort_insert();//对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。并调用Output输出

void sort_select();//对所有学生,按平均成绩由低到高进行简单选择排序

void search();//实现班级和成绩的综合查找(如1班,总分240分以上同学)

//----------------------------------------主函数开始--------------------------------------------------------------

#define N 10//数组长度定义为10

void main()//以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数

{  

       int j,id;

       STU student[N];//用于保存输入的N名学生信息

       while(1)

{

              printf("\n请输入功能编号,运行系统相应功能\n");

              printf("1-输入学生信息\n2-信息存盘\n3-从文件中随机读取某个学生的信息\n");

           printf("4-输出所有学生某门课程的最高分和分数最高的学生的姓名\n5-对所有学生按总平均成绩由低到高排序\n");

              printf("6-对某个班级学生按总平均成绩由高到低排序\n7-对某个专业的学生按某门课程成绩由低到高排序\n");

              printf("8-实现班级和成绩的综合查找\n");

        scanf("%d",&id);//输入功能编号,运行系统相应功能

              getchar();//吸收回车键

              switch(id)

              {

              case 1:

              {

                     for(j=0;j<N;j++)//输入信息

                     {

                            printf("第%d个\n",j+1);

                            input(student+j);

                     }

                         break;

              }

              case 2:

              {    

                     save(student,N);//存储信息

                     break;

              }

              case 3:

              {  

                     fetch();//随机读取

                     break;

              }

              case 4:

              {

                     Max();//最高分

                     break;

              }

              case 5:

              {

                     sort_select();//所有总平均成绩排序

                     break;

              }

              case 6:

              {

                     sort_buble();//某班级总平均成绩排序

                     break;

              }

              case 7:

              {

                     sort_insert();//某专业课程排序

                     break;

              }

              case 8:

              {

                     search();//综合查找

                     break;

              }

      

              default://不符合8个常量

                     {

                     break;

              }

       }

       if((id)<1||(id)>8)

              break;//break while

       }

}

//--------------------------------------------------输入函数---------------------------------------------------

void input(STU *p)

{

       int i;

       printf("学号(回车结束): ");

       scanf("%s",&((*p).num));//获得字符串1

       getchar();//吸收回车键

       printf("姓名(回车结束): ");

       gets(p->name);//获得字符串2

       printf("专业(回车结束): ");

       gets(p->major);

       printf("班级(回车结束): ");

       scanf("%d",&((*p).classNo));

       printf("三门成绩(每门回车结束):");

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

       {

              scanf("%d",&((*p).score[i]));

             

       }

       getchar();

}

//--------------------------------------------------写文件函数----------------------------------------------

void save(STU *p,int n)

{

    FILE *fp;//定义指向文件额指针变量

       int i;

       char filename[20];//定义文件名长度为20

       printf("输入要保存的文件名:\n");

       gets(filename);//获取文件名

    if((fp=fopen(filename,"w"))==NULL)//以写的方式在当前目录打开(创建)文件

       {

        printf("open error!\n");

        exit(0);//如果文件无法打开,关闭已经打开的其他文件,结束程序

       }

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

    {

              if(fwrite(p++,sizeof(STU),1,fp)!=1)//向文件中国一次写一个结构体量值

          printf("write error!\n");

       }

      

    fclose(fp);//关闭文件

}

//--------------------------------------------------输出文件------------------------------------------------------

void output(STU *p)

{

    printf("%-10s%-10s%-10s%d     %d      %d      %d\n", p->num, p->name,p->major,

       p->classNo,p->score[0],p->score[1],p->score[2]);

}

//--------------------------------------------------随机读取-----------------------------------------------------

void fetch()

{

    FILE *fp;

       STU student;

       int i;

    char filename[20];

       printf("输入要读取的文件名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("open  error!\n");

        exit(0);

       }

       printf("请输入要查找某个的学生号码(0-9):");

    scanf("%d",&i);

    fseek(fp,i*sizeof(STU),0); //根据参数n调整文件指针位置

    if((fread(&student,sizeof(STU),1,fp))!=1)//从文件中一次读1个结构体量值

    exit(0);

       printf("学号        姓名    专业     班级  成绩0   成绩1    成绩2\n");//输出结构体

    output(&student);

       fclose(fp);

}

//--------------------------------------------------------最大值---------------------------------------------------

void Max()

{

    int i,j;

    FILE *fp;

       STU student[N],*max;//最大值的指针变量

     char filename[20];

       printf("输入要读取的文件夹名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("read error!\n");

        exit(0);

       }

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

    if((fread(&student[i],sizeof(STU),1,fp))!=1)//从文件一次读一个结构体量值

        exit(0);

    printf("请输入要查找的课程(0-2):");

    scanf("%d",&j);//获取课程编号

    if(j>2||j<0)printf("您查找的内容不存在!");

       max=&student[0];

       for(i=0;i<N-1;i++)//筛选出最大值

    if(max->score[j]<student[i+1].score[j])

       {

        max=&student[i+1];

       }

    printf("%d课程的最高分是%d,学生姓名为%s\n",j,max->score[j],max->name);//!!

       fclose(fp);

}

//-------------------------------------------------所有学生选择排序----------------------------------------

void sort_select()

{

       int i,j,k;

    double ave[N];//平均成绩

       FILE *fp;

       STU student[N],t;

    char filename[20];

       printf("输入要读取的文件夹名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("open error!\n");

        exit(0);

       }

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

    if((fread(&student[i],sizeof(STU),1,fp))!=1)

    {printf("read error!\n");

       exit(0);}

       for(i=0;i<N;i++)//计算平均分

       ave[i]=(student[i].score[0]+student[i].score[1]+student[i].score[2])/3.0;

       for(i=0;i<N-1;i++)//选择排序

       {

              k=i;

       for(j=i+1;j<N;j++)

          if(ave[j]<ave[k])

          {       k=j;//如果j的平均分高于i,成绩和编号进行交换

               t=student[k];

               student[k]=student[i];

               student[i]=t;

          }

        }

          printf("按平均成绩由低到高排序依次为:\n");

          printf("学号        姓名    专业     班级  成绩0   成绩1    成绩2\n");

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

         output(student+i);//由低到高输出

            fclose(fp);

}

//---------------------------------------班级起泡排序------------------------------------------------------------

void sort_buble()

{

    STU stu_class_ave[N];//按平均成绩排序后的某个班级的学生信息

    FILE *fp;

       STU student[N],stu;

    char se_maj[15];//专业

    double ave[N];//平均成绩

    int count=0;//实际元素个数

     int i,j,se_no;//班级

       char filename[20];

       printf("输入要读取的文件夹名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("open error!\n");

        exit(0);

       }

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

    if((fread(&student[i],sizeof(STU),1,fp))!=1)

    {printf("read error!\n");

       exit(0);} 

       fclose(fp);

    printf("请输入要查找的专业(computer,software,network ):");

    gets(se_maj);

       printf("请输入要查找的班级(1-2):");

    scanf("%d",&se_no);

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

       {

        if(strcmp(student[i].major,se_maj)==0&&student[i].classNo==se_no)//用比较法将相同专业和班级人员的计数 

              {

                     stu_class_ave[count]=student[i];

                     count++;

              }

       }

    for(i=0;i<count-1;i++)//计算实际元素的平均分

    ave[i]=(stu_class_ave[i].score[0]+stu_class_ave[i].score[1]+stu_class_ave[i].score[2])/3.0;

    for(i=0;i<count-1;i++)//起泡排序

       { 

              for(j=0;j<count-i-1;j++)

              {

                     if(ave[j]<ave[j+1])//当后一个数大于前一个数,交换数值

                     {

                         stu=stu_class_ave[j+1];

                      stu_class_ave[j+1]=stu_class_ave[j];

                      stu_class_ave[j]=stu;

                     }

              }

       }

   printf("学号        姓名    专业     班级  成绩0   成绩1    成绩2\n");

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

   output(&stu_class_ave[i]);//由高到低输出

   fclose(fp);

}

//---------------------------------------------------某课程插入排序--------------------------------------------

void sort_insert()

{

  

    int count=0;//实际元素个数

       int i,j,k,c;

    char se_major[15];//专业

       STU student[N],stu[N];

    STU stu_class_subject[N];//按某门课程成绩排序后的某个专业的学生信息

       FILE *fp;

      char filename[20];

       printf("输入要读取的文件夹名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("open error!\n");

        return;

       }

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

    if((fread(&student[i],sizeof(STU),1,fp))!=1)

         return;

    printf("请输入您要查找的专业(computer,software,network):");

       gets(se_major);

       printf("请输入您要查找的课程(0-2):");

    scanf("%d",&c);

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

       {    if(strcmp(student[i].major,se_major)==0)//计数

        {

                     stu_class_subject[count]=student[i];

            count++;

              }

       }

    for(i=1;i<count;i++)//插入排序

       {  

              for(j=i-1;j>=0;j--)

              {     if(stu_class_subject[j].score[c]<stu_class_subject[i].score[c])

                  break;

              }

      

              if(j!=i-1)

              {   stu[0]=stu_class_subject[i];

                  for(k=i;k>=j+1;k--)

                     {stu_class_subject[k]=stu_class_subject[k-1];}

                      stu_class_subject[j+1]=stu[0];//插入位置

              }

       }

    printf("排序后的信息为:\n");

       printf("学号        姓名    专业     班级  成绩0   成绩1    成绩2\n");

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

   {output(&stu_class_subject[i]);}//由低到高输出

    fclose(fp);

}

//-----------------------------------------------------------查找---------------------------------------------------

void search()

{

    int i,k,count=0;

    int sum[N],fscore;

    FILE *fp;

       STU student[N],stu[N];

     char filename[20];

       printf("输入要读取的文件夹名:\n");

       gets(filename);

    if((fp=fopen(filename,"r"))==NULL)

       {

        printf("open error!\n");

        exit(0);

       }

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

    if((fread(&student[i],sizeof(STU),1,fp))!=1)

        exit(0);

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

       {sum[i]=student[i].score[0]+student[i].score[1]+student[i].score[2];}//计算总分

    printf("请输入要查找的班级、分数下限:");

    scanf("%d%d",&k,&fscore);

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

    {

              if(student[i].classNo==k&&fscore<=sum[i])//计数

              {stu[count]=student[i];

              count++;}

       }           

      

                   printf("学号        姓名    专业     班级  成绩0   成绩1    成绩2\n");

                            for(i=0;i<count-1;i++)

                            output(stu+i);

       fclose(fp);

}

五、程序测试(输入、输出的截图及文件的内容)

六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)

更多相关推荐:
学生信息管理系统实验报告

西安郵電學院数据库原理及应用设计报告题目:学生信息管理系统一.设计目的学生管理系统是高校管理工作中一项非常重要的组成部分。用户的需求具体体现在各种信息的提供、保存、更新和查询方面,这就要求数据库结构能充分满足各…

学生信息管理系统课程设计报告

数据库课程设计报告指导老师贺亚茹组名组长组员完成日期成绩数据库课程设计报告一项目名称学生信息管理系统二项目需求分析1项目需求分析简介本数据库的用户主要是学生通过对用户需求的收集和分析获得用户对数据库的如下要求1...

学生信息管理系统实验报告

学生信息管理系统实验报告班级10网工三班学生姓名谢昊天学号1215134046实验目的和要求实验目的1加深理解Windows程序设计的基本概念2基于单文档的应用程序的创建3学会对话框及相关控件的创建4熟悉基本的...

C语言 学生信息管理系统实验报告

学生管理系统实验报告一实验目的上学期学习了C语言的内容学生信息管理系统有助于对C语言的学习的进一步巩固在本系统可以增强对指针数组文件函数等基本知识的进一步理解另外学生管理系统也是学校常用的基本系统之一它有助于学...

UML学生的信息管理系统__实验报告

面向对象分析与设计期末实验设计题目学生信息管理系统姓名学院电子信息工程学院系别计算机科学与技术班级网络工程1班A部分需求分析一实验目的利用所学的UML建模知识设计学生信息管理系统由于信息技术的急剧发展和配合管理...

学生管理系统实验报告

学生成绩管理系统实验报告目录一开发目的2二项目描述2三系统目标2四系统结构图3五负责模块3六实验过程41系统界面设计42成绩信息管理模块5七实验总结6一开发目的21世纪以来人类经济高速发展人们发生了日新月异的变...

C语言学生信息管理系统实训报告

实训报告题目学生信息管理系统院系信息科技学院专业电子信息工程姓名殷浩学号1152100135指导教师杨呈永日期20xx年6月26日桂林电子科技大学信息科技学院学生信息管理系统本题目设计目的是训练学生的基本编程能...

VB学生信息管理系统实验报告

一开发简介本系统主要包括信息录入信息查询关闭系统三部分其功能主要有有关学生信息的录入包括录入学生基本信息学生考试成绩等2学生信息的查询包括查询学生的个人基本信息科目考试成绩二开发流程学生信息管理系统由用户登陆学...

C语言课程设计报告_--学生成绩管理系统{修}

内蒙古科技大学课程设计论文内蒙古科技大学本科生课程设计论文题目学生成绩管理系统学生姓名胡书培学号1067111106专业计算机科学与技术班级10级计算机1班指导教师周李涌20xx年12月30日1内蒙古科技大学课...

管理系统信息课程设计之学生信息管理系统设计报告

学生信息管理系统设计报告一设计目的作为C课程结课设计验证自身的学习效果同时希望利用所学的基本知识和技能进行简单数据库应用程序设计希望通过项目实践熟悉巩固所学知识以使自身达到熟练掌握NET基本结构以及C语言的基本...

基于java的学生信息管理系统设计报告

南华大学计算机科学与技术学院课程设计报告20xx20xx学年度第1学期课程名称网络编程技术题目基于java的学生信息管理系统姓名刘亮学号20xx4440437专业计算机科学与技术班级03级04班地点专业实验室教...

学生成绩管理系统实验报告 吕杨

数据库系统原理实验报告实验名称学生成绩管理系统院系计算机与信息工程学院班级20xx级计算机科学与技术二班姓名吕杨学号1308114162计算机与信息工程学院数据库系统原理实验报告一实验目的1熟悉并掌握数据库系统...

学生信息管理系统实验报告(27篇)