江苏广播电视大学

《C语言程序设计》课程复习辅导

一、语法判断题

1、 若有 int ⅰ =10, j=0; 则执行完语句 if (j=0) ⅰ + +; else ⅰ - -; ⅰ的值为 11 。( )

若有 int ⅰ =10, j=0; 则执行完语句 if (j==0) ⅰ + +; else ⅰ - -; ⅰ的值为 11 。( )

2 、若有 int i=10, j=2; 则执行完ⅰ * =j+8; 后ⅰ的值为 28 。 ( )

3 、若一个 C 程序中说明一个全局变量 int ⅰ ; ( 在所有函数之外说明的 ) ,则该程序任何一点都可引用全局变量ⅰ。( )

4 、若ⅰ为某函数 f 之内说明的变量,则当 f 执行完后,ⅰ值无定义。( )

5 、若有 int a=5; 则表达式 a=3,3*a 的值为 15 。 ( )

6 、设有 int a=3; 则语句 printf(“%D”,a); 的输出结果是 3 。( )

7. C 语言是介于低级语言和高级语言中间的一种计算机语言,既可以用来编制系统软件,又可以用来编制应用软件。( )

8 、一个可执行的 C 语言程序可以包含若干个函数,但至少必须包含一个 main() 函数。( )

9 、一个 C 语言程序可由若干个源程序文件构成,每个源程序文件也必须包含一个 main() 函数。( )

10 、一个可执行的 C 语言程序总是从 main() 函数的入口地址处开始执行。( )

11 、在变量定义 int sum , SUM; 中 sum 和 SUM 是两个相同的变量名。( )

12 、若有 char c=0x41; 则 printf(“%d,%c”,c,c); 的输出结果是 65,A 。( )

13 、结构化程序设计中循环结构又分为直到型循环和当型循环两种。( )

14 、关系表达式 a=b>c 等价于 a=(b>c) ,同时也等价于 a==b>c 。( )

15 、逻辑表达式 (!a)&&(b==(c>d))||(c<(b+d)) 等价于 !a&&b==c>d||c<b+d 。( )

16 、 C 语言中直到型循环结构为: do 循环体 while( 表达式 ); 但这种循环是当表达式为真时反复执行循环体,表达式为假时结束循环。( )

17 、 break 语句不能用于循环语句和 switch 语句之外的任何其它语句中。( )

18 、 continue 语句和 break 语句的区别是: break 语句提前跳出 switch 结构或结束循环的执行; continue 语句只结束本次循环,而不是终止整个循环的执行。( )

19 、 C 语言规定只有静态存储( static )数组和外部存储( extern )数组才能初始化。( )

20 、 C 语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。( )

21 、若有 int a[3][4]; 则 a[3][4] 是对二维数组的正确引用。( )

22 、若有 char str[50]; 则 scanf(“%s”,&str); 是合法的标准输入函数调用。( )

23 、一个源程序文件由一个或多个函数组成,由此可见函数是一个独立的编译单位。( )

24 、在 C 语言中,所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一个函数。( )

25 、在定义函数时的参数是“形式参数”,在调用函数时的参数是“实际参数”。( )

26 、 #include “stdio.h” 的 作用是将说明标准输入输出库函数的头文件包含到当前源文件中来。( )

27 、 C 语言中允许函数“嵌套调用”和“递归调用”,所谓“递归调用”就是指:在调用一个函数的过程中又出现直接或间接地调用该函数本身。( )

28 、宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查。( )

29 、一个变量的地址就称为该变量的“指针”。( )

30 、字符串 ”china” 在内存中占据的存储空间是 5 个字节。( )

二、语法选择题

1 、设有 int i ;则表达式 i=1,++i,++i||++i,i 的值为 ( )

A).1 B).2 C).3 D).4

2 、设有 int i ;则表达式 (i=1,i=10)?i++||++i:++i 的值为 ( )

A).1 B).2 C).3 D).10

