C++实验,学生成绩管理系统设计

说明:刚学完C++,这个是老师布置的实验。

目录

一、实验目的

二、实验设备和环境

三、要求

四、程序源码

五、部分运行结果


一、实验目的

1、掌握类的定义和使用;掌握对象的声明和使用。

2、掌握类的静态成员的使用。

3、综合应用继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。

二、实验设备和环境

奔腾以上计算机,装有Visual C++ 6.0编程环境。

三、要求

1、问题描述

学生信息包括:学号、姓名、性别、年龄、班级等信息。

小学生除了包括学生所有信息外,还包括英语、数学和语文成绩。

大学生除了包括学生所有信息外,还包括专业、英语、程序设计和高等数学等课程。

设计一程序能够对学生成绩进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。

2、功能要求

(1)添加功能:程序能够添加不同学生的记录,提供选择界面供用户选择所要添加的类别,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。

(2)显示功能:可显示当前系统中所有学生的记录,每条记录占据一行。

(3)删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。

(4)求小学生、大学生各自的平均成绩。

 

(注:本程序中没有用到文件流(因为当时我们老师没有要求),所以输入的学生信息在程序结束后不会保存)

四、程序源码

#include <iostream>
#include <cstring>
using namespace std;

class Pupil;
class UniversityStu; 
Pupil *pupil_group[10000];
UniversityStu *univer_stu_group[10000];
//基类声明
class Student
{
    public:
        Student(char *stu_num="empty",char *nam="empty",char* se=NULL,int ag=0,char *clas="empty")
        {
            num++;
            strcpy(student_num,stu_num);
            strcpy(name,nam);
            strcpy(sex,se);
            age=ag;
            strcpy(class_,clas);
        }
        virtual ~Student()         //虚析构函数
        {
            num--;
        }
        void AcquireStudentNum(char *p)
        {
            strcpy(p,student_num);
        }
        virtual void display()=0;  //纯虚函数
    protected:
        static unsigned int num;
        char student_num[13];
        char name[10];
        char sex[3];
        int  age;
        char class_[20];
};
unsigned int Student::num=0;      //静态变量初始化

//派生类声明
class Pupil: public Student
{
    public:
        Pupil(char *stu_num,char *nam,char *se,int ag,char *clas,int CHINESE=0,int mat=0,int englis=0):
            Student(stu_num,nam,se,ag,clas)
        {
            Pupil_num++;
            Chinese=CHINESE;
            math=mat;
            english=englis;
        }
        ~Pupil()
        {
            Pupil_num--;
        }
        void set(int CHINESE,int mat,int englis)  //修改所有科目
        {
            Chinese=CHINESE;
            mat=math;
            english=englis;
        }
        void set(char *type,int score)            //修改单个科目
        {
            if(!strcmp("语文",type))
            {
                Chinese=score;
            }
            else if(!strcmp("数学",type))
            {
                math=score;
            }
            else if(!strcmp("英语",type))
            {
                english=score;
            }
            else
                cout<<"科目输入错误,请重试\n";
        }
        void display()
        {
            cout<<"|学号|  "<<student_num<<"  |姓名|  "<<name<<"   |性别|  "<<sex<<"  |年龄|  "<<age<<"  |班级|  "<<class_<<"  |语文成绩|  "<<Chinese<<"  |数学成绩|  "<<math<<"  |英语成绩|  "<<english<<endl;
        }
        int Take_score(char type)
        {
            if(type==1)
                 return Chinese;
            else if(type==2)
                 return english;
            else if(type==3)
                 return math;
        }
        static unsigned int Take_the_num_of_stu()
        {
            return Pupil_num;
        }
    protected:
        static unsigned int Pupil_num;
        int Chinese;
        int math;
        int english;
};
unsigned int Pupil::Pupil_num=0;

