打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
华为机试题整理2

1、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

函数接口 int cal_score(int score[], int judge_type[], int n)

 1 int cal_score(int score[],int judge_type[],int n) 2 { 3     if (score==NULL || judge_type==NULL || n<=0) 4     { 5         return 0; 6     } 7     int iDazhong=0,iFenshu1=0; 8     int iZhuanjia=0,iFenshu2=0; 9     int iZongFen;10     for (int i=0;i<n;i++)11     {12         if (judge_type[i]==1)13         {14             iFenshu2+=score[i];15             iZhuanjia++;16         }17         else if (judge_type[i]==2)18         {19             iFenshu1+=score[i];20             iDazhong++;21         }22     }23     24     25 26     if (iFenshu1==0)27     {28         iFenshu2/=iZhuanjia;29         iZongFen=iFenshu2;//无大众30     }31     else32     {33         iFenshu2/=iZhuanjia;34         iFenshu1/=iDazhong;35         iZongFen=(int)(0.6*iFenshu2+0.4*iFenshu1);36     }37 38     return iZongFen;39 40 } 

2、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}

函数接口 void sort(int input[], int n, int output[])

 1 void InsertSort(int data[],int n) 2 { 3     if (data==NULL || n<=0) 4     { 5         return; 6     } 7     int temp; 8     int j; 9     for (int i=1;i<n;i++)10     {11         temp=data[i];12         j=i-1;13         while(j>=0 && data[j]>temp)14         {15             data[j+1]=data[j];16             j--;17         }18 19         data[++j]=temp;20     }21 }22 23 void PaiLie(int input[],int output[],int n)24 {25     if (input==NULL || output==NULL || n<=0)26     {27         return;28     }29 30     InsertSort(input,n);31 32     int center=n/2;33     output[center]=input[n-1];34 35     int offset=1;36     int i=n-2;37     while(i>=0)38     {39         output[center-offset]=input[i--];40         if (i<0)41         {42             break;43         }44         output[center+offset]=input[i--];45 46         offset++;47     }48 }

3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越 高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。

例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}

函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])

 1 void scheduler(int task[],int n,int system_task[],int user_task[]) 2 { 3     int i; 4     int iSystemIndex=0,iUserIndex=0; 5  6     for (i=0;i<n;i++) 7     { 8         if (task[i]<50) 9         {10             system_task[iSystemIndex++]=i;11         }12         else if (task[i]>=50 && task[i]<=255)13         {14             user_task[iUserIndex++]=i;15         }16         17     }18 19     int iMax;20     int iMaxIndex1;21     int j;22 23     for (i=iSystemIndex-1;i>0;i--)24     {25         iMax=task[system_task[0]];26         iMaxIndex1=0;27         for (j=0;j<=i;j++)28         {29             if (task[system_task[j]]>iMax)30             {31                 iMax=task[system_task[j]];32                 iMaxIndex1=j;33             }34         }35         swap(system_task[iMaxIndex1],system_task[i]);36     }37 38 39     int iMaxIndex2;40     for (i=iUserIndex-1;i>0;i--)41     {42         iMax=task[user_task[0]];43         iMaxIndex2=0;44         for (j=0;j<=i;j++)45         {46             if (task[user_task[j]]>iMax)47             {48                 iMax=task[user_task[j]];49                 iMaxIndex2=j;50             }51         }52         swap(user_task[iMaxIndex2],user_task[i]);53     }54 55     system_task[iSystemIndex]=-1;56     user_task[iUserIndex]=-1;57 58 }

4、数组比较(20分)

 

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数

 

比如:

数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3

 

要求实现函数:

int array_compare(int len1, int array1[], int len2, int array2[])

 

【输入】 int len1:输入被比较数组1的元素个数;

int array1[]:输入被比较数组1;

int len2:输入被比较数组2的元素个数;

int array2[]:输入被比较数组2;

 

【输出】 无

 

【返回】 不相等元素的个数,类型为int

 

示例:

1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5

函数返回:0

2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6

函数返回:3

 1 int array_compare(int len1,int array1[],int len2,int array2[]) 2 { 3     assert(len1>0 &&len2>0); 4     assert(array1!=NULL && array2!=NULL); 5  6     int iLen=(len1>len2)? len2:len1; 7     int count=0; 8  9     for (int i=iLen-1;i>=0;i--)10     {11         if (array1[i]!=array2[i])12         {13             count++;14         }15     }16 17     return count;18 }

 

