第八次上机作业理论题.docx
《第八次上机作业理论题.docx》由会员分享,可在线阅读,更多相关《第八次上机作业理论题.docx(12页珍藏版)》请在冰豆网上搜索。
第八次上机作业理论题
理论题期末考试前提交即可
一、选择题
1.下面对结构体数据类型的叙述中__________是错误的。
A.结构体变量可以在说明结构类型后定义,也可在说明结构类型时定义
B.结构体可由若干成员组成,各成员的类型可以不同
C.定义一个结构体类型后,编译程序要为结构体的各成员分配存储空间
D.结构体变量的各成员可通过结构体变量名和指向结构体变量的指针引用
2.对于一个共用体类型的变量,系统分配给它的内存大小是___________。
A.成员中内存需求量最大者的容量
B.第一个成员所需的容量
C.各成员所需容量的总和
D.最后一个成员所需的容量
3.设有如下定义语句:
structSD
{intx;
floaty;
}ND;
则下面叙述中不正确的是__________。
A.struct是结构体类型的关键字
B.ND是用户自定义的结构体类型名
C.structSD是用户自定义的结构体类型名
D.x和y都是结构体成员名
4.对于下列程序段:
structSD
{intx; floaty;};
structSDa[3]={{1001,3.5},{1002,4.5},{1003,4.0}},*p;
p=a;
则下面不正确的使用是__________。
A.(++p)->x B.p++ C.(*p).y D.p=&a[0].x
5.设有定义语句“struct{intx;inty;}a[2]={{2,3},{2,8}};”,则printf("%d\n",a[0].y/a[0].x*a[1].y);的输出结果是___________。
A.3 B.2 C.12 D.8
6.若有以下程序段:
structSD
{intx;
int*r;
};
inta=1,b=2,c=3;
structSDs[3]={{1001,&a},{1002,&b},{1003,&c}};
main()
{structSD*p;
p=s;
……
}
则以下表达式中值为2的是_________。
A.*(++p)->r B.*(p++)->r
C.(*p).r D.(p++)->r
7.有以下结构体类型的说明和变量定义,并给出图示,则选项中不能把结点b连接到a之后的语句是__________。
data next data next
a b
p q
structND
{chardata;
structND*next;
}a,b,*p=&a,*q=&b;
A.a.next=q; B.p.next=&b; C.p->next=&b; D.(*p).next=q;
8.以下说法中正确的是__________。
A.一个结构只能包含一种数据类型
B.不同结构中的成员不能有相同的成员名
C.两个结构变量不可以进行比较
D.关键字typedef用于定义新的数据类型
9.有说明:
enummoney{Fen,Jiao,Yuan=100,Tenyuam};
每个枚举量所对应的实际值为__________。
A.0,1,100,101 B.1,2,100,101
C.Fen,Jiao,Yuan,Tenyuam D.Fen,Jiao,100,Tenyuam
10.以下程序的输出结果是__________。
#include
main(){printf("%d",NULL);}
A.0 B.'\0' C.1 D.无定义
11.值为6的表达式为__________。
structst{intn;structst*next;}
staticstructsta[3]={5,&a[1],7,&a[2],9,’\0’},*p;
p=&a[0];
A.p++->n B.p->n++ C.(*p).n++ D.++p->n
12.对以下结构体变量example中成员x的引用正确的是__________。
struct
{int x;
int y;
}example,*p=&example;
A.(*p).example.x B.(*p).x C. p->example D.p.example.x
二、基本概念填空题
1.完成下列表格(表1):
表1结构体与共用体变量的对比表
问题
结构体
共用体
变量定义格式
什么因素决定了变量的大小
对成员的引用方法
改变一个成员的值是否影响其他成员的值
可否为变量各成员初始化
2.完成下列表格(表2):
表2简单数据类型与结构体、共用体的对比表
问题
char/int/float
指针
结构体
共用体
数据类型是否需要单独定义
是否有明确的数值范围
是否可以用scanf、printf直接输入输出
是否可以直接进行关系运算
3.“.”称为__________运算符,“->”称为__________运算符。
4.若有以下定义语句,则变量x在内存中所占的字节数是___________。
unionUN
{floatr;
chars[6];};
structST
{unionUNu;
floatv[5];
doublew;}x;
5.structst
{inta;
structstb;
}*p,x;
p=&x;
x.b的另外两种引用形式是:
____________________、____________________。
6.有定义和赋值语句:
unionaa
{longj;
charc;};
structst
{inta[4];
doublet;
unionaac;
}w[3],*pw;
pw=w;
数组w元素所占字节数是_____,w[0]的a[3]成员表示为:
________________,w[1]的c中c元素的引用形式为:
_______________________用pw引用w[0]中a[1]的两种形式是:
________________________、________________________用pw引用w[0]的c中的c元素的两种形式是:
________________________、_______________________。
三、阅读程序题
1.以下程序的输出结果是________。
enumweek{SUN=7,MON=1,WED,TUS,FRI,SAT};
main()
{printf("%d",hour(FRI,SUN));}
hour(intx,inty)
{if(y>x)return24*(y-x);
elsereturn-1;
}
2.以下程序的输出结果是___________。
(字符0的ASCII码值为16进制的30)
main()
{union
{charc;
charb[4];
}z;
z.b[0]=0x39;z.b[1]=0x36;
printf("%c\n",z.c);
}
3.以下程序的输出结果是___________。
main()
{union{intcount[2];
charch[4];}un;
int i;charletter=6;
for(i=0;i<4;i++)un.ch[i]=letter++;
for(i=0;i<2;i++)printf("%d:
%x,",i,un.count[i]);}
四、完善程序题
1.下列程序的功能是计算前一天是星期几。
enumday{sun,mon,tue,wed,thu,fri,sat};
enumdayday_after(d)
enumdayd;
{return((enumday)__________);
}
main()
{printf("%d\n",day_after(5));}
2.设某班级有学生30名,学期末统计每位学生各课程成绩总分后,将前10名学生的学号、姓名、总分张榜公布,以下程序输出张榜清单。
#defineN30
main()
{struct STU
{long num;
char name[20];
int score;
};
struct STU a[N],t;
inti,j,k;
for(i=0;iscanf("%ld%s%d",&a[i].num,a[i].name,&a[i].score);
for(i=0;i{k=i;
for(j=i+1;jif(a[j].score>a[k].score)k=j;
if(i!
=k)
{__________;__________;__________;}
}
printf("Number Name Score\n");
for(i=0;i<10;i++)
printf("%-10ld%-10s%-8d\n",a[i].num,a[i].name,a[i].score);
}
3.某高三毕业班有三名同学(Guo、Liu、Hu)获得全国数学竞赛二等奖,现只有一个南京大学的保送名额,必须通过投票选举出得票最高的同学保送南大。
假设全班共有50名同学全部参加了投票,每人推举一名候选人,选票全部有效。
以下程序输出三名候选人的得票数。
#defineN50
#include"string.h"
structHXR
{charname[10];
intdps;
};
main()
{structHXRstu[3]={{"Guo",0},{"Liu",0},{"Hu",0}};
inti,j;
charname[10];
for(i=0;i{_____________________;
for(j=0;j<3;j++)
if(strcmp(name,stu[j].name)==0)_____________________;}
printf("Name Depiaoshu:
\n");
for(i=0;i<3;i++)
printf("%-5s%-3d\n",stu[i].name,stu[i].dps);}
4.以下程序用“比较计数”法对结构体数组a按成员num进行降序排列。
“比较计数”法的基本思想是:
通过另一成员a[i].con记录数组a中排在a[i]之前的元素的个数,每两个元素只比较一次。
最终,a[i].con的值就代表a[i].num在a中的排序位置。
#defineN8
struct
{intnum,con;}a[N];
main()
{inti,j;
for(i=0;i{scanf("%d",&a[i].num);
a[i].con=0;}
for(i=N-1;i>=1;i--)
for(j=i-1;j>=0;j--)
if(a[i].num________________;
else
________________;
for(i=0;iprintf("%d,%d\n",a[i].num,a[i].con);
}
5.设已经建立了一条链表,链表上结点的数据结构为:
structnode
{floatEnglish,Computer; /*英语成绩和计算机成绩*/
structnode*link;};
求出该链表上的结点个数、英语的总成绩和计算机的总成绩,并在链首增加一个新结点,其分量English和Computer分别存放这两门课程的平均成绩。
若链为空链时,链首不增加结点。
以下函数ave()的第一个参数h指向链首,第二个参数count所指对象存放求出的结点个数。
structnode*ave(structnode*h,int*count)
{structnode*p1,*p2;
floatse=0.0,sc=0.0;
*count=0;
if(h==NULL)
________________;
p1=h;
while(________________)
{se+=p1->English;
sc+=p1->Computer;
*count=*count+1;
________________;}
p1=(structnode*)malloc(sizeof(structnode));
p1->English=se/*count;
p1->Computer=sc/*count;
________________;
h=p1;
returnh;
}
6.已知某链表中结点的数据结构定义如下:
#include
structnode
{intx;
structnode*next;};
函数loop的功能是:
根据dir的值循环移位head指向的链表中的所有结点,当dir为正数时实现循环右移一次,否则循环左移一次。
函数返回链表首结点的指针。
例如,移位前的链表数据:
head->1->3->5->4,
右移一次后的链表数据:
head->4->1->3->5。
算法提示:
循环右移时,将链表最后一个结点删除,再将其插入到链表首部;循环左移时,将链表第一个结点删除,再将其连接到链表尾部。
structnode*loop(structnode*head,intdir)
{structnode*p1,*p2;
p1=head;
if(p1==NULL||p1->next==NULL)returnhead;
if(dir>0)
{while(p1->next)
{p2=p1;p1=p1->next;}
________________=NULL;
p1->next=________________;
head=p1;}
else
{head=________________;
p2=head;
while(p2->next)p2=p2->next;
________________________________;
p1->next=NULL;}
returnhead;
}