⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xjgl.cpp

📁 学籍管理系统代码。利用面向对象的方法以及C++的编程思想来完成系统的设计。
💻 CPP
字号:
/*
course.dat-课程列表(只读)
student.dat-学生信息
*/
#include <fstream.h>
#include <iomanip.h>
#include <string.h>
#include <ctype.h>

class COURSE   //课程类
{
private:
   static int coursenum;            //课程数量
   static char (*coursename)[20];   //课程名称

public:
   static void LoadCourse()   //从文件COURSE.DAT装入课程信息
   {
     ifstream f("course.dat");

     f>>coursenum;
     coursename=new char[coursenum][20];
     for(int i=0;   i<coursenum;   i++)
       f>>coursename[i];

     f.close();
   }

   friend class STUDENT;
   friend class COLLEGE;
};
int COURSE::coursenum=0;
char (*COURSE::coursename)[20]=0;

class STUDENT //学生类
{
private:
   char num[20];    //学号
   char name[20];   //姓名
   char sex;        //性别
   char cname[20]; //班级
   float *grade;      //成绩(动态数组)
   float sum;         //各科总分
   STUDENT *next;

public:
   STUDENT()
   {
     grade=new float[COURSE::coursenum];
     next=0;
   }

   ~STUDENT()
   {
     delete []grade;
   }

   void Input()
   {
     sum=0;
     cout<<"学号:";   cin>>num;      //输入学生一般信息
     cout<<"姓名:";   cin>>name;
     cout<<"性别:";   cin>>sex;   sex=toupper(sex);
     cout<<"班级:";   cin>>cname;
     for(int i=0;   i<COURSE::coursenum;   i++)   //输入学生各科成绩
     {
       cout<<COURSE::coursename[i]<<"成绩:";   cin>>grade[i];
       sum+=grade[i];   //计算总分
     }
   }

   void Input(ifstream &f)
   {
     f>>num;
     f>>name;
     f>>sex;   sex=toupper(sex);
     f>>cname;
     for(int i=0;   i<COURSE::coursenum;   i++)   //输出学生各科成绩,总分
     {
       f>>grade[i];
     }
     f>>sum;
   }

   static void OutputT()
   {
     cout<<setw(10)<<"学号"<<setw(20)<<"姓名"<<setw(5)<<"性别"<<setw(10)<<"班级";
     for(int i=0;   i<COURSE::coursenum;   i++)
       cout<<setw(7)<<COURSE::coursename[i];
     cout<<setw(10)<<"总分"<<endl;
   }

   void Output()
   {
     cout<<setw(10)<<num;   //输出学生一般信息
     cout<<setw(20)<<name;
     cout<<setw(5)<<sex;
     cout<<setw(10)<<cname;
     for(int i=0;   i<COURSE::coursenum;   i++)   //输出学生各科成绩,总分
     {
       cout<<setw(7)<<grade[i];
     }
     cout<<setw(10)<<sum<<endl;
   }

   void Output(ofstream &f)
   {
     f<<setw(10)<<num;   //输出学生一般信息
     f<<setw(20)<<name;
     f<<setw(5)<<sex;
     f<<setw(10)<<cname;
     for(int i=0;   i<COURSE::coursenum;   i++)   //输出学生各科成绩,总分
     {
       f<<setw(7)<<grade[i];
     }
     f<<setw(10)<<sum<<endl;
   }

   friend class COLLEGE;
};


class COLLEGE   //学校类
{
private:
   STUDENT *SL;   //学生链表
   void Clear();
   int Find(char* ID,STUDENT **p1,STUDENT **p2);
   void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2);

public:
   COLLEGE()
   {
     COURSE::LoadCourse();   //装入课程信息
     SL=new STUDENT();       //创建学生链表表头结点
   }

   ~COLLEGE()
   {
     STUDENT *p=SL;   //删除学生链表各个结点
     while(p)
     {
       SL=p->next;
       delete p;
       p=SL;
     }
   }
   
   void Set();            //课程设置(增,删,改,存)
   void Add();            //增加学生
   void Delete();         //删除学生
   void Modify();       //修改学生
   void Query();        //查询学生信息(按姓名,学号)
   void Print();        //输出所有学生信息
   void Stat();           //统计课程平均成绩,课程合格率
   void SumSort();        //按总分排名(高->低)
   void NumSort();        //按学号排序(低->高)
   void Save();           //学生数据存盘
   void Load();           //装入学生数据
};

