热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++实现学生选课系统

这篇文章主要为大家详细介绍了C++实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现学生选课系统的具体代码,供大家参考,具体内容如下

#include 
#include  
#include 
#include
#include
using namespace std;

struct SubList/*某个学生所学的课程中的某一个 */
{
 int num; /*课程代号 */
 SubList *next;  /*指向下一个课程的指针*/
 SubList() :num(-1), next(NULL){} /*构造函数*/
};
struct StuList /*课程中所选的学生*/
{
 int num;   /* 学生的学号*/
 float score;   /*学生所得的该课程分数*/
 StuList *next; /*下一个学生*/
 StuList() :num(-1), score(0), next(NULL){}
};
class Student 
{
private:
 int Num;  /*学号*/
 char Name[20];    /*学生的姓名 */
 int MaxSubNum;   /*学生最多可以学五门课程 */
 int FactSubNum;   /* 学生实际所学的课程数目 */
 SubList *Root;   /*课程的指针*/
 float SumXueFen; /*总的选课学分*/
 float FactXueFen; /*实际获得学分*/
 float SumGrade; /*总成绩*/
 bool Update; /*是否需要更新信息*/
public:
 Student *next;/*让所有学生的信息连接起来*/
 SubList *GetSubPtr()const{ return Root; }/*获取所选的课程表*/
 Student() :Update(false), Root(new SubList()), FactXueFen(0), MaxSubNum(5), FactSubNum(0), SumXueFen(0), SumGrade(0),next(NULL){}
 void SetName(char N[]){ strcpy(Name, N); } /* 设置学生的姓名 */
 void SetNum(int num){ Num = num; } /*设置学号*/
 const char* GetName()const{ return Name; }/*得到学生的姓名 */
 int GetNum()const{ return Num; } /*得到学号*/
 int GetFactSubNum()const{ return FactSubNum; } /*得到实际选课数*/
 bool FindSub(int num)const;  /*查找是否已有此课程,如果有返回,如果没有返回 */
 void SetInfo(float sumXueFen, float factXueFen, float sumGrade)
 {
 SumXueFen = sumXueFen;/*这三条信息因为一起用 所以一起设置了*/
 FactXueFen = factXueFen;
 SumGrade = sumGrade;
 }
 void SetUpdate(bool t){ Update = t; }/*是否更新信息的标志*/
 float GetAveGrade(){ return SumGrade / FactSubNum; }  /*学生课程的平均成绩*/
 void AddSub(int num); /*增加课程*/
 bool IsFull()const{ return MaxSubNum == FactSubNum; }
 void ShowStuInfo(); /*输出学生信息*/
 void DelSub(int num); /*删除课程 Manage类使用*/
 ~Student()/*析构函数 不要也行影响不太大 一般程序,还不太会内存用完*/
 {
 SubList *p = Root;
 while (p)
 {
  SubList*t = p->next;
  delete p;
  p = t;
 }
 }
};
//课程类 
class Subject
{
private:
 int MaxStuNum;  /*最多学生数*/
 int FactStuNum;  /*实际学生数*/
 float Credit;  /*该课程的学分 */
 char Name[20]; /* 该课程的名称 */
 int Num; /*课程的代号*/
 StuList *Root; /* 学生名单 */
 float AveGrade; /*该课程的平均成绩 */
 bool Update; /*是否更新信息*/
public:
 StuList *GetStuPtr()const{ return Root; }/*获取选此课程的学生表*/
 Subject*next;
 Subject() :Root(new StuList()), MaxStuNum(30), FactStuNum(0), Update(false),next(NULL){}
 float GetCredit()const{ return Credit; }  //得到课程的学分 
 void SetCredit(float credit){ Credit = credit; } //设置学分
 const char* GetName()const{ return Name; } //读出课程的名称
 void SetName(char N[]){ strcpy(Name, N); } //设置课程的名称
 int GetNum()const{ return Num; } //读出课程的代号
 void SetNum(int num){ Num = num; } //设置课程的代号
 int GetFactStuNum()const{ return FactStuNum; } //返回实际学生数 
 int GetMaxStuNum()const{ return MaxStuNum; }//最大学生数
 void SetUpdate(bool t){ Update = t; }
 void SetAveGrade(float num){ AveGrade = num/FactStuNum; } //设置平均分
 float GetAveGrade(){ return AveGrade; }  //得到学生的平均成绩
 float GetStuScore(int num); //查找某个学生的成绩
 bool IsFull()const{ return MaxStuNum == FactStuNum; }//是否人数已满
 void DelStu(int num);//删除学生
 void AddStu(int num);//增加学生
 ~Subject()
 {
 StuList *p = Root;
 while (p)
 {
  StuList*t = p->next;
  delete p;
  p = t;
 }
 }
};

