经典实验--学生成绩管理系统

时间:2024-03-05 19:31:26

·一、实验目的

实验目的:数组,结构体,指针,文件,动态分配内存等知识的综合应用

 

·二、实验原理

  在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号、姓名、各科名称和成绩等并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找、浏览、插入、排序、保存。

要求:

1、提供用户界面

2、每一条记录包括一个学生的学号、姓名、三门课成绩、平均成绩

3、输入功能:可以一次完成若干条记录的输入

4、显示功能:完成全部学生记录的显示

5、查找功能:完成按姓名查找学生记录,并显示

6、排序功能:按学生平均成绩进行排序

7、插入功能:按平均成绩高低插入一条学生记录

8、将学生记录存在文件score中

 

·三、主要数据结构

1、数据结构的设计(写出构造的数据类型,即自己定义的结构体)

struct student

{

       char No[10];

       char name[20];

       int subject1;

       int subject2;

       int subject3;

       float average;

};

 

2、算法分析(写出所定义的函数的原型及函数的功能,写出每个函数功能的实现过程或者画出流程图

 

·四、实验结果及分析

1、测试结果截图

 

 

·五、心得体会

  首先要先弄清楚目的需求,需要实现什么,然后再去设计思路,经需要什么功能,之后在缕顺思路,编写代码,设计界面,最后进行试验测试。

对实验不能糊弄,努力把代码摩纳哥清楚,不能模棱两可。

 

··六、源文件

(1)主函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000
struct student            //结构体设计
{
    char No[10];
    char name[20];
    int subject1;
    int subject2;
    int subject3;
    float average;
};
int p=1;//判断是否有数据
int n=0;
struct student *stu=NULL;//
void menu();
void input();
void sort();
void fileoutput();
void find();
void show();
void insert();
void fileinput();
int main()
{
    fileinput();//从文件读取数据
    int flag;
    int first=0;
    menu();
    if(p==0)
    {
        printf("首先请输入学生人数,最多人数为1000位!\n");
        scanf("%d",&n);
    }
    if(p==0)
        printf("\n初次选择,输入请选择 0:");
    else
        printf("已有数据,请选择其他操作,若要重新输入,请选择 0:");
    while(1)
    {
        if(first==1)
            printf("\n请继续选择操作的序号:");
        else 
            first++;
        scanf("%d",&flag);
        if(flag ==-1)
            break;
        switch(flag)
        {
            case 0:input();break;//输入n个学生成绩
            case 1:find();break;//输入学生姓名查找
            case 2:sort();break;//将学生成绩从小到大排序
            case 3:show();break;//显示所有学生成绩 
            case 4:insert();break;//按平均成绩高低插入一条学生记录
            case 5:menu();break;//调出菜单 
            default:printf("本次选择不成功!\n");
        }
    }
    fileoutput();//将所有学生成绩保存到score文件中
}

(2)菜单

void menu()//菜单
{
    printf("                   学生成绩管理系统                    \n");
    printf("***************************************************\n");
    printf("*   请选择操作的序号,如果输入-1,程序结束         *\n");
    printf("*                                                 *\n");
    printf("*   0 输入n个学生信息         1 输入学生姓名查找  *\n");
    printf("*                                                 *\n");
    printf("*   2 将学生成绩从小到大排序  3 显示所有学生成绩  *\n");
    printf("*                                                 *\n");
    printf("*   4 插入一条学生记录        5 显示菜单          *\n");
    printf("*                                                 *\n");
    printf("***************************************************\n");
} 

 

(3)输入函数

void input()//输入n个学生成绩
{
    int i,j,num=1;
    char a[10];
    stu = (struct student*)malloc(sizeof(struct student)*n);
    for(i=0;i<n;i++)
    {
        printf("请输入第%d个学生的信息:\n",num);
        num++;
        gets(a);//防止回车键占用学号位置; 
        printf("学号:");
        gets(stu[i].No);
        printf("姓名:");
        gets(stu[i].name);
        printf("三科成绩:\n");
        scanf("%d%d%d",&stu[i].subject1,&stu[i].subject2,&stu[i].subject3);
        stu[i].average=stu[i].subject1+stu[i].subject2+stu[i].subject3;
        stu[i].average=stu[i].average/3;
    }
    printf("一共%d个学生信息输入完毕\n",n);
    printf("输入5返回主菜单");
    scanf("%d",&j);
    if(j==5) 
        {system("cls");//清屏
        menu();
        }
}

(4)查询函数

void find()//输入学生姓名查找并输出该学生信息
{    int k;
    printf("请输入要查找的学生姓名:");
    char a[10];
    gets(a);//防止回车键占用学号位置;
    char name[20];
    gets(name);
    int i,j=1001;
    for(i=0;i<n;i++)
    {
        if((strcmp(name,stu[i].name))==0)
            j=i;
    }            
    if(j==1001)
        printf("没有此学生!\n");
    else
    {
        printf("成功已找到此姓名的学生\n");
        printf("学号:");
        puts(stu[j].No);
        printf("姓名:");
        puts(stu[j].name);
        printf("三科成绩:%d %d %d\n平均成绩:%.2f\n",stu[j].subject1,stu[j].subject2,stu[j].subject3,stu[j].average);
    }
    printf("输入5返回主菜单");
    scanf("%d",&k);
    if(k==5) 
        {system("cls");//清屏
        menu();
        }
}

(5)排序函数

void sort()//将学生成绩从小到大排序
{
    struct student t;
    int min;
    int i,j,k,num;
    for(j=0;j<n;j++)
    {    
        min=stu[j].average;
        num=j;
        for(i=j;i<n;i++)
        {
            if(stu[i].average<min)
            {
                num=i;
                min=stu[i].average;
            }
        }
        t=stu[j];
        stu[j]=stu[num];
        stu[num]=t;
    }
    show();
    printf("已按照平均成绩从低到高排序完毕!\n");
    printf("输入5返回主菜单");
    scanf("%d",&k);
    if(k==5) 
        {system("cls");//清屏
        menu();
        }
}

(6)输出文件函数

void fileoutput()//将所有学生成绩输出到score文件中
{
    int k;    
    char filename[]={"score.txt"};
    FILE *in;
    if((in=fopen(filename,"w"))==NULL)
        printf("无法打开此文件\n");
    else
    {
        int i;
        fprintf(in,"%d\n",n);
        for(i=0;i<n;i++)
            fwrite(&stu[i],sizeof(struct student),1,in);
        fclose(in);
        printf("已成功将学生记录保存于score文件中\n");
    }
    free(stu);
    stu = NULL;
    if(k==5) 
        {system("cls");//清屏
        menu();
        }
}

(7)show函数

void show()//显示所有学生成绩
{
    printf("以下是所有学生信息:\n");
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("学号:");
        puts(stu[i].No);
        printf("姓名:");
        puts(stu[i].name);
        printf("三科成绩:%d %d %d\n平均成绩:%.2f\n",stu[i].subject1,stu[i].subject2,stu[i].subject3,stu[i].average);
        printf("\n");
    }
    printf("输入5返回主菜单");
    scanf("%d",&j);
    if(j==5) 
        {system("cls");//清屏
        menu();
        }
}