//派生类声明
class UniversityStu: public Student
{
    public:
        UniversityStu(char *stu_num,char *nam,char *se,int ag,char *clas,int professio=0,int mat=0,int progra=0,int englis=0):
            Student(stu_num,nam,se,ag,clas)
        {
            univer_stu_num++;
            profession=professio;
            math=mat;
            english=englis;
            program=progra;
        }
        ~UniversityStu()
        {
            univer_stu_num--;
        }
        void display()
        {
            cout<<"|学号|"<<student_num<<"  |姓名| "<<name<<"  |性别| "<<sex<<" |年龄| "<<age<<" |班级| "<<class_<<" |专业课成绩| "<<profession<<" |数学成绩| "<<math<<" |程序设计成绩| "<<program<<" |英语成绩| "<<english<<endl;
        }
        int Take_score(char type)
        {
            if(type==1)
                 return profession;
            else if(type==2)
                 return english;
            else if(type==3)
                 return math;
            else if(type==4)
                 return program;
        }
        static int Take_the_num_of_stu()
        {
            return univer_stu_num;
        }
    protected:
        static int univer_stu_num;
        int profession,english,math,program;
};
int UniversityStu::univer_stu_num=0;

//添加学生信息函数
char add()
{
    static unsigned int i=0,i3=0;
    unsigned int i2,i4;
    int type;
    static bool pupil_overflow_flag=false,univer_overflow_flag=false;
    char stu_num[13],name[10],sex[3],clas[20];
    int age;
    int Chinese,math,english;
    cout<<"请选择要添加的学生类型(1:小学生,2:大学生)\n"<<">";
    cin>>type;
    if(type==1)
    {
        //数组指针若到上限,重新搜索已经删除空间的空指针
     a: if(i>=10000)
        {
            pupil_overflow_flag=true;
        }
        if(pupil_overflow_flag)
        {
            bool empty_flag=0;
            for(i=0;i<10000;i++)
            {
                if(pupil_group[i]==NULL)
                {
                    empty_flag=1;
                    break;
                }
            }
            if(!empty_flag)
            {
                cout<<"小学生存储空间已达上限(10000人)\n";
                return 3;
            }
        }

        cout<<"请输入小学生信息(学号,姓名,性别,年龄,班级,语文成绩,数学成绩,英语成绩\n"<<">";
        cin>>stu_num>>name>>sex>>age>>clas>>Chinese>>math>>english;
        //检测学号是否重复
        for(i2=0;i2<10000;i2++)                 //遍历分组
        {
            if(pupil_group[i2]!=NULL)           //判断指针是否有效
            {
                char *buf=(char*)malloc(13);
                pupil_group[i2]->AcquireStudentNum(buf);
                if(!strcmp(buf,stu_num))        //检查学号是否重复
                {
                    free(buf);
                    cout<<"输入的学号系统中已存在,请重试\n";
                    return 2;
                }
                free(buf);
            }
        }
        while(pupil_group[i]!=NULL)             //判断指针是否可用
        {
            i++;
            if(i>=10000)
                goto a;
        }
        pupil_group[i]=new Pupil(stu_num,name,sex,age,clas,Chinese,math,english);
        cout<<"新添加的小学生信息为:\n";
        pupil_group[i]->display();
        if(!pupil_overflow_flag)
            i++;
    }
    else if(type==2)
    {
        //数组指针若到上限,重新搜索已经删除空间的空指针
      b:if(i3>=10000)
        {
            univer_overflow_flag=true;
        }
        if(univer_overflow_flag)
        {
            bool empty_flag=0;
            for(i3=0;i3<10000;i3++)
            {
                if(univer_stu_group[i3]==NULL)
                {
                    empty_flag=1;
                    break;
                }
            }
            if(!empty_flag)
            {
                cout<<"大学生存储空间已达上限(10000人)\n";
                return 3;
            }
        }

        cout<<"请输入大学生信息(学号,姓名,性别,年龄,班级,专业课成绩,数学成绩,程序设计成绩,英语成绩\n"<<">";
        int profession,program;
        cin>>stu_num>>name>>sex>>age>>clas>>profession>>math>>program>>english;
        //检测学号是否重复
        for(i4=0;i4<10000;i4++)                 //遍历分组
        {
            if(univer_stu_group[i4]!=NULL)      //判断指针是否有效
            {
                char *buf=(char*)malloc(13);
                univer_stu_group[i4]->AcquireStudentNum(buf);
                if(!strcmp(buf,stu_num))        //检查学号是否重复
                {
                    free(buf);
                    cout<<"输入的学号系统中已存在,请重试\n";
                    return 2;
                }
                free(buf);
            }
        }
        while(pupil_group[i3]!=NULL)
        {
            i3++;
            if(i3>=10000)
                goto b;
        }
        univer_stu_group[i3]=new UniversityStu(stu_num,name,sex,age,clas,profession,math,program,english);
        cout<<"新添加的大学生信息为:\n";
        univer_stu_group[i3]->display();
        if(!univer_overflow_flag)
            i3++;
    }
    else
    {
        cout<<"选择的学生类型错误,请重试\n";
        return 1;
    }
    return 0;
} 