3 、设有 int a[ ]={10,11,12},*p=&a[0] ;则执行完 *p++;*p+=1; 后 a[0],a[1],a[2] 的值依次是 ( )

A).10,11,12 B).11,12,12

C).10,12,12 D).11,11,12

4 、设有说明 int s[2]={0,1},*p=s; 则下列错误的 C 语句是 ( )

A).s+=1; B).p+=1; C).*p++; D). (*P)++;

5 、若有 char a[3]= {‘A','\0','D'},*P=a, i=2, j=4; 则下列表达式值不是 1 的有( )

A) . strlen (a); B) . j ‖ j; C) . * (P+1); D) . - - ⅰ ;

6 、 printf(“%-3d,%3d\n”,4,5) ;的输出为( )

A).004,500 B).400,005 C).4_ _ , _ _5 D)_ _4,5_ _

7 、设 a 、 b 和 c 都是 int 型变量 , 且 a=3,b=4,c=5, 则下列表达式中 , 值为 0 的表达式是( )

A).'A'&&'B' B).a<=b

C).c>=b||b+c&&b-c D). a<=b+c&&c>=a+b

8 、若 x 和 y 都是 int 型变量 ,x=100,y=200, 则下面程序片段 :printf("%d",(x,y)); 的输出结果是( )

A).200 B).100

C).100 200 D). 输出格式符不够 , 输出不确定的值

9 、下面各语句中 , 能正确进行字符串赋值操作的语句行是( )

A).char s[4][5]={"ABCDE"}; B). char s[5]={'A','B','C','D','E'}

C). Char *s; s="ABCDE"; D). char *s; scanf("%s",s);

10 、请读程序 :

#include “ stdio.h”

#define SUB(x,y) (x)*y

main()

{int a=3,b=4;

printf("%d\n",SUB(a++,b++));

}

上面程序的输出结果是( )

A).12 B).15

C). 16 D).20

11 、若有 :int a[6]={4,5,6,9,5,7},*p=a, *q=p; 则对数组元素的错误引用是( )

A). a[4] B). *(p+4) C). *a++ D). *q++

12 、若有以下定义 :

char a; int b;

float c; double d;

  则表达式 a*b+d-c*b 值的类型为( )

A). float B). int C). char D). double

13 、表示关系 x<=y<=z 的 c 语言表达式为( )

A). (x<=y)&&(y<=z) B). (x<=y)AND(y<=z)

C). (x<=y<=z) D). (x<=y)&(y<=z)

14 、设 x 和 y 均为 int 型变量 , 则执行下面的循环后 ,y 值为( )

for(y=1,x=1;y<=50;y++)

{ if(x>=10))break;

if (x%2==1)

{ x+=5; continue;}

x-=3;

}

A).2 B). 4 C). 6 D). 8

15 、给出以下定义 :

char x[ ]="abcdefg";

char y[ ]={'a','b','c','d','e','f','g'};

  则正确的叙述为( )

A). 数组 X 和数组 Y 等价 B). 数组 x 和数组 Y 的长度相同

C). 数组 X 的长度大于数组 Y 的长度 D). 数组 X 的长度小于数组 Y 的长度

16 、以下叙述中不正确的是( )

A). 在不同的函数中可以使用相同名字的变量

B). 函数中的形式参数是局部变量

C). 在一个函数内定义的变量只在本函数范围内有效

D). 在一个函数内的复合语句中定义的变量在本函数范围内有效

17 、假定 a 和 b 为 int 型变量 , 则执行以下语句后 b 的值为( )

a=1; b=10;

do

{ b-=a; a++; }

while (b--<0);

A). 9 B). –2 C). -1 D). 8

18 、设 j 为 int 型变量 , 则下面 for 循环语句的执行结果是( )

for( j=10;j>3;j--)

{ if(j%3)j--;

--j; --j;

printf("%d %%",j);

}

A). 6 %3% B). 7% 4% C). 6% 2% D). 7% 3%

19 、设有以下宏定义 :