5. 约瑟夫问题

 

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替 换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程 实现上述计数过程,同时输出数值出列的顺序

 

比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)

第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数

第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数

第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数

最后一轮计数出列数字为4,计数过程完成。

输出数值出列顺序为:2,3,1,4。

 

要求实现函数:

void array_iterate(int len, int input_array[], int m, int output_array[])

 

【输入】 int len:输入数列的长度;

int intput_array[]:输入的初始数列

int m:初始计数值

 

【输出】 int output_array[]:输出的数值出列顺序

 

【返回】 无

 

示例:

输入:int input_array[] = {3,1,2,4},int len = 4, m=7

输出:output_array[] = {2,3,1,4}

 1 void array_iterate(int len,int input_array[],int m,int output_array[]) 2 { 3     assert(len>=0 && input_array!=NULL && m>0 && output_array!=NULL); 4     int iChooseIndex=0; 5     int iStartIndex=0; 6     int i=0; 7  8     while(len>0) 9     {10         iStartIndex=iChooseIndex;11         iChooseIndex=(iStartIndex+(m-1)%len)%len;12         m=input_array[iChooseIndex];13         output_array[i++]=m;14         for (int j=iChooseIndex;j<len-1;j++)15         {16             input_array[j]=input_array[j+1];17         }18 19         len--;20         21     }22 }

 

 

6. 简单四则运算

 

问题描述:

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注:

3.1、表达式只含 +, -, *, / 四则运算符,不含括号

3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

3.3、要考虑加减乘除按通常四则运算规定的计算优先级

3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数:

int calculate(int len, char *expStr)

 

【输入】 int len: 字符串长度;

char *expStr: 表达式字符串;

 

【输出】 无

 

【返回】 计算结果

 

示例:

1)输入:char *expStr = “1+4*5-8/3”

函数返回:19

2)输入:char *expStr = “8/3*3”

函数返回:6

  1 int calculate(int len,char *expStr)  2 {  3     stack<int> OperateNum;  4     stack<char> OperateSymbol;  5     bool bFlag=false;  6   7     for (int i=0;i<len;i++)  8     {  9         char c=expStr[i]; 10         if (c>='0' && c<='9') 11         { 12             int iNumber=c-'0'; 13             OperateNum.push(iNumber); 14             continue; 15         } 16  17         else if (c=='*' || c=='/') 18         { 19             if (OperateSymbol.size()>0 && (OperateSymbol.top()=='*' || OperateSymbol.top()=='/')) 20             { 21                 bFlag=true; 22             } 23             else 24             { 25                 bFlag=false; 26             } 27         } 28  29         else if (c=='+' || c=='-') 30         { 31             if (OperateSymbol.size()==0) 32             { 33                 bFlag=false; 34             } 35             else 36             { 37                 bFlag=true; 38             } 39         } 40  41         if (bFlag) 42         { 43             int iOperand1=OperateNum.top(); 44             OperateNum.pop(); 45             int iOperand2=OperateNum.top(); 46             OperateNum.pop(); 47  48             char cOperSymbol=OperateSymbol.top(); 49             OperateSymbol.pop(); 50  51             int iTemp; 52             switch (cOperSymbol) 53             { 54             case '+': 55                     iTemp=iOperand2+iOperand1; 56                     OperateNum.push(iTemp); 57                 break; 58             case '-': 59                     iTemp=iOperand2-iOperand1; 60                     OperateNum.push(iTemp); 61                 break; 62             case '*': 63                     iTemp=iOperand2*iOperand1; 64                     OperateNum.push(iTemp); 65                 break; 66             case '/': 67                     iTemp=iOperand2/iOperand1; 68                     OperateNum.push(iTemp); 69                 break; 70                      71             } 72  73              74         } 75          76         OperateSymbol.push(c); 77     } 78  79     while(OperateSymbol.size()>0) 80     { 81         int iOperand1=OperateNum.top(); 82         OperateNum.pop(); 83         int iOperand2=OperateNum.top(); 84         OperateNum.pop(); 85  86         char cOperateSymbol=OperateSymbol.top(); 87         OperateSymbol.pop(); 88  89         int iTemp; 90         switch(cOperateSymbol) 91         { 92         case '+': 93                 iTemp=iOperand2+iOperand1; 94                 OperateNum.push(iTemp); 95                 break; 96         case '-': 97                 iTemp=iOperand2-iOperand1; 98                 OperateNum.push(iTemp); 99                 break;100         case '*':101                 iTemp=iOperand2*iOperand1;102                 OperateNum.push(iTemp);103                 break;104         case '/':105                 iTemp=iOperand2/iOperand1;106                 OperateNum.push(iTemp);107                 break;108         }109     }110     111     return OperateNum.top();112 }

 

