华为机试题及答案1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。
请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。
测试:输入:“abc def gh i d”输出:“abc,def,gh,i,d,”#include<stdio.h>#include<string.h>void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr){int i=0,j=0;int flag=0;while(pInputStr[i]==' '){i++;}for(;i<lInputLen;i++){if(pInputStr[i]==' '){flag=1;continue;}if(flag==1){flag=0;pOutputStr[j++]=',';}pOutputStr[j++]=pInputStr[i];}pOutputStr[j++]=',';pOutputStr[j]='\0';}int main(){char test[40];char re[40];gets(test);DivideString(test, strlen(test), re);printf("%s",re);return 0;}2、将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。
例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
测试:输入:char*input="abbbcd" 输出:char*output="bcdcde"#include<stdio.h>#include<string.h>void convert(char *input,char* output){int i;for(i=0;i<strlen(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';}int main(){char in[20]={"asdfzzxzxz"};char on[20];//gets(in);convert(in,on);printf("%s",on);return 0;}3、通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
测试:输入:“afafafaf” 输出:“af”#include<stdio.h>#include<string.h>void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr){int i,j,count;int k=0;for(i=0;i<strlen(pInputStr);i++){count=0;for(j=0;j<strlen(pOutputStr);j++){if(pInputStr[i]==pOutputStr[j]){count++;}}if(count==0){pOutputStr[k++]=pInputStr[i];}}pOutputStr[k]='\0';}int main(){char in[20]={"aabbccabacddsads"};char on[20];//gets(in);stringFilter(in,strlen(in),on);printf("%s",on);return 0;}4、通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
测试:输入:“cccddecc” 输出:“3c2de2c”#include<stdio.h>#include<string.h>void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {int i,j=0,num=0;int k=0;for(i=0;i<=lInputLen;i++){if(i&&pInputStr[i]!=pInputStr[i-1]){if(num>1){pOutputStr[j++]=(char)num+'0';}pOutputStr[j++]=pInputStr[i-1];num=1;}else{num++;}}pOutputStr[j]='\0';}int main(){char in[20]={"ccddecc"};char on[20];//gets(in);stringZip(in,strlen(in),on);printf("%s",on);return 0;}5、通过键盘输入100以正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。
测试:输入:“4 - 7” 输出:“-3”#include<stdio.h>#include<string.h>#include<math.h>void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr) {int i,count=0,re=0;int x,y,z;int num[2]={0};char op;for(i=0;i<lInputLen;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;z<lInputLen;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);}int main(){char in[20];char on[20];gets(in);arithmetic(in,strlen(in),on);printf("%s",on);return 0;}6、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n 表示评委总数。
打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。
如果没有大众评委,则总分 = 专家评委平均分,总分取整。
函数最终返回选手得分。
#include<stdio.h>#include<string.h>#include<math.h>int cal_score(int score[], int judge_type[], int n){int i=0,gscore;int pro=0,pub=0;int pro_count=0,pub_count=0;for(i=0;i<n;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;}return gscore;}int main(){int score[5]={90,80,95,86,87};int judge_type[5]={1,2,2,1,1};int n=5;printf("%d",cal_score(score, judge_type, n));return 0;}7、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。