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

/*
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
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 20
char str[N];
int verifyMsisdn(char* inMsisdn)
{
int i,len=strlen(inMsisdn);
if(len!=13)
return 1;
for(i=0;i<len;i++)
{
if(!(inMsisdn[i]<='9'&&inMsisdn[i]>='0'))
return 2;
}
if(inMsisdn[0]!='8'||inMsisdn[1]!='6')
return 3;
return 0;
}
int main()
{
int i,j,n,sum;

while(scanf("%s",str)!=EOF)
{
printf("%d\n",verifyMsisdn(str));
}
return 0;
}
/*
869123456789
8813912345678
8613912345678
861231231a444
*/


2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分) 


问题描述: 有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,


现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,


并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。 


说明:  


1、  元音字母是a,e,i,o,u,A,E,I,O,U。  


2、  筛选出来的元音字母,不需要剔重;     


最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。    


要求实现函数:  void sortVowel (char* input, char* output); 


【输入】  char* input,表示输入的字符串  


【输出】  char* output,排好序之后的元音字符串。 


【返回】  无    


示例  


输入:char *input = “Abort!May Be Some Errors In Out System. “  


输出:char *output =“aeeeooAEIO “


/*
2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述: 有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,
现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,
并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数: void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入:char *input = “Abort!May Be Some Errors In Out System. “
输出:char *output =“aeeeooAEIO “
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 50
char s[N]={'a','e','i','o','u','A','E','I','O','U'};
void sortVowel(char* input, char* output)
{
int i,len=strlen(input);
char *p=output;
for(i=0;i<10;i++)
{
char *temp=input;
while(*temp)
{
if(*temp==s[i])
*p++=s[i];
temp++;
}
}
*p='\0';
}
int main()
{

char str[N],output[N];
while(gets(str))
{
sortVowel(str,output);
printf("%s\n",output);

}
return 0;
}
/*
Abort!May Be Some Errors In Out System.
*/


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”,函数返回值:7; 


8) 输入:”511002198808081234”,函数返回值:0;


/*
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”,函数返回值:7;
8) 输入:”511002198808081234”,函数返回值:0;
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 20
char str[N];
int verifyIDCard(char* input)
{
int i,len=strlen(input);
int y,m,d;
if(len!=18)
return 1;
for(i=0;i<len-1;i++)
{
if(!(input[i]<='9'&&input[i]>='0'))
return 2;
}

if(input[17]!='x'&&(!(input[17]<='9'&&input[17]>='0')))
return 3;

y=0;
for(i=6;i<=9;i++)
{
y=y*10+input[i]-'0';
}
if(!(y<=2100&&y>=1900))
return 4;

m=0;
for(i=10;i<=11;i++)
{
m=m*10+input[i]-'0';
}
if(!(m<=12&&m>=1))
return 5;

d=0;
for(i=12;i<=13;i++)
{
d=d*10+input[i]-'0';
}
int nomal_date[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int runnian_date[12]={31,29,31,30,31,30,31,31,30,31,30,31};
if((y%4==0&&y%100!=0)||(y%400==0))
{
if(d>runnian_date[m-1]||d<1)
return 6;
else if(d>nomal_date[m-1]||d<1)
return 7;
}else
{
if(d>nomal_date[m-1]||d<1)
return 7;
}
return 0;
}
int main()
{
int i,j,n,sum;

while(scanf("%s",str)!=EOF)
{
printf("%d\n",verifyIDCard(str));
}
return 0;
}
/*
511002111222
511002abc123456789
51100219880808123a
511002188808081234
511002198813081234
511002198808321234
511002198902291234
511002198808081234
*/