//增加学生
void COLLEGE::Add()           
{
   cout<<"\n** 增加学生信息 **\n";

   STUDENT *p=new STUDENT;      //创建1个新学生结点
  
   STUDENT *p2=SL;              //查找学生链表表尾结点
   while(p2->next)p2=p2->next;
   p2->next=p;                  //链接学生结点

   p->Input();                  //输入学生信息
}

//查找学生结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
int COLLEGE::Find(char *ID,STUDENT **p1,STUDENT **p2)   
{
   *p1=SL->next;
   *p2=SL;
   while(*p1)
   {
     if(strcmp((*p1)->num,ID)==0)
       break;   //找到
     else 
     {
       *p2=*p1;   //继续查找
       *p1=(*p1)->next;
     }
   }
   return *p1?1:0;
}


//删除学生
void COLLEGE::Delete()        
{
   cout<<"\n** 删除学生 **\n";

   char No[20];
   STUDENT *p1,*p2;
  
   cout<<"学号:";   cin>>No;
   if(!Find(No,&p1,&p2))
   {
     cout<<"指定的学生没有找到!\n";
   }
   else
   {
     p2->next=p1->next;   //连接
     delete p1;
     cout<<"正确删除!\n";
   }
}

//修改学生
void COLLEGE::Modify()        
{
   cout<<"\n** 修改学生 **\n";

   char No[20];
   STUDENT *p1,*p2;
  
   cout<<"学号:";   cin>>No;
   if(!Find(No,&p1,&p2))
   {
     cout<<"指定的学生没有找到!\n";
   }
   else
   {
     p1->Output();   //输出原来的学生信息(做提示)
     p1->Input();   //输入此学生信息(更新)
     cout<<"修改完成!\n";
   }
}


/*未完*/
 
/*承上*/

//查询学生信息
//按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示.
void COLLEGE::Query()  
{
    cout<<"\n** 查询学生 **\n";

    STUDENT *p=SL->next;
    char No[20];
    char Name[20];
    char ch;
    do
    {
      cout<<"按学号查1,按姓名查2:";    cin>>ch;
    }while(ch!='1'&&ch!='2');

    int flag=0;    //未找到0,找到1
    if(ch=='1')    //按学号查
    {
      cout<<"学号:";    cin>>No;
      while(p)
        if(strcmp(p->num,No)==0)
        {
          flag=1;    break;
        }
        else
          p=p->next;
    }
    else    //按姓名查
    {
      cout<<"姓名:";    cin>>Name;
      while(p)
        if(strcmp(p->name,Name)==0)
        {
          flag=1;    break;
        }
        else
          p=p->next;
    }

    if(flag==1)    //如果找到,显示此同学信息
    {
      p->OutputT();
      p->Output();
    }
    else    //否则给出未找到提出
      cout<<"指定的学生没有找到!\n";
}

//输出所有学生信息
void COLLEGE::Print()      
{
    cout<<"\n** 输出学生信息 **\n";
    STUDENT *p=SL->next;
  
    STUDENT::OutputT();    //输出标题
    while(p)    //循环输出各位学生信息
    {
      p->Output();
      p=p->next;
    }
}

//学生数据存盘
void COLLEGE::Save()          
{
    ofstream f("student.dat");

    STUDENT *p=SL->next;
    while(p)    //遍历学生链表
    {
      p->Output(f);    //写入文件
      p=p->next;     
    }

    f.close();

    cout<<"\n** 保存数据完成! **\n";
}

void COLLEGE::Clear()
{
    STUDENT *p=SL->next;
    while(p)
    {
      SL->next=p->next;
      delete p;
      p=SL->next;
    }
}

//装入学生数据
void COLLEGE::Load()          
{
    Clear();

    ifstream f("student.dat");
    STUDENT *p=SL;
    STUDENT *p2=new STUDENT;
    p2->Input(f); 
    while(f)
    {
      p->next=p2;
      p=p->next;
      p2=new STUDENT;
      p2->Input(f); 
    }
    delete p2;
    f.close();
}

//统计课程平均成绩,课程合格率
void COLLEGE::Stat()          
{
    float *sum=new float[COURSE::coursenum];    //各科平均成绩
    float *pass=new float[COURSE::coursenum];    //各科合格人数,/n=>合格率
    int n=0;    //学生人数

    for(int i=0;    i<COURSE::coursenum;    i++)
    {
      STUDENT *p=SL->next;    n=0;
      sum[i]=pass[i]=0;
      while(p)    //遍历学生链表
      {
        n++;                            //人数
        sum[i]=sum[i]+p->grade[i];    //某科总分
        if(p->grade[i]>=60)pass[i]++;     //某科合格人数
        p=p->next;
      }
    }
  
    for(i=0;    i<COURSE::coursenum;    i++)
    {
      cout<<setprecision(4)<<setiosflags(ios::showpoint);
      cout<<COURSE::coursename[i]<<"平均:"<<sum[i]/n<<",合格率:"<<pass[i]/n*100.<<"%"<<endl;
    }

    delete []sum;
    delete []pass;
}