//显示系统中的小学生信息函数
char display_pupil(void)
{
    unsigned int i;
    cout<<"系统中小学生的信息:"<<"(总人数:"<<Pupil::Take_the_num_of_stu()<<")"<<endl;
    for (i=0; i < 10000; i++)
    {
        if (pupil_group[i] != NULL)
        {
            pupil_group[i]->display();
        }
    }
    return 0;
}

//显示系统中的大学生信息函数
char display_university_stu(void)
{
    unsigned int i;
    cout<<"系统中大学生的信息:"<<"(总人数:"<<UniversityStu::Take_the_num_of_stu()<<")"<<endl;
    for (i=0; i < 10000; i++)
    {
        if (univer_stu_group[i] != NULL)
        {
            univer_stu_group[i]->display();
        }
    }
    return 0;
}

//修改小学生成绩函数
char Set_pupil_score()
{
    char temp_buf[13];
    int i;
    char find_flag=0;
    cout<<"请输入学号\n"<<">";
    cin>>temp_buf;
    char *buf=(char*)malloc(13);
    for(i=0;i<10000;i++)                       //遍历分组
    {
            if(pupil_group[i]!=NULL)           //判断指针是否有效
            {
                pupil_group[i]->AcquireStudentNum(buf);
                if(!strcmp(buf,temp_buf))      //检查学号是否匹配
                {
                    free(buf);
                    find_flag=1;
                    cout<<"该学生信息如下:\n";
                    pupil_group[i]->display();
                    cout<<"输入要修改的科目、分数\n"<<">";
                    char class_[5];
                    int score;
                    cin>>class_>>score;
                    pupil_group[i]->set(class_,score);
                    cout<<"修改后的信息为:\n";
                    pupil_group[i]->display();
                    return 0;
                }  
            }
    }
    free(buf);
    if(!find_flag)
    {
        cout<<"没有该学生,请重试\n";
        return 1;
    }                
}

//修改学生信息
char Set_info()
{
    int type;
    cout<<"请选择:1:修改小学生成绩   2:修改大学生成绩\n"<<">";
    cin>>type;
    if(type==1)
    {
        return (Set_pupil_score());
    }
    else if(type==2)
    {
        cout<<"暂未支持\n";
    }
    else
    {
        cout<<"类型选择错误,请重试\n";
        return 1;
    }
    return 0;
    
}

//删除小学生信息函数
char delete_pupil(void)
{
    char find_flag=0;
    cout<<"请输要删除学生的学号\n"<<">";
    char stu_num[13];
    cin>>stu_num;
    for(unsigned int i=0;i<10000;i++)       //遍历分组
    {
        char buf[13];
        if(pupil_group[i]!=NULL)
        {
            pupil_group[i]->AcquireStudentNum(buf);
            if (!strcmp(stu_num, buf))
            {
                delete pupil_group[i];     //删除学生信息
                pupil_group[i]=NULL;
                find_flag=1;
                cout<<"已删除\n";
                break;
            }
        }
    }
    if (find_flag ==0)
    {
        cout << "输入的学号不存在,请重试\n";
        return 1;
    }
    return 0;
}

//删除大学生信息函数
char delete_univer_stu(void)
{
    char find_flag=0;
    cout<<"请输要删除学生的学号\n"<<">";
    char stu_num[13];
    cin>>stu_num;
    for(unsigned int i=0;i<10000;i++)       //遍历分组
    {
        char buf[13];
        if(univer_stu_group[i]!=NULL)
        {
            univer_stu_group[i]->AcquireStudentNum(buf);
            if (!strcmp(stu_num, buf))
            {
                delete univer_stu_group[i];     //删除学生信息
                univer_stu_group[i]=NULL;       //清空指针(必须自己清空,不然会保存原来的地址)
                find_flag=1;
                cout<<"已删除\n";
                break;
            }
        }
    }
    if (find_flag ==0)
    {
        cout << "输入的学号不存在,请重试\n";
        return 1;
    }
    return 0;
}

