华为2011上机笔试题3+参考程序

来源:互联网 发布:大数据行业分析 编辑:程序博客网 时间:2024/05/17 03:42

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 == 8159         || 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 }
复制代码
原创粉丝点击