编程题(共3题,第一题20分,第二题30分,第三题50分,共100分)
注意:
1、请上机编写程序,按题目要求提交文件。
2、本试题采用自动执行测试用例进行评分,测试用例不对考生公开
3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。
4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况
5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误
6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分
7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并实现下一题目
1.计算面积(20分)
在标准坐标轴上,当前位置A点的坐标为(x,y)。A点可以在东南西北四个方向上任意移动,每次移动的距离为整数1。A点根据给定方向进行移动,移动之后的坐标为(x’,y’)。请实现函数,计算A点移动之后,如下图所示区域的面积(坐标原点,(x’,y’),(x’,0),(0, y’)四个点构成的矩形面积)
int calculateArea(int x, int y, char dir)
【输入】int x,表示A点的原始横坐标
int y,表示A点的原始纵坐标
char dir,表示坐标点要移动的方向,东南西北分别表示为’e’,’s’,’w’,’n’。
【输出】 无
【返回】 如上图所示,坐标原点、(x’,y’)、(x’,0)、(0, y’)四个点构成的矩形面积,类型为int
1) 输入:x=1,y=1,dir=’e’,函数返回值:2;
2) 输入:x=1,y=0,dir=’e’,函数返回值:0;
3) 输入:x=1,y=1,dir=’x’,函数返回值:1;
2.身份证号码合法性判断
我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的月日信息进行校验(大小月)。比如0808表示8月8日月日信息,是合法的;0832表示8月32日,是非法的月日信息;1308表示13月8日,是非法的月日信息。不需要考虑闰年的情况,2月份统一认为只有28天,测试用例不会输入闰年情况。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号上的日期信息非法,返回4;
【注】
除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
日期合法性判断不考虑闰年情况,即2月只有28天,出现2月29日情况均认为日期非法。测试用例也不会出现闰年的情况,在此情况下如果考生花时间进行了闰年处理,并不能带来任何加分,并且由于是自动阅卷,甚至出现扣分。
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2
3) 输入:”511002198808321234”,函数返回值:4
4) 输入:”511002200102291234”,函数返回值:4
5) 输入:”511002198808081234”,函数返回值:0
3.联系人姓名在手机上的数字匹配
通常我们的手机按键如下分布:
针对每个联系人,比如John Smith,我们可以通过如下两种方式进行匹配:
1、 首几个连续字母。以上面的例子来说明:J(5)o(6)h(4);
2、 联系人姓和名的首字母匹配。以上面的例子来说明:J(5)ohn S(7)mith。
现在需要实现如下函数,寻找与联系人姓名匹配的数字,并按字符串形式返回,要求如下:
1、 简单起见,只考虑英文联系人的情况,英文大小写都有可能出现,大小写统一对待;
2、 英文联系人的姓和名之间只可能包含空格,没有其他怪异的符号;
3、 联系人的姓名可能只包含一个单词,也可能包含多个单词,每个单词不少于3个字母。
4、 如果联系人姓名只有一个单词,返回首3个字母的数字匹配;如果联系人姓名包括多个单词,返回每个单词的首字母匹配,单词数超过3个的,只需要输出前三个单词的首字母匹配。
5、 返回类型为字符串形式的数字,比如”John”匹配5、6和4,则返回字符串”564”;”John smith”匹配5和7,则返回字符串”57”
void getLetter2NumIndex(char* strName,char *numIndex)
【输入】 char* strName,表示输入的英文姓名字符串。
【输出】 char *numIndex,表示最终计算出来的数字匹配字符串。
【返回】 无
1) 输入:”Willam”,输出:”945”;
2) 输入:”WILLAM”,输出:”945”
3) 输入:”John Smith”,输出:”57”;
4) 输入:”John Smith Green Carlos”,输出:”574”。