学生成绩管理系统怎么做

img

试编写一管理 系统,要求如下:

1)实现对两个文件数据进行合并, 生成新文件3. txt .

  1. 抽取出三科成绩中有补考的学生并保存在一-个新文件4. txt

3)对 合并后的文件3. txt中的数据按总分降序排序

4)输入一个学生姓 名后,能查找到此学生的信息并输出结果

5)要求使用结构体, 链或数组等实现上述要求.

参考


学生成绩管理系统(C语言)_void deletee()//删除学生信息{ int i; while (1) { char id_张十五的博客-CSDN博客 思路学生成绩管理系统,首先要初始化系统,开始一个新的学生成绩系统初始化记录学生姓名,学号,院系,然后输入学生各科成绩,数学,英语,语文成绩。记录完各课成绩以后,可查看学生平均成绩和是否及格,成绩查询其中有学号查询,姓名查询,院系查询,还有全部输出,可以清晰的看到及格人数,按照分数高低排列,最后还可以添加和删除学生成绩,或者更改学生成绩,避免人为录入成绩错误。基本函数1.结构体 struct Student定义一个结构体struct,结构体的关键字,students定义的结构体对象。学... https://blog.csdn.net/weixin_43887148/article/details/116887706

#include<stdio.h>
#include<string.h>    //比较字符串头文件//
#include<stdlib.h>   //实时检测总数头文件//
#define N 1000       //控制最大输入//
int n=0;             //实时检测的总数n//
 
/*定义结构体students*/                                                                           
struct students
{
   int num;          //学号-整型//
   char name[8];     //姓名-字符型//
   char chinese;     //大学语文-字符型//
   char math;        //大学数学-字符型//
   char computer;    //计算机-字符型//
   char sum;         //总成绩-字符型//
   char ave;        //平均分-字符型//
}student[N],student1;     //student[N]是结构体数组student1是结构体的初始化//
 
  /*实时检测总数n*/
void count()  
 {
    FILE *fp;         //定义一个文件指针fp//
    fp=fopen("students.txt","at+");     //以“追加”方式打开students文本文件//
    if(fp==NULL)                        //判断文件是否为空//
        printf("Cannot open file!");
    struct students stu1;                 
    n=0;         //初始化//
    while(1)
    {
      if(feof(fp))  //检测文件是否结束//
      break;
      fread(&stu1,sizeof(struct students),1,fp);   //读取文件//
      n++;    //读取文件数//
    }
    n--;           //关闭文件数//
    fclose(fp);    //关闭文件//
 }
 
/*菜单*/
void main()
{
    int i;        //获取用户在菜单中的选择//     
    while(i!=0)
    {
        system("cls");     //清屏//
    printf("\t\t欢迎进入学生信息管理系统\n");
  printf("\t\t==============================\n");
        printf("\t\t*请择操作                    *\n");
        printf("\t\t*1输入学生信息               *\n");
        printf("\t\t*2输出学生信息               *\n");
        printf("\t\t*3修改学生信息               *\n");
        printf("\t\t*4查询学生信息               *\n");
       printf("\t\t*5排序学生信息               *\n");
        printf("\t\t*6退出                       *\n");
    printf("\t\t==============================\n");
 scanf("%d",&i);
 system("cls");     //清屏// 
        count();     //实时检测总数n//
        switch(i)
        {
         case 1:input();break;    //输入学生信息//    
         case 2:output();break;     //输出学生信息//
         case 3:xiugai();output();break;    //修改学生信息//
        case 4:query();break;    //查询学生信息*/
        case 5:paixu();output();break;    //成绩排序//
    default:
           printf("输入有错\n");     //错误纠正//  
        }
    }
       if(i==0)
         tuichu();        //退出系统//
}
 
 
/*成绩输入*/
void input()   
{
  int i=0;     //学生人数初始化//
  char c;
  FILE *fp;     //定义一个文件指针fp//
    count();     //实时检测总数n//
    fp=fopen("students.txt","at+");    //以“追加”方式打开students文本文件//
  do 
  {    
   printf("请输入学生的个人信息:\n");
     printf("\n请输入第%d学生的信息:\n",n+1);
     printf("请输入学生的学号:");
     scanf("%d",&student[i].num);
     printf("请输入学生的姓名:");
    scanf("%s",student[i].name);getchar();
    printf("请输入学生的大学语文成绩");
    scanf("%s",student[i].chinese);
    printf("请输入学生的大学数学成绩:");
    scanf("%d",&student[i].math);
    printf("请输入学生的计算机成绩:");
    scanf("%s",student[i].computer);
     getchar();
     student[i].sum=student[i].chinese+student[i].math+student[i].computer;
        student[i].ave=student[i].sum/3;
fwrite(&student[i],sizeof(struct students),1,fp);  //以方式将其写入students文本文件//
    i++;     
    n++;      
    printf("\n\n\t\t\t\t是否继续输入(Y/N):");getchar();     //提示是否继续,从键盘  
                                                           获得一个字符//  
scanf("%c",&c);  
  }
 while(c=='y'||c=='Y');
 fclose(fp);
}
 