7、 识别字符串中的整数并转换为数字形式(40分)

问题描述: 
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。

要求实现函数: 
void take_num(const char *strIn, int *n, unsigned int *outArray)

【输入】 strIn:  输入的字符串

【输出】 n:      统计识别出来的整数个数

      outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,

 outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用

【返回】 无

注:

I、    不考虑字符串中出现的正负号(+,-),即所有转换结果为非负整数(包括0和正整数)

II、   不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsignedint可处理的范围

III、  需要考虑 '0' 开始的数字字符串情况,比如"00035" ,应转换为整数35;

       "000" 应转换为整数0;"00.0035"应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)

IV、  输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。

示例 
输入:strIn ="ab00cd+123fght456-25  3.005fgh"

输出:n = 6

outArray= {0, 123, 456, 25, 3, 5}

 1 void take_num(const char *strIn,int *n,unsigned int *outArray) 2 { 3     assert(strIn!=NULL); 4     *n=0; 5     int iLen=strlen(strIn); 6     int iOutArrayIndex=0; 7     unsigned int iNumber=0; 8     bool bFlag=false; 9 10     for (int i=0;i<iLen;i++)11     {12         if (strIn[i]>='0' && strIn[i]<='9')13         {14             iNumber=iNumber*10+(strIn[i]-'0');15             if (bFlag==false)16             {17                 bFlag=true;18             }19         }20         else 21         {22             if (bFlag==true)23             {24                 outArray[iOutArrayIndex++]=iNumber;25                 (*n)++;26                 iNumber=0;27                 bFlag=false;28             }29         }30     }31 32     if (strIn[iLen-1]>='0' && strIn[iLen-1]<='9')33     {34         outArray[iOutArrayIndex]=iNumber;35         (*n)++;36     }37 }

 

8、IP地址匹配(60分)

问题描述: 
在路由器中,一般来说转发模块采用最大前缀匹配原则进行目的端口查找,具体如下:

IP地址和子网地址匹配:

IP地址和子网地址所带掩码做AND运算后,得到的值与子网地址相同,则该IP地址与该子网匹配。

 

比如:

IP地址:192.168.1.100

子网:192.168.1.0/255.255.255.0,其中192.168.1.0是子网地址,255.255.255.0是子网掩码。

192.168.1.100&255.255.255.0= 192.168.1.0,则该IP和子网192.168.1.0匹配

 

IP地址:192.168.1.100

子网:192.168.1.128/255.255.255.192

192.168.1.100&255.255.255.192= 192.168.1.64,则该IP和子网192.168.1.128不匹配

 

最大前缀匹配:

任何一个IPv4地址都可以看作一个32bit的二进制数,比如192.168.1.100可以表示为:11000000.10101000.00000001.01100100,

192.168.1.0可以表示为11000000.10101000.00000001.00000000

最大前缀匹配要求IP地址同子网地址匹配的基础上,二进制位从左到右完全匹配的位数尽量多(从左到右子网地址最长)。比如:

IP地址192.168.1.100,同时匹配子网192.168.1.0/255.255.255.0和子网192.168.1.64/255.255.255.192,

但对于子网192.168.1.64/255.255.255.192,匹配位数达到26位,多于子网192.168.1.0/255.255.255.0的24位,

因此192.168.1.100最大前缀匹配子网是192.168.1.64/255.255.255.192。

 

请编程实现上述最大前缀匹配算法。

要求实现函数: 
void max_prefix_match(const char *ip_addr, const char *net_addr_array[], int*n)

【输入】ip_addr:IP地址字符串,严格保证是合法IPv4地址形式的字符串

       net_addr_array:子网地址列表,每一个字符串代表一个子网,包括子网地址和掩码,

                       表现形式如上述,子网地址和子网掩码用’/’分开,严格保证是

                       合法形式的字符串;如果读到空字符串,表示子网地址列表结束

【输出】n:最大前缀匹配子网在*net_addr_array[]数组中对应的下标值。如果没有匹配返回-1

示例 
输入:

ip_addr= "192.168.1.100"

net_addr_array[]=

{

"192.168.1.128/255.255.255.192",

"192.168.1.0/255.255.255.0",

"192.168.1.64/255.255.255.192",

"0.0.0.0/0.0.0.0",

""

}

输出:n = 2

 

  1 void make_prefix_match(const char *ip_addr,const char *net_addr_array[],int *n)  2 {  3     int iArrayIndex=0;  4     *n=-1;  5     const char *p=net_addr_array[iArrayIndex];  6     int iMaxLength=-1;  7     int number=0;  8   9     int iIpAddress[4]; 10     int iIpIndex=0; 11     int iIpLen=strlen(ip_addr); 12     int i; 13     for (i=0;i<iIpLen;i++) 14     { 15         if (ip_addr[i]>='0' && ip_addr[i]<='9') 16         { 17             number=number*10+(ip_addr[i]-'0'); 18         } 19         else if (ip_addr[i]=='.') 20         { 21             iIpAddress[iIpIndex++]=number; 22             number=0; 23                  24         } 25         else 26         { 27             return; 28         } 29  30     } 31     iIpAddress[iIpIndex]=number; 32  33     int iNetMask[4]; 34     int iNet[4]; 35      36  37     while(*p!='\0') 38     { 39         number=0; 40         int iNetMaskIndex=0,iNetIndex=0; 41         int iNetLen=strlen(p); 42         for (i=0;;i++) 43         { 44             if (p[i]>='0' && p[i]<='9') 45             { 46                 number=number*10+(p[i]-'0'); 47             } 48             else if (p[i]=='.') 49             { 50                 iNet[iNetIndex++]=number; 51                 number=0; 52             } 53             else if (p[i]=='/') 54             { 55                 iNet[iNetIndex]=number; 56                 number=0; 57                 break; 58             } 59             else 60             { 61                 return; 62             } 63         } 64          65         for (++i;i<iNetLen;i++) 66         { 67             if (p[i]>='0' && p[i]<='9') 68             { 69                 number=number*10+(p[i]-'0'); 70             } 71             else if (p[i]=='.') 72             { 73                 iNetMask[iNetMaskIndex++]=number; 74                 number=0; 75             } 76             else 77             { 78                 return; 79             } 80         } 81         iNetMask[iNetMaskIndex]=number; 82  83         for (i=0;i<4;i++) 84         { 85             if ((iIpAddress[i]&iNetMask[i])!=iNet[i]) 86             { 87                 break; 88             } 89         } 90  91         if (i==4) 92         { 93             int iCurrentlen=0; 94             for (int k=3;k>=0;k--) 95             { 96                 if (iNet[k]!=0) 97                 { 98                     iCurrentlen=k*8; 99                     bitset<32> b=iNet[k];100                     int j;101                     for (j=0;j<32;j++)102                     {103                         if (b[j]==1)104                         {105                             break;106                         }107                     }108                     iCurrentlen+=(8-j);109                     break;110                 }111             }112             if (iCurrentlen>iMaxLength)113             {114                 iMaxLength=iCurrentlen;115                 *n=iMaxLength;116             }117         }118 119 120         ++iArrayIndex;121         p=net_addr_array[iArrayIndex];122 123     }124 125 }

 

9、

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
 
要求实现函数: 
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
 
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
 
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
 
示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”
 
 1 void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr) 2 { 3     assert(pInputStr!=NULL && pOutputStr!=NULL && lInputLen>0); 4      5     bool bFlag[26]={false}; 6     long j=0; 7     for (long i=0;i<lInputLen;i++) 8     { 9         if (bFlag[pInputStr[i]-'a']==false)10         {11             bFlag[pInputStr[i]-'a']=true;12             pOutputStr[j++]=pInputStr[i];13         }14     }15     pOutputStr[j]='\0';16 }

 