#define N 3

#define Y(n) ( (N+1)*n)

 则执行语句 z=2 * (N+Y(5+1)); 后 z 的值为( )

A). 出错 B).42 C). 48 D).54

20 、设 P1 和 P2 是指向同一个 int 型一维数组的指针变量 ,k 为 int 型变量 , 则不能正确执行的语句是( )

A).k=*P1+*P2; B).p2=k; C).P1=P2; D).K=*P1 * (*P2);

21 、设有如下定义 :

int arr[]={6,7,8,9,10};

int * ptr;

  则下列程序段的输出结果为( )

ptr=arr;

* (ptr+2)+=2;

printf ("%d,%d\n",*ptr,*(ptr+2));

A).8,10 B).6,8 C).7,9 D).6,10

22 、执行以下程序段后 ,m 的值为( )

int a[2][3]={ {1,2,3},{4,5,6} };

int m,*p;

p=&a[0][0];

m=(*p)*(*(p+2))*(*(p+4));

A). 15 B). 14 C). 13 D). 12

23 、有以下程序

main()

{ int a,b,c=246;

a=c/100%9;

b=(-1)&&(-1);

printf("%d,%d\n",a,b);

}

  输出结果是( )

A). 2,1 B). 3,2 C).4,3 D). 2,-1

24 、设有定义 int (*ptr)(); 则以下叙述中正确的是( )

A) ptr 是指向一维数组的指针变量

B) ptr 是指向 int 型数据的指针变量

C) ptr 是指向函数的指针 , 该函数返回一个 int 型数据

D) ptr 是一个函数名 , 该函数的返回值是指向 int 型数据的指针

25 、设有以下说明和定义 :

typedef union

{ long i; int k[5]; char c; }DATE;

struct date

{ int cat; DATE cow; double dog; } too;

DATE max;

  则下列语句的执行结果是( )

printf ("%d",sizeof (struct date ) +sizeof(max));

A). 26 B). 30 C). 18 D). 8

26 、有以下程序

main()

{ char a[]="programming", b[]="language";

char *p1,*p2;

int i;

p1=a; p2=b;

for(i=0;i<7;i++)

if(*(p1+i)==*(p2+i)) printf(" % c",*(p1+i));

}

  输出结果是( )

A). gm B). rg C). or D). ga

27 、执行以下程序后的输出结果为( )

viod fun (int a,int b,int c)

{ a=4; b=5; c=6;a=b+c;b=c+a;c=a+b;}

main()

{ int x=10, y=20,z=30;

fun (x,y,z);

printf("%d,%d,%d\n",x,y,z);

}

A).30,20,10 B).10,20,30

C).11,17,28 D).4,5,6

28 、执行以下程序后的输出结果为( )

int fun(int x,int y,int *cp,int *dp)

{ *cp=x+y; *dp=x-y; }

main()

{ int a, b, c, d;

a=30; b=50;

fun(a,b,&c,&d);

printf("%d,%d\n", c, d);

}

A).50,30 B).30,50 C).80,-20 D).80,20

29 、设 x 、 y 、 z 和 k 都是 int 型变量,则执行表达式 x= ( y=4 , z=16 , k=32 )后 x 的值为( )

A).4 B).16 C).32 D).52

30 、设有如下的变量定义:

int i=8,k,a,b;

unsinged long w=5;

double x=7,y=5.2;

  则以下符合 C 语言语法的表达式是( )

A).a+=a-=(b=4)*(a=3) B).x%(-3)

C).a=a*3=2 D).y=float(i)

31 、以下叙述中正确的是( )

A). 输入项可以是一个实型常量,如  scanf("%f , "3.5);

B). 只有格式控制,没有输入项,也能正确输入数据到内存,例如:  scanf("a=%d,b=%d");

C). 当输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如: scanf("%4.2f",&f);

D). 当输入数据时,必须指明变量地址,例如: scanf("%f",&f);

