19.有以下结构体说明,变量定义和赋值语句
struct STD
{ char name[10];
int age;
char sex;
}s[5],*ps;
ps=&s[0];
则以下scanf函数调用语句中错误引用结构体变量成员的是
A)scanf(”%s”,s[0].name); B)scanf(“%d”,&s[0].age);
C)scanf(“%c”,&(ps->sex)); D)scanf(“%d”,ps->age);
【答案】D
【解析】本题考查scanf()的函数的运用。在scanf()函数中,除了第1个参数为“格式控制”字符串外,其余参数均为地址值。因此,选项B和C都是合法的。选项A中的S[0].name是数组名,是一个地址值,所以也合法。而选项D中的ps一>age是通过结构体指针ps引用其所指内容的成员age,该成员为int型变量不是地址值,故不合法。应该选择D。
20.若有以下定义和语句
union data
{ int i; char c; float f;} x;
int y;
则以下语句正确的是
A)x=10.5;
C)y=x;
【答案】B
【解析】本题考查了共用体的运用。共用体变量和结构体变量不能直接参与一般的运算,而只能通过“一>”和“.”运算符取其成员变量来参与运算。因此,选项A)C和D都是错误的。故应该选择B。
21.程序中已构成如下图所示的不带头结点的单向链表结构,指针变量s,p,q均已正确定义,并用于指向链表结点,指针变量s总是作为头指针指向链表的第一个结点。 B)x.c=101; D)printf(“%d\n”,x);
若有以下程序段
q=s; s=s->next; p=s;
while(p->next) p=p->next;
p->next=q; q->next=NULL;
该程序段实现的功能是
A)首结点成为尾结点 B)尾结点成为首结点
C)删除首结点
【答案】A
【解析】刚开始时s指向a结点(链表头),所以语句q=s;使q也指向a结点。S=s一>next;语句使s指向a的下一个结点b。p=s;语句使p也指向b结点。接下来是一个while循环,循环条件为p一>next ,即当p没有指向链表尾时执行循环体p=p一>next;让p指向下一个结点,所以当循环结束时,p指向链表尾(c结点)。执行到此时,s、p、q分别指向的结点是B)C)a。然后执行p一>next=q;,使c结点的后续指针指向了a结点。最后执行q一>next=NULL;,使a结点的后续指针为NULL。由此可见,该程序段实现了将a结点移动到c结点之后.即首结点成为尾结点。故应该选择A。
22.有以下程序
struct S {int n; int a[20];};
void f(struct S *p)
{ int i,j,t;
for(i=0;i n-1;i++)
for(j=i+1;j n;j++)
if(p->a[i]>p->a[j]) { t=p->a[i]; p->a[i]=p->a[j]; p->a[j]=t; }
}
main( )
{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
?SPAN lang=EN-US> f(&s);
for(i=0;i<s.n;i++) printf("%d",s.a[i]);
}
程序运行后的输出结果是( )
A)1,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1,
C)2,3,1,6,8,7,5,4,10,9, D)10,9,8,7,6,1,2,3,4,5,
【答案】A
【解析】本题主要考查了选择排序算法和结构体指针用作函数参数。选择排序一般使用一个二重循环,外循环从待排序第1个元素遍历到倒数第2个元素,内循环从外循环变量所指元素的后一个元素遍历到最后一个元素。然后在D)删除尾结点
内循环的循环体中,比较外循环变量所指元素和内循环变量所指元素的大小,两者若为逆序(若从大到小排序,则前者小于后者为逆序;从小到大则前者大于后者为逆序),则交换两者内容。题目的f()函数中,外循环从0递增到p->n-2,内循环从i+l递增到p->n-1,内循环体中if语句条件是“p->a[i]>p->a[j]”,即前者大于后者则执行if子句(变换两者)。这些都满足选择排序算法,又因为指针用于函数参数传递的都是地址值,无论指针类型是结构体还是其他什么类型,即函数f()可以改变实参的内容。因此可以断定f()函数的作用就是:将传入参数所指结构体中的数组成员a的前n位(n也是结构体成员)进行从小到大排序。故本题应该选择A。
23. 有以下程序
struct S{ int n; int a[20]; };
void f(int *a,int n)
{int i;
for(i=0;i<n-1;i++) a[i]+=i;
}
main( )
{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(s.a,s.n);
for(i=0;i<s.n;i++) printf("%d",s.a[i]);
}
程序运行后的输出结果是( )
A)2,4,3,9,12,12,11,11,18,9, B)3,4,2,7,9,8,6,5,11,10,
C)2,3,1,6,8,7,5,4,10,9, D)1,2,3,6,8,7,5,4,10,9,
【答案】A
【解析】首先分析题目中的f()函数,函数中只有一个for循环,循环了参数n-1次,每次循环令指针参数a所指数组中对应的元素自增循环变量i,即循环结束时让a[0]+=0、a[l]+=1、a[2]+=2??。主函数中,首先定义了一个结构体s,并初始化为{lO,{2,3,l,6,8,7,5,4,10,9}}。然后,使用该结构体的两个成员为参数调用函数f().由此可见,调用的结果会令结构体s的数组成员a的元素a[0]~a[8]分别自增0~8,即函数返回时,s中的内容应该为{10,{2+0,3+1,1+2,6+3,8+4,7+5,5+6,4+7,10+8,9}}={10,{2,4,3,9,12,12,1l,1l,18,9}}。故本题应该选择A。
24. 有以下程序段
typedef struct node { int data; struct node *next; } *NODE;
NODE p;
以下叙述正确的是( )
A)p是指向struct node结构变量的指针的指针
B)NODE p;语句出错
C)p是指向struct node结构变量的指针
D)p是struct node结构变量
【答案】C
【解析】本题考查了typedef关键字的用法。使用关键字typedef可以为已有类型名定义一个新类型名。其语法格
式为:
typedef<已有类型名><新类型名>
typedef类型说明并没有真正地定义新的数据类型,它只是相当于给某个已有的数据类型起了一个别名。本题的typedef语句中,“struct node{int data;struct node*next;}*”就是<已有类型名>,给这个已有类型所起的别名就是NODE。所以,下面的定义语句可以将NODE用“struct node{int data;struct node *next;}”替换掉,即完整的定义语句是“struct node{int data;struct node *next;}*p;”。由此可见,P是指向struct node结构变量的指针,故应该选择C。
25.有以下说明和定义语句
struct student
{ int age; char num[8];};
struct student stu[3]={{20,"200401"},{21,"200402"},{10\9,"200403"}};
struct student *p=stu;
以下选项中引用结构体变量成员的表达式错误的是
A) (p++)->num B)p->num C)(*p).num D)stu[3].age
【答案】D
【解析】本题考核的知识点是结构体数组元素成员的引用。结构体变量也有地址,因此可以把它的地址赋值给一个指针变量,然后通过该指针变量来引用结构体的成员,选项A和选项B就是通过指针变量来引用结构体的成员,故选项A和选项B都正确,也可以通过结构体数组元素的成员引用,选项C和选项D属于这种情况,而在选项D中stu[3].age不正确,因为结构体数组stu共有三个元素,其下标应该为0、l、2。所以,4个选项中选项D符合题意。
26.现有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中连续的三个结点。
struct node
{ char data; struct node *next;
}*p,*q,*r;
现要将q和r所指结点交换前后位置,同时要保持链表的连续,以下不能完成此操作的语句是
A)q->next=r->next;p->next=r;r->next=q;
B)p->next=r;q->next=r->next;r->next=q;
C)q->next=r->next;r->next=q;p->next=r;
D)r->next=q;p->next=r;q->next=r->next;
【答案】D
【解析】本题考查的是指针的应用。解本题的关键是理解题目中的要求“将q和r所
指结点交换前后位置,同时要保持链表的连续”。我们不妨先想想交换后的样子,应
该是像下面这个样子:
data next data next data next
??
↑p ↑r ↑q
然后比较一下交换前的样子,我们会发现,其中需要改变的指针只有3个:
(1)结点A的next指针从原来指向结点B变为指向结点C:
(2)结点C的next指针从原来指向结点C的后续结点变为指向结点B:
(3)结点B的next指针从原来指向结点c变为指向结点c的后续结点。在选项A中,语句q一>next=r一>next;实现了改变(3);p一>next=r;实现了改变(1);r>next=q;实现了改变(2)。所以选项A能够完成题目要求的操作,同样可以推出选项B和c也能够完成题目要求的操作,只不过操作的顺序不一样而已。而在选项D中,r->next=q;实现了改变(2):p->next=r;实现了改变(1);但q->next=r->next;已经无法实现改变(3)了,因为在执行第1条语句r->next=q;时,r->next已经指向了结点B,从而丢失了结点c的后续结点的位置。所以我们无论如何要在改变(2)之前实现改变(3),否则无法实现题目的要求,故应该选择D。
27.有以下程序段
struct st
{ int x; int *y;}*pt;
int a[]={1,2},b[]={3,4};
struct st c[2]={10,a,20,b};
pt=c;
以下选项中表达式的值为11的是
A)*pt->y B)pt->x
【答案】C
【解析】本题考查的是*、一>和++运算符的混合运算。要计算一个复杂的表达式时,首先要弄明白表达式中所有运算符的优先级与结合性,本题中所涉及的运算符中,一>的优先级最高,*和++的优先级相同,但其结合性为从右至左。所以选项A等价于*(pt一>y)也就是pt所指向的结构体的成员指针变量y所指向的内容。从前面的程序段不难看出,pt指向结构体数组c的首地址,也就是指向它的第1个元素,在它的第1个元素中,指针变量y又被初始化为指向整型数组a的首地址,即指向数组a的第1个元素。故选项A中的表达式的值为a[O],也就是1。选项B中表达式的值就是c[0].x,即10。根据优先级和结合性,选项C中的表达式等价于++(pt一>x),由于是前缀++,所以整个表达式的值为pt一>x的值加1.故为ll。而选项D中,++是后缀形式,所以(pt++)的值还是pt的原值,即等于pt一>x的值
bbs.99jianzhu.com内容:建筑图纸、PDF/word 流程,表格,案例,最新,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。