评论

收藏

[C++] C++学生成绩管理系统

编程语言 编程语言 发布于:2021-07-22 20:07 | 阅读数:502 | 评论:0

面对简易的学生成绩管理系统需要实现以下几个功能要求p:1、可以手动录入用户输入的学生成绩信息 2、可以实现对系统中某个特定项进行修改 3、可以对已经存在的学生信息进行查找 4、对录入的数据信息进行保存 5、可以对输入的数据进行删除清空 6、显示出保存好的信息
根据这些功能需求现在来进行具体实现:声明一个学生类和一个学生成绩派生类并在类外分别进行定义,包含学号、姓名、身份证号码,数学成绩、英语成绩、计算机成绩、各科总成绩,平均成绩及一些函数。由于系统要求所有的数据都需要存放在txt文件中,所以需要使用文件的输入输出流。此次系统是创建链表来存放学生信息,也使用到链表头指针和数据域指针来检索信息。自定义功能函数:void creat();//录入成绩;void Tshow();//输出此次录入数据;void del();//删除已存某个数据;void clean();//清空数据库;void rework();//修改数据库;void save();//保存学生信息进入文件;void find();//查找数据库中学生信息;void displist();//输出数据库;之后再创建一个简易的菜单对用户的操作进行提示,根据提示完成相应操作,使系统更具有操作性。此系统既可以从控制台进行信息处理,也可以在txt文件里进行对数据的添加。此次学习让我很好的学习到代码与文件的联系,并亲自写代码实践了,收获颇丰。
核心代码:
int main()
{
  root = new link;
  root->next = nullptr;
  cout << "**************************************" << endl;
  cout << "*  欢迎使用学生成绩管理系统主菜单   *" << endl;
  cout << "*      (请按提示操作)      *" << endl;
  cout << "*1 录入成绩\t     2 修改已存信息*\n*3 保存信息\t     4 输出信息  *\n*5 删除信息\t     6 清空\t   *\n*7 查询信息\t     8 输出数据库  *" << endl;
  cout << "*       按其他键退出       *" << endl;
  cout << "**************************************" << endl;
  cout << "   选择1-8进行操作,你的选择是:";
  int n;
  cin >> n;
  while (n > 0 && n < 9)
  {
    switch (n)
    {
    case 1:
      creat(); break;//录入成绩
    case 2:
      rework(); break;//修改数据库
    case 3:
      save(); break; //保存学生信息进入文件
    case 4:
      Tshow(); break;//输出此次录入数据
    case 5:
      del(); break;//删除已存某个数据
    case 6:
      clean(); break;//清空数据库
    case 7:
      find(); break;//查找数据库中学生信息
    case 8:
      displist(); break;//输出数据库
    default:break;
    }
    system("pause");
    system("cls");
    cout << "**************************************" << endl;
    cout << "*   迎使用学生成绩管理系统主菜单   *" << endl;
    cout << "*      (请按提示操作)      *" << endl;
    cout << "*1 录入成绩\t     2 修改已存信息*\n*3 保存信息\t     4 输出信息  *\n*5 删除信息\t     6 清空\t   *\n*7 查询信息\t     8 输出数据库  *" << endl;
    cout << "*       按其他键退出       *" << endl;
    cout << "**************************************" << endl;
    cout << "   选择1-8进行操作,你的选择是:";
    cin >> n;
  }
  cout << "*****************************************" << endl << endl;
  cout << "    感谢使用学生成绩管理系统!!!" << endl << endl;
  cout << "*****************************************" << endl;
  return 0;
}
void creat()//录入成绩
{
  link* s;
  s = new link;
  s->head.fcourse();//利用链表指针输入数据
  ifstream in;//从硬盘到内存,in为输入流对象
  in.open("学生成绩数据.txt", ios::in);//文件以输入方式打开,向文件中录入数据
  if (!in.is_open())
  {
    cout << "打开文件失败!" << endl;
    return;
  }
  string x, y, z;//专业,姓名,年级
  double q, w, e,t,u;
  in >> x >> y >> z >> q >> w >> e >>t>> u ;//从文件中读取数据传给程序
  if (x == s->head.a)//x为学号,判断录入学号是否已经存在
  {
    cout << "************" << endl << endl;
    cout << "  学号重复!" << endl;
    cout << s->head.a << "录入失败!" << endl << endl;
    cout << "************" << endl;
    in.close();//关闭输入流对象
    delete s;
    return;
  }
  s->next = root;//连接root链表
  root = s;//将s中录取的学生数据信息存入root链表中
  cout << "************" << endl << endl;
  cout << "  录入成功!" << endl << endl;
  cout << "************" << endl;
}
void Tshow()//输出此次录入数据
{
  cout << "***********************************************************************************************" << endl << endl;
  cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机" << setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
  link* p = root;//创建一个指针指向root链表
  while (p->next != nullptr)//判断链表中的信息情况
  {
    p->head.show();//显示输出本次输出的学生信息
    p = p->next;//指针依次往后移
  }
  cout << "                  输出成功!" << endl << endl;
  cout << "************************************************************************************************" << endl;
}
void clean()//清空数据
{
  ofstream clear;//从内存到硬盘清空数据,clear为输出流对象
  clear.open("学生成绩数据.txt", ios::trunc);//如果文件存在,把文件长度设为0
  clear.close();
  cout << "************" << endl << endl;
  cout << "  清空成功!" << endl << endl;
  cout << "************" << endl;
}
void rework()//修改数据
{
  int p = 0;//判断标值
  string b;//b为学号
  cout << "********************" << endl << endl;
  cout << " 请输入修改的学号:";
  cin >> b;
  ifstream in;//从硬盘到内存,in为输入流对象
  in.open("学生成绩数据.txt", ios::in); // 文件以输入方式打开
  if (!in.is_open())
  {
    cout << "文件打开失败!" << endl;
    return;
  }
  ofstream out;//从内存到硬盘,out输出流对象
  out.open("学生成绩表.txt", ios::app);//以追加的方式打开文件,添加数据到文件尾部
  if (!out.is_open())
  {
    cout << "文件打开失败!" << endl;
    return;
  }
  string x, y, z;//学号、姓名、身份证号
  double q, w, e,t,u;
  while (in >> x)
  {
    in >> y >> z >> q >> w >> e >> t >> u;//从文件把数据传给程序
    if (b == x)//判断输入流对象数据中学号是否相等
    {
      int o = 0;
      cout << "请选择需要修改的数据!" << endl;
      cout << "1:修改数学 2:修改英语 3:修改计算机:" << endl;
      cin >> o;
      switch (o)
      {
      case 1:
        cout << "请输入成绩:" << endl;
        in >> q;
        cin >> q ;
        t = q + w + e;
        u = t / 3.0;
        p++;
        out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
        //从程序中把修改后的数据传给文件数据库
        break;
      case 2:
        cout << "请输入成绩:" << endl;
        in >> w;
        cin>> w ;
        t = q + w + e;
        u = t / 3.0;
        p++;//修改数据库
        out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
        //从程序中把修改后的数据传给文件数据库
        break;
      case 3:
        cout << "请输入成绩:" << endl;
        in >> e;
        cin >> e ;
        t = q + w + e;
        u = t / 3.0;
        p++;//执行后p变为1;
        out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
        //从程序中把修改后的数据传给文件数据库
        break;
      }
      //out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
      ////从程序中把修改后的数据传给文件数据库
    }
  }
  out.close();
  in.close();
  system("del 学生成绩数据.txt");
  system("rename 学生成绩表.txt 学生成绩数据.txt");//改名
  if (p == 0)
  {
    cout << "   查无此人!" << endl << endl;
    cout << "********************" << endl;
  }
  else
  {
    cout << "   修改成功!" << endl << endl;
    cout << "********************" << endl;
  }
}
void save()//保存数据进入文件中
{
  link* P = root;
  while (P->next != nullptr)//判断链表中是否有数据
  {
    P->head.ishow();//将链表中数据存储到文件中
    P = P->next;//指针后移
  }
  cout << "********************" << endl << endl;
  cout << "  保存数据成功!" << endl << endl;
  cout << "********************" << endl;
}
void find()//查找数据库中学生信息
{
  string b;//输入学号
  cout << "********************" << endl << endl;
  cout << "  请输入查找的学号:";
  cin >> b;
  fstream ff("学生成绩数据.txt", ios::in);//ff为输入输出流文件对象,对ff进行输入操作
  if (!ff)
  {
    cout << "打开文件失败!" << endl;
    return;
  }
  string x, y, z;
  double q, w, e,t, u;
  ff >> x >> y >> z >> q >> w >> e  >> t >> u;//将文件里的数据传给程序
  while (x != b)//根据学号判断
  {
    if (!(ff >> x >> y >> z >> q >> w >> e >> t >> u))//判断是否存在该学号的成绩信息
    {
      cout << "    查无此人!" << endl << endl;
      cout << "********************" << endl;
      return;
    }
  }
  ff.close();//关闭文件
  cout << "学号:" << x << "  姓名:" << y << "  身份证号:" << z << "  数学:" << q << "  英语:" << w << "  计算机:" << e  << "  总成绩:" << t << "  平均成绩:" << u << endl;
  cout << "    输出成功!" << endl << endl;
  cout << "********************" << endl;
}
void del()//删除已存某个数据
{
  int p = 0;
  string b;
  cout << "********************" << endl << endl;
  cout << "  请输入删除的学号:";
  cin >> b;
  ifstream in;//从硬盘到内存,输入流对象
  in.open("学生成绩数据.txt", ios::in);
  if (!in.is_open())
  {
    cout << "文件打开失败!" << endl;
    return;
  }
  ofstream out;//从内存到硬盘
  out.open("学生成绩表.txt", ios::app);
  if (!out.is_open())
  {
    cout << "文件打开失败!" << endl;
    return;
  }
  string x, y, z;
  double q, w, e, t, u;
  while (in >> x)
  {
    in >> y >> z >> q >> w >> e >> t >> u;
    if (b != x)
    {
      out << x << "\t" << y << "\t" << z << "\t" << q << "\t" << w << "\t" << e << "\t" << t << "\t" << u << endl;
    }
    if (b == x)
    {
      p++;
    }
  }
  out.close();
  in.close();
  system("del 学生成绩数据.txt");
  system("rename 学生成绩表.txt 学生成绩数据.txt");
  if (p == 0)
  {
    cout << "    查无此人!" << endl << endl;
    cout << "********************" << endl;
  }
  else
  {
    cout << "    删除成功!" << endl << endl;
    cout << "********************" << endl;
  }
}
void displist()//输出数据库
{
  int p = 0;
  string x, y, z;
  double q, w, e, t, u;
  cout << "*******************************************************************************************" << endl << endl;
  cout << setw(10) << "学号" << setw(6) << "姓 名" << setw(20) << "身份证号" << setw(8) << "数学" << setw(8) << "英语" << setw(8) << "计算机"  << setw(8) << "总成绩" << setw(8) << "平均成绩" << endl;
  ifstream in;//in为输入流对象
  in.open("学生成绩数据.txt", ios::in);
  if (!in.is_open())
  {
    cout << "打开文件失败!" << endl;
    return;
  }
  while (in >> x)
  {
    p++;
    in >> y >> z >> q >> w >> e >> t >> u;
    cout << setw(10) << x << setw(6) << y << setw(20) << z << setw(8) << q << setw(8) << w << setw(8) << e  << setw(8) << t << setw(8) << u << endl;
    //控制数据的域宽
  }
  if (p == 0)
  {
    cout << "                    无数据!" << endl << endl;
    cout << "*******************************************************************************************" << endl;
  }
  else
  {
    cout << "                   输出成功!" << endl << endl;
    cout << "*******************************************************************************************" << endl;
  }
}


关注下面的标签,发现更多相似文章