文档库 最新最全的文档下载
当前位置:文档库 › c语言之填空与程序分析

c语言之填空与程序分析

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!");

}

相关文档