(9) 以下程序的输出结果是a=___,b=___,c=___。 #include
int func(int a,int *p); void main() {
int a=1,b=2,c; c=func(a,&b); b=func(c,&a); a=func(b,&c);
printf(\}
int func(int a,int *p) {
a++; *p=a+2;
return(*p+a); }
36 16 19
第九章 预处理 A部分
一、 选择题
1、 以下不正确的叙述是(D)
A、宏替换不占用运行时间。 B、宏名无类型。
C、宏替换只是字符替换。 D、宏名必须用大写字母表示。
2、 C语言的编译系统对宏命令的处理(D) A、在程序运行时进行的。 B、在程序连接时进行。
C、和C程序中的其它语句同时进行编译的。 D、在对源程序中其它语句正式编译之前进行的。 3、以下程序的输出结果是(C)。 A、15 B、100 C、10 D、150
#define MIN(x,y) (x)
int I,j,k;
i=10;j=15;k=10*MIN(i,j); printf(“%d\\n”,k); }
4、以下叙述中正确的是(D)
A、 用#include包含的文件的后缀必须是“.h”。 B、 若一些源程序中包含某个头文件;当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。 C、 宏命令行可以看作是一行C语句。 D、 预处理是在编译之前进行的。 5、以下叙述中正确的是(C)
A、源程序中所有的行都参加编译。
B、宏定义常量与const定义常量是一样的。 C、宏定义可以嵌套定义,即在宏定义中的字符串可以引用另一个宏定义的标识符。 D、以上都不正确。 二、 填空题
1、 以下程序中for 循环执行的次数是 6 。 #define N 2 #define M N+1
#define NUM (M+1)*M/2 void main() {
int i;
for(i=1;i<=NUM;i++); printf(“%d\\n”,i); }
2、以下程序的输出结果是 x=93 。 #define A 3
#define B(a) ((A+1)*a) void main() {
int x;
x=3*(A+B(7));
printf(“x=%d\\n”,x); } B部分(
编程:请写出一个宏定义MYALPHA(c),用以判断c是否是字母字符,若是,得1,否则,得0。 解:#define MYALPHA(c) ((c>=’A’&&c<=’Z’)||( c>=’a’&&c<=’z’)?1:0)
第十章 指针 A部分) 一、选择题
1、若有定义:int x,*pb;则以下正确的表达式是(A)
A、pb=&x B、pb=x C、*pb=&x D、*pb=*x 2、以下程序的输出结果是(B) A、因变量无定义输出不定值
B、0 C、-1 D、1 #includevoid main()
{printf(“%d\\n”,NULL);}
3、以下程序的输出结果是(B)
A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7
#include
void sub(int x,int y,int *z) {*z=y-x;} void main() {
int a,b,c;
sub(10,5,&a); sub(7,a,&b); sub(a,b,&c);
printf(“%d,%d,%d\\n”,a,b,c); }
4、以下程序的输出结果是(C)
A、4 B、6 C、8 D、10 #includevoid main() {
int k=2,m=4,n=6;
int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf(“%d\\n”,n); }
5、已知指针p的指向(图一)的a[1],则执行语句*p++;后,*p的值是(B)。
A、20 B、30 C、21 D、31 a[0] a[1] a[2] a[3] a[4] 10 20 30 40 50 (图一)
6、已知指针p的指向(图一)的a[1],则表达式*++p的值是(B)。
A、20 B、30 C、21 D、31
7、已知指针p的指向(图一)的a[1],则表达式++*p的值是(C)。
A、20 B、30 C、21 D、31 8、以下程序的输出结果是(D)。 A、23 B、24 C、25 D、26 #includevoid prtv(int *x)
{printf(“%d\\n”,++*x);} void main() {
int a=25;prtv(&a); }
9、以下程序的输出结果是(B)。 A、运行出错 B、100
C、a的地址 D、b的地址 #includevoid main() {
int **k,*a,b=100; a=&b;k=&a;
printf(“%d\\n”,**k); }
10、以下程序运行后,输出结果是(D)。
A)8 B)7 C)6 D) 5 #includess(char *s)
{ char *p=s; while(*p) p++; return(p-s); }
main()
{ char *a=\ int i; i=ss(a);
printf(\ } 二、填空题
1、若有定义:char ch;
(1)使指针p指向变量ch的定义语句是 char *p=&ch; 。
(2)若已定义char *p;,使指针p指向变量ch的赋值语句是 p=&ch; 。
(3)在(1)的基础上,通过指针p给变量ch读入字符的scanf调用语句是 scanf(“%c”,p); 。 (4)在(1)的基础上,通过指针p给变量ch赋字符’a’的语句是*p=’a’; 。
(5)在(1)的基础上,通过指针p用格式输出函数输出ch中字符的语句是printf(“%c”,*p); 。 2、以下程序输出的是 C 。 void main( ) { int i=3, j=2;
char *a=\DCBA\
printf(\ }
3、以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。请填空。
void exchange(int *x, int *y) { int t;
t=*y; *y= *x ; *x= t ; } B部分
程序填空:
1、下面程序的输出结果是 A B C D B C D C D D 。 char b[]=\ABCD\ void main() { char *chp;
for(chp=b; *chp: chp+=2) A、p++->n B、p->n++ C、(*p).n++ D、
++p->n
struct st{int n;struct st *next;}; struct st a[3],*p;
a[0].n=5;a[0].next=&a[1];a[1].n=7;a[1].printf(\
printf(\ }
2、 下面是一个字符串连接函数,请补充完整。 void mystrcat(char *s1,char *s2) {
char *p,*q;
for(p=s1; *p ; p++ );
for( q=s2 ;*q;q++) *p++=*q ; *p=’\\0’ ; }
第十一章 结构体与共用体 A部分( 一、选择题
1、设有如下定义: struct sk
{int a;float b;}data,*p;
若有p=&data;,则对data中的a域的正确引用是(B)。
A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a
2、根据以下定义,能输出字母M的语句是(D)。 A、printf(“%c\\n”,class[3].name); B、printf(“%c\\n”,class[3].name[1]); C、printf(“%c\\n”,class[2].name[1]); D、printf(“%c\\n”,class[2].name[0]);
struct person{char name[9];int age;}; struct person class[10]={“John”,17,”Paul”,19,”Mary”,18,”Adam”,16,}; 3、以下程序的输出结果是(D)。 A、0 B、1 C、3 D、6 #includevoid main() {
struct emplx{int x;int y;}enum[2]={1,3,2,7};
printf(“%d\\n”,enum[0].y/enum[0].x*enum[1].x); } 4、若有以下说明及语句,则值为6的表达式是(D)。 next=&a[2];
a[2].n=9;a[2].next=’\\0’;p=&a[0];
5、已知字符0的ASCII码的十进制的值是48,且数组的第0个元素在低位,以下程序的输出结果是(B)。
A、39 B、9 C、38 D、8 void main() {
union{int i[2];long k;char c[4];}r,*s=&r;
s->i[0]=0x39;s->i[1]=0x38; printf(“%x\\n”,s->c[0]); }
6、以下程序输出的结果是(C)。 A、32 B、16 C、8 D、24
typedef union{long x[2];int y[4];char z[8];}MYTYPE; MYTYPE them; void main() {
printf(“%d\\n”,sizeof(them)); }
7、设有以下语句
typedef struct S
{ int g; char h;} T; 则下面叙述中正确的是(B)。
A) 可用S定义结构体变量 B)可以用T定义结构体变量
C)S是struct类型的变量 D)T是struct S类型的变量 8、有以下说明和定义语句 struct student
{ int age; char num[8];}; struct student stu[3]={{20,\200403\
struct student *p=stu;
以下选项中引用结构体变量成员的表达式错误的是(D)。
A) (p++)->num??B) p->num C) (*p).num D) stu[3].age
二、填空题
1、为了建立结构体(含有两个成员,data是数据成员,next是指向自身结构体的指针成员),请填空:
Struct link {
char data;
struct link *next ; } 2、把类型int另取一个类型名称INT,则以下应填: typedef int INT;
3、以下程序的运行结果是2002Shangxian 。 # include typedef struct student{
char name[10]; long sno; float score; }STU; main( ) { STU a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},
c={“Anhua”,2003,95},d,*p=&d; d=a;
if(strcmp(a.name,b.name)>0) d=b; if(strcmp(c.name,d.name)>0) d=c; printf(“%ld%s\\n”,d.sno,p->name); } B部分
程序填空:
以下程序的功能是:处理由学号和成绩组成的学生记录,N名学生的数据已在主函数中放入结构体数组s中,它的功能是:把分数最高的学生数据放在b所指的数组中,注意:分数最高的学生可能不只一个,函数返回分数最高学生的人数。请填空。 #include#define N 16 typedef struct {
char num[10]; int s; }STREC;
int fun(STREC *a,STREC *b) {
int i,j=0,max=a[0].s;