C语言上机考试练习题(1)说明:我们已经学习完成了基本数据类型、基本控制语句,以及数组、函数这些知识了,请同学们看看附件中的这些题目是否能够快速编写出来?可能有个别题目与过去的练习有些重复,请尽量不要去参考过去的答案。如果现在编写起来困难还很多,那你就要加倍努力了。1、编写一个程序,判定一个字符串是否是另一个字符串的子串,若是,返回子串在主串中的位置。要求:(1)在主函数中输入两个字符串,调用子函数cmpsubstr()判断,并在主函数输出结果。(2)子函数的返回值为-1表示未找到,否则返回子串的位置(起始下标)。#includestdio.h#includestring.hvoidmain(){intcmpsubstr(char*s1,char*s2);charstr1[20],str2[50];char*s1=str1,*s2=str2;gets(str1);gets(str2);printf(%d,cmpsubstr(s1,s2));}intcmpsubstr(char*s1,char*s2){inti,d,a=0,situation=0;d=strlen(s1);for(i=0;*(s2+i)!='\0';i++){if(*(s1+a)==*(s2+i)){a++;if(a==d){situation=1;break;}}else{a=0;}}if(situation==0)return(-1);elsereturn(i-d+2);}2、输入一个字符串,内有数字和非数字字符,如:a123x45617960?302tab5876,将其中连续的数字作为一个整数,依次存放到数组a中。例如,123放在a[0]中,456放在a[1]中等等,统计共有多少个整数,并输出这些整数。要求:(1)在主函数中输入字符串,并输出结果。调用子程序处理字符串。(2)子函数的返回值为整数的个数。#includestdio.h#includestring.hvoidmain(){intsearch(char*str,int*sum);charstr[100];intd,sum[20],i;gets(str);d=search(str,sum);for(i=0;id;i++)printf(%d\n,*(sum+i));}search(char*str,int*sum){inti,t=0,a=0;for(i=0;*(str+i)!='\0';i++){if(*(str+i)='0'&&*(str+i)='9'){if(a==0){*(sum+t)=(int)(*(str+i)-'0');a++;}else{*(sum+t)=*(sum+t)*10+(int)(*(str+i)-'0');}}elseif(*(str+i-1)='0'&&*(str+i-1)='9'){t++;a=0;}}if(*(str+i-1)='0'&&*(str+i-1)='9')return(t+1);elsereturn(t);}3、编写一个主函数和子函数tran(x,r),要求是:函数tran(x,r)将十进制整数x转换成r进制数y(r在2-16之间),x和r的值由主调函数(即主函数)传入,y的值需要返回主调函数进行输出。要求:y的值利用字符数组进行存储,数组的每一个元素存放y的一位数字字符。#includestdio.h#includestring.h#includemalloc.h#includemath.hvoidmain(){char*tran(intx,intr);intx,r;char*y;printf(Pleaseinputx&r=\n);scanf(%d,%d,&x,&r);y=tran(x,r);puts(y);}char*tran(intx,intr){intlen1,len2,i,t;char*y1,*y2;len1=2+(int)log((double)x)/log((double)r);y1=(char*)malloc(len1*sizeof(char));for(i=0;x!=0;i++){t=x%r;if(t10)*(y1+i)=(char)(t+48);else*(y1+i)=(char)(t+87);x=(int)x/r;}*(y1+i)='\0';len2=strlen(y1);y2=(char*)malloc(len2*sizeof(char));for(i=0;ilen2;i++){*(y2+i)=*(y1+len2-i-1);}*(y2+i)='\0';return(y2);}4、编写一个主函数和函数tran(x),要求是:(1)函数tran(x)产生支付指定金额x(如234.78元)的各种面额人民币的数量(注意:尽量支付大面额的人民币),要求按100元、50元、10元、1元、5角、1角、5分、1分八种面额进行统计,产生的结果存放在数组中返回主函数。(2)在主函数中输入一金额,并以该金额调用tran函数,并输出该函数返回的统计结果。5、编写程序实现将键盘输入的一行字符按单词倒排输出。如键盘输入“Iloveyou”,屏幕显示“youloveI”。要求:(1)编写一个函数intinvertion(charch1[],charch2[])实现按单词倒排字符串,第一个形参ch1接受实参传过来的原字符串,倒排后的新字符串通过第二个形参返回主函数,函数中还需要统计该字符串中共有多少个单词,函数最后返回字符串中包含的单词个数。(2)主函数中输入字符串,调用子函数invertion,输出倒排后的字符串及字符串中包含的单词个数。#includestdio.h#includestring.h#includemath.h#includemalloc.hvoidmain(){intinvertion(charch1[],charch2[]);intlen;char*ch1,*ch2;ch1=(char*)malloc(100);ch2=(char*)malloc(100);gets(ch1);len=invertion(ch1,ch2);puts(ch2);printf(%d\n,len);}intinvertion(charch1[],charch2[]){inti,j,t=0,len1,len,sum=0;char*str;str=(char*)malloc(10);for(i=0,len=0;*(ch1+i)!='\0';i++,len++);len1=len;for(i=0;*(ch1+i)!='\0';i++){if(*(ch1+i)!=''){*(str+t)=*(ch1+i);//将ch1的单词转移到str上//t++;}else{sum++;//单词个数加一//*(ch2+len1)='';len1=len1-t;for(j=0;jt;j++)*(ch2+j+len1)=*(str+j);//将str转移到ch2上//t=0;len1--;}}sum++;//最后一个单词转移到ch2上//*(ch2+len1)='';len1=len1-t;for(j=0;jt;j++)*(ch2+j+len1)=*(str+j);*(ch2+len)='\0';return(sum);}6、编写一个主函数以及一个函数maxlong(str)。要求是:(1)函数maxlong(str)找出字符串str中包含的第一个最长单词(用字符数组进行存储),并返回主调函数。(2)在主函数中输入一个字符串,假定输入字符串中只含字母和空格,空格用来分割不同单词;以该字符串作为参数调用maxlong函数,并输出返回的结果。#includestdio.h#includestring.h#includemath.h#includemalloc.hvoidmain(){char*maxlong(char*str);charstr[100],*str0;gets(str);str0=maxlong(str);puts(str0);}char*maxlong(char*str){char*word,*str0;intt=0,i,max=0;for(i=0;*(str+i)!='\0';i++){if(*(str+i)!='')t++;//t为单词字母个数//else{if(tmax)//比较t与之前最大的单词个数的大小//{word=(str+i-t);max=t;}t=0;//t初始化//}}if(tmax)//最后一个单词在循环中没有比较//{word=(str+i-t);max=t;}str0=(char*)malloc(max+1);for(i=0;imax;i++){*(str0+i)=*(word+i);//将最大的单词赋给str0//}*(str0+i)='\0';return(str0);}7、编写一个函数ad(a,m,n)找出一个m行n列的二维数组a中的“鞍点”;在主函数中输入二维数组的值(假设数组中任意两个数都不相等),并将它作为实参调用ad函数。所谓“鞍点”是指该位置上的元素在该行上最大,在该列上最小;一个二维数组中可能没有鞍点。#includestdio.h#includemalloc.h#includestring.h#includetime.hvoidmain(){int**input(intm,intn);voidprint(int**p,intm,intn);intad(int**p,intm,intn);int**p,m,n;while(!ad(p,m,n)){printf(请输入行数:m,列数:n.\n);m=n=7;p=input(m,n);print(p,m,n);}}intad(int**p,intm,intn){inti,j,k,s,max,l,time=0;for(i=0;im;i++){for(j=0;jn;j++)//max为一行最大值//{if(j==0){max=*(*(p+i)+j);l=j;}else{if(max*(*(p+i)+j)){max=*(*(p+i)+j);l=j;}}}s=0;for(k=0;km;k++){if(max*(*(p+k)+l)){s=1;break;}}if(s==0){printf(NO.%drowNO.%dline:%d\n,i+1,l+1,*(*(p+i)+l));time++;}}return(time);}int**input(intm,intn)//建造一个m行,n列二维数组//{int**p;inti,j;p=(int**)malloc(m*sizeof(int*));for(i=0;im;i++){*(p+i)=(int*)malloc(n*sizeof(int));}srand(time(NULL));////for(i=0;im;i++){for(j=0;jn;j++){*(*(p+i)+j)=rand()%100;//给数组赋值//}}return(p);}voidprint(int**p,intm,intn){inti,j;for(i=0;im;i++){printf(第%d行为:\n,i+1);for(j=0;jn;j++)printf(%4d,*(*(p+i)+j));printf(\n);}}8、编写主函数和两个递归函数sum(a,n)、max(a,n)。要求是:(1)函数sum(a,n)求数组a中前n个元素之和,并返回求得的和值。(2)函数max(a,n)求数组a中前n个元素中的最大值,并返回求得的最大值。(3)主函数:输入任意10个正整数给数组,调用sum函数求数组中的10个元素之和,并输出求得的和值;调用max函数求数组中10个元素的最大值,并输出求得的最大值。#includestdio.h#includemal