void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2)
{
    strcpy(s1.num,s2.num);     //学号
    strcpy(s1.name,s2.name);    //姓名
    s1.sex=s2.sex;         //性别
    strcpy(s1.cname,s2.cname);     //班级
    for(int i=0;    i<COURSE::coursenum;    i++)
      s1.grade[i]=s2.grade[i];     //成绩指针(动态数组)
    s1.sum=s2.sum;          //各科总分
}

//按总分排名(采用选择法排序),总分高->低
void COLLEGE::SumSort()       
{
    STUDENT *p1,*p2;

    p1=SL->next;
    while(p1)
    {
      p2=p1->next;
      while(p2)
      {
        if(p2->sum>p1->sum)
        {
          STUDENT t;
          ValueS2ToS1(t,*p1);
          ValueS2ToS1(*p1,*p2);
          ValueS2ToS1(*p2,t);
        }
        p2=p2->next;
      }
      p1=p1->next;
    }
}

void COLLEGE::NumSort()    //按学号排序(低->高)
{
    STUDENT *p1,*p2;

    p1=SL->next;
    while(p1)
    {
      p2=p1->next;
      while(p2)
      {
        if(strcmp(p2->num,p1->num)<0)    //只要修改这里,其余同SumSort
        {
          STUDENT t;
          ValueS2ToS1(t,*p1);
          ValueS2ToS1(*p1,*p2);
          ValueS2ToS1(*p2,t);
        }
        p2=p2->next;
      }
      p1=p1->next;
    }
}


void main()
{
    char ch;
    COLLEGE c;    //定义大学对象
    cout.setf(ios::left);

    //显示主菜单,接受选择,并分支调用大学类的相应功能的成员函数
    do
    {
      cout<<"\n☆☆ 高校学籍管理系统 ☆☆\n";
      cout<<"1-增加学生\n";
      cout<<"2-删除学生\n";
      cout<<"3-修改学生\n";
      cout<<"4-查询学生\n";
      cout<<"5-输出学生信息\n";
      cout<<"6-综合统计(课程平均成绩,课程合格率)\n";
      cout<<"7-总分排序\n";
      cout<<"8-学号排序\n";
      cout<<"S-数据存盘\n";
      cout<<"L-数据装入\n";
      cout<<"Q-退出\t请选择(1-8,SLQ):";

      cin>>ch;    ch=toupper(ch);
      switch(ch)
      {
        case '1':    c.Add();     break;
        case '2':    c.Delete();break;
        case '3':    c.Modify();break;
        case '4':    c.Query(); break;
        case '5':    c.Print();     break;
        case '6':    c.Stat();    break;
        case '7':    c.SumSort();    break;
        case '8':    c.NumSort();    break;
       case 'S':    c.Save();    break;
        case 'L':    c.Load();    break;
      }
    }while(ch!='Q');
}

3、2数据文件
1、course.dat:
3
C++
英语
高数

2、student.dat:
       86101             chenkaijun      M       M8601       77       59       96         232
       86102               zhaowei      F        M8601       55       85       77         217
       86103                wubin       M       M8601       85       87       92         264
       86104                shijun       M       M8601       58       90       85         233
       86105           wangzhuguo       M       M8601       66       70       86         222

3、3运行结果参考
☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):L

☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):5

** 输出学生信息 **
学号        姓名                  性别 班级        C++      英语     高数     总分
86101       chenkaijun            M      M8601       77       59       96       232
86102       zhaowei               F      M8601       55       85       77       217
86103       wubin                 M      M8601       85       87       92       264
86104       shijun                M      M8601       58       90       85       233
86105       wangzhuguo            M      M8601       66       70       86       222

☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):7

☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):5

** 输出学生信息 **
学号        姓名                  性别 班级        C++      英语     高数     总分
86103       wubin                 M      M8601       85       87       92       264
86104       shijun                M      M8601       58       90       85       233
86101       chenkaijun            M      M8601       77       59       96       232
86105       wangzhuguo            M      M8601       66       70       86       222
86102       zhaowei               F      M8601       55       85       77       217

☆☆ 高校学籍管理系统 ☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率)
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出 请选择(1-8,SLQ):q
Press any key to continun
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -