C++ 继承中的虚函数和纯虚函数
最近在校内网广泛流传一篇笑话,说是一个 IT 男去相亲的时候问了别人三个问题,其中第一个问题是:“C++ 中的虚函数和纯虚函数有什么区别?”结果那个女孩子没答上来。
考虑到明天俱乐部里刚好要讲到这个问题,我就先在这里写了吧。
最近在校内网广泛流传一篇笑话,说是一个 IT 男去相亲的时候问了别人三个问题,其中第一个问题是:“C++ 中的虚函数和纯虚函数有什么区别?”结果那个女孩子没答上来。
考虑到明天俱乐部里刚好要讲到这个问题,我就先在这里写了吧。
Polygon 是一个有关多边形的单人游戏。图 1 就是一个这样的多边形,它的边数 N 为 4. 多边形中每一个顶点都标记了一个整数,每一条边都标记了 +(加号)或 *(乘号)。并且,边被标记了从 1 到 N 的整数。
在第一回合的时候,先拿掉多边形的一条边。接下来的回合中涉及以下几步:
在没有任何边的时候,游戏结束,并且游戏的得分是最后幸存顶点所标记的数字。
考虑图 1 的多边形。玩家第一回合拿掉了第 3 条边。此后,玩家依次选择了第 1 条边,第 4 条边,最后是第 2 条边。他的得分是 0.
写一个程序,对于给出的多边形,计算其可行的最高得分;并且列出所有能够使得游戏取得最高分的,在第一回合被拿掉的边。
编码方案 (encoding scheme) 经常用于加密存储和传输时的数据。现在,我们开发了一种简单的编码方案,这种方案可以将某些特殊的长度为 5 或以下的(小写)字母编码成整数。
根据英语字母表 {a, b, c, ... , z} 组成的合法单词可以严格地按照字典序排列。在这里,“合法的”单词的含义是,单词中的字母从左向右是严格递增的;就是说,对于合法的单词中的每一对字母,第二个字母总是在第一个字母的字母表 {a, b, c, ... , z} 的后面。
你的程序需要读取若干行的输入数据。输入数据中,每行只有一个单词,并且保证这个单词的长度至少是 1 至多是 5. 对于每个读入的单词,如果它是不合法的单词,请输出数字 0. 如果是一个合法的单词,请给出这个单词在合法单词表中的字典序。
一种衡量序列的“乱序程度 (unsortedness)”的指标,是序列的“逆序数”(the number of pairs of entries that are out of order with respect to each other, 即序列中所有满足条件的数对的对数,这个条件是:该数对的两个数与整个序列的预期排序不符。)。例如,在“DAABEC”中,逆序数是 5, 因为 D 分别大于后面的 4 个字符,且 E 大于后面的一个字符。这就是序列的逆序数 (the number of inversions in the sequence). 序列“AACEDGG”的逆序数是 1, 因为它只有 E 和 D 是无序的——这表明它接近于有序序列——然而序列“ZWQM”的逆序数是 6(它达到了乱序的极致——正好与预期排序完全相反)。
你现在需要排序一连串的 DNA 数据(DNA 中只有 A, T, G 和 C 四个字母)。然而,你不应该以字典序排列它,而是应该以“排序程度”排列它们,最先输出的是“最排好序的”,最后输出的是“最乱序的”。所有的 DNA 字符串都是相同长度的。
在最近的期中项目“牛奶”里,我大量运用了共享指针。虽然这是一种偷懒的表现,但是对于这个“模拟牛奶生产过程”的项目来说,我们并不在乎它对效率产生的影响。
题外话说完后,说说共享指针。共享指针 (shared_ptr) 是现在的 Boost 库中提供的,并且应该是将来 C++1x 的标准库中提供的一个模板类。在此之前,ISO/IEC 14882:2003 标准库 <memory> 中的“自动指针 (auto_ptr)”也有类似的功能。显然 shared_ptr 要比 auto_ptr 从功能上来说应该强大一些。这篇文章主要介绍 shared_ptr 的最基本用法和注意事项,相当于入门级多一点点。
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为 23 天、28 天和 33 天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为 10,下次出现三个高峰同天的时间是 12,则输出 2 (注意这里不是 3)。
Fred Mapper 正在考虑在路易斯安那州购买一些土地来建他自己的房子。在研究土地的过程中,他发现,路易斯安那州的土地每年都会被密西西比河侵蚀掉 50 平方里。因为 Fred 希望在这个房子里度过余生,所以他需要知道他的那些土地是否会被侵蚀掉。
在做了更多的调查之后,Fred 发现这些土地是以半圆的形状被侵蚀的。这个半圆所对应的正圆的圆心在坐标原点 (0, 0), 坐标轴 x 轴将这个圆切成两半。在 x 轴下方的区域是河流。在第一年刚开始的时候,这个半圆的面积是 0.
一个程序员住在一条街上,这条街的房子被连续地编号(从 1 号开始)。每天晚上她都把狗从家里牵出来遛,并且她会随机的往左或往右转,然后走到街道的尽头再回来。一天晚上,她把街上她走过的房子的号数求了和(除了她自己的)。下一次她走了另外一条路,也把这些房子的号数加起来后,她惊奇地发现,这两个和居然是一样的。虽然这件事(两次的和是一样的)一方面取决于她的房子的号数,另一方面取决于街上房子的数量,但她还是觉得,她的房子(因为有了“让这两次的和是一致的”这种属性)是非常有价值的。并且她决定让以后的房子都表现这样的性质。