/*成绩输出*/        
void output()  
{
  int i;
  char c;
  FILE *fp;      //定义一个文件指针fp//
  fp=fopen("students.txt","rt");    //以“读取的” 方式打开students文本文件//
  system("cls");     //清屏//
  getchar();
    
printf("||------||-----||-----||-----||------||-------||-------||------||");
    printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩
-----平均分---#|\n");
  do{  
      for(i=0;i<n;i++)  
      { 
       fread(&student[i],sizeof(struct students),1,fp);  
       printf("%d",student[i].num);
        printf(" %d",student[i].name);
            printf("%d",student[i].chinese);
          printf(" %d ",student[i].math);
          printf("%d ",student[i].computer);
          printf("%d",student[i].sum);
          printf(" %d ",student[i].ave);
     
      }
printf("|------||-----||------||-----||-----||-----||-----||------ |");
        printf("\n\n\t\t\t\t是否继续其它操作(Y/N):");     //提示是否继续//
          scanf("%c",&c);
      c=getchar();
    }while(c=='y'||c=='Y');
     fclose(fp);      //关闭文件//
}
 
/*成绩修改*/
void xiugai()  { 
  int i,tp,num1;
  char c; 
  FILE *fp;     //定义一个文件指针fp//
 
lb:  
  printf("\n按学号修改\n\n");
  printf("请输入要修改的学生学号\n");
  scanf("%d",&num1);
 
 for(i=0;i<n;i++) 
 {
    if(num1==student[i].num)
      { 
        printf("要修改的学生信息为:\n");
        printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t计算机成绩\t总成绩\t
平均分\n");          
        printf(" %d ",student[i].num);
        printf(" %d ",student[i].name);
        printf(" %d ",student[i].chinese);
        printf(" %d ",student[i].math);
        printf(" %d ",student[i].computer);
        printf(" %d ",student[i].sum);
        printf(" %d ",student[i].ave);
        do {
            printf("请选择要修改项:\n");
            printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n5总成绩\n6平
均分\n");
            scanf("%d",&tp);
                switch(tp)
            {
             case 1:
                {     printf("请输入学号:\n");
                  scanf("%d",&student[i].num);
                  goto la;
                }    
                case 2:
                { printf("请输入姓名:\n");
                  scanf("%s",student[i].name);
                  goto la;
                }    
                case 3:
                { printf("请输入大学语文成绩:\n");
                  getchar();
                  scanf("%c",&student[i].chinese);
                 goto la;
                }    
                case 4:
                { printf("请输入大学数学成绩:\n");
                  scanf("%d",&student[i].math);
                 goto la;          
                }    
                case 5:
                {printf("请输入计算机成绩:\n");
                  scanf("%s",student[i].computer);    
                 goto la;
                }    
               case 6:
                { printf("请输入总成绩:\n");
                  scanf("%s",student[i].sum);
                 goto la;
                }    
               case 7:
                { printf("请输入平均分:\n");
                  scanf("%s",student[i].ave);
                 goto la;
                }
            }
        }while (tp<8);         
la:      printf("是否继续修改(y/n)\n");     //提示是否继续//
      getchar();
      scanf("%c",&c);
      if(c=='y'||c=='Y')  goto lb;
         }
  }
    fp=fopen("students.txt","w+");   //以“读写” 方式打开students文本文件//
      for(i=0; i<n;i++)
      fwrite(&student[i],sizeof(struct students),1,fp);  //以 方式将其写入students
                                                 文本文件//
 fclose(fp);    //关闭文件//
}
 
 
/*成绩查询*/
void query()
{ int querymode;     //子菜单选择//
  int i,j=0,findnum;
  char findname[20];
  int findok,t=0;     //定义一个判断标志的整型变量findok//
  char findct;        //定义一个用于判断是否继续查找的字符变量findct//
  
   FILE *fp;         //定义一个文件指针fp//
   count();     //实时检测总数n//
   fp=fopen("students.txt","r");       //以“只读” 方式打开students文本文件//
   system("cls");     //清屏//
 
  /*查询菜单*/
  printf("\t\t信息查询");
  printf("\n\t1按姓名查询");
  printf("\n\t2按学号查询");
  printf("\n\t0返回上级菜单");
  printf("\n请输入您的操作:");
  scanf("%d",&querymode);
 
  /*查询操作*/
  switch(querymode)
  {case 1: 
    {     printf("请输入要查询学生的姓名:\n");
            getchar();
            scanf("%s",findname); 
            for(i=0;i<N;i++)
        {
     fread(&student[i],sizeof(struct students),1,fp); //以方式将其读入students
                                                      文本文件//
   if(strcmp(student[i].name,findname)==0)        //比较字符串//
             { 
               j++;
               printf("\n查寻到的学生为:\n");
               if(j==1)
                          
printf("|------||-----||------||------||------||-------||------||-----|");    
//仅在第一次显示//
    printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩-
----平均分---#|\n");
          
printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
student[i].chinese,student[i].math,student[i].sum,student[i].ave);
              }
 
            }
            if(j==0)
              printf("\n>>>查无此人!");
 
           //提示是否继续// 
            printf ("\n是否继续查找(Y/N)?");       
            getchar();
            getchar();}break;
  
    case 2:{ printf("请输入要查询学生的学号:");
             scanf("%d",&findnum);
             for(i=0;i<n;i++)
             {
              fread(&student[i],sizeof(struct students),1,fp);        
//以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个 
学生的信息//
              if(student[i].num==findnum)      //整型数字的比较// 
              {findok=1;break;}
              else findok=0;
             }
              if(!findok)
                printf("\n>>>查无此人!");
              else
              { printf("\n查寻到的学生为:\n") ;
                if(j==1)
                      printf("|-------||------||------||-------||-------||-------||-------||------|");   
 //仅在第一次显示//
 printf("|学号-----姓名------大学语文------大学数学------计算机------总成绩-----平均分---|\n");
 printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
student[i].chinese,student[i].math,student[i].sum,student[i].ave);
              }
//提示是否继续//
      printf ("\n是否继续查找(Y/N)?");       
        getchar();
            findct=getchar();     //从键盘输入一个判断字符,并将它赋值给字符变量
                               findct,用于以下的if语句的判断 //
            if(findct=='Y' || findct=='y')
              query();
          }
  }
  fclose(fp);    //关闭文件//
}
 
 
/*成绩排序*/
void paixu()
{
   int i, j;
     FILE *fp;       //定义一个文件指针fp//
   system("cls");      //清屏//
   count();       //实时检测总数n// 
   for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)    //按学号对学生信息进行排序//
        {
             if(student[j].num>student[j+1].num)   //整型数字的比较//
             {
                 student1=student[j];
                 student[j]=student[j+1];
                 student[j+1]=student1;
             }
        }
    fp=fopen("students.txt","w+");  //以 “读写”方式打开students文本文件//
    for(i=0;i<n;i++)
    fwrite(&student[i],sizeof(struct students),1,fp);  //以结构体students的方式从
   文件fp中读取,将其写入students文本文件,每次写入一个学生的信息//
    fclose(fp);      //关闭文件//
}
 
