华为机试题及答案1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。测试:输入:“abcdefghid”输出:“abc,def,gh,i,d,”#includestdio.h#includestring.hvoidDivideString(constchar*pInputStr,longlInputLen,char*pOutputStr){inti=0,j=0;intflag=0;while(pInputStr[i]==''){i++;}for(;ilInputLen;i++){if(pInputStr[i]==''){flag=1;continue;}if(flag==1){flag=0;pOutputStr[j++]=',';}pOutputStr[j++]=pInputStr[i];}pOutputStr[j++]=',';pOutputStr[j]='\0';}intmain(){chartest[40];charre[40];gets(test);DivideString(test,strlen(test),re);printf(%s,re);return0;}2、将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a-b,b-c,…,y-z,z-a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa转换为bc,zz转换为ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。测试:输入:char*input=abbbcd输出:char*output=bcdcde#includestdio.h#includestring.hvoidconvert(char*input,char*output){inti;for(i=0;istrlen(input);i++){if(i==0){output[i]=input[i]+1;if(output[i]==123){output[i]=97;}}else{if(input[i]!=input[i-1]){output[i]=input[i]+1;if(output[i]==123){output[i]=97;}}else{output[i]=input[i]+2;if(output[i]==123){output[i]=97;}if(output[i]==124){output[i]=98;}}}}output[i+1]='\0';}intmain(){charin[20]={asdfzzxzxz};charon[20];//gets(in);convert(in,on);printf(%s,on);return0;}3、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。测试:输入:“afafafaf”输出:“af”#includestdio.h#includestring.hvoidstringFilter(constchar*pInputStr,longlInputLen,char*pOutputStr){inti,j,count;intk=0;for(i=0;istrlen(pInputStr);i++){count=0;for(j=0;jstrlen(pOutputStr);j++){if(pInputStr[i]==pOutputStr[j]){count++;}}if(count==0){pOutputStr[k++]=pInputStr[i];}}pOutputStr[k]='\0';}intmain(){charin[20]={aabbccabacddsads};charon[20];//gets(in);stringFilter(in,strlen(in),on);printf(%s,on);return0;}4、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。测试:输入:“cccddecc”输出:“3c2de2c”#includestdio.h#includestring.hvoidstringZip(constchar*pInputStr,longlInputLen,char*pOutputStr){inti,j=0,num=0;intk=0;for(i=0;i=lInputLen;i++){if(i&&pInputStr[i]!=pInputStr[i-1]){if(num1){pOutputStr[j++]=(char)num+'0';}pOutputStr[j++]=pInputStr[i-1];num=1;}else{num++;}}pOutputStr[j]='\0';}intmain(){charin[20]={ccddecc};charon[20];//gets(in);stringZip(in,strlen(in),on);printf(%s,on);return0;}5、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。输入字符串的格式为:“操作数1运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。测试:输入:“4-7”输出:“-3”#includestdio.h#includestring.h#includemath.hvoidarithmetic(constchar*pInputStr,longlInputLen,char*pOutputStr){inti,count=0,re=0;intx,y,z;intnum[2]={0};charop;for(i=0;ilInputLen;i++){if(pInputStr[i]==''){count++;}}if(count!=2){pOutputStr[0]='0';pOutputStr[1]='\0';return;}for(x=0;pInputStr[x]!='';x++){if(pInputStr[x]='0'&&pInputStr[x]='9'){num[0]=num[0]*10+pInputStr[x]-'0';}else{pOutputStr[0]='0';pOutputStr[1]='\0';return;}}for(y=x+1;pInputStr[y]!='';y++){}if(y-x-1!=1){pOutputStr[0]='0';pOutputStr[1]='\0';return;}else{if(pInputStr[y-1]!='+'&&pInputStr[y-1]!='-'){pOutputStr[0]='0';pOutputStr[1]='\0';return;}else{op=pInputStr[y-1];}}for(z=y+1;zlInputLen;z++){if(pInputStr[z]='0'&&pInputStr[z]='9'){num[1]=num[1]*10+pInputStr[z]-'0';}else{pOutputStr[0]='0';pOutputStr[1]='\0';return;}}if(op=='+'){re=num[0]+num[1];}else{re=num[0]-num[1];}itoa(re,pOutputStr,10);}intmain(){charin[20];charon[20];gets(in);arithmetic(in,strlen(in),on);printf(%s,on);return0;}6、选秀节目打分,分为专家评委和大众评委,score[]数组里面存储每个评委打的分数,judge_type[]里存储与score[]数组对应的评委类别,judge_type[i]==1,表示专家评委,judge_type[i]==2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分=专家评委平均分*0.6+大众评委*0.4,总分取整。如果没有大众评委,则总分=专家评委平均分,总分取整。函数最终返回选手得分。#includestdio.h#includestring.h#includemath.hintcal_score(intscore[],intjudge_type[],intn){inti=0,gscore;intpro=0,pub=0;intpro_count=0,pub_count=0;for(i=0;in;i++){if(judge_type[i]==1){pro_count++;pro=pro+score[i];}if(judge_type[i]==2){pub_count++;pub=pub+score[i];}}if(pub_count!=0){gscore=pro/pro_count*0.6+pub/pub_count*0.4;}else{gscore=pro/pro_count;}returngscore;}intmain(){intscore[5]={90,80,95,86,87};intjudge_type[5]={1,2,2,1,1};intn=5;printf(%d,cal_score(score,judge_type,n));return0;}7、给定一个数组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}#includestdio.h#includestring.h#includemath.hvoidsort(intinput[],intn,intoutput[]){inti,j,k,a;inttemp;for(i=0;in;i++){for(j=0;jn-i-1;j++){if(input[j]input[j+1]){temp=input[j+1];input[j+1]=input[j];input[j]=temp;}}}k=1;a=1;output[n/2]=input[0];while(kn){output[n/2-a]=input[k++];a++;output[n/2+a-1]=input[k++];}}intmain(){intinput[5]={99,80,95,86,87};intoutput[5];intn=5,i;sort(input,n,output);for(i=0;in;i++){printf(%d,output[i]);}return0;}8、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级50,用户任务的优先级=50且=255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[]中的任务按照系统任务、用户任务依次存放到system_task[]数组和user_task[]数组中(数组中元素的值是任务在task[]数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面),数组元素为