一、具体代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
using namespace std;
class student;
class student_manager
{public:student* p;//对象数组指针
student_manager();~student_manager();int number;//记录学生总人数bool read_file();    //读文件,如果文件存在并有数据返回trueint get_filenumber();//读出文件中有多少人void save_file();//将用户输入的学生信息进行保存void raw_data();//展示学生的原始数据(从文件中读入的或是用户输入的)void sort();//将学生按照成绩进行排序void average();//求出各门科目的平均分void score_segment();//求各门科及其各个分数区间的人数void add_student();//添加学生信息void find_student();//查找学生void change_student();//修改学生信息void delete_student();//删除学生void show_menu();//展示学生成绩管理系统的菜单  void exit_system();//退出系统
};
class student
{//声明为友元类使其可以访问student类的私有属性friend bool student_manager::read_file();friend void student_manager::save_file();friend void student_manager::raw_data();friend void student_manager::sort();friend void student_manager::average();friend void student_manager::score_segment();friend void student_manager::add_student();friend void student_manager::find_student();friend void student_manager::change_student();friend void student_manager::delete_student();
public:student() {}student(int number, string name, double c_score, double math_score, double english_score, double algebra_score){this->number = number;this->name = name;this->c_score = c_score;this->math_score = math_score;this->english_score = english_score;this->algebra_score = algebra_score;this->average = (c_score + math_score + english_score + algebra_score) / 4.0;this->ranking = 0;//存放到数组里面方便后面用this->urr[0] = this->c_score;this->urr[1] = this->math_score;this->urr[2] = this->english_score;this->urr[3] = this->algebra_score;this->urr[4] = this->average;}void show_information(){cout << number << '\t' << name << '\t' << c_score << '\t' << math_score << '\t' << english_score << '\t' << algebra_score << '\t' << average << '\t' << ranking << endl;}
private:int number;  //学号string name;//姓名double c_score;      //C语言成绩double math_score;   //高数成绩double english_score;//英语成绩double algebra_score;//线性代数成绩double average;      //各门科目的总平均分double urr[5];       //将四门科目和平均分汇总存放在一起,方便统计int ranking;         //在班里的排名
};
bool student_manager::read_file()//判断文件是否纯在以及里面是否有数据
{ifstream ifs;ifs.open("学生成绩管理系统.txt", ios::in);if (!ifs.is_open())//判断文件是否存在{cout << "文件不存在,请输入学生数据!" << endl;ofstream ofs;ofs.open("学生成绩管理系统.txt", ios::out);ifs.close();return false;}char ch;ifs >> ch;if (ifs.eof()){cout << "文件存在但是数据为空,请输入学生数据!" << endl;ifs.close();return false;}ifs.seekg(0, ios::beg);//将文件指针重新定位到开头return true;
}
int student_manager::get_filenumber()//读出文件中一共有几名学生
{int num=0;ifstream ifs;ifs.open("学生成绩管理系统.txt",ios::in);int number;string name;double c_score;double math_score;double english_score;double algebra_score;while (ifs >> number >> name >> c_score >> math_score >> english_score >> algebra_score){num++;}return num;
}
void student_manager::save_file()//将用户输入的学生信息保存到文件里面
{ofstream ofs;ofs.open("学生成绩管理系统.txt", ios::out);for (int i = 0; i < this->number; i++){ofs << p[i].number << '\t' << p[i].name << '\t' << p[i].c_score << '\t' << p[i].math_score << '\t' << p[i].english_score << '\t' << p[i].algebra_score << endl;}ofs.close();
}
student_manager::student_manager()
{if (read_file() != false)//如果文件里面有数据就从文件里面读{ifstream ifs;ifs.open("学生成绩管理系统.txt", ios::in);this->number = get_filenumber();this->p = new student[this->number];//动态开辟一段空间,并用p指向他int number;string name;double c_score;double math_score;double english_score;double algebra_score;int i = 0;while (ifs >> number >> name >> c_score >> math_score >> english_score >> algebra_score){p[i] = student(number, name, c_score, math_score, english_score, algebra_score);i++;}ifs.close();}else  //如果文件里面没有数据就让用户输入数据{int number;string name;double c_score;double math_score;double english_score;double algebra_score;cout << "请输入您要输入的学生数目:";cin >> this->number;this->p = new student[this->number];//动态开辟for (int i = 0; i <this->number; i++){cout << "请输入第" << i + 1 << "学生的信息" << endl;cout << "学号   姓名  C程序设计 高等数学 英语 线性代数 " << endl;cin >> number >> name >> c_score >> math_score >> english_score >> algebra_score;p[i] = student(number, name, c_score, math_score, english_score, algebra_score);}save_file();//用户输完后把数据存到文件里面}
}
student_manager::~student_manager()
{if (this->p != NULL)//手动释放开辟在堆区的空间{delete p;//归还内存p = NULL;//将指针指向空this->number = 0;}
}
void student_manager::raw_data()
{cout << "学号   姓名  C程序设计 高等数学 英语 线性代数 " << endl;for (int i = 0; i < this->number; i++){cout << p[i].number << '\t' << p[i].name << '\t' << p[i].c_score << '\t' << p[i].math_score << '\t' << p[i].english_score << '\t' << p[i].algebra_score << endl;    }
}
void student_manager::sort()
{for (int i = 0; i < this->number - 1; i++)//冒泡排序{for (int j = 0; j < this->number - 1 - i; j++){if (p[j].average< p[j + 1].average){student temp;temp = p[j];//交换p[j] = p[j + 1];p[j + 1] = temp;}}}for (int i = 0; i < this->number; i++){p[i].ranking =  i+1;}for (int i =0; i <this->number-1; i++)//用于处理平均分相同的情况{if (p[i].average == p[i + 1].average){p[i+1].ranking = p[i].ranking;//并列排名}}cout << "学号    姓名 C程序设计 高等数学 英语 线性代数  平均分 名次 " << endl;for (int i = 0; i < this->number; i++){p[i].show_information();}
}
void student_manager::average()
{double c_score = 0;double math_score = 0;double english_score = 0;double algebra_score = 0;double average = 0;for (int i = 0; i < this->number; i++){c_score += p[i].c_score;math_score += p[i].math_score;english_score += p[i].english_score;algebra_score += p[i].algebra_score;average += p[i].average;}c_score /= (double)this->number;math_score /= (double)this->number;english_score /= (double)this->number;algebra_score /= (double)this->number;average /= (double)this->number;cout << "             C程序设计 高等数学 英语 线性代数  平均分  " << endl;cout << "各科平均分      " << c_score << '\t' << math_score << '\t' << english_score << '\t' << algebra_score << '\t' << average << endl;
}
void student_manager::score_segment()
{int arr[4][5] = { 0 };for (int i = 0; i < 5; i++){for (int j = 0; j < this->number; j++){if (p[j].urr[i] >= 90 && p[j].urr[i] <= 100){arr[0][i]++;}if (p[j].urr[i] >= 80 && p[j].urr[i] <= 90){arr[1][i]++;}if (p[j].urr[i] >= 60 && p[j].urr[i] <= 80){arr[2][i]++;}if (p[j].urr[i] >= 0 && p[j].urr[i] <= 60){arr[3][i]++;}}}cout << "  90-100        ";for (int i = 0; i < 5; i++){cout << arr[0][i] << '\t';}cout << endl;cout << "  80-89         ";for (int i = 0; i < 5; i++){cout << arr[1][i] << '\t';}cout << endl;cout << "  60-69         ";for (int i = 0; i < 5; i++){cout << arr[2][i] << '\t';}cout << endl;cout << "  60以下        ";for (int i = 0; i < 5; i++){cout << arr[3][i] << '\t';}cout << endl;}
void student_manager::add_student()
{cout << "请输入您要添加的学生人数:";int add_number;cin >> add_number;int t = this->number + add_number;student* temp=new student[this->number+add_number];//动态开辟一段新的空间for (int i = 0; i < this->number; i++){temp[i] = p[i];//将原来的数据拷贝到新的空间下面}int number;string name;double c_score;double math_score;double english_score;double algebra_score;for (int i =this->number; i < add_number+this->number; i++){newpoint:cout << "请输入第你要添加的第" << i - this->number + 1 << "个学生的信息" << endl;cout << "学号   姓名  C程序设计 高等数学 英语 线性代数 " << endl;cin >> number >> name >> c_score >> math_score >> english_score >> algebra_score;for (int i = 0; i < this->number; i++){if (number == p[i].number){cout << "输入有误,请勿重新输入学号" << endl;//如果用户输入的学号已经存在,跳转到前面让他重新输入goto newpoint;}}temp[i] = student(number, name, c_score, math_score, english_score, algebra_score);}this->p = temp;//p指针指向新的空间this->number = t;//更新学生的人数save_file();cout << "添加学生成功!" << endl;
}
void student_manager::find_student()
{cout << "请输入您要查找的学生的学号:";int num;cin >> num;for (int i = 0; i < this->number; i++){if (this->p[i].number == num){cout << "查找学生成功!该学生的信息如下" << endl;cout << "学号    姓名 C程序设计 高等数学 英语 线性代数  平均分 名次 " << endl;this->p[i].show_information();return;}      }cout << "查找失败,查无此人!"<<endl;
}
void student_manager::change_student()
{cout << "请输入您要修改信息的学生的学号";int num;cin >> num;int subscript=-1;for (int i = 0; i < this->number; i++){if (this->p[i].number == num){subscript = i;break;}}if (subscript == -1){cout << "没有这个人,无法修改其信息" << endl;return;}newpoint1:cout << "请输入您要修改的学生信息" << endl;int number;string name;double c_score;double math_score;double english_score;double algebra_score;cout << "学号   姓名  C程序设计 高等数学 英语 线性代数 " << endl;cin >> number >> name >> c_score >> math_score >> english_score >> algebra_score;for (int i = 0; i < this->number; i++){if (p[i].number == number)//将该学生的学号改为已经存在的(除非是他自己本来的学号)提示用户重新输入正确的学号{if (p[i].number != num){cout << "输入有误,您输入的学生学号已经存在,请重新输入!" << endl;goto newpoint1;}     }           }
p[subscript] = student(number, name, c_score, math_score, english_score, algebra_score);cout << "修改学生信息成功!" << endl;save_file();
}
void student_manager::delete_student()
{cout << "请输入您要删除的学生学号:";int num;cin >> num;int subscript = -1;for (int i = 0; i < this->number; i++){if (this->p[i].number == num){subscript = i;break;}}if (subscript == -1){cout << "没有这个人,无法删除其信息" << endl;return;}for (int i = subscript; i < this->number - 1; i++){this->p[i] = this->p[i + 1];}this->number--;cout << "删除成功!" << endl;save_file();
}
void student_manager::show_menu()
{cout << "|——————————————————————|" << endl;cout << "|       学生成绩管理系统           |" << endl;cout << "|——————————————————————|" << endl;cout << "|        0.展示原始学生信息              |" << endl;cout << "|——————————————————————|" << endl;cout << "|        1.展示学生成绩及排名            |" << endl;cout << "|——————————————————————|" << endl;cout << "|            2.展示各课程分数段人数          |" << endl;cout << "|——————————————————————|" << endl;cout << "|            3.添加学生信息                  |" << endl;cout << "|——————————————————————|" << endl;cout << "|            4.查找学生信息                  |" << endl;cout << "|——————————————————————|" << endl;cout << "|            5.修改学生信息                  |" << endl;cout << "|——————————————————————|" << endl;cout << "|            6.删除学生信息                  |" << endl;cout << "|——————————————————————|" << endl;cout << "|            7.退出系统                      |" << endl;cout << "|——————————————————————|" << endl;
}
void student_manager::exit_system()
{cout << "【退出系统】" << endl;cout << "欢迎下次使用!" << endl;exit(0);
}
int main()
{student_manager A;while (true){A.show_menu();int choice;cout << "请输入您的选择:";cin >> choice;switch (choice){case 0: A.raw_data(); break;case 1: A.sort(); break;case 2: {  A.average(); A.score_segment(); break;}case 3: A.add_student(); break;case 4: A.find_student(); break;case 5: A.change_student(); break;case 6: A.delete_student(); break;case 7: A.exit_system(); break;default:cout << "输入有误,请正确输入" << endl; break;}system("pause");system("cls");}return 0;
}

二、注意事项
○1当文件不存在时创建文件,并提示用户录入学生信息,并将录入的信息保存到文件中

○2当文件里面没有数据时让用户录入学生信息,并将录入的信息保存到文件中

○3文件存在且有数据时,将文件里数据读出来,用户可直接根据菜单进行功能体验,不必再输入一遍数据

○4功能0(展示从文件中读的原始数据或用户键入的原始数据)

○5功能1(展示按平均分排序后的学生信息及其排名)
注:考虑有同学平均分相同的情况,如下的小刘和小张,均分均为86,并列排名第4名

○6功能2(展示各个课程的平均分及各个分数段人数)

○7功能3(添加学生)
(1) 要添加学生的学号不是已经存在时

(2) 要添加学生的学号已经存在时,提示用户输入有误,让用户重新输入

检验:可见学生成功添加进去了

○8功能4(查找学生)
(1) 当查找学生学号存在时
(2)当查找的学生不存在时

○9功能5(修改学生信息)
(1)修改后的学号未与已有学生(本身除外)的学号冲突

(2) 修改后的学生学号与已有的学生冲突,提示用户输入错误,让其再次输入

检验:可见大山的信息成功被修改

○10功能6(删除学生)
(1)输入的学号存在

(2)输入的学号不存在

○11功能7(退出系统)

补:当用户的选择错误时提示用户正确输入选择

学生成绩管理系统 c++版相关推荐

  1. 基于PHP的学生成绩管理系统(多用户版)

    基于PHP的学生成绩管理系统(多用户版) 一 项目介绍 此成绩管理系统用户分为学生和教师,界面友好!(附带设计文档) 技术栈 原生php+mysql+navicat+vscode 二 主要功能 学生 ...

  2. c语言实现学生二科成绩的单链表,c++链表实现学生成绩管理系统(简易版)

    #include using namespace std; typedef struct student{ int id;//学号 string sex; string name; int cpp;/ ...

  3. 【Python】学生成绩管理系统

    学生成绩测评系统 参考链接 安装Mysql 具体操作参考此贴:最新超详细MySQL安装及基本使用教程 运行中出现的问题 python报错raise XLRDError (FILE_FORMAT_DES ...

  4. python成绩管理系统界面-python实现简易版学生成绩管理系统

    300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下 使用链表来实现 class Node(object): def __init__(self, data, pointer ...

  5. 学生成绩管理系统设计报告python_python实现简易版学生成绩管理系统

    300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下 使用链表来实现 class Node(object): def __init__(self, data, pointer ...

  6. 西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统(链表版)

    背景描述: 因为苦于网上到处都找不到答案,仅有的链表版还要收费,我就自己写了一个低配版链表,将就着用,想的是帮助明年以及后年的学弟学妹们. 题目描述: 实验目的: 掌握程序设计的基本算法和简单数据结构 ...

  7. VC版学生成绩管理系统

    VC版学生成绩管理系统 一.    功能需求: 1.  能进行对数据库的连接(后台): 这是查询管理信息的基础. 2.  能进行增.删.改.查等基本功能: 这是学生成绩管理系统最基本的功能,可以在这个 ...

  8. 学生成绩管理系统(简单版)

    学生成绩管理系统(简单版) 学生成绩管理系统(简单版) 数组版 结构体版 函数版 学生成绩管理系统(简单版) 要求:存储50个学生下信息(学号,姓名,性别,成绩1,成绩2)计算平均成绩,与等级(等级要 ...

  9. 学生成绩管理系统(简易版)

    写一个简单的学生成绩管理系统 为了方便,并且这个程序也不是很长,所以把所有代码写在一起了,下面是头文件和声明部分: 4.14修改版 : #include<stdio.h> #include ...

最新文章

  1. 178页,四年图神经网络研究精华汇总
  2. 5G NGC — NEF Traffic Influence Service
  3. 解析IntelliJ IDEA内部设计
  4. 线上squid防火墙配置
  5. Python学习笔记(二)——高级特性
  6. iOS 玩转CocoaPods
  7. php怎么进行异步编程,php异步编程是怎样的?
  8. mysql如何给text字段添加索引_MySQL 是如何利用索引的
  9. 查询数据表里所有重复里的单条记录
  10. WYSISYN编辑器 Prosemirror 入门
  11. hadoop入门手册5:Hadoop【2.7.1】初级入门之命令:文件系统shell2
  12. js html 加背景图片,利用js实现随机背景显示,每次访问背景图都不一样
  13. 也谈VC中ModifyStyleModifyStyleEx无法改变控件的Style)
  14. Linux小项目-数码相册设计
  15. JavaScript 读写剪贴板之方式汇总
  16. 我们应该怎样来提高自己的编程能力?
  17. 网页Flash实现图片轮播特效
  18. CSAPP:第四章——处理器体系结构(上)
  19. C++加载PNG图片
  20. 期末作业成品代码——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码

热门文章

  1. QT之QLineEdit——实现鼠标点击事件
  2. 关于在写代码时如何使用绝对路径与相对路径及其简单介绍
  3. 【Tools/macOS系列】iPad作为扩展显示屏的几种解决方案
  4. libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed by erlang-22.0.7-1.el7.x86_64
  5. 润乾报表 :com.runqian report4.dataset.SQLDataSetFactory 失败:数据集中,数据集ds1 中未设定数据源名称,且无默认数据源,请检查数据源设定
  6. MODIS地表温度产品获取处理
  7. 若金融战败 30年辛劳积累将付诸东流!
  8. Nagios配置文件简单介绍
  9. 有一个数组,内放10个整数,要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换。
  10. unity敌人跟随(导航)