考试时间:50分钟 考试方式:从下面的20题中随机抽取一题,再附加一题,共需完成2道题。附加题不事先给定 分值分配:第一题60分,第二题40分,共100分 考试时间:第十八周
编写函数long fun(long x),它的功能是:将长整型参数x中每一位上为偶数的数依次取出,构成一个新数返回。高位仍在高位,低位仍在低位。例如:下面程序运行时输入:124578902,程序输出:24802. #include<stdio.h> long fun(long x) { int n=10,m=0; while (x) { int t=x%10; if(t%2==0) { m+=t*n/10; n*=10; } x/=10; } return m; } void main() { long a,b; printf("Enter a number:"); scanf("%ld",&a); b=fun(a); printf("b=%ld\n",b); } 编写函数void fun(int k,int *p),功能是:将参数k(2≤k≤32767)所有的不相同质因子升序写入p所指的一维数组中,以-1作为所有质因子的结束标志。例如:下面程序运行时若输入200,输出:2 5;若输入27720,输出:2 3 5 7 11;若输入101,输出101。 #include<stdio.h> void fun(int k,int *p) { } void main() { int x,a[17]={0},i; do{ printf("Enter a number(2-32767):"); scanf("%d",&x); }while(x<2); fun(x,a); for(i=0;a[i]!=-1;i++) printf("%d ",a[i]); printf("\n"); } 编写函数void fun(int *x,int n),功能是:求出长度为n的数组x中的最大数与次最大数,并把最大数和a[0]对调,次最大数与a[1]对调,其余的数保持不变。下面程序运行时若输入:2 4 6 1 3 9 7 0 5 8,则输出:9 8 6 1 3 2 7 0 5 4。 #include<stdio.h> #define N 10 void fun(int *x,int n) { int i,j,k,temp; for(i = 0 ; i < 2 ; i ++) //利用选择排序进行两du次比较就行了,因为我们只需zhi改变前边两个数a[0],a[1]的值dao { k = i; for(j = i + 1 ; j < n ; j ++) if(*(x + k) < *(x + j)) //这句代码等同于 if(a[k] < a[j]) k = j; if(k != i) { temp = *(x+k);*(x+k) = *(x+i);*(x+i)=temp; } } } int main() { int a[N],i; for(i=0;i<N;i++) scanf("%d",a+i); fun(a,N); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; } 数组x中保存有n个整数, 编写函数int fun(int *x,int n,float *w),对数组x进行如下操作:从第0个元素起对每5个元素求一个平均埴,并将这些均值依次存放在w所指的数组中。函数返回平均值的个数。例如:若输入n为14,14个数据为:11 21 35 24 55 16 27 58 18 0 11 12 13 14,则只为前10个求均值,输出结果为:29.20 23.80 #include<stdio.h> int fun(int *x,int n,float *w) { int i,j,num,sum; num=n/5; for(i=0;i<=num;i++){ for(j=5*(i-1),sum=0;j<5*i;j++){ sum+=x[j]; } w[i-1]=sum/5.0; } return num; } main() {int a[30],i,n,m; float b[6]; printf("Input a number: "); scanf("%d ",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); m=fun(a,n,b); for(i=0;i<m;i++) printf("%0.2f ",b[i]); printf("\n"); } 编写函数int fun(int x,long int y),功能:计算满足表达式x0+x1+x2+…+xn<y的最大的n并作为函数返回值带回。例如,当x=2,y=1000时,程序输出8。 #include<stdio.h> #include<math.h> int fun(int x,long int y) { int i; long s=0; for(i=0;s<y;i++){ s+=pow(x,i); } return (i-2); } main() {int x;long y; scanf("%d%ld",&x,&y); printf("n=%d\n",fun(x,y)); } 编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字符数组,每行存放一个字符串。求出最长的字符串,复制到s所指的字符数组中,然后返回此最长字符串的长度。 #define N 30 #include<stdio.h> #include<string.h> int fun(char (*ss)[N],int m,char *s) { int i,j,k; s=ss[0]; for(i=0;i<m;i++){ if(strlen(s)<strlen(ss[i])){ s=ss[i]; } } j=strlen(s); printf("str=%s",s); return j; } int main() {char a[8][N],b[N]; int i,len; for(i=0;i<8;i++) gets(a[i]); len=fun(a,8,b); printf("len=%d,str=%s\n",len,b); } 编写函数int countw(char *str),统计字符串str中单词的个数。单词之间以空格,逗号,句号作分隔,数字也看做单词。单词之间可能不止一个分隔符。如输入: It’s 10:10 o’clock ,I am late.屏幕上输出"There are 6 words." #include<stdio.h> int countw(char *str) { char c; int i=0,num=0,word=0; while((c=str[i])!='\0'){ if(c==' '||c==','||c=='.'){ word=0; } else if(word==0){ word=1; num++; } i++; } return num; } main() {char s[200]; gets(s); printf("There are %d words.\n",countw(s)); } 编写函数void fun(char *str),功能:字符串str中单词以空格作分隔,如果单词之间不止一个空格,则删除多余的空格,使单词之间只保留一个空格。字符串开始的空格也只保留一个。例如,程序运行时若输入: It’s 10:10 o’clock , I am late. 输出: It’s 10:10 o’clock , I am late. #include<stdio.h> void fun(char *str) { int i,t; for(i=0;str[i]!='\0';i++) if(str[i]==' '&&str[i+1]==' ') { for(t=i+1;str[t]!='\0';t++) str[t]=str[t+1]; str[t+1]='\0'; i--; } } main() {char s[100]; puts("Enter a string:"); gets(s); fun(s); puts(s); } 函数void fun(int x,int k,int *p)的功能是:求出比x大的最初k(k<1000)个素数,放入p所指数组中。例如:程序运行时输入:10 10,输出:11 13 17 19 23 29 31 37 41 43 #include<math.h> #include<stdio.h> void fun(int x,int k,int *p) { int i,m=0,n=0; x=x+1; n=sqrt(x); while(m<k){ for(i=2;i<=n;i++){ if(x%i==0) break; else if(i>=n){ p[m]=x; m++; } } x++; } } int main() {int a,b,n[1000],i; scanf("%d%d",&a,&b); fun(a,b,n); for(i=0;i<b;i++) printf("%d ",n[i]); puts(""); } 编写函数int fun(int a,int b),在[a,b]范围内统计满足下面条件的数的个数。条件:该数是素数,且该数逆序后形成的数也是素数。例如,在[100,150]范围内101 107 113 131 149 满足条件,则下面程序运行时输入100 150,输出:num=5。 #include<math.h> #include<stdio.h> int fun(int a,int b) { int i,j,c,k=0,w,n,sum; double m,d; for(i=a;i<=b;i++){ m=sqrt(i); for(j=2;j<=m;j++) if(i%j==0) break; if(j>m){ for(w=i,sum=0;w>0;) { c=w%10; sum=10*sum+c; w=w/10; } d=sqrt(sum); for(n=2;n<=d;n++) if(sum%n==0) break; if(n>d){ k++; } } } return k; } int main() {int num,a,b; scanf("%d%d",&a,&b); num=fun(a,b); printf("num=%d\n",num); } 编写函数void fun(char s),功能:在s所指字符串中每两个字母之间加一个,其余字符保持不变。 例如,下面程序运行时,若输入:I had 123_book. 输出:I had 123_boo*k. #include<stdio.h> void fun(char *s) { int i,j,k,n; for(i=0;s[i]!=0;i++){ if(((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))&&((s[i+1]>='a'&&s[i+1]<='z')||(s[i+1]>='A'&&s[i+1]<='Z'))) { for(k=0,n=0;s[k]!='\0';k++) n++; for(j=n+1;j>i+1;j--) s[j]=s[j+1]; s[j]='*'; } } } int main() {char x[80]; gets(x); fun(x); puts(x); } 编写函数int fun(int k),功能:从5个红球, 6个白球,7个黑球中任意取出k(2≤k≤18)个球作为一组进行组合。在每组中,可以没有红球和白球,但必须要有黑球。不同组合的数目作为函数值返回。例如,若k为8时,正确的组合数是31;若k为2时,正确的组合数是3;或k为3时,正确的组合数是6 。 #include<stdio.h> int fun(int k) { int x,y,z,num=0; for(x=0;x<=5;x++) for(y=0;y<=6;y++) for(z=1;z<=7;z++) if(x+y+z==k) num++; return num; } int main() {int x,n; scanf("%d",&x); n=fun(x); printf("n=%d\n",n); } 编写函数void fun(char *str),功能:对形参str所指字符串中的字符按ASCII码升序排序。例如,下面程序运行时输入:The C Programming Language<回车> 输出: CLPTaaaeegggghimmnnorru #include <stdio.h> #include <string.h> void fun( char t[] ) { char c; int i, j; for( i = strlen( t )-1; i>0; i-- ) for( j = 0; j < i; j++ ) if( t[j] >t[ j + 1 ] ) { c = t[j]; t[j] = t[ j + 1 ]; t[j + 1 ] = c; } } int main() {char s[100]; gets(s); fun(s); puts(s); } 请编写函数void fun(int *a, int n, int y),它的功能是:把y值插入到有n个数的a数组中,a数组中的数已按由大到小的次序排好,y的值从键盘读入。 插入后,数组中的数仍然有序。对照下面三种情况运行程序: 插在最前 2) 插在最后 3) 插在中间 若输入数11, 输出 20 18 16 14 12 11 10 8 6 4 2 输入数1, 输出 20 18 16 14 12 10 8 6 4 2 1 输入数33, 输出 33 20 18 16 14 12 10 8 6 4 2 #include <stdio.h> void fun(int *a,int n,int y) { int i,j; for(i=0;i<n;i++){ if(y>a[i]) break; } for(j=n;j>i;j--) a[j]=a[j-1]; a[i]=y; } int main() {int i,a[11]={20,18,16,14,12,10,8,6,4,2},x; void fun(int *,int n,int y); scanf("%d",&x); fun(a,10,x); for(i=0;i<11;i++) printf("%d ",*(a+i)); } 编写函数int fun(char *s1,char *s2),在字符串s1中统计字符串s2出现的次数并返回。若s2在s1中未出现,则返回0。例如: 若输入的字符串s1为:abaaAabcaabbabca,字符串s2为:ab ,则程序输出:n=4 若输入的字符串s1为:abaaAabcaabbabca,字符串s2为:abd,则程序输出:No find #include<string.h> #include<stdio.h> int fun(char *s1,char *s2) { int i,j,n=0; for(i=0;i<=strlen(s1)-strlen(s2);i++){ for(j=0;j<strlen(s2);j++) if(s1[i+j]!=s2[j]) break; if(j==strlen(s2)) n++; } return n; } int main() { char a[80],b[80]; int n; printf("Please input the first string:"); gets(a); printf("Please input the second string:"); gets(b); n=fun(a,b); if(n==0) printf("No find\n"); else printf("n=%d\n",n); } 编写函数int fun(char *str),功能是:统计字符串str中不同字符的个数并做为函数值返回。例如,下面程序运行时若输入:One world,One dream! 输出:n=13 #include<stdio.h> int fun(char *str) { int i,j,n=0; for(i=0;str[i];i++){ for(j=0;j<i;j++){ if(str[i]==str[j]) break; } if(i==j) n++; } return n; } int main() {char s[80]; int n; gets(s); n=fun(s); printf("n=%d\n",n); } 编写函数int fun(int m,int n,int *p),要求将范围[m,n]之间所有的fibonacci数写入p所指的一维数组中,fibonacci数的个数通过函数返回值带回。例如,[0,30]之间的fibonacci数有7个,它们是:1 2 3 5 8 13 21 ;[1000,32767]之间有7个,它们是:1597 2584 6765 10946 17711 28657 。 #include<stdio.h> int fun(int m,int n,int *p) { int i,j,s,a[1000]={1,2}; for(i=2;i<1000;i++) a[i]=a[i-1]+a[i-2]; for(i=0,j=0,s=0;i<1000;i++){ if(a[i]>=m&&a[i]<=n){ p[j]=a[i]; j++; s++; } } return s; } int main() {int a,b,n,c[22],i; scanf("%d%d",&a,&b); n=fun(a,b,c); for(i=0;i<n;i++) printf("%6d",c[i]); printf("\nn=%d\n",n); } 编写函数char *fun(char *s1,char s2,int n),将字符串s1中后面的n个字符复制到s2所指数组中,若s1不足n个字符,则用在前端补齐至n个字符,写入s2中。函数返回字符串s2的指针。例如,下面程序运行时, 若输入:“abcd1234”和6,则输出“cd1234” 若输入:“abcd1234”和10,则输出“**abcd1234” #include<stdio.h> char *fun(char *s1,char *s2,int n) { int i,j,m; for(i=0;s1[i]!='\0';i++) m=i; if(m>=n){ for(j=0,i=m-n;j<=n-1;i++,j++){ s2[j]=s1[i]; s2[n]='\0'; } } else { for(j=0;j<n-m;j++) s2[j]='*'; for(i=0,j=n-m;i<=m-1;i++,j++) s2[j]=s1[i]; s2[n]='\0'; } return s2; } int main() {char c1[80],c2[80]; gets(c1); fun(c1,c2,6); puts(c2); puts(fun(c1,c2,30)); } 编写函数void fun(char *s,char *b,char *c),逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c数组中,形成一个新的字符串。例如,若a中的字符串为aBCDeFgH,b中的字符串为:ABcd,则c中的字符串应为:aBcdeFgH。 #include<stdio.h> #include<string.h> void fun(char *a,char *b,char *c) { int i,ls1,ls2; ls1=strlen(a); ls2=strlen(b); for(i=0;i<(ls1>ls2?ls2:ls1);i++) c[i]=(a[i]>b[i]?a[i]:b[i]); for(i=(ls1>ls2?ls2:ls1);i<(ls1>ls2?ls1:ls2);i++){ if(ls1>ls2) c[i]=a[i]; else c[i]=b[i]; c[i]='\0'; } } int main() {char s1[80],s2[80],s3[80]; gets(s1); gets(s2); fun(s1,s2,s3); puts(s3); } 编写函数void fun(char *s),将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符和非数字字符原有的前后次序。 例如,若输入:num is 0532-66ouc78,OK. 执行结果为:num is -ouc,OK.05326678 #include<stdio.h> void fun(char *s) { int i,j=0,n,n1=0; int a[80]; for(i=0;s[i]!='\0';i++) n=i; for(i=0;i<n;i++){ if(s[i]>='0'&&s[i]<='9'){ n1++; a[j]=s[i]; j++; } } for(i=0;i<n;i++){ if(s[i]>='0'&&s[i]<='9'){ for(j=i;j<n;j++) s[j]=s[j+1]; i--; } } for(i=n-n1,j=0;i<n;i++,j++) s[i]=a[j]; } int main() {char a[80]; gets(a); fun(a); puts(a); }