题目要求(手打,累):设计一个类CStudent,类中包含一个学生的基本数据如下:
编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩。
并假设编号为整数,且从1号往后连续编码;姓名为字符串,性别为字符。如:
1 LiPing m 18 89 98 94
请采用binary文件形式,并使用随机读写处理方式,对自定义CStudent类的对象数据进行存储与读写处理(即是说,总按具体连续编码的编号num为"序"来对文件中各对象进行随机读写处理)。并设计该类的成员函数,而且对输出运算符"<<"进行重载,使该运算符能够完成将一个学生的信息输出到屏幕上。要求成员函数完成以下功能:
(1) 从键盘输入一个学生的有关信息,并将它们存入到数据文件中(按编号来确定写出位置)。
(2) 按编号对学生信息进行检索并将检索结果显示在屏幕上。
(3) 按姓名对学生信息进行检索并将检索结果显示在屏幕上。
(4) 计算某编号学生的总成绩与平均成绩。
(5) 列出所有总成绩超过n分的性别为s同学的有关信息(n,s由用户从键盘输入)。
思考:可进一步对上述程序进行扩充,如,添加学生的基本数据(籍贯,专业,班级,其他各门成绩,奖罚记录等),并添加所需要的其他相关处理函数(如可通过咨询教学办公室管理人员后确立),进而将其编织成为一个简单而且实用的小型学籍与成绩管理软件。
以下为代码:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
#define NUM 10000
void Menu(); //菜单功能
class CStudent
{
private:
int num; //编号
string name; //姓名
char gender; //性别
int age; //年龄
double math; //数学成绩
double physics; //物理成绩
double computer; //计算机成绩
double english; //外语成绩
string major; //专业
string RP; //奖罚记录
double sum; //总成绩
double ave; //平均成绩
public:
void Insert(CStudent & S); //插入,添加
void Dlete(); //删除
void Numseek(); //按编号查找
void Nameseek(); //按姓名查找
void Grade(); //计算某个学生的平均成绩和总成绩
void Sort(CStudent & S); //对学生的总成绩进行排序
void Inquire(double n, char ch); //根据输入的成绩和性别排查超过输入成绩且性别一样的同学
void Save(); //保存数据到文件
void Read(); //读取数据
void Sum(){sum = math + physics + computer + english;} //计算总成绩
void Ave(){ave = (math + physics + computer + english) / 4;}
void operator <<(CStudent & S)
{
cout << setw(5) << S.num << setw(5) << S.name << setw(5) << S.gender << setw(5) << S.age << setw(5) << S.math << setw(5) << S.physics << setw(7) << S.computer
<< setw(5)<< S.english << setw(5) << S.major << setw(9) << S.RP << endl;
}
};
static int j;
CStudent C[NUM];
int main()
{
fstream File("学生学籍与成绩管理系统.txt");
cout << "\n\t\t^^^检查文件是否存在中^^^" << endl << endl << endl;
if(!File)
{
cout << "\t\t文件不存在,请创建名为学生学籍与成绩管理系统的文档!" << endl;
exit(1);
}
cout << "\t\t该文件存在,是否进入管理系统" << endl << endl << endl;
cout << "\t\t是请按1,不是请按0" <<endl << endl << endl;
bool n;
cin >> n;
if(!n)
{
cout << "\t\t谢谢使用!" << endl;
File.close();
exit(1);
}
File.close();
CStudent S;
char ch;
while(1)
{
Menu();
cin >> ch;
switch(ch)
{
case '1':{S.Insert(S); break;}
case '2':{S.Dlete(); break;}
case '3':{S.Numseek(); break;}
case '4':{S.Nameseek(); break;}
case '5':{S.Grade(); break;}
case '6':{S.Sort(S); break;}
case '7':{double n; char ch; cout << "请输入要查询多少分以上的成绩\n"; cin >> n; cout << "请输入性别\n";
cin >> ch; S.Inquire(n, ch); break;}
case '8':{S.Read(); break;}
case '0':{exit(0);}
}
}
return 0;
}
//---------------------------------------------------------------------------------------------------菜单功能
void Menu()
{
system("cls");
cout << "\n\t\t\t欢迎进入学生学籍与成绩管理系统" << endl << endl;
cout << "\t\t\t按1添加数据" << endl << endl;
cout << "\t\t\t按2删除数据" << endl << endl;
cout << "\t\t\t按3根据编号查找学生信息" << endl << endl;
cout << "\t\t\t按4根据姓名查找学生信息" << endl << endl;
cout << "\t\t\t按5输入学生编号计算他的平均成绩和总成绩" << endl << endl;
cout << "\t\t\t按6排序" << endl << endl;
cout << "\t\t\t按7输入成绩和性别查询学生" << endl << endl;
cout << "\t\t\t按8读取数据" << endl << endl;
cout << "\t\t\t按0退出程序" << endl << endl;
}
//---------------------------------------------------------------------------------------------------插入添加
void CStudent::Insert(CStudent & S)
{
while(1)
{
bool judge = true;
cout << "\n\n请输入编号(1~10000):";
cin >> S.num;
cout << "\n请输入姓名:";
cin >> S.name;
for(int i = 0; i <= j; i++)
{
if(C[i].num == S.num || (C[i].name).compare(S.name) == 0) //判断了编号重复和姓名重复的情况
{
cout << "输入编号或姓名重复,退出添加系统" << endl;
system("pause");
judge = false;
}
}
if(judge == false)
break;
while(1)
{
cout << "\n请输入性别(男:m,女:n):";
cin >> S.gender;
if(S.gender == 'm' || S.gender == 'n')
break;
else
cout << "格式输入错误" << endl;
}
cout << "\n请输入年龄:";
cin >> S.age;
cout << "\n请输入数学成绩:";
cin >> S.math;
cout << "\n请输入物理成绩:";
cin >> S.physics;
cout << "\n请输入计算机成绩:";
cin >> S.computer;
cout << "\n请输入外语成绩:";
cin >> S.english;
cout << "\n请输入专业:";
cin >> S.major;
cout << "\n请输入奖罚记录:";
cin >> S.RP;
cout << "\n是否保存数据(按1保存,按0不保存):";
char ch;
cin >> ch;
if(ch == '1')
{
C[j] = S;
j++;
Save();
}
else
{
cout << "数据没保存" << endl << endl;
}
cout << "\n是否继续添加(按1继续,按0退出添加程序)?" << endl;
cin >> ch;
if(ch == '0')
break;
}
}
//---------------------------------------------------------------------------------------------------删除
void CStudent::Dlete()
{
while(1)
{
int num;
cout << "请输入你要删除的学生的编号:";
cin >> num;
for(int i = 0; i < j; i++)
{
if(C[num-1].num == C[i].num)
for(int k = i; k < j; k++)
C[k] = C[k+1];
}
char ch;
cout << "\n是否删除数据(按1删除,按0不删除):";
cin >> ch;
if(ch == '1')
{
j--;
Save();
}
else
{
cout << "数据没删除" << endl << endl;
}
cout << "\n是否继续删除(按1继续,按0退出删除程序)?" << endl;
cin >> ch;
if(ch == '0')
break;
}
}
//---------------------------------------------------------------------------------------------------按编号查找
void CStudent::Numseek()
{
while(1)
{
bool judge = false;
int num;
cout << "请输入要查找的学生的编号:";
cin >> num;
for(int i = 0; i < j; i++)
if(num == C[i].num)
{
cout << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5) << "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << endl;
C[i] << C[i];
judge = true;
}
if(judge == false)
cout << "你输入的学生编号不存在" << endl;
char ch;
cout << "是否继续查找(按1继续,按0退出查找程序)?" << endl;
cin >> ch;
if(ch == '0')
break;
}
}
//---------------------------------------------------------------------------------------------------按姓名查找
void CStudent::Nameseek()
{
while(1)
{
bool judge = false;
string name;
cout << "请输入要查找的学生的姓名:";
cin >> name;
for(int i = 0; i < j; i++)
if(name.compare(C[i].name) == 0)
{
cout << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5) << "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << endl;
C[i] << C[i];
judge = true;
}
if(judge == false)
cout << "你输入的学生姓名不存在" << endl;
char ch;
cout << "是否继续查找(按1继续,按0退出查找程序)?" << endl;
cin >> ch;
if(ch == '0')
break;
}
}
//--------------------------------------------------------------------------------------------------计算学生的总成绩和平均成绩
void CStudent::Grade()
{
for(int i = 0; i < j; i++)
{
C[i].Sum();
C[i].Ave();
}
cout << "请输入学生的编号:";
int num;
cin >> num;
for(int i = 0; i < j; i++)
if(C[i].num == num)
{
cout << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5)<< "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << setw(9) << "平均成绩" << setw(7) << "总成绩" << endl;
cout << setw(5) << C[i].num << setw(5) << C[i].name << setw(5) << C[i].gender << setw(5) << C[i].age << setw(5) << C[i].math << setw(5) << C[i].physics << setw(7) << C[i].computer
<< setw(5) << C[i].english << setw(5) << C[i].major << setw(9) << C[i].RP << setw(9) << C[i].ave << setw(7) << C[i].sum << endl;
}
system("pause");
}
//--------------------------------------------------------------------------------------------------对学生的总成绩进行排序
void CStudent::Sort(CStudent & S)
{
for(int i = 0; i < j; i++)
C[i].Sum();
for(int i = 0; i < j; i++)
for(int k = i+1; k < j; k++)
if(C[k].sum > C[i].sum)
{
S = C[k];
C[k] = C[i];
C[i] = S;
}
cout << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5)<< "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << setw(7) << "总成绩" << endl;
for(int i = 0; i < j; i++)
cout << setw(5) << C[i].num << setw(5) << C[i].name << setw(5) << C[i].gender << setw(5) << C[i].age << setw(5) << C[i].math << setw(5) << C[i].physics << setw(7) << C[i].computer
<< setw(5) << C[i].english << setw(5) << C[i].major << setw(9) << C[i].RP << setw(7) << C[i].sum << endl;
system("pause");
}
//---------------------------------------------------------------------------------------------------//根据输入的成绩和性别排查超过输入成绩且性别一样的同学
void CStudent::Inquire(double n, char ch)
{
for(int i = 0; i < j; i++)
C[i].Sum();
bool judge = false;
for(int i = 0; i < j; i++)
{
if(C[i].sum >= n && C[i].gender == ch)
{
cout << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5) << "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << endl;
C[i] << C[i];
judge = true;
}
}
if(judge == false)
cout << "没有相匹配的学生" << endl;
system("pause");
}
//---------------------------------------------------------------------------------------------------读取数据
void CStudent::Read()
{
cout << endl << endl;
ifstream File2("学生学籍与成绩管理系统.txt");
static char st[81];
while(!File2.eof())
{
File2.getline(st, 80);
cout << st << endl;
}
File2.close();
system("pause");
}
//----------------------------------------------------------------------------------------------------保存数据到文件
void CStudent::Save()
{
ofstream File1("学生学籍与成绩管理系统.txt", ios::binary); //以二进制添加的方式输入数据
File1 << setw(5) << "编号" << setw(5) << "姓名" << setw(5) << "性别" << setw(5) << "年龄" << setw(5) << "数学" << setw(5) << "物理" << setw(7) << "计算机"
<< setw(5) << "英语" << setw(5) << "专业" << setw(9) << "奖罚记录" << endl;
for(int i = 0; i < j; i++)
File1 << setw(5) << C[i].num << setw(5) << C[i].name << setw(5) << C[i].gender << setw(5) << C[i].age << setw(5) << C[i].math << setw(5) << C[i].physics << setw(7) << C[i].computer
<< setw(5) << C[i].english << setw(5) << C[i].major << setw(9) << C[i].RP << endl;
cout << "\n\n数据已保存到文件中" << endl << endl;
File1.close();
}
写的可能很乱,毕竟初学,希望大家可以多多支持!