10、

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“cccddecc”   输出:“3c2de2c”
输入:“adef”     输出:“adef”
输入:“pppppppp” 输出:“8p”
 1 void stringZip(const char *pInputStr,long lInputLen,char *pOutputStr) 2 { 3     assert(pInputStr!=NULL && pOutputStr!=NULL && lInputLen>0); 4      5     long iRepeat=1; 6     long k=0; 7     for (long i=0;i<lInputLen;i++) 8     { 9         if (i+1<lInputLen && pInputStr[i]==pInputStr[i+1])10         {11             iRepeat++;12         }13         else14         {15             if (iRepeat!=1)16             {17                 char cTemp[100];18                 itoa(iRepeat,cTemp,10);19                 long j=0;20                 while(cTemp[j])21                 {22                     pOutputStr[k++]=cTemp[j++];23                 }24             }25             pOutputStr[k++]=pInputStr[i];26             iRepeat=1;27         }28     }29 30     pOutputStr[k]='\0';31 }

 

11、

通过键盘输入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         else19         {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         else35         {36             return;37         }38     }39 40     for (++i;i<lInputLen;i++)41     {42         if (pInputStr[i]>='0' && pInputStr[i]<='9')43         {44             iOperand2=iOperand2*10+(pInputStr[i]-'0');45         }46         else47         {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 }

 

 

12、手机号码合法性判断(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<iLen;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 }

 

13、将一个字符串的元音字母复制到另一个字符串,并排序(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<iLen;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<iSmallCount;j++)30     {31         pOutput[k++]=pSmall[j];32     }33     for (j=0;j<iLargeCount;j++)34     {35         pOutput[k++]=pLarge[j];36     }37 38     pOutput[k]='\0';39 40     delete []pSmall;41     delete []pLarge;42 }

 

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

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;

  1 int verifyIDCard(char *input)  2 {  3     assert(input!=NULL);  4   5     int iLen=strlen(input);  6     if (iLen!=18)  7     {  8         return 1;  9     } 10      11     int i; 12     for (i=0;i<17;i++) 13     { 14         if (input[i]<'0' || input[i]>'9') 15         { 16             return 2; 17         } 18     } 19  20     if ((input[17]<'0' || input[17]>'9') && input[17]!='x') 21     { 22         return 3; 23     } 24  25     int iYear=0; 26     for (i=6;i<10;i++) 27     { 28         iYear=iYear*10+(input[i]-'0'); 29     } 30     if (iYear<1900 || iYear>2100) 31     { 32         return 4; 33     } 34  35     int iMonth=0; 36     for (i=10;i<12;i++) 37     { 38         iMonth=iMonth*10+(input[i]-'0'); 39     } 40     if (iMonth<1 || iMonth>12) 41     { 42         return 5; 43     } 44      45     int iDay=0; 46     for (i=12;i<14;i++) 47     { 48         iDay=iDay*10+(input[i]-'0'); 49     } 50  51     if ((iYear%4==0) || (iYear%100!=0 && iYear%400==0)) 52     { 53         if (iMonth==2) 54         { 55             if (iDay<1 || iDay>29) 56             { 57                 return 6; 58             } 59         } 60         else if (iMonth==1 || iMonth==3 || iMonth==5 || iMonth==7 || iMonth==8 ||iMonth==10 || iMonth==12) 61         { 62             if (iDay<1 || iDay>31) 63             { 64                 return 6; 65             } 66         } 67         else 68         { 69             if (iDay<1 || iDay>30) 70             { 71                 return 6; 72             } 73         } 74     } 75     else 76     { 77          78         if (iMonth==2) 79         { 80             if (iDay<1 || iDay>28) 81             { 82                 return 6; 83             } 84         } 85         else if (iMonth==1 || iMonth==3 || iMonth==5 || iMonth==7 || iMonth==8 ||iMonth==10 || iMonth==12) 86         { 87             if (iDay<1 || iDay>31) 88             { 89                 return 6; 90             } 91         } 92         else 93         { 94             if (iDay<1 || iDay>30) 95             { 96                 return 6; 97             } 98         } 99     }100 101     return 0;102 103 }

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
彻底搞定C指针---指向指针的指针
二维数组作为形参的参数传递问题[08-0704]_Embedded Resources L...
c++知识 - 洋男的日志 - 网易博客
指针数组,排序,创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中
函数
字符串中查找字符(yc)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服