C++学校信息管理系统

本系统能实现的功能及优点有:
1.动态创建对象(链表实现,使用new向系统申请内存)
2.输入与输出对象的信息:包括单项输入与输出,与全部输入与输出
3.定位插入及删除对象资料(链表实现)
4.动态查找与身份数据匹配的人,并输出他的信息
5.动态查找工资最高的人
6.重要数据类型使用private,实现数据的保密
7. 输出某一对象的总人数(构造时人数++,析构时–)
8.使用了文件的输入输出
9.用归并排序对链表进行排序
10.较为人性化

总代码长度1757行

测试数据文件

总结一下自己犯的错,及debug时的痛苦
1.find函数的循环是

while(temp->next&&temp->Tnum!=data)

注意的是逻辑运算符是&&不是||,其中一个不符合就停止,而且是temp->next!=NULL;,不是temp!=NULL;,否则编译器会强制停止,这么做的话特判一下

if(temp->Tnum!=data) return NULL;

即可

2.creat函数的参数要加引用&,否则无法改变尾指针的地址,然后insert函数调用creat函数的时候尾指针就仍是NULL,然后编译器又会强制停止

3.delete函数参数也要加引用,否则当删除的是第一个对象时,无法改变首指针的地址,又会强制停止

void delete1(Teacher* &head)

而且当删除为第一个对象(head==temp)时,不能在

while(temp->Tnum!=data&&temp!=NULL)   
    pre=temp,temp=temp->next;

后特判,而是要先判断temp是否为NULL,不为空才head=temp->next;否则先判断完后,head与temp就不相等了然后删除的就不是第一个对象了

4.同样的sort函数参数head也要加&

void Tsort(Teacher* &h)

5.findrich函数找到一个类中最有钱的人,也是

while(head->next)
    {
   
        if(Maxn<head->SMwage)///原来在后面没注意加了一个';'导致判断没用了
        {
   
            Maxn=head->SMwage;
            temp=head;
        }
        head=head->next;
    }

6.注意加&的head要让temp=head,temp=temp->next,否则head的地址会改变

7.find函数返回的地址temp,if(temp) cout<<"查找成功";
而不是if(!temp) cout<<"查找成功"; 类似的逻辑符号上的错误还犯了一些

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int TEACHER =2;
const int STUDENT =1;
const int S_MANAGER=4;
const int MANAGER=3;
class S_Manager;
class Person
{
   
    string name,gender,birtheday;
    string others[10];
    int cnt;///补充其他数据的数量
public:
    static int sum;///总对象数量
    Person():cnt(0){
   sum++;}
    virtual ~Person(){
   sum--;}///必须提供定义 否则找不到析构函数入口
    void printprompt(int case1)
    {
   
        if(case1==1) cout<<"请按如下顺序输入";
        if(case1==2) cout<<"请根据数字选择输出哪一项";
        if(case1==3) cout<<"请根据数字选择选择替换的";
        cout<<"基本信息1:名字,2:性别,3:出生年月";
        if(case1==2) cout<<",4:全部";
        if(case1==2||case1==3)cout<<"\n请输入数字";
        cout<<'\n';
    }
    virtual void setwage( int)=0;///给工资的信息输入留一个接口
    void baseread()///读入基本数据
    {
   
        printprompt(1);///提示语
        cin>>name;
        cin>>gender;
        cin>>birtheday;
        cout<<'\n';
    }
    void baseprint()///输出基本数据
    {
   
        int n;
        printprompt(2);
        cin>>n;
        switch(n)
        {
   
            case 1:
                if(!name.size())
                    cout<<"没有此项数据\n";
                else cout<<name<<' ';
                break;
            case 2:
                if(!gender.size())
                    cout<<"没有此项数据\n";
                else cout<<gender<<' ';
                break;
            case 3:
                if(!birtheday.size())
                    cout<<"没有此项数据\n";
                else cout<<birtheday<<' ';
                break;
            case 4:
                if(!name.size())
                    cout<<"没有姓名数据 ";
                else cout<<name<<' ';
                if(!gender.size())
                    cout<<"没有性别数据\n";
                else cout<<gender<<' ';
                if(!birtheday.size())
                    cout<<"没有生日数据\n";
                else cout<<birtheday<<' ';
                break;
            default:
                cout<<"没有此输出项\n";
        }
        cout<<'\n';cout<<'\n';
    }
    void Preplacedata()///数据替换
    {
   
        int n;
        string rdata;
        printprompt(3);
        cin>>n;
        switch(n)
        {
   
            case 1:
                cout<<"请输入替换后的姓名\n";
                cin>>rdata;
                name=rdata; break;
            case 2:
                cout<<"请输入性别\n";
                cin>>rdata;
                gender=rdata; break;
            case 3:
                cout<<"请输入生日\n";
                cin>>rdata;
                birtheday=rdata; break;
            default:
                cout<<"没有此项数据\n";
        }
        cout<<'\n';
    }
    string getname(){
   return name;}
};
int Person:: sum=0;



class Manager: virtual public Person
{
   
    string departmant;int Mwage;string Mnum;
public:

