一道非常经典的C语言题目,用C++实现
题目如下:
- 输入功能:由键盘输入10个学生的学号、姓名、三科成绩,并计算出平均成绩和总成绩,然后将它存入文件stud.dat。
- 插入功能:按学号增加一个学生信息,并将其插入到stud.dat中。
- 排序功能,按要求对学生信息进行排序,分为按学号和按总成绩进行排序两种情形,并输出结果。
- 查询功能:按要求查找学生信息,分为按学号和姓名进行查询两种情形,并输出结果。
- 删除功能:按要求将学生信息删除,分为按学号和姓名进行删除两种情形。
- 输出功能:按学号输出学生信息。
整体思路:
- 程序启动的时候判断文件(stu.dat)是否存在,如果文件不存在,则正常执行,如果文件存在,先获取文件中学生的个数,根据学生的个数创建对象数组,将内容创建成学生对象,保存在对象数组1里,再向下执行。
- 用Switch语句来判断不同的输入。
- 新增学生,根据 原来对象数组1储存的人数+新增的人数 来确定新的动态数组2的大小,将原本对象数组1内的内容保存在新的对象数组2里,再将新增的内容储存在后面,每次新增完,直接保存到文件。
- 排序学生,根据学号或者姓名,写一个数组的冒泡排序即可
- 查询学生,写一个函数,判断学生是否存在,如果存在返回学生所在数组的下标,根据下标输出内容
- 删除学生,用查询学生写的函数,根据下标删除学生
- cout对象数组里的内容就完事
实现代码
#include <iostream>
#include<fstream>
#include<string>
#define line for (int n = 0; n <= 100; n++) cout << "-"
#define FILENAME "stdu.dat"
using namespace std;
class student { //学生类
public:
int Is_Exist(string stuId, int a);
int get_student_number(); //获取文件中学生人数
bool File_Is_Empty; //文件是否为空的标识
student *studentArray; //将文件中的内容,以student对象方式储存在studentArray[]数组中
int student_number; //学生人数
string studentId; //学号
string name; //姓名
float score[3];//成绩*3
float Total; // 总分
int Average;//平均分
void sort(int n=1); //排序函数
void delete_stu(); //删除学生
void init(); //初始化内容,将文件中的内容读到studentArray中
void save(); //保存文件
void show();//展示界面
void add_stu(int number = 1); //添加学生
void showInfo(); //展示学生信息
void search();//搜索学生
student() //默认构造函数,判断文件是否为空,设置File_Is_Empty值
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
if (!ifs.is_open())
{
this->student_number = 0;
this->studentArray = NULL;
this->studentId = "0";
this->name = "0";
this->score[0] = 0;
this->Average = 0;
this->Total = 0;
this->File_Is_Empty = true;
ifs.close();
return;
}
char c;
ifs >> c;
if (ifs.eof())
{
//文件空
this->student_number = 0;
this->studentArray = NULL;
this->studentId = "0";
this->name = "0";
this->score[0] = 0;
this->Average = 0;
this->Total = 0;
this->File_Is_Empty = true;
ifs.close();
return;
}
int num = this->get_student_number(); //获取文件中学生数量
this->student_number = num;
//cout << "现在学生人数为:" << num << endl;;
//system("pause");
};
~student() //析构函数
{
delete[]this->studentArray;
this->studentArray = NULL; //防止指针变为野指针
}
student(string stuId,string stuName, float stuScore[3]) //带参数的构造函数
{
this->studentId = stuId;
this->name = stuName;
for (int i = 0; i < 3; i++)
this->score[i] = stuScore[i];
this->A