/*退出系统*/
void tuichu() 
{
    char c;
      system("cls");      //清屏//
    printf("\n\n\t\t谢谢使用\n\n\n");
    printf("\n\n\t\t制作人:李姣 渠莉 宝珠 朱佳 刘妍\n");
      getchar();
    c=getchar();       //取用户输入,回显//    
}

C++ 实现学生成绩管理系统


#include<iostream>
#include<string>
#include<fstream>
using namespace std;

struct score     //定义存放学生成绩信息的结点
{
    int num;      //学号 
    string name;   //姓名 
    float math;   //数学成绩 
    float english;  //英语成绩
    float computer;   //计算机基础成绩 
    float scoresum;   //三门成绩总和 
    struct score * next;  //next为指向下一结点的指针 
};
struct score * head;  //指向链表头结点的指针
int studentSum = 0;  //学生总人数

class record
{
public:
    struct score * InsertRecord(struct score *h);//插入学生成绩信息 
    struct score * DeleteRecord(struct score *h);//删除学生成绩信息 
    struct score * UpdateRecord(struct score *h);//修改学生成绩信息 
    void FindRecord(struct score *h, int  x, float s1, float s2);//根据某门课程的分数段查询学生成绩信息 
    void FindRecord(struct score *h, string  x); //根据学生姓名查询学生成绩信息 
    void FindRecord(struct score *h, int x);     //根据学生学号查询学生成绩信息 
    void StatisticRecord(struct score *h, int x);  //统计某门课程的及格学生人数、及格率,并显示不及格学生信息 
    void StacRecordFind(struct score *h);    //统计三门课程成绩全部优秀的学生人数,并显示全部优秀的学生信息
    void StacRecordDisq(struct score *h);    //统计三门课程成绩全部不及格的学生人数,并显示全部不及格的学生信息 
    void PrintRecord(struct score *h);       //输出所有 学生成绩 
    void SaveRecordFile(struct score *h);     //保存学生成绩信息到文件 
    struct score *LoadRecordFile(struct score *h);   //从文件中加载学生成绩信息 
};

