一、选择题 (1)有以下程序 # include <string.h> void f(char *s, char *t) { char k; k=*s; *s=*t; *t=k; s++; t--; if (*s) f(s, t); } main() { char str[10]="abcdefg", *p ; p=str+strlen(str)/2+1; f(p, p-2); printf("%s\n",str); } 程序运行后的输出结果是 A)abcdefg B)gfedcba C)gbcdefa D)abedcfg
(2)有以下程序 float f1(float n) { return n*n; } float f2(float n) { return 2*n; } main() { float (*p1)(float),(*p2)(float),(*t)(float), y1, y2; p1=f1; p2=f2; y1=p2( p1(2.0) ); t = p1; p1=p2; p2 = t; y2=p2( p1(2.0) ); printf("%3.0f, %3.0f\n",y1,y2); } 程序运行后的输出结果是 A)8, 16 B)8, 8 C)16, 16 D)4, 8
(3)程序中若有如下的说明和定义语句 char fun(char *); main() { char *s="one",a[5]={0},(*f1)()=fun,ch; …… } 以下选项中对函数fun的正确调用语句是 A)(*f1)(a); B)*f1(*s); C)fun(&a); D)ch=*f1(s)
(4) 在函数调用过程中,如果函数funA调用了函数 funB,函数funB又调用了函数funA,则 A) 称为函数的直接递归调用 B) 称为函数的间接递归调用 C) 称为函数的循环调用 D) C语言中不允许这样的递归调用
(5) 有以下程序 void fun(int *a,int i,int j) { int t; if(i<j) { t=a[i];a[i]=a[j];a[j]=t; i++; j--; fun(a,i,j); } } main() { int x[]={2,6,1,8},i; fun(x,0,3); for(i=0;i<4;i++) printf("%2d",x[i]); printf("\n"); } 程序运行后的输出结果是 A) 1 2 6 8 B) 8 6 2 1 C) 8 1 6 2 D) 8 6 1 2
(6) 有以下程序 #include <string.h> main(int argc ,char *argv[ ]) { int i,len=0; for(i=1;i<argc;i+=2) len+=strlen(argv[i]); printf(“5d\n”,len); } 经编译链接后生成的可执行文件是ex.exe,若运行时输入以下带参数的命令行 ex abcd efg h3 k44 执行后输出结果是 A) 14 B) 12 C) 8 D) 6
(7) 有以下程序 void f(int a[],int i,int j) { int t; if(i<j) { t=a[i]; a[i]=a[j];a[j]=t; f(a,i+1,j-1); } } main( ) { int i,aa[5]={1,2,3,4,5}; f(aa,0,4); for(i=0;i<5;i++) printf(“%d,”,aa[i]); printf(“\n”); } 执行后输出结果是 A) 5,4,3,2,1, B) 5,2,3,4,1, C) 1,2,3,4,5, D) 1,2,3,4,5,
(8) 有以下程序 void fun(int *a,int i,int j) { int t; if(i<j) { t=a[i];a[i]=a[j];a[j]=t; fun(a,++i,--j); } } main() { int a[]={1,2,3,4,5,6},i; fun(a,0,5) for(i=0;i<6;i++) printf("%d",a[i]); } 执行后的输出结果是 A) 6 5 4 3 2 1 B) 4 3 2 1 5 6 C) 4 5 6 1 2 3 D) 1 2 3 4 5 6
(9) 有以下程序 int f(int n) { if (n==1) return 1; else return f(n-1)+1; } main() { int i,j=0; for(i=i;i<3;i++) j+=f(i); printf(“%d\n”,j); } 程序运行后的输出结果是 A) 4 B) 3 C) 2 D) 1
(10) 有以下程序 #include <string.h> main(int argc,char *argv[]) { int i,len=0; for(i=1;i<argc;i++) len+=strlen(argv[i]); printf(“%d\n”,len); } 程序编译连接后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是: ex1 abcd efg 10<回车> 则运行的结果是: A) 22 B) 17 C) 12 D) 9
(11) 有以下程序 int fa(int x) { return x*x; } int fb(int x) { return x*x*x; } int f(int (*f1)(),int (*f2)(),int x) { return f2(x)-f1(x); } main() { int i; i=f(fa,fb,2); printf(“%d\n”,i); } 程序运行后的输出结果是 A) -4 B) 1 C) 4 D) 8
(12) 不合法的main函数命令行参数表示形式是 A) main(int a,char *c[]) B) main(int arc,char **arv) C) main(int argc,char *argv) D) main(int argv,char *argc[])
(13) 假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入: PROG ABCDEFGH IJKL<回车>,则输出结果为 A) ABCDEFG B) IJHL C) ABCDEFGHIJKL D) IJKLABCDEFGH main( int argc, char *argv[])) { while(--argc>0) printf(“%s”,argv[argc]); printf(“\n”); }
(14) 以下程序的输出结果是 A) 1 B) 2 C) 3 D) 4 long fun( int n) { long s; if(n= =1 || n= =2) s=2; else s=n-fun(n-1); return s; } main() { printf(“%ld\n”, fun(3)); }
(15) 有如下程序 long fib(int n) { if(n>2) return(fib(n-1)+fib(n-2)); else return(2); } main0 { printf(“%d\n”,fib(3)); 该程序的输出结果是 A) 2 B) 4 C) 6 D) 8
(16) 若有以下说明和定义 fun(int *c){ } main() { int (*a)()=fun,*b(),w[10],c; ┆ } 在必要的赋值之后,对fun函数的正确调用语句是 A) a=a(w); B) (*a)(&c); C) b=*b(w); D) fun (b);
(17) 下列程序执行后的输出结果是 A) hello B) hel C) hlo D) hlm void func1(int i); void func2(int i); char st[]="hello,friend!"; void func1(int i) { printf("%c",st[i]); if(i<3){i+=2;func2(i);} } void func2(int i) { printf("%c",st[i]); if(i<3){i+=2;func1(i);} } main() { int i=0; func1(i); printf("\n");}
(18) 假定下列程序的可执行文件名为prg.exe,则在该程序所在的子目录下输入命令行: prg hello good<回车>后,程序的输出结果是 A) hello good B) hg C) hel D) hellogood main()(int argc, char *argv[]) { int i; if(argc<-0)return; for(i=1;i<argc;i++) printf("%c", *argv[i]); }
(19) 以下程序的输出结果是 A) 5 4 3 2 1 B)0 1 2 3 4 5 C) 1 2 3 4 5 D) 5 4 3 2 1 0 main() { int w=5; fun(w); printf(“\n”);} fun(int k) { if (k>0) fun(k-1); printf(“%d”,k); }
(20) 若以下程序所生成的可执行文件名为filel.exe;当打入以下命令执行该程序时; FILEL CHINA BEIJING SHANGHAI 程序的输出结果是 A) CHINA BEIJING SHANGHAI B) FILEL CHINA BEIJING C) C B S D) F C B main(int argc,char *argv[]) { while(arge-->0) { ++argv;printf("%s ",*argv);} }
(21) C语言规定,程序中各函数之间 A) 既允许直接递归调用也允许间接递归调用 B) 不允许直接递归调用也不允许间接递归调用 C) 允许直接递归调用不允许间接递归调用 D) 不允许直接递归调用允许间接递归调用
二、填空题:
(1)以下程序运行后的输出结果是 【1】 。 int f(int a[], int n) { if (n >= 1) return f(a, n-1)+a[n-1]; else return 0; } main() { int aa[5]={1,2,3,4,5}, s; s=f(aa, 5); printf("%d\n", s); }
(2) 下面程序的运行结果是:【2】 int f( int a[], int n) { if(n>1) return a[0]+f(&a[1],n-1); else return a[0]; } main ( ) { int aa[3]={1,2,3},s; s=f(&aa[0],3); printf(“%d\n”,s); }
(3) 以下程序运行后的输出结果是 【3】 fun(int x) { if (x/2>0) fun(x/2); printf("%d",x); } main() { fun (6); }
(4) 设函数findbig已定义为求3个数中的最大值。以下程序将利用函数指针调用findbig函数。请填空。 main() { int findbig(int,int,int); int (*f)(),x,yz,z,big; f=【4】; scanf("%d%d%d",&x,&y,&z); big=(*f)(x,y,z); printf("bing=%d\n",big); }
(5) 以下程序的输出结果是【5】 。 main() { int x=0; sub(&x,8,1); printf("%d\n",x); } sub(int *a,int n,int k) { if(k<=n) sub(a,n/2,2*k); *a+=k; }
(6) 以下程序的输出结果是 【6】 。 fun(int n,int *s) { int f1,f2; if(n = =1||n = =2) *s=1; else { fun(n-1,&f1); fun(n-2,&f2); *s=f1+f2;} } main() { int x; fun(6,&x); printf("%d\n",x); }
(7) 下面程序的输出是【7】 。 long fun5(int n) { long s; if((n==1)||(n==2)) s=2; else s=n+fun5(n-1); return(s);} main() { long x; x=fun5(4); printf("%ld\n",x);}
(8) 下面h函数的功能是计算如下数学函数H的值。请填空。 double fgh(double( *f)(double a)< double( *g)(double b), double x, double y) { return(【8】 );} double h(double a, double b) return(fgh( sin,cos,a,b)*fgh( 【9】] )); }
(9) 请读程序: #include<stdio.h> main( int argc, char *argv[]) { int i; printf( '%d\n", argc); for( i=0; i<=argc+1; i++) printf( "%s ", argv[i]); printf("\n"); } 若上面的程序编译、连接后生成可执行文件ABC.EXE,则输入以下命令行 abc file1 file2<CR>(<CR>表示回车) 程序执行后的输出结果是 【10】 。
(10) 下面程序的输出结果是 【11】 。 #include <stdio.h> fun( int x) { int p; if( x==0||x==1) return(3); p=x-fun( x-2); return p; } main() { printf( "%d\n", fun(9));}
(11) 下面程序的输出结果是 【12】 。 #include <stdio.h> funa( int a, int b) { return a+b;} funb( int a, int b) { return a-b;} sub( int (*t)(), int x, int y) { return((*t)( x,y));} main() { int x, (*p)(); p=funa; x=sub(p,9,3); x+=sub(funb, 8, 3); printf("%d\n", x); }
(12) 设有如下程序: #include<stdio.h> main(int argc, char *argv[ ]) { while( --argc>0) printf("%s",argv[argc]); printf("\n"); } 假定上述程序经编译和连接后生成可执行文件PROG.EXE,如果在DOS提示符下键入PROG ABCD EFGH IJKL <CR>,则输出结果为 【13】 。
(13) 以下程序调用invert函数按逆序重新放置a数组中元素的值。a数组中的值在main函数中读入。 #include <stdio.h> #define N 10 invert(int *s,int i,int j) { int t; if(i<j){ t=*(s+i); *(s+j)=(s+j);*(s+j)=t; invert(s, 【14】 ,j-1);}} main() { int a[N],i; for(i=0;i<N;i + + ) scanf("%d",a+ 【15】 ); invert(a,0,N-1); for(i=0;i<N;i + + ) printf("%d",a[i]); printf("\n"); }
答案: 一、选择题: 1) B 2) A 3) A 4) B 5) C 6) D 7) A 8) A 9) B 10) D 11) C 12) C 13) D 14) A 15) B 16) B 17) C 18) B 19) B 20) A 21) A 22) 23) 24) 25) 26) 27) 28) 29) 30) 二、填空题: (1)15 (2)6 (3)1 3 6 (4)findbig (5)7 (6)8 (7)9 (8)f(xy)/g(y-x)或(*f)(x+y)/g(y-x)或f(x+y)/(*g)(y_x)或(*f)或(*f)(x+y)/(*g)(y-x) (9)cos,sin,a,b (10)3 abc.exe file1 file2 (注:两个答案,每个1分) (11)7 (12)17 (13)IJKLEFGHABCD (14)i+1 (15)I
|