    friend class S_Manager;
    static int Msum;
    Manager *next;
    Manager():next(NULL){
   Msum++;}
    ~Manager(){
   Msum--;};
    int getMwage(){
   return Mwage;}

    friend void Msort(Manager* &head);
    friend Manager* Mfind(Manager* head);///查找函数
    friend void delete1(Manager* &head);///删除函数
    void printManprompt(int case1)
    {
   
        if(case1==1) cout<<"请按如下顺序输入";
        if(case1==2) cout<<"请根据数字选择输出哪一项";
        if(case1==3) cout<<"请根据数字选择替换哪一项";
        cout<<"管理员信息:1.管理员编号,2.所属部门,3.管理员工资";
        if(case1==2)cout<<",4.全部";
        if(case1==2||case1==3)cout<<"\n请输入数字";
        cout<<"\n";
    }
    void Msetdata()///输入基础信息
    {
   
        baseread();
        printManprompt(1);
        cin>>Mnum>>departmant>>Mwage;
    }
    void setwage(int wage){
   Mwage=wage;}
    void Mprint()///输出基本数据
    {
   
        int n;
        this->baseprint();
        printManprompt(2);
        cin>>n;
        switch(n)
        {
   
            case 1:
                if(!Mnum.size())
                    cout<<"没有此项数据\n";
                else cout<<Mnum<<' ';
                break;
            case 2:
                if(!departmant.size())
                    cout<<"没有此项数据\n";
                else cout<<departmant<<' ';
                break;
            case 3:
                if(!Mwage)
                    cout<<"没有此项数据\n";
                else cout<<Mwage<<' ';
                break;
            case 4:

                if(!Mnum.size())
                    cout<<"没有管理员编号数据\n";
                else cout<<Mnum<<' ';

                if(!departmant.size())
                    cout<<"没有所属部门数据\n";
                else cout<<departmant<<' ';

                if(!Mwage)
                    cout<<"没有管理员工资数据\n";
                else cout<<Mwage<<' ';
                break;
            default:
                cout<<"没有此输出项\n";
        }
        cout<<'\n';
        cout<<'\n';
    }
    void Mreplacedata()///数据替换
    {
   
        Preplacedata();
        int n;
        printManprompt(3);
        cin>>n;
        string rdata;int Rdata;
        switch(n)
        {
   
            case 1 :
                cout<<"请输入替换后的管理员编号\n";
                cin>>rdata;
                Mnum=rdata;
                cout<<"替换成功\n";
                break;
            case 2:
                cout<<"请输入替换后的所属部门\n";
                cin>>rdata;
                departmant=rdata;
                cout<<"替换成功\n";
                break;
            case 3:
                cout<<"请输入替换后的工资\n";
                cin>>Rdata;
                Mwage=Rdata;
                cout<<"替换成功\n";
                break;
            default:
                cout<<"没有此项数据\n";
        }
        printf("\n");
        cout<<'\n';
    }

};
int Manager:: Msum=0;


string Mfindpromote(int &case1)
{
   
    cout<<"请输入查询的方式(输入数字):1.管理员编号,2.姓名\n";
    int n;
    cin>>n;
    while(n!=1&&n!=2){
   cout<<"没有此项查找方式,请重新输入查找方式\n";cin>>n;}
    string data;
    if(n==1)
    {
   
        cout<<"请输入管理员编号\n";
        cin>>data;
        case1=n;
    }
    else if(n==2)
    {
   
        cout<<"请输入姓名\n";
        cin>>data;
        case1=n;
    }
    cout<<'\n';
    return data;
}

Manager* Mfind(Manager* head)
{
   
    if(head==NULL) {
   cout<<"还未创建对象\n";return NULL;}
    cout<<"请输入查询的方式(输入数字):1.管理员编号,2.姓名\n";
    int n; cin>>n;
    while(n!=1&&n!=2){
   cout<<"没有此项查找方式,请重新输入查找方式\n";cin>>n;}
    string data;
    if(n==1)
    {
   
        cout<<"请输入管理员编号\n";
        cin>>data;
        Manager* temp=head;
        while(temp->Mnum!=data&&temp->next!=NULL)
            temp=temp->next;
        if(temp->Mnum!=data) return NULL;
        return temp;

    }
    else if(n==2)
    {
   
        cout<<"请输入姓名\n";
        cin>>data;
        Manager* temp=head;
        while(temp->getname()!=data&&temp->next!=NULL)
            temp=temp->next;
        if(temp->getname()!=data) return NULL;
        return temp;
    }
    else return NULL;
}


Manager* creatManager(Manager* &back1)///head要加引用!!!!!!!!!!!!!,否则地址不会改变
{
   
    //int i=1;
    cout<<"请输入录入信息的管理员个数\n";
    int n;cin>>n;
    Manager *head=NULL;
    Manager *ob1=NULL;
    Manager *ob2=NULL;
    ob1=new Manager();
    head=ob1;
    for(int i=0;i<n;i++)
    {
   
        cout<<"请输入第"<<i+1<<"个管理员的信息\n";
        ob1->Msetdata();///注意调用方式,是*(ob1).Tsetdata();或者ob1->Tsetdata();
        if(i+1<n)
        {
   
            ob2=ob1;
            ob1=new Manager;
            ob2->next=ob1;
        }
    }
    back1=ob1;///用于插入时返回尾指针的位置
    //cout<<"!!"<<ob1<<endl;
    back1->next=NULL;
    ob1->next=NULL;
    ob2=NULL;
    ob1=NULL;
    cout<<'\n';
    return head;
}