float Subject::GetStuScore(int num)
{
 StuList*p = Root->next;
 while (p->num != num)
 p = p->next;
 return p->score;
}

void Student::ShowStuInfo()
{
 cout <next;
 while (!t && p)
 {
 if (p->num == num)
  t = true;
 p = p->next;
 }
 return t;
}

void Student::AddSub(int num)//给学生增加一门课 
{
 SubList *s = new SubList(), *p = Root;
 while (p->next)
 p = p->next;
 p->next = s;
 s->num = num;
 FactSubNum++;
 Update = true;
}

void Student::DelSub(int num)
{
 SubList*p = Root, *t;

 while (p->next->num != num)
 p = p->next;
 t = p->next;
 p->next = t->next;

 FactSubNum--;
 Update = true;
 delete t;
}
//////////////////////////Subject//////////////////////////////////
void Subject::AddStu(int num)// 
{
 StuList *s = new StuList(), *p = Root;
 while (p->next)
 p = p->next;
 p->next = s;
 s->num = num;
 FactStuNum++;
 Update = true;
}

void Subject::DelStu(int num)
{
 StuList*p = Root, *t;

 while (p->next->num != num)
 p = p->next;
 t = p->next;
 p->next = t->next;

 FactStuNum--;
 Update = true;
 delete t;
}

//////////////////////////////////////////////////////////
class Manage
{
private:
 Student*StuRoot;
 Subject*SubRoot;
 bool Update;
public:
 Manage() :StuRoot(new Student()), SubRoot(new Subject()),Update(false){}
 Manage(const Manage&p){}
 void AddStu();
 void AddSub();

 Student*FindStu(int num);
 Subject*FindSub(int num);

 int ShowSub()const;//显示可选课程
 int ShowStu()const;
 void ShowStuSubInfo(Student*p);

 void DelStu(Student*p);
 void DelSub(Subject*p);

 void Start();
 int menu();
 int custom();
 int server();

 Student* password1();
 bool password2();

 void menu_1_1(Student*p);

 void menu_2_1();
 void menu_2_2();
 void menu_2_3();
 void menu_2_4();
 void menu_2_5();
 void menu_2_6();
 void menu_2_7();
 void menu_2_8();
 void menu_2_9();

 void IsUpdate()
 {
 if (Update == true)
 {
  Student*p = StuRoot->next;
  Subject*q = SubRoot->next;
  while (q)
  {
  float sum = 0;
  StuList *t =q->GetStuPtr()->next;
  while (t)
  {
   sum += t->score;
   t = t->next;
  }
  q->SetAveGrade(sum);
  q->SetUpdate(false);
  q = q->next;
  }
  while (p)
  {
  float sum = 0, xuefen = 0, xuefen1 = 0;
  SubList *t = p->GetSubPtr()->next;
  while (t)
  {
   Subject*tt = FindSub(t->num);
   xuefen += tt->GetCredit();

   float f = tt->GetStuScore(p->GetNum());
   sum += f;
   if (f>= 60)
   xuefen1 += tt->GetCredit();
   t = t->next;
  }
  p->SetInfo(xuefen, xuefen1, sum);
  p->SetUpdate(false);
  p= p->next;
  }
  Update = false;
 }
 }
};

