华为上机题库整理.docx_第1页
华为上机题库整理.docx_第2页
华为上机题库整理.docx_第3页
华为上机题库整理.docx_第4页
华为上机题库整理.docx_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

以前上机考试编程工具为C/C+:VC 6.0;Java:eclipse,这次改成C/C+: VS2005(或VC6.0) Java:JDK1.7。由于本人以前学C语言花了一些功夫,相对Java用得上手些,备考时用的是C+;临考前一周接到通知,说是要用VS2005,于是下个软件再加上熟悉一下花了半天时间,手忙脚乱了一阵(建议最好用VS,毕竟有的程序在VC上能调通,在VS上可能运行不通过);2、以往的形式是给你个函数模块,函数名已写好,你只要往里面填代码就行了(华为提供的工程是将Main函数隐藏了的,所以自己不用再添加Main函数)例如: 1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array15=77,21,1,3,5, array23=1,3,5,从array14与array22比较开始,到array12与array0比较结束。这样得出它们不同的元素个数为0,若array16=77,21,1,3,5,7,那么他们不同的元素为3。函数原型为 int compare_array( int len1, int array1, int len2, int array2 );其中,len1与len2分别为数组array1和array2的长度,函数返回值为两个数组不同元素的个数。这次是随你发挥,可以写子函数,也可以只写个main函数(当然main函数是必不可少的)。先在编译环境(即VS2005或JDK1.7)上运行,调通后再复制到考试系统中,检查无误后,点击提交(不过每道题最多只能传五次);.3、以往满分是100分,第一题20分,第二题30分,第三题50分,且前两题为必做题,最后一题作为附加题;现在是满分320(有点像英语四六级改革一样,100分改成710分),第一题60分,第二题100分,第三题160分,且不分什么必做题、附加题,建议拿到题目后最好把题目都浏览一遍,不一定按顺序做,尽会做的先做;有几点需要特别注意:1、一定要按标准输入、输出来编程,且按照考试系统中规定的格式,否则即使从头到尾写的都对,系统将显示格式错误,无法得分;2、最好多试几组测试条例,否则得不全分(本人已经犯过此类失误,希望后人不要重蹈覆辙);3、不要写任何程序提示语句(包括自己人为添加的换行命令),否则该题自动判0分;此外,考试时有不清楚的就问在场的工作人员,不要一个人憋在那里不吭声,浪费的是自己宝贵的时间;个人觉得华为的员工还是挺热心的,我问了不少问题,他们都跟我详细解答的,在此感谢他们的热忱相助。1、删除子串删除子串只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。自己编的:#include #include #include int del_sub_str ( char *str, char *sub_str,char *result );int main (void) int count;char result100;char str100;char sub_str100;printf(Please insert your strings!n);gets(str);printf(Please insert your sub_strings!n);gets(sub_str); count=del_sub_str(str,sub_str,result);printf(The deleted strings are:n);puts(result);printf(The num is:%dn,count);return 0;int del_sub_str ( char *str, char *sub_str,char *result )int n;int count=0;char *p=str,*q=sub_str,*r=result;n=strlen(q);while(*p!=0 )if(strncmp(p,q,n)=0)count+;p+=n;else *r=*p;r+;p+;*r=0;return count;约瑟夫环约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。#include#includetypedef struct Node/ 声明新的类型名(struct)来代替原有的类型名(Node)int num;struct Node *next;LinkList;LinkList *creat(int n)LinkList *p,*q,*head; /定义了三个结构体int i=1; p=(LinkList *)malloc(sizeof(LinkList); p-num=i;head=p;for(i=2;inum=i;p-next=q; p=q; p-next=head; /*使链表尾指向链表头形成循环链表*/return head;void fun(LinkList *L,int k,int m)int i;LinkList *p,*s,*q;p=L;printf(出列顺序为:);for(i=1;inext;while(p-next!=p)for(i=1;inext;printf(%5d,p-num); s=p;q-next=p-next;p=p-next;free(s);printf(%5dn,p-num);int main()LinkList *L;int n, m,k;n=9;m=5;k=2;L=creat(n);fun(L,k,m);return 0;4、数组&回文数组#include #include void huiwen(char str)int i,len,k=1;len=strlen(str);for(i=0;ilen/2;i+)if(stri!=strlen-i-1) /str一般结尾处有0,所以需要-1k=0;break;if(k=0) printf(%s 不是一个回文数n,str);elseprintf(%s 是一个回文数n,str);void main() char str100 = 0; printf(Input a string:n); /*提示输入Input a string:*/scanf(%s, str); /*scan()函数输入一个字符串:*/huiwen(str);5.数组比较 问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组1,3,5和数组77,21,1,3,5按题述要求比较,不相等元素个数为0数组1,3,5和数组77,21,1,3,5,7按题述要求比较,不相等元素个数为3 要求实现函数:intarray_compare(intlen1,intarray1,intlen2,intarray2)【输入】 intlen1:输入被比较数组1的元素个数;intarray1:输入被比较数组1;intlen2:输入被比较数组2的元素个数;intarray2:输入被比较数组2;【输出】 无【返回】 不相等元素的个数,类型为int 示例1) 输入:intarray1=1,3,5,intlen1=3,intarray2=77,21,1,3,5,intlen2=5函数返回:02) 输入:intarray1=1,3,5,intlen1=3,intarray2=77,21,1,3,5,7,intlen2=6函数返回:#include#include#includeint array_compare(int len1, int array1, int len2, int array2)int count=0;for( ;len1=0&len2=0 ;len1-,len2-)if(array1len1-1=array2len2-1)count+;return count;int main()int result=0;int array1=1,3,5;int len1=3;int array2=77,12,1,3,5;int len2=5;result=array_compare( len1, array1, len2, array2); /result=array_compare( len1, array1, len2, array2);不能这样 / 函数形参中永远只是传得首地址,不能传数组 切记切记!printf(the result is %d, result);6、手机号码合法性判断(20分)l 问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:1、 长度13位;2、 以86的国家码打头;3、 手机号码的每一位都是数字。请实现手机号码合法性判断的函数要求:1) 如果手机号码合法,返回0;2) 如果手机号码长度不合法,返回13) 如果手机号码中包含非数字的字符,返回2;4) 如果手机号码不是以86打头的,返回3;【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。l 要求实现函数:int verifyMsisdn(char* inMsisdn)【输入】 char* inMsisdn,表示输入的手机号码字符串。【输出】 无【返回】 判断的结果,类型为int。l 示例输入: inMsisdn = “869123456789“输出: 无返回: 1输入: inMsisdn = “88139123456789“输出: 无返回: 3输入: inMsisdn = “86139123456789“输出: 无返回: 0#include#include#include#include#define LENGTH 13int verifyMsisdn(char *inMsisdn)char *pchar=NULL;assert(inMsisdn!=NULL);if(LENGTH=strlen(inMsisdn)if(8=*inMsisdn)&(*(inMsisdn+1)=6)while(*inMsisdn!=0)if(*inMsisdn=0)&(*inMsisdn=9) /判断字符串全为数字inMsisdn+;elsereturn 2 ; /return 会跳出被调用函数elsereturn 3;elsereturn 1;return 0;int main()char *pchar=NULL;unsigned char ichar=0;int result;switch(ichar)case 0:pchar=8612345363789;break;case 1:pchar=861111111111111;break;case 2:pchar=86s1234536366; break;default: break;result =verifyMsisdn(pchar);printf(result is %dn,result);7、合并字符串(指针)说明:编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。char str120=“Hello ”, str220=“World ”;答案:#include int main()char str120=“Hello ”, str220=“World ”;char *p=str1, *q=str2;while( *p ) p+;while( *q ) *p = *q;p+;q+; *p = 0;printf(“%sn”, str1);return 0;8、选秀节目打分分为专家评委和大众评委,score 数组里面存储每个评委打的分数,judge_type 里存储与 score 数组对应的评委类别,judge_typei = 1,表示专家评委,judge_typei = 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分*0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。函数接口 int cal_score(int score, int judge_type, int n)#include#include#include#include#define N 5int cal_score(int score, int judge_type, int n) int expert=0;int dazhong=0;int zongfen=0;int i;int number=0;for(i=0;iN;i+)if(judge_typei=1)expert=expert+scorei;number+;else dazhong=dazhong+scorei;if(number=N)zongfen=(int)(expert/N);elseexpert=(int)(expert/number);dazhong=(int)(dazhong/(N-number);zongfen=int(0.6*expert+0.4*dazhong);return zongfen;int main()int scoreN;int judge_typeN;int numberlast=0;int i;printf(please input the %d score:n,N);for(i=0;iN;i+)scanf(%d,&scorei);printf(please input the level(1:expert,2:dazhong)n);for(i=0;iN;i+)scanf(%d,&judge_typei);numberlast=cal_score(score,judge_type,N);printf(the last score is %dn,numberlast);return 0;9、数组排序如果数组长度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#include#include#includevoid sort(int input, int n, int output)int i,j;int k=1;int temp;int med;for(i=0;in-1;i+) /冒泡排序法for(j=0;jinputj+1)temp=inputj;inputj=inputj+1;inputj+1=temp;if(n%2!=0)for(i=0;in;i+)printf(%2d,inputi);printf(n);med=(n-1)/2; /数列是从0开始计数的,所以不是(n+1)/2outputmed=inputn-1; /数列是从0开始计数的for(i=1;i=med;i+)outputmed-i=inputn-1-k;outputmed+i=inputn-2-k;k=k+2;elsefor(i=0;in;i+)printf(%2d,inputi);printf(n);med=n/2;outputmed=inputn-1;for(i=1;i=med-1;i+)outputmed-i=inputn-1-k;outputmed+i=inputn-2-k;k=k+2;output0=input0;for(i=0;in;i+)printf(%2d,outputi);printf(n);int main()int a6=3,6,1,9,7,8;int b6=0;for(int i=0;i6;i+)printf(%2d,ai);printf(n);sort(a,6,b);return 0;10、子字符串的替换(C语言)描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:ABCDEFGHIJKLMNOPQgggUVWXYZ#include #include void str_replace(char *str_src,char *str_find,char *str_rpl);int main ()char str100=safasfgsdgvnaksf;char str_find=asf;char str_rpl=liuqh;str_replace(str,str_find,str_rpl);/puts(str);return 0;void str_replace(char *str_src,char *str_find,char *str_rpl)char temp100;int n=strlen(str_find);char *p;p=str_rpl;char *q=temp;while(*str_src)if(strncmp(str_src,str_find,n)=0)while(*p)*q=*p;q+;p+;p=str_rpl;str_src+=n-1;else*q=*str_src; q+;str_src+;*q=0;puts(temp);strcpy(str_src,temp); 求均分,去最高(低)分算分数的问题,去掉一个最高分一个最低分,求平均分1. #include 2. floatavescore(floatscore,intn)3. 4. floatmin=0;5. floatmax=0;6. intminindex=0;7. intmaxindex=0;8. floatsum=0;9. min=score0;10. for(inti=0;in;i+)11. if(scoreimin)12. 13. min=scorei;14. minindex=i;15. 16. scoreminindex=0; /最小值赋0值17. max=score0;18. for(i=0;imax)20. 21. max=scorei;22. maxindex=i;23. 24. scoremaxindex=0;/最大值赋0值25. for(i=0;in;i+)26. sum+=scorei;27. sum=sum/(n-2);28. returnsum;29. 30. voidmain()31. 32. floatscore6=70,80,90,98,87,86;33. floatlastscore;34. lastscore=avescore(score,6);35. printf(thelastscoreis:%5.2fn,lastscore);36. 37. 运行结果:the last score is :85.75字符串处理 问题描述:把一个字符串中的除大写字母、小写字母和数字字符之外的其他字符都去掉,输出新字符串。 要求实现函数: void my_string(char* input, char* output)#includevoid my_string(char* input,char*output);void main ()char str_in100;char str_out100;printf(Please insert your strings:n);gets(str_in);my_string(str_in,str_out);printf(The deleted strings are:n);puts(str_out); void my_string(char* input,char*output)while(*input)if(*input=a)|(*input=A)|(*input=0)*output=*input; output+;input+;*output=0;从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array15=77,21,1,3,5, array23=1,3,5,从array14与array22比较开始,到array12与array0比较结束。这样得出它们不同的元素个数为0,若array16=77,21,1,3,5,7,那么他们不同的元素为3。函数原型为 int compare_array( int len1, int array1, int len2, int array2 );其中,len1与len2分别为数组array1和array2的长度,函数返回值为两个数组不同元素的个数。#includeint compare_array(int len1,int array1,int len2,int array2)int i,t,small,num=0;/把两数组倒置for(i=0;ilen1/2;i+)t=array1i;array1i=array1len1-i-1;array1len1-i-1=t;for(i=0;ilen2/2;i+)t=array2i;array2i=array2len2-i-1;array2len2-i-1=t;/输出倒置后的两数组/*for(i=0;ilen1;i+)printf(%d ,array1i);printf(n);for(i=0;ilen2)small=len2;elsesmall=len1;num=small;for(i=0;ismall;i+)if(array1i=array2i)num-;printf(num=%dn,num);return num;void main()int array15=77,21,1,3,5,array23=1,3,5;int len1=5,len2=3;compare_array(len1,array1,len2,array2);17、编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。 char str120=“Hello ”, str220=“World ”;答案:#include int main() char str120=“Hello ”, str220=“World ”; char *p=str1, *q=str2; while( *p ) p+; while( *q ) *p = *q; p+; q+; *p = 0; printf(“%sn”, str1); return 0;操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 = 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, -11. #include 2. #include 3. #include 4. #include 5. 6. voidscheduler1(inttask,intn,intsystem_task,intuser_task)7. 8. inti;9. intj=0;10. int*p,*pp,*p_user,*pp_user;11. intindex=0;12. intcount,count2;13. intmin=0;14. intk=0;15. p=(int*)malloc(sizeof(int)*n);16. for(i=0;in;i+)17. pi=0;18. pp=(int*)malloc(sizeof(int)*n);19. for(i=0;in;i+)20. ppi=0;21. p_user=(int*)malloc(sizeof(int)*n);22. for(i=0;in;i+)23. p_useri=0;24. pp_user=(int*)malloc(sizeof(int)*n);25. for(i=0;in;i+)26. pp_useri=0;27. 28. for(i=0;in;i+)29. 30. if(taski50)31. 32. 33. system_taskj=taski;34. ppj=i;35. j+;36. 37. count=j;38. 39. 40. elseif(taski=255)41. 42. 43. 44. user_taskk=taski;45. pp_userk=i;46. k+;47. 48. count2=k;49. 50. elsetaski=taski;51. 52. 53. 54. for(i=0;icount;i+)55. printf(%3d,system_taski);56. printf(n);57. 58. 59. for(i=0;icount;i+)60. 61. min=system_task0;62. for(j=1;jcount;j+)63. 64. 65. if(system_taskjmin)66. 67. min=system_taskj;68. pi=j;69. 70. 71. 72. system_taskpi=51;73. 74. 75. ppcount=-1;76. for(i=0;icount;i+)77. printf(%3d,pppi);78. printf(%3dn,ppcount);79. 80. 81. /*/82. 83. for(i=0;icount2;i+)84. printf(%4d,user_taski);85. printf(n);86. 87. for(i=0;icount2;i+)88. 89. min=user_task0;90. for(j=1;jcount2;j+)91. 92. 93. if(user_taskjmin)94. 95. min=user_taskj;96. p_useri=j;97. 98. 99. 100. user_taskp_useri=256;101. 102. 103. pp_usercount2=-1;104. for(i=0;icount2;i+)105. printf(%4d,pp_userp_useri);106. printf(%3dn,pp_usercount2);107. 108. 109. 110. 111. 112. 113. intmain()114. 115. inttask9=0,30,155,1,80,300,170,40,99;116. intsystem_task9=0;117. intuser_task9=0;118. scheduler1(task,9,system_task,user_task);119. return0;120. 求一个正整数X的平方根Y,要求y在1到1000以内#includedouble JD=1.0E-13;double mysqrt(double x)if(xJD|(s*s-x)JD)q=s;s=p+(s-p)/2;elsep=s;s=s+(q-p)/2;return s;int main ()int a;printf(your num:n);scanf(%d,&a);printf(sqrt(%d)=%lfn,a,mysqrt(a);return 0;掷骰子游戏在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示:1) 9:无障碍2) 1:停掷一轮,即下轮所掷数字无效;3) 2:后退两步,如果已经到起点不再后退;4) 3:奖励前进一步如果在游戏过程中,已经走到地图终点,则游戏结束。根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步。 要求实现函数: void dice(int map_len, int* map, int* dice_val, int* output)【输入】 int map_len,地图数组的长度 int* map,地图数组,值表示障碍int* dice_val,5个骰子数的数组【输出】 int *output,玩家共前进了多少步【返回】 无注:玩家是从起始位置开始,即地图数组的第一位,骰子数只能是16 示例 1) 输入:map_len = 15, map = 9,1,9,9,9,2,9,9,9,9,9,9,9,9,9,dice_val = 1,2,1,3,1,返回:42) 输入:map_len = 16, map = 9,9,9,9,9,1,9,3,9,9,2,9,9,9,9,9,dice_val = 2,1,4,1,6,返回:15#include void dice(int map_len, int* map, int* dice_val, int* output);int main(void)i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论