江苏广播电视大学
《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 ,并统计字符串的长度。 ( 用字符指针实现 )