32 、设 x 和 y 均为 int 型变量,则以下语句 x+=y; y=x-y; x-=y; 的功能是( )

A). 把 x 和 y 按从大到小排列  B). 把 x 和 y 按从小到大排列 

C). 无确定结果  D). 交换 x 和 y 中的值

33 、以下程序的输出结果是( )

main()

{ int a=12,b=12;

printf("%d %d\n",--a,++b);

}

A).10 10 B).12 12 C).11 10 D).11 13

34 、以下程序运行后,输出结果是( )

main()

{ char *s="abcde";

s+=2;

printf("%ld\n",s);

}

A).cde B). 字符 c 的 ASCII 码值  C). 字符 c 的地址 D). 出错

35 、以下程序输出结果是( )

main()

{ int m=5;

if(m++>5) printf("%d\n",m);

else printf("%d\n",m--);

}

A).7 B).6 C).5 D).4

36 、下面能正确进行字符串赋值操作的语句是( )

A).char s[5]={"ABCDE"}; B).char s[5]={'A' 、 'B' 、 'C' 、 'D' 、 'E'};

C).char *s; s="ABCDEF"; D). char *s; scanf("%s",s);

37 、当执行以下程序段时( )

x=-1;

do { x=x*x;} while( !x);

A). 循环体将执行一次  B). 循环体将执行两次 

C). 循环体将执行无限次  D). 系统将提示有语法错误

38 、设 a 、 b 都是 int 型变量,若有语句 scanf(“a=%d,b=%d”,&a,&b) ;

则执行时输入正确的是( )

A). 23 45 ↙ B).23,45↙ C).a=23 b=45↙ D).a=23,b=45↙

39 、若有 int a; 则表达式语句 a+=a -=a*a; 等价于下列哪组表达式语句( )

A). a+a; a*a; B).a=a+a; a=a-a*a;

C). a=a+a-a*a; D).a=a-a*a; a=a+a;

40 、假定有变量定义: int k=7 , x=12 ;则能使值为 3 的表达式是( )

A).x%=(k%=5) B).x%=(k-k%5) C).x%=k-k%5 D).(x%=k)-(k%=5)

三、语法填空题

1 、在 C 语言中,调用函数时应保证实参和形参在 及 一致。

2 、表达式 98&&8&&31&1 的值为 , printf("%5.3f\n",123456.12345) ;输出为 。

3 、若有说明 int i,j,k; 则表达式 i=10,j=20,k=30,k*=i+j 的值为 。

4 、设 P 是指向具有 10 个元素的一维数组的指针变量,该数组元素类型为 int ,则指针变量 P 的定义为 。

5 、表达式 12345 = = 12345/3*3 的值为 ,表达式 12346 = = 12346/3*3 的值为 。

6 、若有 int i=3,j=7; 执行 printf(“%d,%d”,( ⅰ + +),(j=5,+ +j)); 的输出为 。

7 、 C 语言是一种典型的高级程序设计语言,其显著特点是: 、 、 。

8 、一个函数由两部分组成,即: 和 。

9 、 C 语言程序中出现的 /* ………… */ 部分所起的作用是: 。

10 、 C 语言中的整型常量有三种表示形式,即: 、 、 。

11 、在 IBM PC 机上的 Turbo C 环境中, sizeof(int) 的值为 , sizeof(char) 的值为 , sizeof(float) 的值为 , sizeof(double) 的值为 。

12 、 C 语言中数据类型的转换有两种,即: 和 。

13 、 C 语言规定了运算符的优先级和结合性,其结合性分为: 和 。

14 、若有 int a=4; float b=14.70; 则 4/5 的值为 , 4.0/5 的值为 ;能正确表示 a+b 对 a 取余的表达式是 。

15 、结构化程序设计方法中,程序由三种基本结构,即: 、 、 。

16 、设有 int a, b; 当执行输入函数 scanf(“%d:%d”,&a,&b); 时正确的输入是 。(给 a 输入 5 ,给 b 输入 8 )

