05级.docx
- 文档编号:4332194
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:12
- 大小:20.13KB
05级.docx
《05级.docx》由会员分享,可在线阅读,更多相关《05级.docx(12页珍藏版)》请在冰豆网上搜索。
05级
2005级本科《系统程序设计》期末考试试卷(A卷)
一、选择题(20道单选题,每题2分,共40分)
1.可用作C语言用户标识符的一组标识是()
a)voiddefineWORD
b)a3-3_123if
c)For_abcCase
d)2aDOsizeof
2.如果用8位的2的补码表示十进制的-10,下面哪个是正确的?
()
e)10001010
f)11110101
g)11110110
h)11111010
3.如果X=0x66,Y=0x93,则表达式X&&~Y等于()
i)0x00
j)0x01
k)0x42
l)0xFD
4.如果给出下列声明和s的初始化,表达式s[6]的值是:
()
chars[]="string";
m)一个不可预测的值
n)'\n'
o)'g'
p)'\0'
5.在C中,假设int类型数据占据4个字节,数组a的声明如下:
inta[10];并且数组a在内存中的起始地址为0x10000,那么a[5]的地址是()
q)0x10005
r)0x10014
s)0x10016
t)0x10020
6.在地址和整数都为32位宽的计算机里,编译器要为下面的代码片段分配多少字节的内存?
()
inta;
int*b=&a;
u)4
v)8
w)16
x)32
7.在基于IA32的计算机硬件体系中,如果规定结构成员对齐为4Bytes,那么,对于结构体
structS1{
inti;
charc;
intj;
};
其在内存中分配的字节数为:
()
y)3Bytes
zz)5Bytes
aa)9Bytes
bb)12Bytes
8.按照下列声明的顺序,最后一行可以改写为:
()
inta[10];
ptr=a+5;
*ptr++=x;
cc)a[6]=x;
dd)ptr=x;*ptr++;
ee)ptr=ptr+1;*ptr=x;
ff)a[5]=x;ptr=ptr+1;
9.对于char*pa[10];的描述,()是正确的
gg)pa是一个指向数组的指针,所指向的数组是10个char型元素
hh)pa是一个指向某数组中第10个元素的指针,该指针是char型变量
ii)pa[5]表示某个数组的第5个元素的值
jj)pa是一个具有10个元素的指针数组,每一个元素是一个char型指针
10.下面的程序会()
main(){
intx=10,y=5,z=5;
if(z=x-2*y)printf(“****”);
elseprintf(“####”);
}
kk)有语法错误不能通过编译
ll)可以通过编译,但不能通过连接,因而不能运行
mm)输出****
nn)输出####
11.考虑下面的代码:
chara[100];
a[99]=*((char*)(((int)&a[0])+4))
如果整数为32位宽,下面哪个值等于a[99]?
()
oo)a[0]+4
pp)a[3]
qq)a[4]
rr)theintegerstoredinthebytesa[4],a[5],a[6]anda[7]
12.考虑一下代码片段:
#include
intcallee(void){
intcount=5;
printf("%d",(int)&count);
returncount;
}
intmain(intargc,char*argv[]){
intcount=4;
count=callee();
printf("%d",(int)&count);
return0;
}
下面哪项正确地描述了程序输出结果?
()
ss)两个不同的整数被打印,并且从所给信息无法得知其中的任何一个值
tt)同一个整数被打印两次,并且它的值无法从所给信息中得知
uu)5在同一行被打印两次
vv)5和4按顺序在同一行被打印
13.阅读下列代码,判断下面几句话中哪句关于输出的描述是正确的?
()
inti;
int*jp=&i;
intmain(inti,char*argv[]){
printf("%d%d\n",(int)&i,(int)jp);
}
ww)两个不同的整型数
xx)两个完全相同的整型数
yy)无结果,因为代码含糊无法编译
zzz)两个值,其中一个是4,另一个比4小
14.考虑下面的代码片断:
intfactorial(int*arg){
intn=*arg;
if(n==1)returnn;
returnn*factorial(n-1);
}
在上面的代码片段执行过程中,变量n被分配到()
aaa)许多地址,并且编译器不知道其中的任何一个地址
bbb)编译器选定的许多地址
ccc)仅一个地址,并且该地址由编译器选定
ddd)仅一个地址,并且编译器不知道该地址
15以下程序的输出结果是()
#include
func1(inta,intb)
{
return(a+b);
}
func2(inta,intb)
{
return(a-b);
}
func3(int(*t)(),intx,inty)
{
return(*t)(x,y);
}
main()
{
intx,(*p)(int,int);
p=func1;
x=func3(p,9,3);
x+=func3(func2,8,3);
printf(“%d\n”,x);
}
eee)3
fff)9
ggg)17
hhh)27
16.下面哪一个负责数据从CPU寄存器到缓存的传输?
()
iii)硬件
jjj)操作系统
kkk)寄存器
lll)编译器
17.假设你的计算机是32位,具有128个32字节的直接映射缓存线。
在下面的代码中,编译器在地址0x800000处分配数组a,在地址0x801000处分配数组b。
在该代码执行前,假设a和b从未被使用,因此它们不会在缓存中。
请问,在执行这段代码时,a和b数组能够从内存读入缓存的最小字节分别是多少?
()
intb[1024];
inta[1024];
for(i=0;i<17;sum+=a[i]+b[i],i++);
mmm)17
nnn)68
ooo)96
ppp)1088
18.通过调用以下的函数,关于缓存的哪些事实能够判定?
()
intdata[1<<20];
voidcallee(intx){
inti,result;
for(i=0;i<(1<<20);i+=x){
result+=data[i];
}
}
I.缓存线大小
II.缓存大小
III.缓存速度
qqq)只有I
rrr)I和II
sss)I和III
ttt)I、II和III
19下面哪个对存储层次结构(memoryhierarchy)的描述正确?
()
uuu)存储层次结构使得代码执行变慢,但是允许它们规模增加
vvv)存储层次结构既利用了SRAM的速度,又考虑了磁盘的空间
www)存储层次结构是一种决定内存分配策略的方法
xxx)存储层次结构限制了程序的大小,但是允许它们执行得更快
20阅读下面C代码片段:
charq[]="donotoverflow";
charr[]="memory";
chars[24];
strcpy(s,q);
strcat(s,r);
intlen=strlen(s);
问:
当该代码片段执行完毕时,变量len的值是()
yyy)21
zzzz)22
aaaa)23
bbbb)24
二、改错题。
请指出下面代码的错误之处,给出正确代码,并说明错误的原因。
(1-6题每题2分,7-10题每题3分,共24分)
示例:
y=x*300.0f-2000.0(缺少结束符“;”)正确代码:
y=x*300.0f-2000.0;
1、程序员意图:
由用户输入变量i和d的值,然后由系统输出。
(2分)
inti;
doubled;
scanf("%d%g",i,d);
printf("%d%g",i,d);
2、程序员意图:
数组动态分配,并给某一数组成员赋值。
(2分)
#defineARRAY_SIZE100
int*a=(int*)malloc(ARRAY_SIZE);
a[99]=0;
3、程序员意图:
如果指针a指向的值大于0,则使该值减去1。
(2分)
voiddec_positive(int*a)
{
*a--;//decrementtheinteger
if(*a<0)*a=0;//makesureaispositive
}
4、程序员意图:
动态分配一个A[m][n]的数组,并充分考虑代码在不同硬件上的通用性。
(2分)
int**makeArray1(intn,intm)
{
inti;
int**A=(int**)Malloc(n*sizeof(int));
for(i=0;i A[i]=(int*)Malloc(m*sizeof(int)); returnA; } 5、程序员意图: 动态分配及释放内存。 (2分) voidmy_write(x) { ...usex... free(x); } int*x=(int*)malloc(sizeof(int*)*N); ... my_read(x); ... my_write(x); free(x); 6、程序员意图: 动态分配及释放内存。 (2分) voidmy_write(x) { ...usex... free(x); } int*x=(int*)malloc(sizeof(int*)*N); ... my_read(x); ... my_write(x); ... my_read(x); ... my_write(x); } 7、程序员意图: 初始化一个堆,存放错误信息。 (3分) voidmy_function(char*msg) { //allocatespaceforastring char*full_msg=(char*)malloc(strlen(msg)+100); strcpy(full_msg,"Thefollowingerrorwasencountered: "); strcat(full_msg,msg); if(! display(full_msg))return; ... free(full_msg); } 8、程序员意图: 声明一个结构体,给它及其成员分配内存空间,程序执行完毕后释放资源。 (3分) typedefstruct{ char*name; intage; char*address; intphone; }Person; voidmy_function() { Person*p=(Person*)malloc(sizeof(Person)); p->name=(char*)malloc(M); ... p->address=(char*)malloc(N); ... free(p); } 9、程序员意图: 搜索一个符合条件的指针。 (3分) int*search(int*p,intval) { while(*p&&*p! =val) p+=sizeof(int); returnp; } 10、程序员意图: 将array数组初始化为从0到9的10个数。 (3分) #defineARRAY_SIZE10 voidnatural_numbers(void){ inti; intarray[ARRAY_SIZE]; i=1; while(i<=ARRAY_SIZE){ array[i]=i-1; i=i+1; } } 三、简答与计算题(36分) 1.解释静态分配与动态分配的概念及它们的不同点,并说明它们的用途。 (6分) 静态分配在全局中声明变量,或在函数体中用static,在声明时若没被赋初值则赋为0,放置于栈的最低层中,生命周期是整个程序的生命周期。 在编译阶段决定。 动态分配通过在函数调用中声明局部变量实现,生命周期是此函数的生命周期,动态分配有堆分配与栈分配2种方式。 2.简述使用堆栈进行函数调用的过程。 (6分) 第一步: 压参,由右至左入栈 第二步: 压入函数返回地址。 第三步: 压入FramePointer。 第四步: 压入声明的变量 第五步: 执行函数的代码 第六步: 将返回值压入寄存器中。 第七步: 将SP设定至为FramePointer 第八步: 弹出栈顶元素(FramePointer) 第九步: 弹出栈顶元素(ReturnAddress)并返回函数 简要解释80/20原理和Amdahl定律。 说明对代码进行性能定量量测可以采用哪些方法,这些方法各自具有哪些优点,又具有哪些缺点。 (6分) 直意为80%时间是由20%的代码耗费的,也就是每个程序都存在性能提升的瓶颈,只要克服了这个瓶颈,性能就会大大提升。 Amdahl定律为(公式),揭示了被优化的代码在被优化后与优化前的时间对比。 3.请画出计算机中内存层次结构的金字塔结构,并说明内存缓存(cache)的优点。 (6分) 4.3M决定在白纸上印黄方格,做成小贴纸。 这个过程中,他们需要设置方格中每个点的CMYK(蓝色,红色,黄色,黑色)值。 3M雇佣你判定下面算法在一个2048字节、直接映射、块大小为32字节的数据高速缓存上的有效性。 有如下定义: structpoint_color{ intc; intm; inty; intk; }; structpoint_colorsquare[16][16]; inti,j; 有如下假设: ●sizeof(int)==4; ●square起始于存储器地址0; ●高速缓存起始为空; ●惟一的存储器是对于square数组中的元素。 变量i和j被存放在寄存器中。 a.确定下列代码的高速缓存性能: for(i=0;i<16;i++){ for(j=0;j<16;j++){ square[i][j].y=1; } } for(i=0;i<16;i++){ for(j=0;j<16;j++){ square[i][j].c=0; square[i][j].m=0; square[i][j].k=0; } } 写总数是多少? 在高速缓存中命中的写总数是多少? 命中率是多少? (6分) b.要提高a小题中代码的缓存命中率,可以采取什么方法? (即怎样改写代码? )写出改写后的代码,并计算出你改写后的代码的命中率,以证明代码确实已改良。 (6分)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05