应用题   请使用VC6或使用[答题]菜单打开proj2下的工程proj2,该工程中包含一个程序文件main. epp,其中有日期类Date、人员类Person及排序函数sortByName和主函数main的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为:
    按姓名排序
    排序前:
    张三  男  出生日期:1978年4月20日
    王五  女  出生日期:1965年8月3日
    杨六  女  出生日期:1965年9月5日
    李四  男  出生日期:1973年5月30日
    排序后:
    李四  男  出生日期:1973年5月30日
    王五  女  出生日期:1965年8月3日
    杨六  女  出生日期:1965年9月5日
    张三  男  出生日期:1978年4月20日
    注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。
    #include<iostream>
    using namespace std;
    class Date  {//日期类
    int year, month, day;//年、月、日
    public:
    Date(int year, int month, int day): year(year), month(month), day(day) {}
    int getYear()const {return year;}
    int getMonth()const {return month;}
    int getDay()const {return day;}
    };
    class Person {//人员类
    char name[14];//姓名
    bool is_male;//性别,为true时表示男性
    Date birth—date;//出生日期
    public:
    Person(char*name, bool is_male, Date birth_date)
    //**********found**********
    :______
    {
    strcpy(this->name, name);
    }
    const char*getName()const {return name;}
    bool isMale()const {return is_male;}
    Date getBirthdate()const {return birth_date;}
    //利用strcmp()函数比较姓名,返回一个正数、0或负数,分别表示大于、等于、小于
    int compareName(const Person &p)const {
    //**********found**********
    ______}
    void show() {
    cout<<endl;
    cout<<name<<'<<(is_male?'男': '女')<<'<<'出生日期: '<<birth_date. getYear()<<'年'//显示出生年
    //**********found**********
    ______//显示出生月
    <<birth_date. getDay()<<'日';//显示出生日
    }
    };
    void sortByName(Person ps[], int size) {
    //将人员数组按姓名排列为升序
    for(int i=0; i<size-1; i++) {
    //采用选择排序算法
    int m=i;
    for(int j=i+1; j<size; j++)
    if(ps [j]. compareName(ps[m])<0)
    m=j;
    if(m>i) {
    Person P=ps[m];
    ps[m]: ps[i];
    ps[i]=P;
    }
    }
    }
    int main() {
    Person staff[]= {
    Person('张三', true, Date(1978, 4, 20)),
    Person('王五', false, Date(1965, 8, 3)),
    Person('杨六', false, Date(1965, 9, 5)),
    Person('李四', true, Date(1973, 5, 30))
    };
    const int size=sizeof(staff)/sizeof(staff[0]);
    int i;
    cout<<endl<<'按姓名排序';
    cout<<endl<<'排序前:';
    for(i=0; i<size; i++) staff[i]. show();
    sortByName(staff, size);
    cout<<endl<<endl<<'排序后:';
    for(i=0; i<size; i++) staff[i]. show();
    cout<<endl;
    return 0;
    }
 
【正确答案】(1)is_male(is_male), birth_date(birth_date) (2)return strcmp(name, p. getName()); (3)<<birth_date. getMonth()<<'月' 答案考生文件夹
【答案解析】[考点] 本题考查Date类和Person类,其中涉及构造函数、const函数、bool型私有成员及成员函数,以及strcmp()函数。 (1)主要考查考生对构造函数的掌握,由函数体内strcpy(this->name, name);可知,要使用成员列表初始化的成员为is_male和birth_date。 (2)主要考查考生对strcmp()函数的掌握,先看程序对该函数的功能要求:利用strcmp()函数比较姓名,返回一个正数、0或负数,分别表示大于、等于、小于。因为strcmp()函数的功能是比较字符串大小,因此可以直接被return语句调用:return strcmp(name, p. getName());。 (3)主要考查考生对成员函数的掌握,程序的注释为:显示出生月,由此可以知道这里要输出出生月份,直接调用函数getMonth()即可。 strcmp()函数、strcpy()函数、strlen()函数等是经常会用到的系统函数,要了解各个函数的功能:stralt(连接)、strcly(复制)、strump(比较)、strlen(求长度)。