17 、分支语句 if(x>=y) max=x; else max=y; 用含条件运算符的赋值语句表示为 。

18 、 C 语言中所提供的循环控制语句有三种,即: 、 、 。

19 、 C 语言中函数的参数分为: 和 。

20 、 C 语言中按函数在程序中出现的位置来分,函数的调用有三种方式,即: 、 、 。

21 、当 C 程序使用到数学库中的函数时,要在源程序的开始加入预处理命令 。

22 、 C 语言中,从变量作用域角度分:有 和 ;从变量存在的时间分:有

和 。

23 、 C 语言提供了三种常用的编译预处理功能,即: 、 、 。

24 、 C 语言中用来存放变量地址的变量称作 。

25 、在 C 程序中,可以用两种方法实现一个字符串,即: 和 。

26 、 int p[10 ]; 的含义是 。

27 、 int *p[10]; 的含义是 。

28 、 int (*p)[10]; 的含义是 。

29 、 int p( ); 的含义是 。

30 、 int *p( ); 的含义是 。

31 、 int (*p)( ); 的含义是 。

32 、 int *p; 的含义是 。

33 、 int **p; 的含义是 。

34 、若有定义 int a[10], *p=a; 则 p++ 的含义是 。

35 、若有 int a[4]={10,11,12,13},b,* p=a; 则 执行语句 b=*p++; 后 b 的值是 ,接着执行语句 b=*++p; 后 b 的值是 ,再执行语句 b=++*p; 后 b 的值是 。

36 、 C 语言提供的定义结构体和共用体变量的关键字分别是: 和 。

37 、定义一种新的类型 INTEGER, 使其与 int 等价,则正确的表示方式为 。

38 、定义一个宏 EOF , 使其与 -1 等价,则正确的表示方式为 。

39 、 C 语言中根据数据的组织形式,可以将文件分为: 和 。

40 、 C 语言的缓冲文件系统中提供的文件打开和文件关闭的函数分别为: 和 。

四、语法简答题

1 、请用 C 语言的表达式表示下列代数式。


(1)

(2)

(3) (e=2.71828)

(4) (e=2.71828)

2 、设在程序的变量说明部分已作了如下说明和初始化

int i=2,j=4,k=9,x=0,t=0,*p=&i ;

char a='X',b='Y',c='Z' ;

现若分别单独执行下列各条语句,写出执行后变量 t 的当前值。

(1) t=!c&& c<<2+b ;

(2) t=k/2+(k>j>i) ;

(3) x*=(t=2,t*=i*j* *p-t) ;

(4) t=a && b || k>j ;

3 、根据要求定义数据类型或变量。

(1) 定义一个 3 行 4列的整型 二维数组 array, 并为数组的每个元素都进行初始化。

(2) 用两种方法实现一个字符串 str ,并赋以初值 ”welcome to NanJing !” 。

(3) 定义结构体类型 date, 该结构体包含的成员为 year ( 整型 ) 、 month ( 整型 ) 、 day( 整型 ) ,再使用 typedef

将结构体类型 date 等价成 DATE ,最后使用 DATE 定义一个变量 pdate 。

(4) 定义结构体类型 bookinfo ,该结构体包含的成员为 name ( 长度为 20 的字符数组 ) 、 writer ( 长度为

10 的字符数组 ) 、 publish ( 长度为 50 的字符数组 ) 、 price ( 实型 ) 、 count ( 整型 ) ,并用 bookinfo 定

义一个结构体变量 book1 和指向结构体类型的指针变量 p 。

五、程序分析题

1 、写出下列程序执行后各 printf 的输出结果。

(1) int i=1;

main()

{static int a;

register int b=-10;

int c=0;

printf("i=%d,a=%d,b=%d,c=%d\n",i,a,b,c);

c=c+8;

other();

printf("i=%d,a=%d,b=%d,c=%d\n",i,a,b,c);

i=i+10;

other();

}

other()

