if( ) printf(―\\Nwell DNOE!!! \\n‖);
else printf)‖\\nSorry the correct answer is %d\\n‖,val); }
三、判断题
(1) C语言中,用户若需调用标准库函数,在调用前必须重新定义。 (2) C语言中不允许用户重新定义标准库函数。
(3) 在C程序中,函数的定义和调用都不允许嵌套。
(4) 如果用数组名作为函数调用的实际参数,则传递给形参的是数组的首地址。 (5) 形式能参数也是一种局部变量。 四、编程题
(1)已有变量定义和函数调用语句int a,b; b=sum(a);函数sum()用以求 k ,和数作为函数值返回。若a值为10,经函数sum 的计算后,b的值是55。请编写sum 函数。 Sum(int n)
{ }
(2)a是一个2*4的整型数组,且各元素均已赋值,函数 max_value 可求出其中的最大元素值 max,并将此值返回主调函数。今有函数调用语句 max=max_value(a);请编写 max_value 函数。 Max_value(int arr[ ][4]) { }
第八章 编译预处理命令 一、单选题 (1)请读程序:
#define ADD(x) x+x main() {
int m=1,n=2,k=3;
int sum=ADD(m+n)*k; printf(―sum=%d‖,sum); }
上面程序的运行结果是 。 A) sum=9 B) sum=10 C) sum=12 D) sum=18
(2) 以下程序的运行结果是 。 #define MIN(x,y) (x)<(y)? (x)+(y) main()
{int I=10,j=15,k; k=10*MIN(I,j); printf(―%d\\n‖,k);
} A)10 B)15 C)100 D)150
(3) 在宏定义#define PI 3.14159中,用宏名PI代替一个 。 A) 常量 B) 单精度数 C) 双精度数 D) 字符串
(4) 若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*x/2
则执行以下printf语句后,输出结果是 。 int a; a=Y;
printf(―%d\\n‖,Z); printf(―%d\\n‖,--a);
A)7 B)12 C)12 D)7 6 6 5 5
(5) 若有以下宏定义: #define N 2
#define Y(n) ((N+1)*n)
则执行语句z=2*(N+Y(5));后的结果是 。 A) 语句有错误 B) z=34 C) z=70 D) z无定值 二、填空题
(1)设有以下宏定义:#define WIDTH 80
#define LENGTH WIDTH+40
则执行赋值语句:v=LENGTH*20;(V为int型变量)后,v的值是((2)设有以下宏定义:#define WIDTH 80
#define LENGTH (WIDTH+40)
则执行赋值语句:k=LENGTH*20;(K为int型变量)后,k的值是((3)下面程序的运行结果是( )。 #define DOUBLE(r) r*r main()
。。 ) ) {int x=1,y=2, t; t=DOBLE(x+y); printf(―%d\\n‖,t); }
(4)下面程序的运行结果是( )。 #define MUL(z) (z)*(z) main() {
printf(―%d\\n‖,MUL(1+2)+3); }
(5) 下面程序的运行结果是( )。 #define POWER(x) ((x)*(x)) main() {int I=1;
while (I<=4) printf(―%d\\t‖,POWER(I++)); printf(―\\n‖); }
三、判断题
(1) 预处理命令行都必须以#号开始。
(2) 宏替换不占用运行时间,只占编译时间。 (3) C程序在执行过程中对预处理命令进行处理。 (4) 宏名必须用大写字母表示。
(5) 在文件包含预处理命令的使用形式中,当#include 后的文件名用<>括起来时,表示在
当前目录搜索被包含文件。 四、编程题
(1)输入两个整数,求它相除的余数。用带参的宏来编程实现。
(2)试用义一个带参的宏swap(x,y),以实现两个整数之间的交换,并利用它将一维数组a和b的值进行交换。
第九章 指针 一、选择题
(1) 以下程有错误,错误原因是 main()
{int *p,I; char *q,ch; p=&I; q=&ch; *p=40; *p=*q; …….. }
A) p和q的类型不一致,不能执行*P=*Q;语句
B) P中存放的是地址值,因此不能执行*P=40;语句 C) Q没有指向具体的存储单元,所以*Q没有实际意义
D) Q虽然指向了具体的存储单元,但该单元中没有确定值,所以不能执行*P=*Q;语
句
(2)已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量K,下面不能正确执行的赋值语句是 .
A)k=*ptr1+*ptr2; B)ptr2=K;
C)ptr1=ptr2; D)k=*ptr1*(*ptr2);
(3)变量的指针,其含义是指该变量的________.
A)值 B)地址 C)名 D)一个标志
(4)若有语句int*point,a=4;和ponit=&a; 下面均代表地址的一组选项是_________. A) a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point
(5)下面能正确进行字符串赋值操作的是________.
A) char s[5]={―ABCDE‖};
B) char s[5]={?A‘,‘B‘,‘C‘,‘D‘,‘E‘}; C) char *S; s=‖ABCDE‖; D) char *S; scanf(―%s‖,s);
(6) 若有以下定义,则对A数组元素的正确引用是_______.
A)*&a[5] B)*a+2 C)*(P+5) D)*(a+2)
(7) 若有以下定义,则对a数组元素地址的正确引用是_______>
A) p+5 B) *a+1 C) &a+1 D) &a[0]
(8) 若有定义:int a[2][3];则对a数组的第I行第J列(假设I,J已正确说明并赋值)元素值的正
确引用为_______. A)*(*(a+I)+J) B)(a+I)[j] C)*(a+I+j) D)*(a+I)+j
(9)若有定义:int a[2][3];则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素地址的正确引用为________.
A)*(a[i]+j) B)(a+i) C)*(a+j)
E) a[i]+j
(10)若有以下定义和语句,则对a数组元素地址的正确引用为_________.
Int a[2][3],(*p)[3] P=a; A)*(p+2) B) p[2] C) p[1]+1 D) (p+1)+2 二、填空题
(1)下面程序段的运行结果是() char s[80],*sp=‖HELLO!‖; sp=strcpy(s,sp); s[0]=‘h‘; puts(sp);
(2)下面程序段的运行结果是() char[a]=‖123456789‖,*p; int I=0; p=a;
while(*p)
{if(I%2==0) p=‘*‘; p++;I++; }
puts(a);
(3)若有以下语句和定义: int a[4]={0,1,2,3,},*p; p=&a[1];
则++(*p)的值是()
(4)若有定义:int a[2][3]={2,4,6,8,10,12};则(&a[0][0]+282+1的值是(),*(a[1]+2)的值是()。 三、判断题
(1)若有定义:int (*p)[4],则标识符p表示的是一个指向整型变量的指针。 (2)若有定义:int *p[4],则标识符p表示的是一个指针数组名。 (3)指针值就是地址值。
(4)若有定义int (*p)(),指针p可以表示函数返回值的类型。 (5)C语言允许main函数带形参,但形参名只能是argv和arvc。 四、编程题
(1)编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针完成。
(2)设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的N个数按逆序重新排列并输出新的完整数列。进行逆序处理时要赤使用指针方法。试编程。(例如:原数列为2,4,6,8,10,12,14,16,18,20,若要求把从第4个数开始的5个数按逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20。)