//删除学生信息函数
char delete_()
{
    int type;
    cout<<"请选择: 1:删除小学生信息 2:删除大学生信息\n"<<">";
    cin>>type;
    if(type==1)
    {
        return (delete_pupil());
    }
    else if(type==2)
    {
        return (delete_univer_stu());
    }
    else
    {
        cout<<"选择错误,请重试\n";
        return 1;
    }
}

//计算小学生平均成绩
char take_pupil_average_score()
{
    double n=0;
    double math_score,english_score;
    double Chinese_score;
    double sum_math,sum_english;
    double sum_Chinese;
    for(unsigned int i=0;i<10000;i++)       //遍历分组
    {
        if(pupil_group[i]!=NULL)
        {
            n++;
            sum_Chinese=sum_Chinese+pupil_group[i]->Take_score(1);
            sum_english=sum_english+pupil_group[i]->Take_score(2);
            sum_math=sum_math+pupil_group[i]->Take_score(3);
        }
    }
    Chinese_score=sum_Chinese/n;
    math_score=sum_math/n;
    english_score=sum_english/n;
    cout<<"小学生的平均成绩:\n";
    cout<<"|语文| "<<Chinese_score<<" |数学| "<<math_score<<" |英语| "<<english_score<<endl;
    return 0;
}

//计算大学生平均成绩
char take_univer_average_score()
{
    double n=0;
    double math_score,english_score;
    double profession_score,program_score;
    double sum_math,sum_english;
    double sum_profession,sum_program;
    for(unsigned int i=0;i<10000;i++)       //遍历分组
    {
        if(univer_stu_group[i]!=NULL)
        {
            n++;
            sum_profession=sum_profession+univer_stu_group[i]->Take_score(1);  //求总分
            sum_english=sum_english+univer_stu_group[i]->Take_score(2);
            sum_math=sum_math+univer_stu_group[i]->Take_score(3);
            sum_program=sum_program+univer_stu_group[i]->Take_score(4);
        }
    }
    profession_score=sum_profession/n;                                        //获取平均分
    math_score=sum_math/n;
    english_score=sum_english/n;
    program_score=sum_program/n;
    cout<<"大学生的平均成绩:\n";
    cout<<"|专业课| "<<profession_score<<" |数学| "<<math_score<<" |英语| "<<english_score<<" |程序设计| "<<program_score<<endl;
    return 0;
}

//计算平均成绩
char take_average_score()
{
    int type;
    cout<<"请选择: 1:计算小学生平均成绩  2:计算大学生平均成绩\n"<<">";
    cin>>type;
    if(type==1)
    {
        take_pupil_average_score();
    }
    else if(type==2)
    {
        take_univer_average_score();
    }
    else
    {
        cout<<"选择错误,请重试\n";
        return 1;
    }
    return 0;
}

int main()
{
    int type=0;
    char error=0;
    //新建demo
    // pupil_group[10]=new Pupil("2000","小明","男",12,"六一",91,92,93);
    // pupil_group[11]=new Pupil("2001","小兰","女",13,"五三",89,88,87);
    // univer_stu_group[11]=new UniversityStu("201721811040","张笑歌","女",17,"通信17-1",91,92,93,95);

    while(1)
    {
        cout << "====================================================菜单=================================================\n";
        cout << "* 1:添加学生信息 2:修改学生信息 3:显示学生信息 4:计算成绩 5:删除学生信息 (请输入对应数字,选择操作)*\n";
        cout << "=========================================================================================================\n"<<">";
        cin >> type;
        switch (type)
        {
            case 1:
                do
                    error = add();
                while(error==1||error==2);
                break;
            case 2:
                do
                    error = Set_info();
                while(error);
                break;
            case 3:
                display_pupil();
                display_university_stu();
                break;
            case 4:
                do
                    error = take_average_score();
                while(error);
                break;
            case 5:
                do
                    error = delete_();
                while(error);
                break;
            default:
                cout<<"选择错误,请重试\n";        
        }
    }
    return 1;
}

五、部分运行结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值