void Manage::DelStu(Student*p)
{
 SubList *l = p->GetSubPtr()->next;
 while (l)
 {
 FindSub(l->num)->DelStu(p->GetNum());
 l = l->next;
 }

 Student*t = StuRoot;
 while (t->next != p)
 t = t->next;
 t->next = p->next;
 delete p;
 Update = true;
}

void Manage::DelSub(Subject*p)
{
 StuList *l = p->GetStuPtr()->next;
 while (l)
 {
 FindStu(l->num)->DelSub(p->GetNum());
 l = l->next;
 }

 Subject*t = SubRoot;
 while (t->next != p)
 t = t->next;
 t->next = p->next;
 delete p;
 Update = true;
}

int Manage::ShowSub()const
{
 Subject*p = SubRoot->next;
 int n = 0;
 while (p)
 {
 cout <GetNum() <<" " <GetName() <<" 学分:" <GetCredit() <next;
 }
 return n;
}

int Manage::ShowStu()const
{
 Student*p = StuRoot->next;
 int n = 0;
 while (p)
 {
 cout <GetNum() <<" " <GetName() <next;
 }
 return n;
}

Student*Manage::FindStu(int num)
{
 Student*p = StuRoot->next;
 while (p)
 {
 if (p->GetNum() == num)
  break;
 p = p->next;
 }
 return p;
}

Subject*Manage::FindSub(int num)
{
 Subject*p = SubRoot->next;
 while (p)
 {
 if (p->GetNum() == num)
  break;
 p = p->next;
 }
 return p;
}

//总菜单 
int Manage::menu()
{
 int k = 0, n;
 while (1)
 {
 system("cls");
 cout <> n;
 if (n > -1 && n <3)
  return n;
 else
 {
  cerr <<"\n\n\t\t\t\t输入有误!\n" <> n;
 if (n > 0 && n <5)
  return n;
 else
 {
  cerr <<"\n\t\t\t\t输入有误!请重新输入\n" <> n;
 if (n > -1 && n <10)
  return n;
 else
 {
  cerr <<"\n\t\t\t\t输入有误!\n" <> num;
 Student*p = FindStu(num);
 if (p == NULL)
 {
  cout <<"无此学号!!请重新输入 " <GetName() <= 3)
 {
  system("cls");
  cerr <<"\n\n\t\t\t输入错误密码超过三次!请按任意键退出.." <> B;
 if (strcmp(A, B) == 0)
  return true;
 else
 {
  k++;
  cerr <<"\n\n\t\t\t密码输入错误!请重新输入!\n" <ShowStuInfo(); break;//学生情况 

  case 3:ShowStuSubInfo(p);; break;//选课情况 

  }
  IsUpdate();
  if (c == 4) break;//退出系统 
  }
  if (p == NULL)
  n = 0;
 }
 else if (n == 2)
 {
  bool t = password2();
  while (t)
  {
  int c = server();
  switch (c)
  {
  case 1:menu_2_1();  break;  //增加学生 
  case 2:menu_2_2(); break;  //增加课程 
  case 3: menu_2_3(); break;  //删除学生  
  case 4:menu_2_4();  break;  //删除课程  
  case 5: menu_2_5(); break;  //填写成绩 
  case 6: menu_2_6(); break;  //更改学分 
  case 7:menu_2_7();  break;  //学生情况 
  case 8:menu_2_8();  break;  //选课情况 
  case 9: menu_2_9(); break;  //保存数据 
  }
  IsUpdate();
  if (c == 0)   break;  //退出系统 
  }
  if (!t)
  n = 0;
 }
 }
}

//学生端功能函数 
void Manage::menu_1_1(Student*p)  //学生选课
{
 if (p->IsFull())
 cout <<"你的课程已经选满了" <> num;
  if (p->FindSub(num))
  cout <<"此课程你已经选择" <IsFull())
  cout <<"课程人数已满" <AddSub(num);
  FindSub(num)->AddStu(p->GetNum());
  cout <<"选课成功" <GetSubPtr()->next;
 cout <GetNum() <<" " <GetName() <<" 选课数" <GetFactSubNum() <num);
 cout <<"\t\t" <GetNum() <<" " <GetName() <<" " <GetCredit() <GetStuScore(p->GetNum());
 cout <<"\t\t 成绩 " <next;
 }
}

