c++课设学生成绩与学籍管理系统

题目要求(手打,累):设计一个类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();
}
写的可能很乱,毕竟初学,希望大家可以多多支持!
上一篇:scanf() gets() fgets()使用注意事项


下一篇:Linux拷贝U盘文件(命令行)