计算机二级C语言上机题型总结一)“******”问题1、将字符串中的前导*号全部删除,中间和后面的*号不删除。voidfun(char*a){char*p=a;while(*p==’*’)p++;for(;*p!=’\0’;p++,a++)*a=*p;*a=’\0’;}2、只删中间*inti;for(i=0;a[i]==’*’;i++)for(;hp;h++)if(*h!=’*’)a[i++]=*h;for(;*p;p++)a[i++]=*p;a[i]=’\0’;3、只删尾*while(*a!=’\0’)a++;a--;while(*a==’*’)a--;*(a+1)=’\0’;4、只留前*inti,j=0;for(i=0;a=’*’;i++);j=i;for(;a;i++)if(a!=’*’)a[j++]=a[i];a[j]=’\0’;5、只留中间*inti,j=0;for(i=h;in-e;i++)a[j++]=a[i];a[j]=’\0’;6、只留尾*char*t=a;for(;t=p;t++)if(*t!=’*’)*(a++)=*t;for(;t!=’\0’;t++)*(a++)=*t;*a=’\0’;7、*个数n个,删多余的*;*个数=n个,不做任何处理。inti=0,k=0;char*p,*t;p=t=a;while(*t==’*’){k++;t++;}if(kn){while(*p){a[i]=*(p+k-n);i++;p++}a[i]=’\0’;}(二)移动问题1、若一维数组中有n个整数,要求把下标从p到n-1(p=n-1)的元素平移到数组前面。inti,j,t;for(i=p;i=n-1;i++){t=w[n-1];for(j=n-2;j=0;j--)w[j+1]=w[j];w[0]=t;}2、把下标从0到p(p=n-1)的元素平移到数组最后。inti,j,t;for(i=0;i=p;i++){t=w[0];for(j=1;jn;j++)w[j-1]=w[j];w[j-1]=t;}3、把字符串str中的字符向前移动,原来第1个字符放串尾,结果仍保存在原串中。ch=str[0];for(i=0;str[i+1];i++)str[i]=str[i+1];str[i]=ch;4、移动字符串中的内容,把第1到第m个字符平移到串后,把第m+1到后移到前。voidfun(char*w,intm){inti,j;chart;for(i=1,i=m;i++){t=w[0];for(j=1;w[j]!=’\0’;j++)w[j-1]=w[j];w[j-1]=t;}}(三)排序法1、冒泡法for(i=1;in;i++)for(j=0;jn-1;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}2、选择法for(i=0;in-1;i++){p=i;for(j=i+1;jn;j++)if(a[p]a[j])p=j;if(p!=i)t=a[i];a[i]=a[p];a[p]=t;}3、插入法for(i=1;in;i++){t=a[i];for(j=i-1;a[j]t&&j=0;j--)a[j+1]=a[j];a[j+1]=t;}(四)Fibonacci问题1、求Fibonacci数列中小于t的最大的一个数,结果由函数返回。intfun(intt){inta=1,b=1,c=0,i;do{c=a+b;a=b;b=c;}while(ct);c=a;returnc;}2、用递归算法计算数列中第n项的值。longfun(intg){swich(g){case0:return0;switch(g)case1:case2:return1;}return(fun(g-1)+fun(g-2));}(五)素数问题1、将大于整数m且紧靠m的k个非素数存入所指的数组中。voidfun(intm,intk,intxx[]){inti,j,n;for(i=m+1,n=0;nk;i++)for(j=2;ji;j++)if(i%j==0){xx[n++]=i;break;}}2、小于或等于lim的所有素数放在aa数组中,该函数返回所求出的素数个数。intfun(intlim,intaa[MAX]){inti,j,k=0;for(i=2;i=lim;i++){for(j=2;ji;j++)if(i%j==0)break;if(j=i)aa[k++]=i;}returnk;}3、将所有大于1小于整数m的非素数存入xx数组中,个数通过k传回。voidfun(intm,int*k,intxx[]){inti,j,n=0;for(i=4;im;i++){for(j=2;ji;j++)if(i%j==0)break;if(ji)xx[n++]=i;}*k=n;}或{inti,j,t,n=0;for(i=2;im;i++){t=1;for(j=2;ji;j++)if(i%j==0){t=0;break;}if(t==1)xx[n++]=I;}*k=n;}(六)删除相同数intfun(inta[],intn){inti,j=1;for(i=1;in;i++)if(a[j-1]!=a[i])a[j++]=a[i];returnj;}或{inti,t,j=0;t=a[0];for(i=1;in;i++)if(t==a[i]);else{a[j++]=t;t=a[i];}a[j++]=t;returnj;}(七)统计字符个数,单词个数。1、按‘0’到‘9’统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。voidfun(char*tt,intnum[]){inti,j;intbb[10];char*p=tt;for(i=0;i10;i++){num[i]=0;bb[i]=0;}while(*p){if(*p=’0’&&*p=’9’)bb[*p-‘0’]++;p++;}for(i=1,j=0;i10;i=i+2,j++)num[j]==bb[i];}2、str全部由小写字母和空格字符组成的字符串,num传入字符串长度。统计单词个数。voidfun(char*s,int*num){intI,n=0;for(i=0;i*num;i++){if(s[i]=’a’&&ss[i]=’z’&&(s[i+1]==’’||s[i+1]==’0’))n++;}*num=n;}3、从’a’到’z’统计一个字符串中所有字母字符各自出现的次数,结果存在数组alf中。voidfun(char*tt,intalf[]){inti;char*p=tt;for(i=0;i26;i++)alf[i]=0;while(*p){if(*p=’A’&&*p=’Z’)*p+=32;if(*p=’a’&&*p=’z’)alf[*p-‘a’]++;p++;}}4、str字符序列由字符0和1组成。查找0字符连续出现的最长长度,若有几个0字符长度相同,只记录最后1个0字符串相关信息,通过m和k返回最长0字符长度和其下标。voidfun(char*str,int*m,int*k){inti,j=0;intbb[N];char*p=str;*m=0;*k=0;for(i=0;iN;i++)bb[i]=0;i=0;while(*(p+i)){if(*(p+i)==’0’){bb[j]++;i++;}else{j++;i++;}if(*m=bb[j]){*m=bb[j];*k=i-1;}}}5、统计在tt字符串中”a”到”z”26个字母各自出现的次数,并依次放在pp所指数组中。voidfun(char*tt,intpp[]){inti;for(i=0;i26;i++)pp[i]=0;for(;*tt!=’\0’;tt++)if(;*tt=’a’&&*tt=’z’)pp[*tt-’a’]++;}6、统计一个长度为n的字符串在另一个字符串中出现的次数。intfun(char*str,char*substr){intn;char*p,*r;n=0;while(*str){p=str;r=substr;while(*r)if(*r==*p){r++;p++;}elsebreak;if(*r==’\0’)n++;str++;}returnn;}7、求出ss所指字符串中指定字符的个数,并返回此值。intfun(char*ss,charc){inti=0;for(;*ss!=’\0’;ss++)if(*ss==c)i++;returni;}8、统计一个长度为2的字符串在另一个字符串中出现的次数。intfun(char*str,char*substr){inti,j=0;for(i=0;str[i+1]!=’\0’;i++)if(str[i]==substr[0]&&str[i+1]==substr[1])j++;returnj;}(八)进制转换1、把str字符串转换成任意进制的数。x:原进制;y:要转换成的进制。intfun(char*str,intx,inty){intsum;inti=0;char*p=str;for(i=0;iN;i++)xx[i]=0;sum=*p-‘\0’;p++;while(*p){sum=sum*x+*p-‘0’;p++;}i=0;while(sum!=0){xx[i]=sum%y;sum=sum/y;i++;}returni;}注:(1)将x转换成10进制:sum=sum*x+*p-‘0’;(2)将10进制转换成y:sum%y得到y进制数的最低位。sum/y得到y进制数的次低位。2、str字符串由‘0’和‘1’组成。转换成十进制数。intfun(char*str){intn;char*p=str;n=*p-‘0’;p++;while(*p){n=n*2+*p-‘0’;p++;}returnn;}(九)比较字符串长度1、比较两个字符串的长度,函数返回较短的字符串。char*fun(char*s,char*t){inti,j;for(i=0;s[i]!=’\0’;i++);for(j=0;t[j]!=’\0’;j++);if(i=j)returns;elsereturnt;}2、从传入的num个字符中找出最长的一个字符串,通过形参指针max传回该串地址。fun(char(*a)[81],intnum,char*max){inti=0;max=a[0];for(i=0;inum;i++)if(strlen(max)strlen(a[i]))max=a[i];returnmax;}(十)最大公约数,最小公倍数1、intfun(inta,intb){intr,t;if(ab){t=a;a=b;b=t;}r=a%b;while(r!=0){a=b;b=r;r=a%b}return(b);}2、输入两整数m和n,求最大公约数,最小公倍数。while(b!=0){t=a%b;a=b;b=t;}printf(“%d”,”%d”,a,n*m/a);注:(1)最大公约数:若b/a的非零余数能整除a。(2)最小公倍数:两数乘积除以最大公约数。