struct score *record:: InsertRecord(struct score *h)
{
    struct score *p1, *p2, *p3;
    p3 = new score;     //创建新的学生成绩结点
    cout << "\n请输入学生学号:";
    cin >> p3->num;
    cout << "\n请输入学生姓名:";
    cin >> p3->name;
    cout << "\n请输入学生的数学成绩:";
    cin >> p3->math;
    cout << "\n请输入学生的英语成绩:";
    cin >> p3->english;
    cout << "\n请输入学生的计算机基础成绩:";
    cin >> p3->computer;
    p3->scoresum = p3->math + p3->english + p3->computer;  //计算结点的总成绩
    p3->next = NULL;   //将要插入结点的指针域置为空

    if (h == NULL)
    {
        h = p3;
        return h;
    }
    p1 = p2 = h;
    while (p1 != NULL && p3->num > p1->num)   //查找结点的学号大于要插入结点的学号的第一个结点    
    {                   //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点的指针
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == h)  //插入位置为链表头结点前
    {
        p3->next = h;
        h = p3;
        return h;
    }
    else   //插入位置为链表的中间的链表的尾部
    {
        p2->next = p3;
        p3->next = p1;
    }
    studentSum += 1;  //学生人数加1
    return h;    //返回链表的头结点
}

void record::PrintRecord(score *h)
{
    if (h == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return;
    }
    cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
    while (h)   //输出链表中每个结点的学生成绩信息
    {
        cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
        h = h->next;
    }
}

struct score *record::DeleteRecord(struct score *h)
{
    struct score *p1, *p2;
    int num;
    if (h == NULL)  //链表为空
    {
        cout << "\n抱歉,没有任何记录!";
        return h;
    }
    p1 = p2 = h;//将链表的头指针赋给指针p1和p2
    cout << "\n请输入要删除记录的学生学号";
    cin >> num;
    while (p1 != NULL && p1->num != num)//查找结点的学号等于要删除学生学号的第一个结点
    {                     //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点指针
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == NULL)
    {
        cout << "\n抱歉啊,表中没有该记录哦!";
        return h;
    }
    if (p1->num == num)
    {
        studentSum -= 1;//学生人数减1
        if (p1 == h)  //删除的是头结点
            h = h->next;
        else      //删除的是非头结点
            p2->next = p1->next;
        delete p1;  //释放p1所指向的存储单元
    }
    return h;
}

