华为2011上机笔试题3+参考程序
1. 手机号码合法性判断(20分)
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “88139123456789“
输出: 无
返回: 3
输入: inMsisdn = “86139123456789“
输出: 无
返回: 0
2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重(chong);
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入:char *input = “Abort!May Be Some Errors In Out System. “
输出:char *output =“aeeeooouAEIO “
3.我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号的年信息非法,返回4;
6) 如果身份证号的月信息非法,返回5;
7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int
示例
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2;
3) 输入:”51100219880808123a”,函数返回值:3;
4) 输入:”511002188808081234”,函数返回值:4;
5) 输入:”511002198813081234”,函数返回值:5;
6) 输入:”511002198808321234”,函数返回值:6;
7) 输入:”511002198902291234”,函数返回值:6;
8) 输入:”511002198808081234”,函数返回值:0;
参考程序(欢迎讨论)转载请注明来源http://www.cnblogs.com/jerry19880126/
1 #include <iostream> 2 using namespace std; 3 4 5 // 编程题第一题 6 // 实现手机号码合法性判断的函数 7 int verifyMsisdn(char* inMsisdn) 8 { 9 int len = strlen(inMsisdn); 10 11 // 检测长度是否合法 12 if(len != 13) 13 { 14 return 1; 15 } 16 17 // 检测是否都是数字 18 for(int i = 0; i < len; ++i) 19 { 20 if(inMsisdn[i] <'0' || inMsisdn[i] > '9') 21 { 22 return 2; 23 } 24 } 25 26 // 检测是否以86打头 27 if(inMsisdn[0] != '8' || inMsisdn[1] != '6') 28 { 29 return 3; 30 } 31 32 //是合法的号码 33 return 0; 34 } 35 36 37 void mySort(char *a, int len) 38 { 39 //用插入法 40 for(int i = 1; i < len; ++i) 41 { 42 char temp = a[i]; 43 int j = i - 1; 44 while(j >= 0 && temp < a[j]) 45 { 46 a[j + 1] = a[j]; 47 --j; 48 } 49 a[j + 1] = temp; 50 } 51 } 52 53 // 编程题第二题 54 // 找出元音字母并排序 55 void sortVowel(char* input, char* output) 56 { 57 int len = strlen(input); 58 int outputIndex1 = 0; 59 int outputIndex2 = 0; 60 char *output1 = new char[len];//存放小写字母 61 char *output2 = new char[len];//存放大写字母 62 //查找 63 for(int i = 0; i < len; ++i) 64 { 65 char c = input[i]; 66 if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') 67 { 68 output1[outputIndex1++] = c; 69 } 70 else if(c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') 71 { 72 output2[outputIndex2++] = c; 73 } 74 } 75 76 //排序,先小写字母升序排序,再是大写字母升序排序 77 mySort(output1, outputIndex1); 78 mySort(output2, outputIndex2); 79 80 //合并,先小写再大写 81 for(int i = 0; i < outputIndex1; ++i) 82 { 83 output[i] = output1[i]; 84 } 85 86 for(int i = 0; i < outputIndex2; ++i) 87 { 88 output[i + outputIndex1] = output2[i]; 89 } 90 91 // 加上'\0' 92 output[outputIndex1 + outputIndex2] = '\0'; 93 94 delete [] output1; 95 delete [] output2; 96 } 97 98 99 // 编程题第三题 100 // 判断身份证号码的合理性 101 int verifyIDCard(char* input) 102 { 103 int len = strlen(input); 104 // 长度判断 105 if(len != 18) 106 { 107 return 1; 108 } 109 110 // 前17位数字判断 111 for(int i = 0; i < 17; ++i) 112 { 113 if(input[i] < '0' || input[i] > '9') 114 { 115 return 2; 116 } 117 } 118 119 // 第18位合法性判断 120 if( (input[17] < '0' || input[17] > '9') && input[17] != 'x') 121 { 122 return 3; 123 } 124 125 // 采集年 126 int year = 0, month = 0, day = 0; 127 for(int i = 6; i < 10; ++i) 128 { 129 year = year * 10 + (input[i] - '0'); 130 } 131 // 年信息判断 132 if(year < 1900 || year > 2100) 133 { 134 return 4; 135 } 136 137 // 采集月 138 for(int i = 10; i < 12; ++i) 139 { 140 month = month * 10 + (input[i] - '0'); 141 } 142 // 月信息判断 143 if(month <= 0 || month >=13) 144 { 145 return 5; 146 } 147 148 // 采集日 149 for(int i = 12; i < 14; ++i) 150 { 151 day = day * 10 + (input[i] - '0'); 152 } 153 // 日信息判断 154 if(day <= 0 || day >= 32) 155 { 156 return 6; 157 } 158 if(!(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 159 || month == 10 || month == 12)) 160 { 161 // 不是大月 162 if(day == 31) 163 { 164 return 6; 165 } 166 } 167 if(month == 2) 168 { 169 if(day >= 30) 170 { 171 return 6; 172 } 173 if( !((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) 174 { 175 // 不是闰年 176 if(day >= 29) 177 { 178 return 6; 179 } 180 } 181 } 182 return 0; 183 } 184 185 int main() 186 { 187 cout << "第一题测试样例:" << endl; 188 char* inMsisdn1 = "869123456789"; 189 char* inMsisdn2 = "8813912345678"; 190 char* inMsisdn3 = "8613912345678"; 191 cout << verifyMsisdn(inMsisdn1) << " " << 192 verifyMsisdn(inMsisdn2) << " " << 193 verifyMsisdn(inMsisdn3) << endl; 194 195 cout << endl << "第二题测试样例:" << endl; 196 char *input = "Abort!May Be Some Errors In Out System"; 197 char output[50]; 198 sortVowel(input, output); 199 cout << output << endl; 200 201 cout << endl << "第三题测试样例:" << endl; 202 char* creditCard1 = "511002111222"; 203 char* creditCard2 = "511002abc123456789"; 204 char* creditCard3 = "51100219880808123a"; 205 char* creditCard4 = "511002188808081234"; 206 char* creditCard5 = "511002198813081234"; 207 char* creditCard6 = "511002198808321234"; 208 char* creditCard7 = "511002198902291234"; 209 char* creditCard8 = "511002198808081234"; 210 cout << verifyIDCard(creditCard1) << " "; 211 cout << verifyIDCard(creditCard2) << " "; 212 cout << verifyIDCard(creditCard3) << " "; 213 cout << verifyIDCard(creditCard4) << " "; 214 cout << verifyIDCard(creditCard5) << " "; 215 cout << verifyIDCard(creditCard6) << " "; 216 cout << verifyIDCard(creditCard7) << " "; 217 cout << verifyIDCard(creditCard8) << endl; 218 cout << endl; 219 }