1.用for循环打印1 4 7 10 13 16 19 22 25 , 其语句应为:
for (i=1; i<=9; i++) printf(“%3d”, _3*i-2__);
2.执行完下列语句段后, i,j值分别为:___355,350__
int i, j;
j=10*(i=5);
i+=j*=i+2;
第一条语句执行后: i = 5, j = 50
执行第二条语句:
i+=j*=i+2
→i += (j *= (i+2))
→i += (j *= 7)
→i += (j = 50*7)
→i = 5 + 350 = 355, j = 350
3.执行完下列语句段后, i值为:__5__
static int a[3][4]={{1,2,3},{4,5,6}}, i;
i= a[0][5];
a[0][0] 1 X
a[0][1] 2 X+2
a[0][2] 3 X+4
a[0][3] ? X+6
a[1][0] 4 X+8
a[1][1] 5X+10
a[1][2] 6 X+12
a[1][3] ? X+14
a[2][0] ? X+16
a[2][1] ? X+18
a[2][2] ? X+20
a[2][3] ? X+22
a[0][5]的地址: X+(0*4+5)*2 = X + 10, 即对应于a[1][1]。
4.执行完下列语句段后, i值为:__4___
int i;
int f(int x)
{ static int k = 0;
x+=k++;
return x;
}
i=f(2);
i=f(3);
5.执行完下列语句段后, i值为:__18__
int i;
int f(int x)
{ return ((x>0)? x*f(x-1):3); }
i=f(f(1));
调用f(1):
(1>0)成立,执行1*f(0)=f(0),
调用f(0) = 3
所以,f(1)=3;
调用f(3):
f(3) = 3 * f(2)
f(2) = 2 * f(1) = 2 * 3 = 6
所以f(3) = 3 * 6 = 18
6.执行完下列语句段后, s和f值分别为: __”%s%lf”, 12.4__
char s[20];
double f;
sscanf(“%s%lf 12.4%s%f12.5”, “%s %lf”, s, &f);
函数sscanf()的一般形式:sscanf(char *buffer, char *format, var1, var2, var3, …)
它的含义:从缓冲区buffer中按照格式字符串format读入变量var1,var2,var3,…的值。
7.对于char c; 若已知其值为小写字母, 将其转换为相应大写字母的表达式为___c –
…a? + …A?______
8.将p说明为字符数组指针,数组大小为10,可写为:__char (*p)[10];__
9.int i=0, s=0;
while (i 等价于 int i, s; for(_i=0,s=0; i < n; s+=i++_); 10.下列程序判断字符串s是否对称,对称则返回1,否则返回0; 如f(“abcba”)返回1, f(“abab”) 返回0; int f(__char s[]_) { int i=0,j=0; while(s[j]) j++; for ( j--; i return __ i>=j__; } 11.下面是用二分法从数组v[n]中查找数x的函数,返回值为x所在下标(若找到)或-1(没找 到): binsearch(int x, int v[], int n) { int low, high, mid; low=0; high=n-1; while (low<=high) { mid = _ (low+high)/2_; if (x else if (x>v[mid]) low = mid +1; else return __ mid_; } return -1; } 12.下面程序验证哥德巴赫猜想, 即寻找2到1000间满足“偶数=素数1+素数2”(如10=3+7) 的所有偶数。素数指只能被1和自身整除的正整数,如1,2,3,17等。 #include #define MAX 500 int prime(int n) /* 判断n是否为素数*/ { int i; for (i=2; i<=n-1; i++) if (!(n%i)) break; return _ i==n_; } main() { int i, j; for (i=1 ; i<=500; i++) for (j=1; j<2*i; j+=2) if (_prime(j) && prime(2*i-j)_) { printf(“%d = %d +%d\n”, 2*i, j, 2*i-j); /*若2*i为两个素数之和*/ break; } } 13.对于整型变量i,j执行scanf("%d%*d%d",&i, &j);当输入2 3 4 5 6后 i=_ 2_ j= _4__ 14.f( int m ) { int i, j; for( i=0; i for( j=m-1; j>=0; j--) printf(“%1d%c",i+j, j?'*':'#'); } 如果调用f(3)将输出__2*1*0#3*2*1#4*3*2#__ 15.用for循环打印0 1 2 0 1 2 0 1 2; for( i=1; i<=9; i++ ) printf("%2d", __(i-1)%3__); 16.定义一个返回整型的函数指针p,应写为_int (*p)();_ 17.定义字符指针数组arr, 数组大小为20,应写为__char *arr[20];__ 18.程序A: int f( int n ) { if(n<=1) return n; else return f(n-1)+f(n-2); } 等价于程序B: int f( int n ) { _int t0,t1,t_; t0=0; t1=1; t=n; while (_n>=2_) { t = _t0+t1_; t0 = t1; t1 = t; n - -; } return _t_; } 19.下列函数strcmp(s1, s2)是字符串比较, 根据s1,s2大小分别返回负数(s1 正数(s1>s2). 请将缺少的部分补上。 strcmp(_char *s1, char *s2_) { for(; s1!=_…\0?_; ++s1, ++s2) if (*s1!= *s2) break; return (_*s1-*s2_); } 20.下列函数f(A, n, x)将正整数x插入已从小到大排序好的数组A中. 数组A当前分量个 数为n. 例如, 当A的前5个分量为(2,3,9,12,15), n=5时, 调用f(A,n,10)后, n变为6, A 的前6个量为:(2,3,9,10,12,15)。A[0] A[1] A[2] A[3] A[4]A[5] void f(_int A[], int n, int x_) { int t, i; i=n; A[n+1]=_ x_; i while ((i>=0) && (_A[i]>A[i+1]_)) { t=A[i]; A[i]=A[i+1]; A[i+1]=t; i - -; } n++; } 21.#include int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; main() { int s, i; for(s=0, i=0; i<3; i++) s+= *(*a+i); printf(“%d ”, s); for(s=0, i=0; i<3; i++) s+= **(a+i); printf(“%d ”, s); } 问题: 上述程序运行后, 将输出__6 15__ a[][ 0] a[][1] a[][2] a[][3] a[0] 1 2 3 4 a[1] 5 6 7 8 a[2] 9 10 11 12 由于:*(a + i) ? a[i], *a + i ? a[0] + i *(*a+i) ? *(a[0] + i) ? a[0][i], 所以,第一个循环是将数组a的第0行的前3个元数相加,值为6; **(a+i) ? *a[i] ? a[i][0] 所以,第一个循环是将数组a的第0列所有的元数相加,值为15。 22.#include int a[2][5]; void p1(int v[]) { int i, j, temp; for (i=1; i<5; i++) for(j=i-1; j>=0 && v[j] temp=v[j]; v[j]=v[j+1]; v[j+1]=temp; } } void p2(int v1[], int v2[]) { int i=0, j=0; while (i<5 && j<5) if (v1[i]>v2[j]) printf("%d ", v1[i++]); else printf("%d ", v2[j++]); while (i<5) printf("%d ", v1[i++]); while (j<5) printf("%d ", v1[j++]); printf("\n"); } main() { int i,j; for (i=0; i<2; i++) for(j=0; j<5; j++) scanf("%d", &a[i][j]); p1(a[0]); p1(a[1]); for (i=0; i<2; i++) for(j=0; j<5; j++) printf("%d ", a[i][j]); printf("\n"); p2(a[0], a[1]); } 问题: 当输入5 9 1 12 10 7 3 11 4 10时, 上述程序运行后, 第一行将输出_12 10 9 5 1 11 10 7 4 3_ 第二行将输出_12 11 10 10 9 7 5 4 3 1_ 函数p1()的功能:将参数数组的每个元素按从大到小的顺序排列。 函数p2()的功能:将两个参数数组中的每个元素(已经降序排列)混合在一起,并按从大到小的顺序输出。 23.#include void p( int r[], int s, int t ) { int i,j,x; i=s; j=t; x=r[s]; while( i < j ) { while ( ( i < j ) && ( r[j] >= x ) ) /* NOTE 1*/ j--; r[i]=r[j]; while ( ( i < j ) && ( r[i] <= x ) ) /* NOTE 2*/ i++; r[j]=r[i]; } r[i]=x; } main() { int i,n,a[100]; scanf("%d",&n); for( i=1; i<=n ; i++ ) scanf( "%d", &a[i] ); p( a, 1, n ); for( i=1; i<=n; i++ ) printf( "%3d", a[i] ); } 问题:⒈当输入6 49 38 65 97 13 27 时, 将输出_27 38 13 49 97 65_ ⒉若将作NOTE 1标记的一行中的r[j]>=x改为r[j]<=x,同时将作NOTE 2 标记的一行中的r[i]<=x改为r[i]>=x 对于问题一中的相同输入,将输出__97 65 49 38 13 27_ 24.#include #define F(k) k+3.14 #define P(a) printf("a=%d\n", (int)(a)) #define P1(a) P(a);putchar('\n'); #define P2(a, b) P(a);p1(b); main() { int x = 1; { int x = 2; P(x*F(2)); } { for (; x < 10; x += 50) P2(x, 9.15*x+32); } } 请写出该程序中有关宏定义的展开式,并给出该程序的运行结果。 有关展开: P(x*F(2)); →printf(“a=%d\n”,(int)(x*F(2))); →printf(“a=%d\n”,(int)(x*2+3.14)); P2(x, 9.15*x+32); →P(x);P1(9.15*x+32); P(x); → printf(“a=%d\n”,(int)(x)); P1(9.15*x+32) → P(9.15*x+32);putchar(…\n?); P(9.15*x+32);→ printf(“a=%d\n”,(int)(9.15*x+32)); → printf(“a=%d\n”,(int)(x));printf(“a=%d\n”,(int)(9.15*x+32));putchar(…\n?); 全部展开,并整理,得: main() { int x = 1; { int x = 2; printf(“a=%d\n”,(int)(x*2+3.14)); } { for (;x<10;x+=50) printf(“a=%d\n”,(int)(x)); printf(“a=%d\n”, (int)(9.15*x+32)); putchar(…\n?); } 运行结果: a=7 a=1 a=498 25.在C语言中使用到的变量,都应先(定义),后(使用)。 26.若有定义:char c=′\010′;则变量c中包含的字符个数为__1个____。 27.函数的返回值是通过函数中的(return)语句获得的。 28.下面函数用来求出两个整数之和,并通过形参传回两数相加之和,请填空。 int add(int x,int y,( int * )z) { ( *z)=x+y;} 29.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是__32_。 struct stud {char num[6]; int s[4]; double ave; }a; 三、分析程序结果 30.main() { int x=1,y=2,z=3; x+=y+=z; printf("%d",(x } 5 31.main() { int a=24,b=16,r; while (b) { r=a%b; a=b; b=r; } printf("%d",a); } 8 32.#include int p(int k,int a[]) {int m,i,c=0; for(m=2;m<=k;m++){ for(i=2;i<=m;i++) if(!(m%i)) break; if(i==m) a[c++]=m; } return c; } #define MAXN 20 main() { int i,m,s[MAXN]; m=p(13,s); for(i=0;i printf(“%4d\t”,s[i]); printf(“\n”); } 程序输出结果为(2 3 5 7 11);函数int p(int k,int a[])的功能为(求以k以内(含k)质数,并依次存入数组a中,返回质数个数) 33..int f(int b[ ],int n) { int i, s=0; for(i=0; i<=n; i+=2) s+=b[i]; return s; } main() { int x,a[ ]={2, 3, 4, 5, 6, 7, 8, 9}; x=f (a, 5); printf(“%d”,x ); } 12 34..程序打印如下形式的图形 * * * * * * * * * * main() { for(int i=1;i<=4;i++) { for(int j=1; ①j<=i;j++) printf( ②"*" ); printf( ③"\n"); } } 35.以下函数返回数组s中最大元素的下标,数组中元素的个数由t传入。 Findmax(int s[],int t) { int m,n; for(n=0,m=n;n if(s[n]>s[m]) (.m=n); return ( m); } 36.函数strcpy()将字符串from复制到字符串to。 void strcpy(char *to, char *from或char *from,char *to) { while(*to++=*from++ ); } 37.下面的程序的功能是:利用指针统计一个字符串中,字母、空格、数字、 及其它字符的个数,请填空。 #include main() { int alpha,space,digit,other; char *p,s[80]; alpha=space=digit=other=0; printf(“input string:\n”); gets(s); fo r(p=s;*p!=?\0?;p++) if(( *p>=?A?&& *p<=?Z?) || ( *p>=?a?&& *p<=?z?)))alpha++; else if((*p==? …|| *p==?\t?))space++; else if((*p>=?0? && *p <=?9?))digit++; else other++; prin tf(“alpha:%d space:%d digit:%d other:%d\n”,alpha,space,digit,other); } 38. 以下程序的运行结果是。 #include "stdio.h" main() { int i,j; clrscr(); for(i=0;i<5;i++) { for(j=5-i;j<=5;j++) putchar('*'); putchar('\n'); } } 39. 以下程序的运行结果是。 fun(int n) { if(n<=3) return 1; return (fun(n-1)+fun(n-2)); } main() { printf(“%d\n”,fun(5)); } 40. 从键盘输入:100<回车>,以下程序的输出结果是。 main() { int a[]={45,23,54,87,51,89}; int k,m; scanf(“%d”,&m); for(k=5;k>=0&&a[k]!=m;k--); printf(“%d\n”,k); } 41.以下程序的输出结果是。 #include "stdio.h" #define Y(x) 2*x+1 main() { int m=2; m=Y(Y(m+1)); printf(“%d\n”,m); } 42.以下程序的输出结果是。 #include “stdio.h” int z; int fun(int x) { x+=z; return x; } main() { int z=3; printf(“%d,%d\n”,fun(z+3),z); } 43. 以下程序运行后,文件test中的内容是。 #include “stdio.h” void writefile(char *fname, char *st) { FILE *myfile; myfile=fopen(fname,”w”); fputs(st,myfile); fclose(myfile); } main() { writefile(“test”,”new world”); writefile(“test”,”hello”); } 44. 以下程序运行结果是。 main() { int s=1,i=0; while (1) { i++; if (s>=20) break; if (s%5) { s+=5; continue; } s+=2; } printf(“%d\n”,i); } 45. 从键盘输入:5, 91 <回车>,以下程序的运行结果是。 main( ) { struct { int n; float f; } t={3, 80.5},*p=&t; scanf(“%d,%f”,&t.n, &t.f); printf(“%d,%4.1f\n”, p->n, p->f+ t.n); } 46. 以下程序程序编译连接后的可执行文件为sm.exe,其功能是根据命令行参 数计算sum=1+2+…+m。例如在DOS提示符下输入sm 10<回车>,运行结果是10,55。请写出三个下线划处应填上的有关内容,使本程序得以完整。 void main( int argc , char ) { int i,m=0; long sum=0L; char ; if (argc<2) exit(0); for (i=0; (ch=argv[1][i])!='\0';i++) { if(ch<'0'||ch>'9') exit(0); m=10* +ch-'0'; } for (i=1;i<=m;i++) sum+=i; printf("%d,%ld\n",m,sum); } 47. n个人围坐在一篮(m个)苹果前取苹果。1号位置的人开始从1报数,2 号位置的人报2,……,n号位置的人报n;接下来继续由1号位置的人报数n+1,2号位置的人报数n+2,……,依次类推,i号位置的人所报的数依次为:i,i+n,i+2*n,……。约定一个整数f(1≤f≤9),当某人所报数为f的整数倍或者个位数为f时,从篮子里取一个苹果。例如,f=7,当某人所报数为7,14,21……,或7,17,27……时,从篮子里取一个苹果。函数num()计算最后一个苹果被取走时所报的数;函数get()计算i号位置的人所取到的苹果数。 请写出四个下线划处应填上的有关内容,使相应函数得以完整。 int num(int m, int f) { int k=0; while(m) { k++; if((k%10== )|| (k%f==0)) m--; } (k); } int get(int n, int m, int f, int i) { int k, maxnum, s=0; maxnum=num( ,f ); for(k=i;k<=maxnum;k+=n) if ((k%10==f)||(k%f==0)) ; return (s); } 48. 以下程序段中,函数fun的功能是删除整个单向链表。写出两个下线划处应 填上的有关内容,使本程序得以完整。(设head已指向单向链表的首结点) struct node { int data; struct node *next; }; void fun( *head) { struct node *p=head; while(p) { struct node *q=p->next; ; p=q; } } 49. 以下程序用于把a(2≤a≤10)进制的正整数x转换为b(2≤a≤10)进制 的正整数。写出四个下线划处应填上的有关内容,使本程序得以完整。 #include int radixA,radixB; long x,y,d,t,e; void main() { printf("Please input:"); scanf("%d,%d,%d",&x,&radixA,&radixB); d=0,y=x,t=1,e=0; while(y!=0&&e { e=y%10; d=d+e*t; y=y/10; t=t*radixA; } if( ) { ; while(d!=0) { ; ; t=t*10; } printf("%ld(%d)=%ld(%d)\n",x,radixA,y,radixB); } else printf("Input data is invalid!"); }