struct score *record::UpdateRecord(struct score *h)
{
    struct score *p1;
    int num;
    if (h == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return h;
    }
    p1 = h;
    cout << "\n请输入要修改记录的学生学号:";
    cin >> num;
    while (p1 != NULL && p1->num != num) //查找结点的学号等于要修改学生学号的结点指针
    {
        p1 = p1->next;  //将p1指针移到下一个结点
    }
    if (p1 == NULL)  //没有找到符合要求的结点
    {
        cout << "\n抱歉,表中没有该记录!";
        return h;
    }
    if (p1->num == num)  //找到符合要求的结点,并修改学生的相关成绩
    {
        cout << "\n请重新输入学生的数学成绩:";
        cin >> p1->math;
        cout << "\n请重新输入学生的英语成绩:";
        cin >> p1->english;
        cout << "\n请重新输入学生的计算机基础成绩:";
        cin >> p1->computer;
        p1->scoresum = p1->math + p1->english + p1->computer;
    }
    return h;
}

void record::FindRecord(struct score *h, int x, float s1, float s2)
{
    if (h == NULL) //链表为空
    {
        cout << "\n,抱歉,没有任何记录!";
        return;
    }
    cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
    while (h)
    {
        if (x == 1)  //查找数学成绩在某分数段的学生成绩信息
        {
            if (h->math >= s1 && h->math <= s2)
                cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
        }
        if (x == 2)
        {
            if (h->english >= s1 && h->english <= s2)
                cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;

        }
        if (x == 3)
        {
            if (h->computer >= s1 && h->computer <= s2)
                cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
        }
        h = h->next;
    }

}

void record::FindRecord(struct score *h, int num)  //根据学生学号查找学生成绩信息
{
    struct score *p1;
    if (h == NULL)
    {
        cout << "\n抱歉,没有任何记录";
        return;
    }
    p1 = h;   //将链表的头结点指针h赋给指针p1
    while (p1 != NULL && p1->num != num) //查找结点的学号等于要查找学生学号的结点指针
    {
        p1 = p1->next;
    }
    if (p1 == NULL)   //没有找到
    {
        cout << "抱歉啊,表中没有该记录的哦!";
        return;
    }
    if (p1->num == num)  //找到并显示信息
    {
        cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
        cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
    }

}

void record::FindRecord(struct score *h, string name)  //根据学生姓名查找学生成绩信息
{
    struct score *p1;
    if (h == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return;
    }
    p1 = h;
    while (p1 != NULL && p1->name != name) //查找结点的姓名等于要查找学生姓名的结点指针
    {
        p1 = p1->next;
    }
    if (p1 == NULL)
    {
        cout << "\n抱歉,表中没有该记录!";
        return;
    }
    if (p1->name == name)
    {
        cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
        cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
    }
}

void record::StatisticRecord(struct score* h, int x)
{
    struct score *p = h;  //将链表的头结点指针赋给指针p
    int count = 0;//定义统计人数count变量并赋初值为0
    if (p == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return;
    }
    while (p)
    {
        if (x == 1)
            if (p->math >= 60)
                count += 1;
        if (x == 2)
            if (p->english >= 60)
                count += 1;
        if (x == 3)
            if (p->computer >= 60)
                count += 1;
        p = p->next;
    }
    if (x == 1)
    {
        cout << "数学成绩及格人数为:";
        cout << count;
        cout << ",及格率为:";
        cout << count / (float)studentSum << endl;
        if (count < studentSum)
            cout << "\n学号\t姓名\t数学" << endl;
        else
            cout << "没有数学成绩不及格学生" << endl;
    }
    else
    {
        if (x == 2)
        {
            cout << "英语成绩及格人数为:";
            cout << count;
            cout << ",及格率为:";
            cout << count / (float)studentSum << endl;
            if (count < studentSum)
                cout << "\n学号\t姓名\t英语" << endl;
            else
                cout << "没有英语成绩不及格学生" << endl;
        }
        else
        {
            if (x == 3)
            {
                cout << "计算机成绩及格人数为:";
                cout << count;
                cout << ",及格率为:";
                cout << count / (float)studentSum << endl;
                if (count < studentSum)
                    cout << "\n学号\t姓名\t计算机" << endl;
                else
                    cout << "没有计算机成绩不及格学生" << endl;
            }
        }

    }

    p = h;
    while (p)
    {
        if (x == 1)
            if (p->math < 60)
                cout << p->num << "\t" << p->name << "\t" << p->math << endl;
        if (x == 2)
            if (p->english < 60)
                cout << p->num << "\t" << p->name << "\t" << p->english << endl;
        if (x == 13)
            if (p->computer < 60)
                cout << p->num << "\t" << p->name << "\t" << p->computer << endl;
        p = p->next;
    }

}