//管理端功能函数
void Manage::menu_2_1()  //增加学生 
{
 system("cls");
 int num;
 char name[20];

 cout <<"\n\n\t\t\t\t增加学生操作\n" <> num;

 if (FindStu(num))
 cout <<"学生已经存在" <> name;
 Student*p = new Student();
 p->SetNum(num);
 p->SetName(name);
 Student *root = StuRoot;
 while (root->next)
  root = root->next;
 root->next = p;
 cout <> num;
 if (FindSub(num))
 cout <<"\n\t\t此课程已经存在,按任意键继续" <> name;
 cout <<"请输入课程学分" <> credit;
 Subject*p = new Subject();
 p->SetNum(num);
 p->SetName(name);
 p->SetCredit(credit);
 Subject *root = SubRoot;
 while (root->next)
  root = root->next;
 root->next = p;
 cout <> num;
 Student*p = FindStu(num);
 if (p == NULL)
  cout <<"无此学生" <> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cout <<"无此课程" <> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cerr <<"\n\t\t没有此课程!!请按任意键继续.." <GetNum() <<" 课程名称" <GetName() <<" 选课人数" <GetFactStuNum() <> n;
  if (n == 1)
  {
  StuList*q = p->GetStuPtr()->next;
  while (q)
  {
   Student*l = FindStu(q->num);
   cout <<"\n\n\t\t请填写" <num <<" " <GetName() <<"的学生成绩\n" <> q->score;
   l->SetUpdate(true);
   q = q->next;
  }
  p->SetUpdate(true);
  }

 }
 }
 Update = true;
 system("pause");
}

void Manage::menu_2_6()  //更改学分 
{
 system("cls");

 cout <<"\n\n\n\t\t\t\t更改学分操作\n" <> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cout <<"无此课程" <GetCredit() <> n;
  p->SetCredit(n);

  StuList*q = p->GetStuPtr()->next;
  while (q)
  {
  FindStu(q->num)->SetUpdate(true);
  q = q->next;
  }

  cout <<"\n\t\t更改课程学分成功,按任意键继续" <next;
 if (p == NULL)
 cout <<"无记录" <next;
 }
 system("pause");
}

void Manage::menu_2_8()  //选课情况
{
 system("cls");
 cout <<"\n\n\t\t\t\t选课情况操作" <> num;

 Subject*p = FindSub(num);
 if (p == NULL)
  cout <<"\n\t\t无此课程!!\t请按任意键继续.." <GetNum() <<" " <GetName() <<" " <GetCredit() <GetMaxStuNum() <<" " <<"实际人数" <GetFactStuNum() <GetStuPtr()->next;
  while (q)
  {
  cout <num <<" " <num)->GetName() <<" " <score <next;
  }
 }
 }
 system("pause");
}

 /*保存数据 不过没有读取函数 这个功能就没有 读取懒的写了... */
void Manage::menu_2_9() 
{
 Student*p = StuRoot->next;
 ofstream o("Student.txt",32);
 ofstream oo("SubList.txt", 32);
 while (p)
 {
 SubList*t=p->GetSubPtr()->next;
 o.write(reinterpret_cast(p), sizeof(*p));
 while (t)
 {
  oo.write(reinterpret_cast(t), sizeof(*t));
  t = t->next;
 }
 p = p->next;
 }
 o.close();
 oo.close();

 Subject*q = SubRoot->next;
 o.open("Subject.txt", 32);
 oo.open("StuList.txt", 32);

 while (q)
 {
 StuList*t = q->GetStuPtr()->next;
 o.write(reinterpret_cast(q), sizeof(*q));
 while (t)
 {
  oo.write(reinterpret_cast(t), sizeof(*t));
  t = t->next;
 }
 q = q->next;
 }
 o.close();
 oo.close();
 cout <<"\n\n\n\t\t\t保存数据成功!按任意键继续.." <

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
author-avatar
伪祢添睬_362
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有