• 程序阅读:简单C++学生信息管理系统


    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接


    【程序阅读】阅读并执行以下的程序,找出当中出现构造函数、友元函数、运算符重载、静态数成员语法现象出现的位置。细致体会其使用方法,在以后的设计中可以灵活应用有关方法和技巧

    #include <iostream>
    #include <string.h>
    using namespace std;
    #define MAX 100
    
    class CDate  // 定义日期类
    {
    private:
        unsigned short int year;   // 年
        unsigned short int month;  // 月
        unsigned short int day;    // 日
    public:
        CDate(int y=0,int m=0,int d=0);
        bool operator < (CDate d);
        friend istream & operator >> (istream &in,CDate &d);
        friend ostream & operator<<(ostream &out,CDate &d);
        friend bool CheckValid(CDate d);
        friend bool LeapYear(int year);
        void SetDate(int y,int m,int d);
    };
    CDate::CDate(int y,int m,int d):year(y),month(m),day(d) {}
    // 设置日期
    void CDate::SetDate(int y,int m,int d)
    {
        year=y;
        month=m;
        day=d;
    }
    // 重载输入运算符>>
    istream &operator>>(istream &in,CDate &d)
    {
        char ch1,ch2;
        cout<<"请输入日期(输入格式:YYYY-MM-DD):";
        while(1)
        {
            cin>>d.year>>ch1>>d.month>>ch2>>d.day;
            if (ch1=='-' && ch2=='-')
                if (CheckValid(d)) break;
            cerr<<"时间格式或取值不对! 请又一次输入
    ";
        }
        return cin;
    }
    // 重载输出运算符<<
    ostream &operator<<(ostream &out,CDate &d)
    {
        out<<d.year<<"年"<<d.month<<"月"<<d.day<<"日";
        return out;
    }
    // 推断日期d1<d2
    bool CDate::operator < (CDate d)
    {
        if (year<d.year) return true;
        if (year>d.year) return false;
        if (month<d.month) return true;
        if (month>d.month) return false;
        if (day<d.day) return true;
        return false;
    }
    
    // 检查是否为闰年
    bool LeapYear(int year)
    {
        if (year%4==0 && year%100 || year%400==0)
            return true;
        return false;
    }
    
    // 检查日期合法性
    bool CheckValid(CDate d)
    {
        int n;
        if (d.month<1 || d.month>12) return false;
        if (d.day<1) return false;
        n=31;
        switch(d.month)
        {
        case 2:
            if (LeapYear(d.year))
                n=29;
            else
                n=28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            n=30;
            break;
        }
        if (d.day>n) return false;
        return true;
    }
    
    class CStudent
    {
    private:
        char *name;              // 姓名
        bool sex;                // 性别
        CDate date;              // 出生日期,类对象作数据成员
    public:
        static int num;          // 学生人数
        CStudent();
        void InputData();
        friend void Sort();      // 排序
        friend void FindName();  // 按姓名查询
        friend void Statistic(); // 按性别统计
        friend void Display();   // 显示所有信息
    } stu[MAX];
    int CStudent::num=0;
    CStudent::CStudent() {}
    // 输入信息
    void CStudent::InputData()
    {
        int p;
        char s[41];
        cout<<"请输入学生信息(NO."<<num<<"):
    ";
        cout<<"姓名:";
        cin>>s;
        name=new char[strlen(s)+1];
        strcpy(name,s);
        cout<<"性别(1-男。0-女):";
        cin>>p;
        if (p)  sex=true;
        else sex=false;
        cin>>date;
        cout<<endl;
    }
    // 排序
    void Sort()
    {
        int i,j,p,num;
        char *tn;
        bool ts;
        CDate td;
        num=CStudent::num;
        for(i=1; i<num; i++)
        {
            p=i;
            for(j=i+1; j<=num; j++)
                if (stu[j].date<stu[p].date) p=j;//找到当前未排序元素中年龄最小的对象的下标
            if (p==i) continue;
            //以下交换stu[i]和stu[p]
            tn=stu[i].name;
            stu[i].name=stu[p].name;
            stu[p].name=tn;
            ts=stu[i].sex;
            stu[i].sex=stu[p].sex;
            stu[p].sex=ts;
            td=stu[i].date;
            stu[i].date=stu[p].date;
            stu[p].date=td;
        }
    }
    // 按姓名查询
    void FindName()
    {
        char name[41];
        int i,num;
        cout<<"请输入姓名:";
        cin>>name;
        num=CStudent::num;
        for(i=1; i<=num; i++)
            if (strcmp(stu[i].name,name)==0) break;
        if (i>num)
        {
            cout<<"查无此人!"<<endl<<endl;
            return;
        }
        //假设查到了,显示学生信息
        cout<<"姓名:"<<stu[i].name<<endl;
        cout<<"性别:";
        if (stu[i].sex)
            cout<<"男"<<endl;
        else
        cout<<"女"<<endl;
        cout<<"生日:"<<stu[i].date<<endl;
        cout<<endl;
    }
    // 按性别统计
    void Statistic()
    {
        int i,num,s1,s0;
        num=CStudent::num;
        s1=0;
        s0=0;
        for(i=1; i<=num; i++)
            if (stu[i].sex==1)
                s1++;
            else
                s0++;
        cout<<"男生人数:"<<s1<<endl;
        cout<<"女生人数:"<<s0<<endl;
        cout<<endl;
    }
    
    // 显示所有信息
    void Display()
    {
        int i,num;
        num=CStudent::num;
        for(i=1; i<=num; i++)
        {
            cout<<stu[i].name<<"	";
            if (stu[i].sex)
                cout<<"男";
            else
                cout<<"女";
            cout<<"	"<<stu[i].date<<endl;
        }
        cout<<endl;
    }
    
    int main()
    {
        char *menu[]= { "","输入信息","排序","按姓名查询","按性别统计","显示所有信息","退出" };
        int i,p;
        bool end;
        end=false;
        while(!end)
        {
            for(i=1; i<7; i++)
                cout<<i<<"  "<<menu[i]<<endl;
            cin>>p;
            switch(p)
            {
            case 1:                          // 输入信息
                CStudent::num++;
                stu[CStudent::num].InputData();
                break;
            case 2:                          // 排序
                Sort();
                break;
            case 3:                          // 按姓名查询
                FindName();
                break;
            case 4:                          // 按性别统计人数
                Statistic();
                break;
            case 5:                          // 显示所有信息
                Display();
                break;
            case 6:                          // 退出
                end=true;
                break;
            }
        }
        return 0;
    }
    
    【扩展提示】你是否可以在如上设计基础上,添加文件保存数据,使其趋向于真正有用的系统?


    ==================== 迂者 贺利坚 CSDN博客专栏=================
    |== IT学子成长指导专栏 专栏文章的分类文件夹(不定期更新) ==|
    |== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
    |== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
    ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====



  • 相关阅读:
    暑假学习笔记(一)——初识Neo4j和APICloud入门
    置信规则库学习记录——1
    博客整理——宣传文案
    博客整理——软件工程实践总结
    博客整理——Alpha版冲刺
    博客整理——事后诸葛亮
    面试被企业拒绝后还有必要再申请吗?
    MapReduce分布式算法
    水题系列二:PhoneNumbers
    水题系列一:Circle
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6768109.html
Copyright © 2020-2023  润新知