void record::StacRecordFind(struct score *h)
{
    struct score *p = h;
    int count = 0;
    if (p == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return;
    }
    while (p)
    {
        if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
        {
            count += 1;
            
        }
        p = p->next;

    }
    cout << "三门成绩全为优秀的学生人数为:";
    cout << count << endl;
    cout << "全为优秀的学生信息为:" << endl;
    cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
    p = h;
    while (p)
    {
        if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
            cout << p->num << "\t" << p->name << "\t" <<p->math<<"\t"<<p->english<<"\t"<< p->computer <<"\t"<<p->scoresum<< endl;
        p = p->next;
    }
}

void record::StacRecordDisq(struct score *h)
{
    struct  score *p = h;
    int count = 0;
    if (p == NULL)
    {
        cout << "\n抱歉,没有任何记录!";
        return;
    }
    while (p)
    {
        if (p->math < 60 && p->english < 60 && p->computer < 60)
            count += 1;
        p = p->next;
    }
    cout << "三门成绩全不及格的学生人数为:";
    cout << count << endl;
    cout << "全为不及格的学生信息为:" << endl;
    cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
    p = h;
    while (p)
    {
        if (p->math <60 && p->english <60 && p->computer <60)
            cout << p->num << "\t" << p->name << "\t" << p->math << "\t" << p->english << "\t" << p->computer << "\t" << p->scoresum << endl;
        p = p->next;
    }
}

void record::SaveRecordFile(struct score *h) //将链表中的数据写入文件
{
    struct score *p;
    ofstream ofile;  //定义输出文件对象
    ofile.open("score.dat", ios::out);  //以定的方式打开文件score.dat,若该文件不存在,则创建score.dat文件
    if (!ofile)
    {
        cout << "\n数据文件打开错误没有将数据写入文件!\n";
        return;
    }
    ofile << "\n学号\t姓名\t数学\t英语\t计算机\t总分";
    while (h)
    {
        ofile<<endl<< h->num << "\t" << h->name << "\t" << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum;
        p = h;  //将当前结点的数据信息写入到文件中
        h = h->next;
        delete p;
    }
    ofile.close();
}

struct score* record::LoadRecordFile(struct score *h)
{
    ifstream ifile;  //定义输入文件对象
    ifile.open("score.dat", ios::in);//以读写方式打开文件score.dat
    struct score *p, *q;
    if (!ifile)
    {
        cout << "\n数据文件不存在,加载不成功!\n";
        return NULL;
    }
    char s[50];
    ifile.getline(s, 50); //读取文件指针当前行数据
    while (!ifile.eof()) 
    {
        studentSum = studentSum + 1;
        p = new score;
        ifile >> p->num >> p->name >> p->math >> p->english >> p->computer >> p->scoresum; //
        p->next = NULL;
        if (h == NULL)
        {
            q = h = p;
        }
        else
        {
            q->next = p;
            q = p;
        }
    }
    ifile.close();
    return h;
}

