华为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 }

转载于:https://www.cnblogs.com/jerry19880126/archive/2012/08/07/2626218.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值