华为2012校园招聘上机编程题(1)

编程题(共3题,第一题20分,第二题30分,第三题50分,共100分)
注意:
1、请上机编写程序,按题目要求提交文件。[详见考试说明,点击进入考试说明]
2、本试题采用自动执行测试用例进行评分,测试用例不对考生公开
3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。
4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况
5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误
6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分

7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并实现下一题目


1. 手机号码合法性判断(20分)
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
 1、  长度13位;
2、  以86的国家码打头;
3、  手机号码的每一位都是数字。
 请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
1)  如果手机号码合法,返回0;
2)  如果手机号码长度不合法,返回1
3)  如果手机号码中包含非数字的字符,返回2;
4)  如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int s int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】  无
【返回】  判断的结果,类型为int。
示例
输入:  inMsisdn = “869123456789“
输出:  无
返回:  1
输入:  inMsisdn = “88139123456789“
输出:  无
返回:  3
输入:  inMsisdn = “86139123456789“
输出:  无
返回:  0

int verifyMsisdn(char* inMsisdn)
{
	if(strlen(inMsisdn) != 13)
		return 1;

	char *p = inMsisdn;
	while(*p != '\0')
	{
		if((*p < '0') || (*p > '9'))
			return 2;
		p++;
	}

	p = inMsisdn;
	if(*p != '8' || *(++p) != '6')
		return 3;

	return 0;

}


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 “
void sortVowel (char* input, char* output)
{
	size_t len = strlen(input) + 1;
	char *pDa = new char[len];
	char *pXiao = new char[len];
	char *pIN = input;

	int i = 0, j = 0;
	while(*pIN  != '\0')
	{
		if(*pIN  == 'A' ||*pIN  == 'E' ||*pIN  == 'I' ||*pIN  == 'O' ||*pIN  == 'U')
		{
			pDa[i++] = *pIN ;
		}

		if(*pIN  == 'a' || *pIN  == 'e' ||*pIN  == 'i' ||*pIN  == 'o' ||*pIN  == 'u')
		{
			pXiao[j++] = *pIN;
		}

		pIN ++;
	}	 
	pDa[i] = '\0';
	pXiao[j] = '\0';

	size_t len_da = strlen(pDa);
	size_t len_xiao = strlen(pXiao);

	for(int i = 0; i < len_da - 1; i++)
	{
		for(int j = 0; j < len_da - 1 - i; j++)
		{
			if(pDa[j] > pDa[j + 1])
			{
				char temp;
				temp = pDa[j + 1];
				pDa[j + 1] = pDa[j];
				pDa[j] = temp;
			}
		}
	}

	for(int i = 0; i < len_xiao - 1; i++)
	{
		for(int j = 0; j < len_xiao - 1 - i; j++)
		{
			if(pXiao[j] > pXiao[j + 1])
			{
				char temp;
				temp = pXiao[j + 1];
				pXiao[j + 1] = pXiao[j];
				pXiao[j] = temp;
			}
		}
	}

	int k = 0;
	for(int i = 0; i < len_xiao; i++)
	{
		output[k++] = pXiao[i];
	}

	for(int i = 0; i < len_da; i++)
	{
		output[k++] = pDa[i];
	}

	output[k] = '\0';

	delete []pDa;
	delete []pXiao;

}

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;

int verifyIDCard(char* input)
{
	if (strlen(input) != 18)
		return 1;

	for(int i = 0; i < 17;i++)
	{
		if(input[i] < '0' || input[i] > '9')
			return 2;
	}

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

	char year[5];
	year[0] = input[6];
	year[1] = input[7];
	year[2] = input[8];
	year[3] = input[9];
	year[4] = '\0';
	int year_num = atoi(year);
	if(year_num <= 1900 || year_num >= 2100)
		return 4;

	char month[3];
	month[0] = input[10];
	month[1] = input[11];
	month[2] = '\0';
	int month_num = atoi(month);
	if(month_num > 12 || month_num < 1)
		return 5;

	char day[3];
	day[0] = input[12];
	day[1] = input[13];
	day[2] = '\0';
	int day_num = atoi(day);
	if(((year_num % 4 == 0) && (year_num % 100 != 0)) || (year_num % 400 == 0))		// 闰年
	{
		if(month_num == 2)
		{
			if(day_num < 1 || day_num > 29)
				return 6;
		}
		else if(month_num == 1 || month_num == 3 ||month_num == 5 ||month_num == 7 ||month_num == 8 ||month_num == 10 ||month_num == 12)
		{
			if(day_num < 1 || day_num > 31)
				return 6;
		}
		else
		{
			if(day_num < 1 || day_num > 30)
				return 6;
		}
	}
	else		// 不是闰年
	{
		if(month_num == 2)
		{
			if(day_num < 1 || day_num > 28)
				return 6;
		}
		else if(month_num == 1 || month_num == 3 ||month_num == 5 ||month_num == 7 ||month_num == 8 ||month_num == 10 ||month_num == 12)
		{
			if(day_num < 1 || day_num > 31)
				return 6;
		}
		else
		{
			if(day_num < 1 || day_num > 30)
				return 6;
		}
	}

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章