void SystemMenu(record r)
{
    int choice;
    while (1)
    {
        cout << "\n\t\t欢迎进入学生成绩管理系统!";
        cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
        cout << "\n\t1、添加学生成绩信息";
        cout << "\n\t2、删除学生成绩信息";
        cout << "\n\t3、修改学生成绩信息";
        cout << "\n\t4、查询学生成绩信息";
        cout << "\n\t5、显示所有学生成绩信息";
        cout << "\n\t6、统计学生成绩信息";
        cout << "\n\t0、退出系统";
        cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";

        cout << "\n请根据提示选择操作:";
        cin >> choice;
        switch (choice)
        {
        case 1:           //增加学生成绩信息
            head = r.InsertRecord(head);
            break;
        case 2:          //删除学生成绩信息
            head = r.DeleteRecord(head);
            break;
        case 3:    //修改学生成绩信息
            head = r.UpdateRecord(head);
            break;
        case 4:    //查询活到成绩信息        
            while (1)
            {
                int c;
                cout << "\n*************************************";
                cout << "\n\t1、根据学号查询学生成绩信息";
                cout << "\n\t2、根据姓名查询学生成绩信息";
                cout << "\n\t3、根据数学分数查询学生成绩信息";
                cout << "\n\t4、根据英语分数查询学生成绩信息";
                cout << "\n\t5、根据计算机基础成绩查询学生成绩信息";
                cout << "\n\t6、返回上级目录";
                cout << "\n*************************************";

                cout << "\n请根据提示选择操作:";   //显示查询子菜单
                cin >> c;
                if (c == 1)   //根据学生学号查询学生成绩信息
                {
                    int x;
                    cout << "\n请输入需要查询的学生学号:";
                    cin >> x;
                    r.FindRecord(head, x);
                }
                if (c == 2)   //根据学生姓名查询学生成绩信息
                {
                    string name;
                    cout << "\n请输入需要查询的学生姓名:";
                    cin >> name;
                    r.FindRecord(head, name);
                }
                if (c == 3)  //根据数学分数段查询学生成绩信息
                {  
                    float s1, s2;
                    cout << "\n请输入查询的数学最低分的最高分:";
                    cin >> s1 >> s2;
                    r.FindRecord(head, 1, s1, s2);
                }
                if (c == 4)   //根据英语分数段查询学生成绩信息
                {
                    float s1, s2;
                    cout << "\n请输入查询的英语最低分的最高分:";
                    cin >> s1 >> s2;
                    r.FindRecord(head, 2, s1, s2);
                }
                if (c == 5)   //根据计算机分数段查询学生成绩信息
                {
                    float s1, s2;
                    cout << "\n请输入查询的计算机基础最低分的最高分:";
                    cin >> s1 >> s2;
                    r.FindRecord(head, 3, s1, s2);
                }
                if (c == 6)  //退出查询子菜单
                    break;
            }
            break;
        case 5:           //输出所有学生成绩信息
            r.PrintRecord(head); 
            break;
        case 6:             //统计学生成绩信息
            while (1)
            {
                int c;
                cout << "\n***********************************************************";
                cout << "\n\t1、统计数学成绩及格学生人数,并显示不及格学生信息";
                cout << "\n\t2、统计英语成绩及格学生人数,并显示不及格学生信息";
                cout << "\n\t3、统计计算机成绩及格学生人数,并显示不及格学生信息";
                cout << "\n\t4、统计三门功课都不及格的学生人数,并显示学生信息(〉=90)";
                cout << "\n\t5、统计三门功课都优秀的学生人数,并显示学生信息";
                cout << "\n\t6、返回上级目录";
                cout << "\n***********************************************************";

                cout << "\n请根据提示选择操作:";   //显示统计子菜单
                cin >> c;
                if (c == 1)
                {
                    r.StatisticRecord(head, 1);//统计数学成绩及格人数,并显示不及格学生信息
                }
                if (c == 2)
                {
                    r.StatisticRecord(head, 2);//统计英语成绩及格人数,并显示不及格学生信息
                }
                if (c == 3)
                {
                    r.StatisticRecord(head, 3);//统计计算机成绩及格人数,并显示不及格学生信息
                }
                if (c == 4)
                {
                    r.StacRecordFind(head);//统计三门功课都不及格学生人数,并显示学生信息
                }
                if (c == 5)
                {
                    r.StacRecordDisq(head);//统计三门功课都优秀学生人数,并显示学生信息
                }
                if (c == 6)  //退出统计子菜单
                    break;
            }
            break;
        }
        if (choice == 0)//退出系统
        break;
    }
    
}