void Minsert(Manager* &head)///head要加引用!!!!!!!!!!!!!,否则地址不会改变
{
   
    Manager* back1=NULL;
    if(!head)
    {
   
        cout<<"还未创建对象,现在开始创建\n";
        head=creatManager(back1);
        cout<<"创建完成,是否继续插入信息:1.是,2.否\n";
        int n; cin>>n;
        if(n==2) return;
    }
    cout<<"请选择信息的插入方式,1.直接插入信息,2.插入到某一管理员的信息位置后\n";
    int n;cin>>n;
    if(n==2)
    {
   
        Manager *temp=NULL;
        temp=Mfind(head);
        //cout<<temp;
        if(temp)
        {
   
            cout<<"查找成功,开始插入管理员信息\n";
            Manager *temphead=creatManager(back1);///创建一个新的链表
            //cout<<back1->next<<endl;
            ///将新链表连接到原来的链表上
            back1->next=temp->next;
            temp->next=temphead;
            //cout<<temp<<' '<<head->next;
            //cout<<temp->next;
        }
        else {
   cout<<"查找失败,自动选择直接插入信息模式\n";n=1;}
    }
    if(n==1)
    {
   
        Manager *temp=head;
        //cout<<head->next;
        
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修正了已发现的所有错误.欢迎大家下载试用.. 一、项目名称:学校学生信息管理系统。 二、项目目标:实现对学校学生的信息管理——信息的建立和维护、信息的检索。 三、主要功能: 1.信息的输入:建立学生档案文件。 2.信息维护: 添加:增加新学生; 修改:学生信息的改变; 删除:学生减少。 3.信息处理 按要求检索学生信息; 按要求统计信息。 四、界面系统 1.系统管理员进入 (请输入密码) 2.一级菜单 (1 信息维护 2 信息检索 3 信息统计 4 退出) 3. 二级菜单 信息维护 (1 建立学生成绩文件 2 添加学生记录 3 删除学生记录 4 修改学生记录 5 返回上级菜单) 信息检索 (1 按班级查找 2 返回上级菜单) 信息统计 (1 成绩统计 2 返回上级菜单) 五、主要功能说明: 1.用口令(密码)形式验证管理员身份(可输入三次),合法者可进入,否则程序结束。 2.有关功能说明 1)建立学生成绩表(模块a) 建立新的学生成绩文件; 建立若干学生记录,包括姓名、学号、班级、课程编号、成绩。 2)添加学生记录(模块b) 在已存在的学生成绩文件中添加新记录。 3)删除学生记录(模块c) 在学生成绩文件中删除有三门课程不及格的学生记录; 删除前,逐条显示符合删除条件的学生姓名、成绩,确认后再删除。 4)修改学生信息(模块d) 输入学生学号,在学生成绩文件中找出该学生记录; 在屏幕上逐条显示该学生的各条记录; 每显示一条,询问是否修改,如果“Y”,输入修改后数据, 将文件原记录删除,保存新的记录; 5)按姓名和班级查找(模块e) 输入姓名显示相应信息。 6)信息统计(模块f) 同时按照班级和课程统计每门课程、每个班级的平均成绩,最高分、最低分; 在屏幕上先依次显示各门课程,对应的各个班级的统计数据。 7)退出信息管理系统,返回操作系统
1、问题描述 某高校有四类员工教师、实验员、行政人员教师兼行政人员共有的信息包括编号、姓名、性别、年龄等。其中教师还包含的信息有所在系部、专业、职称实验员还包含的信息由所在实验室、职务行政人员还包含的信息有政治面貌、职称等。 2、功能要求 (1)添加功能程序能够任意添加上述四类人员的记录可提供选择界面供用户选择所要添加的人员类别要求员工的编号要唯一如果添加了重复编号的记录时则提示数据添加重复并取消添加。 (2)查询功能可根据编号、姓名等信息对已添加的记录进行查询如果未找到给出相应的提示信息如果找到则显示相应的记录信息。 (3)显示功能可显示当前系统中所有记录每条记录占据一行。 (4)编辑功能可根据查询结果对相应的记录进行修改修改时注意编号的唯一性。 (5)删除功能主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录则提示“记录为空”并返回操作否则输入要删除的人员的编号或姓名根据所输入的信息删除该人员记录如果没有找到该人员信息则提示相应的记录不存。 (6)统计功能能根据多种参数进行人员的统计。能统计四类人员数量以及总数,统计男、女员工的数量。 (7)保存功能可将当前系统中各类人员记录存入文件中存入方式任意。 (8)读取功能可将保存在文件中的人员信息读入到当前系统中供用户进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值