{static int a=2;

static int b;

int c=10;

a=a+2;

i=i+32;

c=c+5;

printf("i=%d,a=%d,b=%d,c=%d\n",i,a,b,c);

b=a;

}

(2) #include "stdio.h"

int x=2,y=3,z=4;

void func1();

main()

{int x=6;

y=5;

printf("%d,%d,%d;",x,y,z);

func1(x,y);

z*=x+y;

printf("%d,%d,%d\n",x,y,z);

}

void func1(int a,int b)

{int z=10;

a=a+b+x;

b=a-b+y;

printf("%d,%d,%d,%d;",x,a,b,z);

}

(3) #include "stdio.h"

main()

{static char a[]="Radio&TV University";

static int b[8]={6,8,9,2};

char *p=a;

int *q;

q=b;

printf("\n%c,%c,%c,%c,%c",a[1],*p,*(a+6),p[2],*(p+3)-32);

*q=*(q+1)+2;

*(q+2)=*q*2;

q++;

printf("\n%d,%d,%d,%d,%d",b[5],*b,b[1],b[2],*q++);

}

(4) #include "stdio.h"

main()

{int x=5,y=8,*px,*py;

px=&x,py=&y;

printf("\nnum1=%d,num2=%d",*px,*py);

if(x<y) swap1(x,y);

printf("\nnum1=%d,num2=%d", *px,*py);

if(x<y) swap2(px,py);

printf("\nnum1=%d,num2=%d",*px,*py);

if(x<y) swap3(px,py);

printf("\nnum1=%d,num2=%d",*px,*py);

}

swap1(int a,int b)

{int t;

t=a; a=b; b=t;

printf("\nnum1=%d,num2=%d",a,b);

}

swap2(int *p,int *q)

{int *t;

t=p; p=q; q=t;

printf("\nnum1=%d,num2=%d",*p,*q);

}

swap3(int *p,int *q)

{int t;

t=*p;*p=*q;*q=t;

printf("\nnum1=%d,num2=%d",*p,*q);

}

2、试 分析下列程序的功能或执行后的输出结果。

(1) #include “stdio.h”

main(int argc,char *argv[ ])

{ int i;

printf(" argc=%d;",argc);

for(i=0;i<=argc-1;i++) printf("%s ;",argv[i]);

}

若上面的程序编译连接后生成可执行文件 print.exe,

若输入以下命令行 print filel file2( 表示回车 ) 注:文件的路径和大小写可以不考虑

(2) #include "stdio.h"

main()

{ char str[81],*sptr;

int i;

for(i=0;i<80;i++)

{ str[i]=getchar();

if(str[i]=='\n') break;

}

str[i]='\0';

sptr=str;

while(*sptr) putchar(*sptr++);

}

六、实例编程题

1 、根据要求将下列程序进行修改调整,使其能完成与原来程序同样的功能。

(1) 将下列程序分别用 do …… while 和 for 循环结构进行改写。

main()

{int i, sum=0; i=1;

while(i<=100)

{sum=sum+i;

i++;

}

printf(“The sum is :%d” ,sum);

}

2 、根据要求直接编写一个程序、一个函数或一个程序段。

(1) 编制一个完整的程序:用冒泡法对数组中的 10 个整型元素进行由大到小排序输出。数组元素由键盘输入。

(2) 编制一个函数:此函数能对一维数组内存放的 10 个学生成绩求平均成绩。 ( 形参数组名为 array)

(3) 编制一个函数:此函数能对一维数组内存放的 10 个学生成绩求平均成绩。 ( 形参为指向具有 10 个元素数组的指针变量 )

(4) 编制一个完整的程序:从键盘输入字符串 str1, 将字符串 str1 复制到字符串 str2 ,并统计字符串的长度。 ( 用字符数组实现 )

(5) 编制一个完整的程序:从键盘输入字符串 str1, 将字符串 str1 复制到字符串 str2 ,并统计字符串的长度。 ( 用字符指针实现 )