int main()
{
    head = NULL;
    record r;                   //定义record类的对象r
    head = r.LoadRecordFile(head);  //将文件中的数据读取到链表中
    SystemMenu(r);           //显示系统菜单,并处理用户选择
    r.SaveRecordFile(head);  //将链表中的数据写到文件中
    return 0;

}


c++学生信息管理系统,主要就是考察对文件读写,循环、条件、输入输出、结构体等等基本知识的使用,比较综合的一个程序。资料还挺多的,开源的代码也有,你参考下,结合自己I的需求改下即可:
(c++)简易学生成绩管理系统:https://blog.csdn.net/weixin_56187542/article/details/126678718

C++学生成绩管理系统示例

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

const int MAX_SIZE = 1000; // 最大学生数
const string FILE1_NAME = "file1.txt";
const string FILE2_NAME = "file2.txt";
const string FILE3_NAME = "file3.txt";
const string FILE4_NAME = "file4.txt";

// 学生成绩结构体
struct Student {
    string name; // 姓名
    int score1; // 成绩1
    int score2; // 成绩2
    int score3; // 成绩3
    int totalScore; // 总分

    friend bool operator < (const Student& a, const Student& b) {
        return a.totalScore > b.totalScore;
    }
};

// 读取学生数据,返回学生数
int readStudents(const string& fileName, vector<Student>& students) {
    ifstream fin(fileName);
    if (!fin) {
        cout << "Error: failed to open file " << fileName << endl;
        return 0;
    }

    int count = 0;
    while (!fin.eof()) {
        Student s;
        fin >> s.name >> s.score1 >> s.score2 >> s.score3;
        s.totalScore = s.score1 + s.score2 + s.score3;
        students.push_back(s);
        count++;
    }

    fin.close();
    return count - 1; // 减去文件最后一行的空行
}

// 写学生数据到文件
void writeStudents(const string& fileName, const vector<Student>& students) {
    ofstream fout(fileName);
    if (!fout) {
        cout << "Error: failed to open file " << fileName << endl;
        return;
    }

    for (const auto& s : students) {
        fout << s.name << " " << s.score1 << " " << s.score2 << " " << s.score3 << endl;
    }

    fout.close();
}

// 将有补考的学生成绩保存到文件4
void saveMakeupStudents(const string& fileName, const vector<Student>& students) {
    ofstream fout(fileName);
    if (!fout) {
        cout << "Error: failed to open file " << fileName << endl;
        return;
    }

    for (const auto& s : students) {
        if (s.score1 < 60 || s.score2 < 60 || s.score3 < 60) {
            fout << s.name << " " << s.score1 << " " << s.score2 << " " << s.score3 << endl;
        }
    }

    fout.close();
}

// 按总分降序排序学生数据
void sortByTotalScore(vector<Student>& students) {
    sort(students.begin(), students.end());
}

// 查找学生数据
bool findStudent(const string& name, const vector<Student>& students, Student& result) {
    for (const auto& s : students) {
        if (name == s.name) {
            result = s;
            return true;
        }
    }

    return false;
}

int main() {
    vector<Student> students1, students2, students3, students;
    int count1 = readStudents(FILE1_NAME, students1);
    int count2 = readStudents(FILE2_NAME, students2);

    // 合并学生数据到vector students3
    students3 = students1;
    students3.insert(students3.end(), students2.begin(), students2.end());

    // 写入合并后的学生数据到文件3
    writeStudents(FILE3_NAME, students3);

    // 保存有补考的学生成绩到文件4
    saveMakeupStudents(FILE4_NAME, students3);

    // 按总分降序排序学生数据
    sortByTotalScore(students3);

    // 查找学生数据
    string name;
    cout << "Please input student's name: ";
    cin >> name;

    Student result;
    if (findStudent(name, students3, result)) {
        cout << "Name: " << result.name << endl;
        cout << "Score1: " << result.score1 << endl;
        cout << "Score2: " << result.score2 << endl;
        cout << "Score3: " << result.score3 << endl;
        cout << "Total Score: " << result.totalScore << endl;
    } else {
        cout << "Error: cannot find student " << name << endl;
    }

    return 0;
}