张老师的生日?

 小明和小强都是张老师的学生,张老师的生日是M月N日,
2人都知道张老师的生日是下列10组中的一天,
张老师把M值告诉了小明,把N值告诉了小强,
张老师问他们知道他的生日是那一天吗?
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天

 

--------------------------------------------------------------------------------
Way1:

小明说:如果我不知道的话,小强肯定也不知道
推出:小明根据月份可以断定小强只知道日数是无法知道具体日期的 就是说 小明拿到的月份指明--》这个月里面的所有可选日期中 日数都是有重复的 所以排除6月和12月 因为6.7 和12.2 两个日期中7和2在所有答案中是唯一的
小强说:本来我也不知道,但是现在我知道了
推出:小强知道月份在3月或者9月后 就知道具体的日期了 排除了5号的可能 因为5号在3月和5月有两个可能 小强也无法确定 所以范围缩小到了 3月4日 3月8日 9月1日
小明说:哦,那我也知道了
推出:如果小明拿到的是3月的话 根据上述推论 他还是不能确定具体的日期 因为三月还有4号和8号两个可能 而他却说自己也知道了 所以只能是9月1日
--------------------------------------------------------------------------------
Way2:

phase 1:10组日期中n值存在两组的有:1,4,5,8;唯一值有:2,7 ;
phase 2:“小明说:如果我不知道的话,小强肯定也不知道。”由此可知 M值所在月份不包含N为唯一值的。否则小强即可猜得日期。
所以 6月,12月排除;
phase 3:“小强说:本来我也不知道,但是现在我知道了。
”此时剩下的日期中N值1,4,8日为唯一值,5日为双值,如果为5日的话,小强仍旧无法判断,故5日排除,由此可知日期必是N为唯一值的日期;
phase 4:“小明说:哦,那我也知道了”此时N为唯一值的日期,3月有2天,9月有一天,小明只掌握月份M值,如果此月份为3月,可能的日期仍然有两天,小明仍无法确认,由此可知M月必只包含一个N为唯一值的可能性:9月1日。
--------------------------------------------------------------------------------
 

好的,我可以为您编写这个程序。以下是完整的程序代码: ```c++ #include <iostream> #include <string> using namespace std; // 日期类 class Date { private: int year; int month; int day; public: Date(int y, int m, int d) : year(y), month(m), day(d) {} void showDate() { cout << year << "-" << month << "-" << day << endl; } }; // 人员类 Person class Person { private: string name; Date birthday; public: Person(string n, int y, int m, int d) : name(n), birthday(y, m, d) {} void showInfo() { cout << "姓名:" << name << endl; cout << "生日:"; birthday.showDate(); } }; // 学生类 Student class Student : public Person { private: int id; double score; public: Student(string n, int y, int m, int d, int i, double s) : Person(n, y, m, d), id(i), score(s) {} void showInfo() { Person::showInfo(); cout << "学号:" << id << endl; cout << "成绩:" << score << endl; } }; // 教师类 Teacher class Teacher : public Person { private: int id; string major; string organization; public: Teacher(string n, int y, int m, int d, int i, string mjr, string org) : Person(n, y, m, d), id(i), major(mjr), organization(org) {} void showInfo() { Person::showInfo(); cout << "工号:" << id << endl; cout << "专业:" << major << endl; cout << "机构:" << organization << endl; } }; int main() { // 创建一个学生对象 Student stu("小明", 2000, 1, 1, 1001, 90.5); cout << "创建学生对象时,构造函数的调用顺序:" << endl; stu.showInfo(); // 创建一个教师对象 Teacher tea("张老师", 1980, 3, 18, 2001, "计算机科学", "XX大学"); cout << endl << "创建教师对象时,构造函数的调用顺序:" << endl; tea.showInfo(); return 0; } ``` 程序定义了日期类 `Date`,人员类 `Person`,学生类 `Student` 和教师类 `Teacher`。在 `Person` 类定义了姓名和生日两个数据成员,并在构造函数初始化 `birthday` 为日期类对象。在 `Student` 和 `Teacher` 类分别定义了学号和成绩、工号和专业、机构等数据成员,并在构造函数调用 `Person` 类的构造函数初始化姓名和生日。 在主函数,创建了一个学生对象 `stu` 和一个教师对象 `tea`,并调用了它们的 `showInfo()` 函数来输出对象的信息。同时,程序也回答了您之前的问题:创建学生类对象时,构造函数的调用顺序是先调用基类 `Person` 的构造函数,再调用派生类 `Student` 的构造函数;程序运行结束时析构函数的调用顺序是先调用派生类 `Student` 的析构函数,再调用基类 `Person` 的析构函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值