2016年华为认证考试题

       1、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

  输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

  补充说明:

  1. 操作数为正整数,不需要考虑计算结果溢出的情况。

  2. 若输入算式格式错误,输出结果为“0”。

  要求实现函数:

  void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

  【输入】 pInputStr: 输入字符串

  lInputLen: 输入字符串长度

  【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

  【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

  示例

  输入:“4 + 7” 输出:“11”

  输入:“4 - 7” 输出:“-3”

  输入:“9 ++ 7” 输出:“0” 注:格式错误

  复制代码

  1 void arithmetic(const char *pInputStr,long lInputLen,char *pOutputStr)

  2 {

  3 assert(pInputStr!=NULL && pOutputStr!=NULL && lInputLen>0);

  4 int iOperand1=0;

  5 int iOperand2=0;

  6 char cSymbol;

  7 long i;

  8 for (i=0;;i++)

  9 {

  10 if (pInputStr[i]>='0' && pInputStr[i]<='9')

  11 {

  12 iOperand1=iOperand1*10+(pInputStr[i]-'0');

  13 }

  14 else if (pInputStr[i]==' ')

  15 {

  16 break;

  17 }

  18 else

  19 {

  20 return;

  21 }

  22 }

  23

  24 for (++i;;i++)

  25 {

  26 if (pInputStr[i]=='+' || pInputStr[i]=='-')

  27 {

  28 cSymbol=pInputStr[i];

  29 }

  30 else if (pInputStr[i]==' ')

  31 {

  32 break;

  33 }

  34 else

  35 {

  36 return;

  37 }

  38 }

  39

  40 for (++i;i

  41 {

  42 if (pInputStr[i]>='0' && pInputStr[i]<='9')

  43 {

  44 iOperand2=iOperand2*10+(pInputStr[i]-'0');

  45 }

  46 else

  47 {

  48 break;

  49 }

  50 }

  51 int iTemp;

  52 switch(cSymbol)

  53 {

  54 case '+':

  55 iTemp=iOperand1+iOperand2;

  56 break;

  57 case '-':

  58 iTemp=iOperand1-iOperand2;

  59 break;

  60 default:

  61 break;

  62 }

  63

  64 int k=0;

  65 if (iTemp<0)

  66 {

  67 iTemp=-iTemp;

  68 pOutputStr[0]='-';

  69 k++;

  70 }

  71

  72 char cTemp[10];

  73 itoa(iTemp,cTemp,10);

  74 int j=0;

  75 while(cTemp[j])

  76 {

  77 pOutputStr[k++]=cTemp[j++];

  78 }

  79

  80 pOutputStr[k]='\0';

  81

  82 }

  复制代码

  2、手机号码合法性判断(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 int verifyMsisdn(char *inMsisdn)

  2 {

  3 assert(inMsisdn!=NULL);

  4

  5 int iLen=strlen(inMsisdn);

  6 if (iLen!=13)

  7 {

  8 return 1;

  9 }

  10

  11 for (int i=0;i

  12 {

  13 if (inMsisdn[i]<'0' || inMsisdn[i]>'9')

  14 {

  15 return 2;

  16 }

  17 }

  18

  19 if (inMsisdn[0]!='8' || inMsisdn[1]!='6')

  20 {

  21 return 3;

  22 }

  23

  24 return 0;

  25

  26 }

  复制代码

  3、将一个字符串的元音字母复制到另一个字符串,并排序(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 “

  复制代码

  1 void sortVowel(char *pInput,char *pOutput)

  2 {

  3 assert(pInput!=NULL && pOutput!=NULL);

  4

  5 int iLen=strlen(pInput);

  6 char *pSmall=new char[iLen+1];

  7 char *pLarge=new char[iLen+1];

  8

  9 int iSmallCount=0;

  10 int iLargeCount=0;

  11

  12 for (int i=0;i

  13 {

  14 if (pInput[i]=='a' || pInput[i]=='e' || pInput[i]=='i' || pInput[i]=='o' || pInput[i]=='u')

  15 {

  16 pSmall[iSmallCount++]=pInput[i];

  17

  18 }

  19 else if (pInput[i]=='A' || pInput[i]=='E' || pInput[i]=='I' || pInput[i]=='O' || pInput[i]=='U')

  20 {

  21 pLarge[iLargeCount++]=pInput[i];

  22 }

  23 }

  24

  25 sort(pSmall,pSmall+iSmallCount);

  26 sort(pLarge,pLarge+iLargeCount);

  27

  28 int j,k=0;

  29 for (j=0;j

  30 {

  31 pOutput[k++]=pSmall[j];

  32 }

  33 for (j=0;j

  34 {

  35 pOutput[k++]=pLarge[j];

  36 }

  37

  38 pOutput[k]='\0';

  39

  40 delete []pSmall;

  41 delete []pLarge;

  42 }

  复制代码

  4、我国公民的身份证号码特点如下:

  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;


个人资料
小黄瓜
等级:6
文章:16篇
访问:2.7w
排名: 23
上一篇: 华为测试面试题整理2016
下一篇:2016年华为笔试面试题
猜你感兴趣的圈子:
华为笔试面试圈
标签: pinput、pinputstr、inmsisdn、手机号码、char、面试题
隐藏