華爲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;
}


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