(8)插入函数

void insert()//按平均成绩高低插入一条学生记录
{    int j;
    struct student *newbase = (struct student *)realloc(stu,sizeof(struct student)*(n+1));
    stu = newbase;
    
    int *m=&n;
    printf("请输入要插入的学生的信息:\n");
    struct student stu1; 
    char a[10];
    gets(a);//防止回车键占用学号位置; 
    printf("学号:");
    gets(stu1.No);
    printf("姓名:");
    gets(stu1.name);
    printf("三科成绩:\n");
    scanf("%d%d%d",&stu1.subject1,&stu1.subject2,&stu1.subject3);
    stu1.average=stu1.subject1+stu1.subject2+stu1.subject3;
    stu1.average=stu1.average/3;
    int num;
    int i;
    for(i=1;1;i++)
    {
        if(stu1.average<stu[0].average)
        {
            num=0;
            break;
        }
        else if(stu1.average>stu[*m-1].average)
        {
            num=*m;
            break;
        }
        else if(stu[i-1].average<stu1.average&&stu1.average<stu[i].average)
        {
            num=i;
            break;
        }
    }
    struct student t;
    for(i=*m-1;i>=num;i=i-1)//将num后的向后平移一个 
    {
        stu[i+1]=stu[i];
    }
    stu[i+1]=stu1;
    *m=*m+1;
    
    show();
    printf("已成功插入该学生的信息\n");
    printf("输入5返回主菜单");
    scanf("%d",&j);
    if(j==5) 
        {system("cls");//清屏
        menu();
        }
}

(9)读文件函数

void fileinput()//从文件中读取数据
{
    char filename[]={"score.txt"};
    FILE *in;
    if((in=fopen(filename,"r"))==NULL)
    {
        printf("无法读取数据\n");
        p=0;
    }
    else
    {
        fscanf(in,"%d\n",&n);
        stu = (struct student*)malloc(sizeof(struct student)*n);
        int i;
        for(i=0;i<n;i++)
            fread(&stu[i],sizeof(struct student),1,in);
        fclose(in);
        printf("已成功从score文件中将学生记录读取\n");    
    }
}