公共部分(50分)
1:从资源管理(分配)的角度出发,I/O设备可分为______ _、 _______和_ _ _____三种类型。独占,共享,虚拟 (顺序可交换) (6分)
2:文件的物理组织有顺序、 _______和索引。链接(2分)
3:进程从运行状态进入就绪状态的原因可能是___ D ____。(4分)
A.被选中占有处理机 就绪——运行
B.等待某一事件// 运行——阻塞
C.等待的事件已发生 阻塞——就绪
D.时间片用完
4:作业调度程序从处于___ D ____状态的队列中选择适当的作业投入运行。(4分)
A.运行 B.提交 C.完成 D.后备
5:按照瀑布模型的阶段划分,软件测试可以分为单元测试,集成测试,系统测试。请问以下哪项测试不属于系统测试的内容( B)(4分)
- 压力测试
- 接口测试
- 功能测试
- 安全测试
- 性能测试
6:测试用例的设计是测试的重要阶段。系统测试用例设计应该从什么时候开始(A)(4分)
- 需求完成
- 详细设计完成
- 编码完成
- 系统集成完毕,提交系统测试
7:在UML方法中,使用多种类型的图形来帮助进行设计,请问以下哪些图形不是UML的图形类型( B )(4分)
- 类图
- 实体关系图
- 序列图
- 活动图
8:解释文件系统为什么会存在数据冗余?这种数据冗余会导致哪两类典型的问题?
(10分)
由于文件系统难于实现数据共享,因此,相同的数据可能会在多个文件中重复出现,即产生数据冗余。(6分)
数据冗余会导致数据(或更新)异常(2分)和数据不一致性(2分)
9:简述中断装置的主要职能。(12分)
中断装置的职能主要有三点:
1)检查是否有中断事件发生。(4分)
2)若有中断发生,保护好被中断进程的断点及现场信息,以便进程在适当时候能恢复驼行。(4分)
3)启动操作系统的中断处理程序。(4分)
C++部分(50分)
- 使用操作符setw对数据进行格式输出时,需要包含( )文件。C(4分)
A iostream.h B fstream.h C iomanip.h D stdlib.h
- 数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示( )。B(4分)
A、a[1][0]+2 B、a数组第1行第2列元素的地址
C、a[0][1]+2 D、 a数组第1行第2列元素的值
int a[3][4];
如以上定义的a数组,则可视a数组由a[0]、a[1]、a[2]等三个元素组成,而a[0]、a[1]、a[2]等每个元素又分别是由4个整型元素组成的一维数组。我们已知a[i]也可以写成:*(a+i),所以*(a+1)代表a[1],再加2表示a数组第1行第2列元素的地址。
- 以下结构类型可用来构造链表的是( )。B(4分)
A structaa{ int a;int * b;}; B struct bb{ inta;bb *b;};
C structcc{ int * a;cc b;}; D struct dd{ int * a;aa b;};
- 设int f(int);和int g(int);是函数f和g的原形,以下将f作为语句调用的是( )。B(4分)
A g(f(3)) B f(g(3)) C g(f(3)+2) D p= f(g(3)+1)
5. 若类A和类B没有继承关系,对于函数void func(A&) ,请至少用两种不同方法说明如何才能传递一个非常量的B类对象给func函数。(8分)
可在A类中定义一个构造函数:A(const B&);(4分)
或在B类中定义一个自动转换函数: operator A( )const;(4分)
6. 请问以下程序将输出什么结果?(14分)
char *RetMemory(void)
{
char p[] =“hello world”;
return p;
}
void Test(void)
{
char *str =NULL;
str = RetMemory();
printf(str);
}
可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
7. static有什么用途?(请说明三种)(12分)
(1)使得变量或对象的存储形式变成静态存储;(4分)
(2)它会把变量的可见范围限制在编译单元中,使它成为一个内部连接;(4分)
(3)类中的static成员。(4分)
公共部分(40分)
1:操作系统的主要组成部分?(8分,每点2分)
进程和线程的管理,存储管理,设备管理,文件管理
2:Internet采用哪种网络协议?该协议的?(10分)
Internet采用TCP/IP协议(2分)
物理层,(2分)数据链路层,(2分)网络层(IP) (2分),应用层(2分)
3:解释文件系统为什么会存在数据冗余?这种数据冗余会导致哪两类典型的问题?(8分)
由于文件系统难于实现数据共享,因此,相同的数据可能会在多个文件中重复出现,即产生数据冗余。(4分)
数据冗余会导致数据(或更新)异常(2分)和数据不一致性(2分)
4:简述中断装置的主要职能。(6分)
中断装置的职能主要有三点:
1)检查是否有中断事件发生。(2分)
2)若有中断发生,保护好被中断进程的断点及现场信息,以便进程在适当时候能恢复运行。(2分)
3)启动操作系统的中断处理程序。(2分)
5:什么是虚拟设备?为什么在操作系统中引入虚拟设备?(8分)
虚拟设备是通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户进程同时使用,通常把这种经过虚拟技术处理后的设备称为虚拟设备。(4分)
在操作系统设备管理中,引入虚拟设备是为了克服独占设备速度较慢、降低设备资源利用率的缺点,从而提高设备的利用率。(4分)
C++部分(60分)
- 定义一个类模板与定义一个类函数模板的格式相同,必须以关键字_________开始。template(3分)
- 16位计算机中整型占__________个字节存储空间。2(3分)
3. 下列各种函数中,( )不是类的成员函数。C(4分)
A 构造函数 B 析构函数 C 友元函数 D 拷贝构造函数
4.假定DD为一个类,则执行“DD a[10],*P”语句时,系统自动调用该类构造函数的次数为( )B(4分)
A、11 B、10 C、1 D、0
5.循环while(int i=0) i–;执行次数是( )。A(4分)
A 0 B 1 C 5 D 无限
i=0 ,i被视为判断变量,0转成bool是false,所以while没进去,C里面int 和 bool 可以相互转换, 整数0视为false,其他整数视为true
6.若类A和类B没有继承关系,对于函数void func(A&) ,请至少用两种不同方法说明如何才能传递一个非常量的B类对象给func函数。(10分)
可在A类中定义一个构造函数:A(const B&);(5分)
或在B类中定义一个自动转换函数: operator A( )const; (5分)
!7.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?(20分)
static全局变量与普通全局变量的区别:前者在主函数之前就要被初始化,(2分)后者无要求。(2分)
static局部变量和普通局部变量的区别:static全句变量是所有函数共享的变量,在一个函数使用完它后它的值会保持到下一个函数来改变它(2分)。后者,本函数所声明的局部变量在本函数运行完之后会被销毁。(2分)
static函数与普通函数的区别:static的可以用类来访问(就是不用初始化一个类就直接使用这个类的这个static方法);(2分)非static的只能通过对象来访问(2分)。static的定义里不能用到类内部非static变量值。(3分)static在循环中定义并赋值时,定义过程只进行一次,而不是每个循环1次。(3分)
(1)static全局变量与普通的全局变量有什么区别?
答:全局变量的说明之前再加以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
(2)static局部变量和普通局部变量有什么区别?
答:static局部变量只被初始化一次,下一次依据上一次结果值;
(3)static函数与普通函数作用域有什么不同点?
答:仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
(4)static函数与普通函数有什么区别?
答:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
8.写出此函数的功能(12分)
struct StrNode {
charname[15]; //字符串域
StrNode *next; //指针域
};
void QB(StrNode* & f ,int n) {
if (n==0) {f=NULL; return; }
f=new StrNode;
cin>>f->name;
StrNode * p=f;
while (–n) {
p=p->next=newStrNode;
cin>>p->name;
}
p->next=NULL;
}
建立一个具有n个结点的链表,每个结点的字符串值由键盘输入,链表的表头指针由引用变量f带回。
公共部分(50分)
1:分时操作系统通常采用___ B ____策略为用户服务。(4分)
A.可靠性和灵活性
B.时间片轮转
C.短作业优先
D.时间片加权分配
2:进程从运行状态进入就绪状态的原因可能是___ D ____。(4分)
A.被选中占有处理机
B.等待某一事件
C.等待的事件已发生
D.时间片用完
3:不能激活触发器执行的操作是:( D)(4分)
A.DELETE B.UPDATE C.INSERT D.SELECT
4:简述中断装置的主要职能。(6分)
中断装置的职能主要有三点:
1)检查是否有中断事件发生。(2分)
2)若有中断发生,保护好被中断进程的断点及现场信息,以便进程在适当时候能恢复运行。(2分)
3)启动操作系统的中断处理程序。(2分)
5:面向连接和非连接的服务的特点是什么(8分)
面向连接的服务,通信双方在进行通信之前,要事先在双方之间建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时地监控和管理。(4分)
而非连接的服务,不需要预先建立起一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往“网络”上送出信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。(4分)
6:请给出预防死锁的若干方法(6分)
预防死锁通常有以下两种方法:
(1)一次封锁法,就是要求每个事务必须一次将所有要使用的数据全部加锁,否则该事务不能继续执行;(3分)
(2)顺序封锁法,是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
(3分)
4:写出以太网数据帧格式。(10分,每点2分)
目的地址 | 源地址 | 类型 | 数据 | CRC |
7:主键和唯一索引的区别(8分,每点2分)
A 主键顺序为数据的物理顺序
B 主键不能空,唯一索引可以为空
C 主键每个表只能有一个,唯一索引可以多个
D 主键:默认将是聚簇索引唯一索引:默认将是非聚簇索引
主键可以被其他表引用为外键,而唯一索引不能。
C++部分(50分)
- 表达式8&3的结果是__________。0(2分)
- 设一维整型数组data已进行了初始化,则其元素个数可由操作符sizeof通过表达式__________________________计算出来。sizeof(data/data[0]) (2分)
3.在继承机制下,当对象消亡时,编译系统先执行________的析构函数,然后再执行_______的析构函数。子类 父类(4分)
4. 设int f(int);和int g(int);是函数f和g的原形,以下将f作为语句调用的是( )。B(3分)
A g(f(3)) B f(g(3)) C g(f(3)+2) D p= f(g(3)+1)
5.设int *p2=&x,*p1=a;p2= *b;则a和b的类型分别是( )。B(3分)
A int *和int B int *和int **
C int 和int* D int *和int *
6. 程序员规范中要求不要写出类似(++i)+(i++)或 f(++i,i++)这样的代码,请说明原因。(8分)
计算子表达式的顺序由编译器决定的,虽然参数的压栈顺序在给定的调用方式下式固定的,但参数表达式的计算顺序也由编译器决定的。不同的编译器或不同的表达式计算的顺序可能不一致。
7. 说明类中的public、 protected和 private成员函数分别在public、protected和private继承方式下在派生类中的可访问性。(10分)
重点是基类中的任何Private在派生类中都是不可访问的。
8. 请指出这个程序里的不正确的地方(18分)
char*getString()
{
return(char*)malloc(800);
}
int main()
{
char *str;
str =getString();
pintf(“%s”,str);
return 0;
}
错误在于:
在前面的函数中。malloc分出来的空间被放在了一个栈上面,是动态分配的,指向堆,而不是指向栈
主函数使用了这个函数后操作系统后弹出栈顶
也就是这块空间被shi放了(9分)
后面那个printf打印的本来是指向栈顶的那个地址的。。
但现在弹出了
所以不知道指到哪里去了
也不会得到自己想要的打印结果(9分)
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
公共部分(50分)
1:作业调度程序从处于___ D ____状态的队列中选择适当的作业投入运行。(3分)
A.运行 B.提交 C.完成 D.后备
2. SQL语言中,删除一个表的命令是( B)(3分)
A.CLEARTABLE B.DROP TABLE C.DELETETABLE D.REMOVE TABLE
3:ATM采用的线路复用方式为 C 。 (3分)
A. 频分多路复用
B. 同步时分多路复用
C. 异步时分多路复用
D. 独占信道
4:数据库中只存放视图的( C)(3分)
A.操作 B.对应的数据
C.定义 D.限制
5:什么是虚拟设备?为什么在操作系统中引入虚拟设备?(10分)
虚拟设备是通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户进程同时使用,通常把这种经过虚拟技术处理后的设备称为虚拟设备。(5分)
在操作系统设备管理中,引入虚拟设备是为了克服独占设备速度较慢、降低设备资源利用率的缺点,从而提高设备的利用率。(5分)
6:TCP为何采用三次握手来建立连接,若采用二次握手可以吗,请说明原因?(16分)
三次握手是为了防止已失效的连接请求再次传送到服务器端。 (6分)
二次握手不可行,(2分)因为:如果由于网络不稳定,虽然客户端以前发送的连接请求以到达服务方,但服务方的同意连接的应答未能到达客户端。则客户方要重新发送连接请求,若采用二次握手,服务方收到重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费(8分)。
7:什么是分布式数据库?(12分,每点4分)
数据库分布在计算机网络的不同计算机上,
网络中的每个节点具有独立处理的能力(场地自治),可以执行局部应用,
同时,每个节点也能通过网络通信子系统执行全局应用。
C++部分(50分)
- 设有“int w[3][4];”,pw是与数组名w等价的数组指针,则pw的初始化语句为____________________ int (* pw)[4]=w;(3分)
是因为二维数组元素在内存的排列是按行优先在内存连续排列的,如果你定义中只给出了总行数,系统是没有办法为定义的数组确定所需存储空间的。只要明确了二维数组的列的总数,数组元素向后排列就可以啦,给定了列数,就是确定二维数组以行为单位的存储空间。
- 要使引用pr代表变量“char *p;”,则pr的初始化语句为_______________ 。
char *&pr=p;(3分)
3.“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if语句为:if ( n == 0 ),则BOOL flag与“零值”比较的 if语句为:____________________________;float x与“零值”比较的 if语句为:____________________________。(6分)
if ( flag )
const float EPSINON =0.00001; if ((x >= – EPSINON) && (x <= EPSINON))
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
EPSINON应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关
最好定义一个符号常量来做。#define EPSINON 1e-6
4. 设有如下语句:(3分)
int x;
( )
*px=0;
则选择以下哪条语句可将x值置为0。C
A int * px; B int const * px=&x;
C int *const px=&x; D const int * px=&x;
5. 设void f1(int * m,long & n);int a;long b;则以下调用合法的是( )。B(3分)
A f1(a,b); B f1(&a,b);
C f1(a,&b); D f1(&a,&b);
6. 请写出如下代码的运行结果(6分)
int main()
{
int a,b,c,d;
a=0;
b=1;
c=2;
d=3;
printf(“%d”,a+++b+c+++d++);
}
6
7. 写出下面函数的功能(12分)
template<class Type>
void WE(Typea[],Type b[],int n) {
for (int i=0;i<n; i++)
b[n-i-1]=a[i];
}
模板函数,把数组a的每个元素按逆序放入数组b中。
8. 写一段代码判断一个单向链表中是否有环。(14分)
给出如下结构:
struct node
{
struct *next;
};
typedef stuctnode Node;
bool getCycle(){
Node* temp1 =head;//(假设head就是这个链表的头)
Node* temp2 =head;
while(head->next!=NULL)
{
temp1 =temp1->next;//步长为1
temp2 =temp2->next->next;//步长为2
if(temp1 ==temp2)
return ture;
head=head->next;
}
return false;
}
公共部分(50分)
1:恢复和并发控制的基本单位是__ ______ 事务 (2分)
2:知学生关系:R(学号,姓名,系名称,系地址),每一名学生属于一个系,每一个系有一个地址,则R规范化程度属于___ ___2NF(2分)
3:P地址为 140.111.0.0的B类网络,若要切割为9个子网,而且都要连上Internet,请问子网掩码设为(D)。(3分)
A. 255.0.0.0
B. 255.255.0.0
C. 255.255.128.0
D. 255.255.240.0
4:当关系R和S做自然联接时,能够保留R中不满足连接条件记录的操作是( A )(3分)
A.左外联接 B.右外联接 C.内部连接 D.全外联接
5:简述中断装置的主要职能(12分,每点4分)
中断装置的职能主要有三点:
1)检查是否有中断事件发生。
2)若有中断发生,保护好被中断进程的断点及现场信息,以便进程在适当时候能恢复驼行。
3)启动操作系统的中断处理程序。
6:ISO网络协议主要层次结构?(14分,每点2分)
物理层,数据链路层,网络层、传输层、会话层、表示层、应用层。
(考察点:注意顺序,不要和tcp混淆)
7:假设有一个“职工”表,表结构如下:(14分)
职工号 | 姓名 | 年龄 | 月工资 | 部门号 | 电话 | 办公室 |
1 | 张三 | 25 | 2000 | 1 | 12345 | 101 |
2 | 李四 | 26 | 1500 | 1 | 54321 | 102 |
3 | 王五 | 23 | 900 | 2 | 23456 | 201 |
….. | …. | ….. | …… | ……. | …… | …….. |
问题:
查询每个部门中月工资最高的“职工号”的SQL查询语句如下:
SELECT 职工号 FROM职工 AS A
WHERE 月工资=(SELECT MAX(月工资) FROM职工 AS B
WHERE A.部门号= B.部门号);
1:请简要的说明该查询语句对查询效率的影响(6分)
2:对该查询语句进行修改,使它既可以完成相同的功能,又可以提高查询效率。(8分)
1. 对于外层职工关系 A中的每一个记录,都要对内层职工关系B进行检索,所有效率不高
2. (1)使用临时表
SELECT MAX(月工资) as最高工资,部门号 INTO temp FROM职工
GROUP BY部门号;
SELECT 职工号 FROM职工,temp WHERE月工资=最高工资
AND 职工.部门号= temp.部门号;
(2)
SELECT 职工号 FROM职工,(SELECT MAX(月工资) as最高工资,部门号 FROM职工 GROUP BY部门号) as DEPMAX
WHERE 月工资=最高工资 AND职工.部门号= DEPMAX.部门号;
C++部分(50分)
- 以下结构类型可用来构造链表的是( )。B(3分)
A structaa{ int a;int * b;}; B struct bb{ int a;bb * b;};
C structcc{ int * a;cc b;}; D struct dd{ int * a;aa b;};
- 使用操作符setw对数据进行格式输出时,需要包含( )文件。C(3分)
A iostream.h B fstream.h C iomanip.h D stdlib.h
3. 设有以下说明和定义:(4分)
typedef union{long i; int k[5]; char c;} DATE;
struct data {int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf(“%d”,sizeof(struct date)+sizeof(max));的执行结果是:_______ 52
4. 请写出如下代码运行的结果(10分)
# include<iostream.h>
# include<string.h>
struct Worker{
charname[15]; //姓名
intage; //年龄
floatpay; //工资
};
void main() {
Worker x;
char*t=”liouting”;
int d=38; floatf=493;
strcpy(x.name,t);
x.age=d;x.pay=f;
cout<<x.name<<’ ‘<<x.age<<’ ‘<<x.pay<<endl;
}
liouting 38 493
5. 写出此函数的功能(10分)
struct StrNode {
charname[15]; //字符串域
StrNode *next; //指针域
};
void QB(StrNode* & f ,int n) {
if (n==0) {f=NULL; return; }
f=new StrNode;
cin>>f->name;
StrNode * p=f;
while (–n) {
p=p->next=newStrNode;
cin>>p->name;
}
p->next=NULL;
}
建立一个具有n个结点的链表,每个结点的字符串值由键盘输入,链表的表头指针由引用变量f带回。
6. #defineswap(a,b) /*交换ab*/(6分)
(未完,请完成这个宏定义。)
#defineswap(a,b) {a=a+b;b=a-b;a=a-b;}
7. 编写程序,把从键盘上输入的一批整数(以-1作为终止输入的标志)保存到文本文件“a:xxk1.dat”中。(14分)
# include<iostream.h>
# include<fstream.h>
# include<stdlib.h>
void main() {
ofstreamfout(“a:xxk1.dat”); //定义输出文件流并打开文件
if (!fout){
cerr <<”文件没有打开!”<<endl;
exit(1);
} //可有可无
int x;
cin >>x;
while (x!=-1) {
fout<<x<<’ ‘;
cin >>x;
} // 能够从键盘向文件正确输出数据
fout.close(); //关闭输出文件流
}
公共部分(50分)
1:SQL语言中,下列涉及空值的操作,不正确的是( C)(3分)
A.AGE ISNULL B.AGE IS NOT NULL C.AGE=NULL D.NOT(AGE IS NULL)
2:下面关于函数依赖的叙述中,不正确的是( B)(3分)
A.若X→Y,X→Z,则X→YZ B.若XY→Z,则X→Z, Y→Z
C.若X→Y,WY→Z,则XW→Z D.若X→Y,则XZ→YZ
3:ATM采用的线路复用方式为 。 C(3分)
A. 频分多路复用
B. 同步时分多路复用
C. 异步时分多路复用
D. 独占信道
4:IP地址为 140.111.0.0的B类网络,若要切割为9个子网,而且都要连上Internet,请问子网掩码设为()。D(3分)
A. 255.0.0.0
B. 255.255.0.0
C. 255.255.128.0
D. 255.255.240.0
5:写出float x与“零值”比较的 if语句(4分)
const float EPSINON = 0.00001;
最好定义一个符号常量来做。#define EPSINON 1e-6
if ((x >= –EPSINON) && (x <= EPSINON)
6:写出 char *p与“零值”比较的 if语句(4分)
if (p == NULL)
7:操作系统中进程调度策略有哪几种?(10分,每点2分)
先来先服务(FIFO),时间轮转法调度(时间片调度),优先权调度,多级反馈队列(反馈循环队列),保证调度
8:设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。(回答下列题目)(20分)
1. 列出各部门中工资不低于600元的职工的平均工资。(10分)
2. 请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。(10分)
1.SELECT DNO,AVG (SALARY)
FROM EMP
WHERE SALARY>=600
GROUP BY DNO
2.UPDATE EMP
SETSALARY=SALARY*1.1
WHERE ENO IN
(SELECT ENO
FROM EMP, DEPT
WHEREEMP.DNO=DEPT.DNO
AND DNAME=’销售部’
AND SALARY<600;
或者
UPDATE EMP
SET SALERY =SALERY * 1.1
FROM EMP A,ENO B
WHERE A.DNO =B.DNO
AND B.DNAME=’销售部’
AND B.SALARY<600;
C++部分(50分)
- 下列程序执行后的输出结果是 B(4分)
main()
{ int a[3][3], *p,i;
p=&a[0][0];
for(i=0; i<9; i++) p[i]=i+1;
printf(“%d \n”,a[1][2]);
}
A) 3 B)6 C) 9 D)随机数
2. 设有以下说明语句(4分)
struct ex
{ int x ; float y; char z ;} example;
则下面的叙述中不正确的是 B
A) struct是结构体类型的关键字 B) example是结构体类型名
C) x,y,z都是结构体成员名 D)struct ex是结构体类型
3. 以下程序运行后,输出结果是 C(4分)
main()
{ char *s=”abcde”;
s+=2;
printf(“%ld\n”,s);
}
A) cde B)字符c的ASCII码值 C)字符c的地址 D)出错
4. 什么函数不能声明为虚函数?(6分,每点3分)
全局函数和静态函数
5. 引用与指针有什么区别?(12分,每点4分)
1) 当引用被创建时,它必须被初始化。(指针则可以在任何时候被初始化。)
2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用。(指针则可以在任何时候指向另一个对象。)
3) 不可能有N U L L引用。必须确保引用是和一块合法的存储单元关连。
6. 设计一个学生类Stud,除了包括no(学号)、name(姓名)和deg(成绩)数据成员外,有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义了一个对象数组用于存储输入的学生数据。(20分)
#include<stdio.h>
#include<string.h>
#define N 3
class Stud
{
int no;
char name[10];
int deg;
static int num;
static int sum;
public:
void setdata(int n,char na[],int d)
{
no=n; deg=d;
strcpy(name,na);
sum+=d;
num++;
}
static double avg()
{
return sum/num;
}
void disp()
{
printf(” %-5d%-8s%3d\n”,no,name,deg);
}
};
int Stud::sum=0;
int Stud::num=0;
void main()
{
Stud st[N];
int i,n,d;
char na[10];
for(i=0;i<N;i++)
{
printf(“输入学号姓名成绩:”);
scanf(“%d%s%d”,&n,na,&d);
st[i].setdata(n,na,d);
}
printf(“输出数据\n”);
printf(” 学号姓名成绩\n”);
for(i=0;i<N;i++)
st[i].disp();
printf(” 平均分=%g\n\n”,Stud::avg());
}
公共部分(50分)
1:当数据库损坏时可以利用_____和______有效的恢复数据库 转储,日志(4分)
2:数据库系统的核心是_______数据库管理系统或DBMS(2分)
3:#include <filename.h> 和 #include “filename.h”有什么区别?(6分)
对于#include <filename.h>,编译器从标准库路径开始搜索 filename.h
对于#include “filename.h”,编译器从用户的工作路径开始搜索 filename.h
4:编写一个宏,输入2个参数,输出结果为两个参数的积(6分)
考察定义宏时,是否添加括号,分号等。
#define TIMES(a,b) ((a)*(b))
5:写出进程的主要状态。(12分,每点2分)
运行态(running),就绪态(ready),等待态(blocked),挂起(suspend),新建态(new),终止态(exit)
6:简要说明电路交换和存储器转发交换这两面种交换方式,并加以比较。(12分,每点6分)
电路交换是一种直接的交换方式,它为一对需要进行通信的装置(站)之间提供一条临时的专用通道,即提供一条专用的传输通道,即可是物理通道又可是逻辑通道(使用时分或频分复用技术)。这条通道是由节点内部电路对节点间传输路径经过适当选择、连接而完成的,由多个节点和多条节点间传输路径组成的链路,例如,目前公用电话网广泛使用的交换方式是电路交换。
存储转发交换方式又可以分为报文存储转发交换与报文分组存储转发交换,报文分组存储转发交换方式又可以分为数据报与虚电路方式。分组交换属于“存储转发”交换方式,但它不像报文交换那样以报文为单位进行交换、传输,而是以更短的、标准的“报文分组”(packet)为单位进行交换传输。分组经过通信网络到达终点有2种方法:虚电路和数据报。
与电路交换相比,报文交换方式不要求交换网为通信双方预先建立,条专用的数据通路,因此就不存在建立电路和拆除电路的过程。
7:主键和唯一索引的区别(8分,每点2分)
A 主键顺序为数据的物理顺序
B 主键不能空,唯一索引可以为空
C 主键每个表只能有一个,唯一索引可以多个
D 主键:默认将是聚簇索引唯一索引:默认将是非聚簇索引
C++部分(50分)
- 下列程序执行后的输出结果是 B(4分)
main()
{ int a[3][3], *p,i;
p=&a[0][0];
for(i=0; i<9; i++) p[i]=i+1;
printf(“%d \n”,a[1][2]);
}
A) 3 B)6 C) 9 D)随机数
2. 设有以下说明语句 B(4分)
struct ex
{ int x ; float y; char z ;} example;
则下面的叙述中不正确的是
A) struct是结构体类型的关键字 B) example是结构体类型名
C) x,y,z都是结构体成员名 D)struct ex是结构体类型
3.以下程序运行后,输出结果是 C(4分)
main()
{ char *s=”abcde”;
s+=2;
printf(“%ld\n”,s);
}
A) cde B)字符c的ASCII码值 C)字符c的地址 D)出错
4. 软件能力成熟度模型CMM共分为( )成熟度等级 C(4分)
- 3
- 4
- 5
D. 6
5. 析构函数什么时候运行,它主要作什么工作?(8分)
在对象被释放的时候运行,主要是清楚对象占用的资源
6. 请问以下程序将输出什么结果?(18分)
char*RetMemory(void)
{
char p[] =“hello world”;
return p;
}
void Test(void)
{
char *str =NULL;
str = RetMemory();
printf(str);
}
可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
7. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?(8分)
有(2分),全局变量存放在数据区(3分),局部变量保存在堆栈区(3分)
公共部分(50分)
1:Internet采用哪种网络协议?该协议的主要层次结构?(10分)
Internet采用TCP/IP协议
物理层,数据链路层,网络层(IP),应用层
2:Internet物理地址和IP地址转换采用什么协议?(2分)
ARP协议
3:IP地址的编码分为哪俩部分?(4分)
网络号主机号
4:请解释什么是操作系统的优先级反转?其解决的办法是什么?(4分)
优先级反转发生在高优先级的任务在等待低优先级的任务释放它所需要的资源时,此时高优先级任务的运行实时性将得不到保证。(2分)
采用优先级继承的方法可以避免优先级反转。(2分)
5:写出以太网数据帧格式。(10分,每点2分)
目的地址 | 源地址 | 类型 | 数据 | CRC |
6:设职工—社团数据库有三个基本表:(20分)
职工(职工号,姓名,年龄,性别);
社会团体(编号,名称,负责人,活动地点);
参加(职工号,编号,参加日期);
其中:
1)职工表的主键为职工号。
2)社会团体表的主键为编号;主键为负责人,被参照表为职工表,对应属性为职工号。
3)参加表的职工号和编号为主键;职工号为外码,其被参照表为职工表,对应属性为职工号;编号为外码,其被参照表为社会团体表,对应属性为编号。
试用SQL语句表达下列操作:
1)定义职工表、社会团体表和参加表,并说明其主键和参照关系。
2)建立下列两个视图。
社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别);
参加人情况(职工号,姓名,社团编号,社团名称,参加日期)
3)查找参加唱歌队或篮球队的职工号和姓名。
4)求参加人数超过100人的社会团体的名称和负责人。
答:
1) CREATTABLE 职工(职工号 CHAR(10)NOTNULL ,
姓名 CHAR(8)NOTNULL,
年龄 SMALLINT,
性别 CHAR(2),
CONSTRAINTC1_PKPRIMARYKEY(职工号);
CREATTABLE 社会团体(编号 CHAR(8)NOTNULL ,
名称 CHAR(12)NOTNULL,
负责人 CHAR(8),
活动地点 VARCHAR(50),
CONSTRAINTC2_PK PRIMARYKEY(职工号)
CONSTRAINTC2FOREIGNKEY(负责人)REFERENCES职工 (职工号));
CREATTABLE 参加(职工号 CHAR(8),
编号 CHAR(8),
参加日期 DATA,
CONSTRAINTC3_PKPRIMARYKEY(职工号,编号),
CONSTRAIN C3FOREIGN KEY(职工号)REFERENCES职工(职工号));
2)
CREAT VIEW社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
AS SELECT编号,名称,负责人,姓名,性别
FROM 社会团体,职工
WHERE 社会团体.负责人=职工.职工号;
CREAT VIEW参加人情况(职工号,姓名,社团编号,参加日期)
ASSELECT参加.职员号,姓名,社会团体.编号,名称,参加日期 FROM职工,社会团体,参加
WHERE 职工.职工号=参加.职工号AND参加.编号=社会团体.编号;
3) SELECT 职工号,姓名
FROM 职工,社会团体,参加
WHERE 职工.职工号=参加.职工号 AND 参加.编号=社会团体.编号
AND 社会团体.名称 IN(’唱歌队’,’篮球队’);
4) SELECT 社会团体.名称,职工.姓名
FROM 职工,社会团体,参加
WHERE 社会团体.编号=参加.编号 AND 社会团体.负责人=职工.职工号
GROUPBY 参加.编号 HAVINGCOUNT(参加.编号)>100;
C++部分(50分)
1.设单链表的结点结构为(data,next),已知指针q所指结点是指针p所指结点的直接前驱,如在*q与*p之间插入结点*s,则应执行的操作为( ) B(4分)
- s->next=p->next; p->next=s;
- q->next=s; s->next=p;
- p->next=s-next; s->next=p;
- p->next=s; s-next=q;
2. 阅读以下程序:
main()
{ int x;
scanf(“%d”,&x);
if(x–<5) printf(“%d”‘x);
else printf(“%d”‘x++);
}
程序运行后,如果从键盘上输人5,则输出结果是( ) B(4分)
- 3
- 4
- 5
- 6
3.有如下程序(4分)
main0
{ int x=23;
do
{ printf(“%d”,x–);}
while(!x);
}
该程序的执行结果是( ) B
- 321
- 23
- 不输出任何内容
- 陷入死循环
4. 你认为在软件项目中,测试应该在以下哪个阶段介入( ) A(4分)
- 需求阶段
- 设计阶段
- 编码阶段
- 编码结束后
5. 请简述以下两个for循环的优缺点:(16分)
(1)
for (i = 0; i< N; i++)
{
if (condition)
{
DoSomething();
}
else
{
DoOthers();
}
}
(2)
if (condition)
{
for (i = 0; i< N; i++)
{
DoSomething();
}
}
else
{
for (i = 0; i< N; i++)
{
DoOthers();
}
}
(1)
优点:程序简洁;(4分)
缺点:多执行了N-1 次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。(4分)
(2)
优点:循环的效率高;(4分)
缺点:程序不简洁。(4分)
(考察点:程序代码性能侧重点)
6. 为什么不用malloc为对象分配空间?(6分)
内存空间未初始化,(3分)同时构造函数不能得到运行。(3分)
7. 写一个函数,判定运算环境(16位以上字长)是little-endian还是 big-endian(12分)
/* 函数返回 0:little endian,非零:big endian */
int is_little_endian(void)
{
int v = 1;
if(*((char*)&v) == 1) return 0;
return 1;
}
公共部分(50分)
1:IP地址的编码分为 和 两部分。
网络号(2分)主机号(2分)
2:假设执行语句S的时间为O(1),则执行下列程序段的时间为( B )(4分)
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
S;
- O(n)
- O(n2)
- O(n*i)
- O(n+i)
3:二维数组A[10..20,5..10]采用行序为主序方式存储,每个数据元素占4个存储单元,且A[10][5]的存储地址是1000,则A[18][9]的地址是( A )(4分)
- 1208
- 1212
- 1368
- 1364
4:设栈最大长度为3,入栈序列为1,2,3,4,5,6,则不可能的出栈序列是( D )(4分)
- 1,2,3,4,5,6
- 2,1,3,4,5,6
- 3,4,2,1,5,6
D. 4,3,2,1,5,6
5:结构体和联合体的主要区别?(4分)
主要区别是结构体的各成员占有各自的内存空间,联合体是共享内存空间
6:操作系统的主要组成部分?(8分)
进程和线程的管理,存储管理,设备管理,文件管理
7:解释文件系统为什么会存在数据冗余?这种数据冗余会导致哪两类典型的问题?(8分)
由于文件系统难于实现数据共享,因此,相同的数据可能会在多个文件中重复出现,即产生数据冗余。(4分)
数据冗余会导致数据(或更新)异常(2分)和数据不一致性(2分)
2.设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。(回答下列题目)(14分)
1. 列出各部门中工资不低于600元的职工的平均工资。
2. 请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。
1.SELECT DNO,AVG (SALARY)
FROM EMP
WHERE SALARY>=600
GROUP BY DNO
2.UPDATE EMP
SETSALARY=SALARY*1.1
WHERE ENO IN
(SELECT ENO
FROM EMP, DEPT
WHEREEMP.DNO=DEPT.DNO
AND DNAME=’销售部’
AND SALARY<600;
或者
UPDATE EMP
SET SALERY =SALERY * 1.1
FROM EMP A,ENO B
WHERE A.DNO =B.DNO
AND B.DNAME=’销售部’
AND B.SALARY<600;
C++部分(50分)
1.设int f(int);和int g(int);是函数f和g的原形,以下将f作为语句调用的是( )。B(3分)
A g(f(3)) B f(g(3)) C g(f(3)+2) D p= f(g(3)+1)
2.循环while(int i=0) i–;执行次数是( )。A(3分)
A 0 B 1 C 5 D 无限
3.以下结构类型可用来构造链表的是( )。B(3分)
A structaa{ int a;int * b;}; B struct bb{ int a;bb * b;};
C structcc{ int * a;cc b;}; D struct dd{ int * a;aa b;};
4. 有如下程序(3分)
main0
{ int x=1,a=0,b=0;
switch(x){
case 0: b++;
case 1: a++;
case 2: a++;b++;
}
printf(“a=%d,b=%d\n”,a,b);
}
该程序的输出结果是 A
A) a=2,b=1 B)a=1,b=1 C) a=1,b=0 D) a=2,b=2
5.设int * p2=&x,* p1=a;p2= *b;则a和b的类型分别是( )。B(3分)
A int *和int B int *和int **
C int 和int* D int *和int *
6. 请写出如下代码运行的结果(9分)
# include<iostream.h>
# include<string.h>
struct Worker{
charname[15]; //姓名
intage; //年龄
floatpay; //工资
};
void main() {
Worker x;
char*t=”liouting”;
int d=38; floatf=493;
strcpy(x.name,t);
x.age=d;x.pay=f;
cout<<x.name<<’ ‘<<x.age<<’ ‘<<x.pay<<endl;
}
liouting 38 493
7. 什么函数不能声明为虚函数?(4分)
全局函数和静态函数
8. 编写程序,把从键盘上输入的一批整数(以-1作为终止输入的标志)保存到文本文件“a:xxk1.dat”中。(18分)
# include<iostream.h>
# include<fstream.h>
# include<stdlib.h>
void main() {
ofstreamfout(“a:xxk1.dat”); //定义输出文件流并打开文件
if (!fout){
cerr <<”文件没有打开!”<<endl;
exit(1);
} //可有可无
int x;
cin >>x;
while (x!=-1) {
fout<<x<<’ ‘;
cin >>x;
} // 能够从键盘向文件正确输出数据
fout.close(); //关闭输出文件流
9. 头文件中的 ifndef/define/endif有什么用(4分)
防止该头文件被重复引用。
公共部分(50分)
1:分页式存贮管理中,页表是用来指出作业的 与 的对应关系。逻辑页号,主存块号 (顺序可交换) (4分)
2:影响局域网络的三种主要技术是____ 、 和 。传输介质、拓扑结构,访问控制方式 (顺序可交换) (6分)
3:若给定有n个元素的向量,则建立一个有序单向链表的时间复杂性的量级是( C)(3分)
- O(1)
- O(n)
- O(n2)
- O(nlog2n)
4:设单链表的结点结构为(data,next),已知指针q所指结点是指针p所指结点的直接前驱,如在*q与*p之间插入结点*s,则应执行的操作为( B )(3分)
- s->next=p->next; p->next=s;
- q->next=s; s->next=p;
- p->next=s-next; s->next=p;
- p->next=s; s-next=q;
5:在一个具有n个结点的单链表中查找值为m的某结点,若查找成功,则平均比较( D )个结点。(3分)
- n
- n/2
- (n-1)/2
- (n+1)/2
6:面向连接和非连接的服务的特点是什么。(8分)
面向连接的服务,通信双方在进行通信之前,要事先在双方之间建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时地监控和管理。(4分)
而非连接的服务,不需要预先建立起一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往“网络”上送出信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。(4分)
7:什么是分布式数据库?(5分)
数据库分布在计算机网络的不同计算机上,网络中的每个节点具有独立处理的能力(场地自治),可以执行局部应用,同时,每个节点也能通过网络通信子系统执行全局应用。
8:设工程—零件数据库中有四个基本表:(18分)
供应商(供应商代码,姓名,所在城市,联系电话);
工程(工程代码,工程名,负责人,预算);
零件(零件代码,零件名,规格,产地,颜色);
供应零件(供应商代码,工程代码,零件代码,数量)
试用SQL语句完成下列操作:
1) 查找预算在50000~100000元之间的工程的信息,并将结果按预算降序排列。
2 ) 找出使用上海产的零件的工程名称。
3) 将由供应商S5供给工程代码为J4的零件P6改为由S3供应,并将零件P6的产地改为S3供货商的所在城市。
4)从供应商关系中删除S2的记录,并从供应零件关系中删除相应的记录。
1.SELECT*
FROM 工程
WHERE 预算 BETWEEN50000AND100000 (或者 WHERE 预算>=50000 AND 预算<= 1000000)
ORDERBY 预算 DESC;
2.SELECT 工程名
FROM 供应商,供应零件,工程
WHERE 供应商.供应商代码=供应零件.供应商代码AND
供应零件.工程代码=工程.工程代码 AND
供应商.所在城市=’上海’;
3.UPDATE 供应零件
SET 供应商代码=’S3′
WHERE 供应商代码=’S5′ AND工程代码=’J4′ AND零件代码=’P6′;
UPDATE零件
SET产地 = B.所在城市
FROM 零件 A,供应商 B
WHERE A.零件代码 = ‘P6′
AND B. 供应商代码 = ‘S3′;
4.DELETE
FROM 供应零件
WHERE 供应商代码=’S2′;
DELETE
FROM 供应商
WHERE 供应商代码=’S2′;
C++部分(50分)
1.有如下程序(4分)
main0
{ int x=23;
do
{ printf(“%d”,x–);}
while(!x);
}
该程序的执行结果是 B
A) 321 B)23 C) 不输出任何内容 D)陷入死循环
2. “零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if语句为:if ( n == 0 ),则BOOL flag与“零值”比较的 if语句为:____________________________;float x与“零值”比较的 if语句为:____________________________。
if ( flag )(2分)
const floatEPSINON = 0.00001;if ((x >= – EPSINON) && (x <= EPSINON))(2分)
3.以下程序运行后,输出结果是 C(4分)
main()
{ char *s=”abcde”;
s+=2;
printf(“%ld\n”,s);
}
A) cde B)字符c的ASCII码值 C)字符c的地址 D)出错
4. 假定DD为一个类,则执行“DD a[10],*P”语句时,系统自动调用该类构造函数的次数为( )B(4分)
A、11 B、10 C、1 D、0
5. 说明类中的public、 protected和 private成员函数分别在public、protected和private继承方式下在派生类中的可访问性。(12分)
重点是基类中的任何Private在派生类中都是不可访问的。
6. 写出此函数的功能(12分)
struct StrNode {
charname[15]; //字符串域
StrNode *next; //指针域
};
void QB(StrNode* & f ,int n) {
if (n==0) {f=NULL; return; }
f=new StrNode;
cin>>f->name;
StrNode * p=f;
while (–n) {
p=p->next=newStrNode;
cin>>p->name;
}
p->next=NULL;
}
建立一个具有n个结点的链表,每个结点的字符串值由键盘输入,链表的表头指针由引用变量f带回。
7. 写出下面函数的功能(10分)
template<class Type>
void WE(Typea[],Type b[],int n) {
for (int i=0;i<n; i++)
b[n-i-1]=a[i];
}
模板函数,把数组a的每个元素按逆序放入数组b中。
公共部分(50分)
5、在TCP/IP层次模型中与OSI参考模型第四层相对应的主要协议有____________ 和 ,其中后者提供无连接的不可靠传输服。TCP(传输控制协议)和UDP(用户数据报协议) (顺序可交换) (4分)
6、在OSI中,完成相邻节点间流量控制功能的层次是 。数据链路层(2分)
5、IP地址为 140.111.0.0的B类网络,若要切割为9个子网,而且都要连上Internet,请问子网掩码设为(D)。(4分)
A. 255.0.0.0
B. 255.255.0.0
C. 255.255.128.0
D. 255.255.240.0
6、以下哪一个不是关于千兆位以太网的正确描述( C)。(4分)
A. 数据传输速率为1000MBit/S
B. 支持全双工传送方式
C. 只能基于光纤实现
D. 帧格式与以太网帧格式相同
3. 设有98个已排序元素,采用二分法查找时,最大比较次数是( D )(4分)
- 49
- 15
- 20
- 7
4. 高度为h的完全二叉树结点数最多有( A)(4分)
- 2h-1
- 2h+1
- 2h-1
- 2h+1
5. Hash表是用于数据存储的一种有效的数据结构,Hash表的查找复杂度依赖于Hash值算法的有效性,在最好的情况下,Hash表的查找复杂度为( A );在最坏的情况下,Hsah表的查找复杂度为( C)(4分)
- O(1)
- O(logn)
- O(n)
- O(nlogn)
- 写出进程的主要状态。(12分)
运行态(running)(2分),就绪态(ready)(2分),等待态(blocked)(2分),挂起(suspend)(2分),新建态(new)(2分),终止态(exit)(2分)
- TCP为何采用三次握手来建立连接,若采用二次握手可以吗?为什么?(12分)
三次握手是为了防止已失效的连接请求再次传送到服务器端。(4分)
二次握手不可行,(2分)
因为:如果由于网络不稳定,虽然客户端以前发送的连接请求以到达服务方,但服务方的同意连接的应答未能到达客户端。则客户方要重新发送连接请求,若采用二次握手,服务方收到重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费。(6分)
C++部分(50分)
- 设一维整型数组data已进行了初始化,则其元素个数可由操作符sizeof通过表达式__________________________计算出来。sizeof(data/data[0]) (2分)
- 在继承机制下,当对象消亡时,编译系统先执行________的析构函数,然后再执行_______的析构函数。子类(2分) 父类(2分)
- 设有“int w[3][4];”,pw是与数组名w等价的数组指针,则pw的初始化语句为____________________ int (* pw)[4]=w; (2分)
4. 要使引用pr代表变量“char * p;”,则pr的初始化语句为_______________ 。char * &pr=p;(2分)
5. 引用与指针有什么区别?(12分)
1) 当引用被创建时,它必须被初始化。(指针则可以在任何时候被初始化。)(4分)
2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用。(指针则可以在任何时候指向另一个对象。)(4分)
3) 不可能有N U L L引用。必须确保引用是和一块合法的存储单元关连。(4分)
6. 请问以下程序将输出什么结果?(16分)
char*RetMemory(void)
{
char p[] =“hello world”;
return p;
}
void Test(void)
{
char *str =NULL;
str = RetMemory();
printf(str);
}
可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
7. 程序员规范中要求不要写出类似(++i)+(i++)或 f(++i,i++)这样的代码,请说明原因。(12分)
计算子表达式的顺序由编译器决定的,虽然参数的压栈顺序在给定的调用方式下式固定的,但参数表达式的计算顺序也由编译器决定的。不同的编译器或不同的表达式计算的顺序可能不一致。
1、指针和引用的区别?
答:引用是在C++中引入的。它们之间的区别有:
(1) 非空区别:指针可以为空,而引用不能为空
(2) 可修改区别:如果指针不是常指针,那么就可以修改指向,而引用不能
(3) 初始化区别:指针在定义时可以不用初始化,而引用在定义的同时必须初始化
2、为什么构造函数不能声明为虚函数?
答:因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情况下的工作机制,特别允许我们调用一个只知道接口而不知道其对象的准确类型的函数。但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型,因此构造函数不能为虚函数。
3、char str1[]=”abc”; char str2[] = “abc”; str1==str2为FALSE,因为str1和str2是位于堆栈上的,它们占用不同的内存空间。Const char str3[] = “abc”; const char str4[] = “abc”;str3==str4为FALSE,同样它们是位于堆栈上的内存空间,是不同的。Const char *str5=”abc”, const char *str6=”abc”;char *str7=”abc”,char *str8 = “abc”,str5==str6 str7==str8为TRUE,因为”abc”是位于文字常量区的,系统会将几个“abc”进行优化,使它们位于同一块内存区,因此指针的指向也就相同了。
4、以下函数能求出数组的长度吗?
void fun(char str[])
{
int len = sizeof(str)/sizeof(str[0]);
}
答:不能,数组作为参数传递给函数时,数组名被退化为指针,因此函数中的sizeof(str)实际是在求一个指针的sizeof,答案为4,因此不能计算出数组的长度。
5、一个32位的机器,该机器的指针是多少位?
答:指针是多少位只要看地址总线的位数就行了,80386以后的机子都是32的数据总线。所以指针的位数就是4个字节。即有void *p; 则sizeof(p) = 4。
6、C和C++中的struct和class有什么不同?
答:C和C++中struct的区别是C中的struct不能有成员函数,而C++中的struct可以。C++中struct和class的主要区别是默认的存取权限,struct的默认存取权限为public,而class的默认存取权限为private。
7、类的静态成员和非静态成员有何区别?
答:类的静态成员每个类只有一个,静态成员为所有类的实例对象共享,静态成员有静态成员变量和静态成员函数,静态成员变量使用前必须初始化,静态成员变量可以被静态成员函数和非静态成员函数访问,而静态成员函数只能访问静态成员变量,因为静态成员函数属于类,其没有this指针。非静态成员每个对象都有一个。
8、纯虚函数的定义?
答:virtual void fun()=0;含有纯虚函数的类为抽象类,抽象类不能实例化对象,但是可以定义指针,纯虚函数是接口,由子类实现。
9、请讲一讲析构函数和虚函数的用法和作用?
答:析构函数是用于在撤销对象时完成对对象的清理工作,比如在创建对象时,如果在构造函数中动态申请了内存,那么在对象释放时,应该在析构函数中对动态申请的内存进行释放,避免造成内存泄露,如果在这个时候还不释放就没有机会释放内存了,会造成内存泄露,总之需要在释放对象之前完成的工作都可以放在析构函数中完成,析构函数不需要用户显示调用,它会在释放对象前由系统自动调用。虚函数是实现多态性的方式,虚函数在子类中被重写,因此可以通过基类指针调用不同子类的虚函数,实现一个接口,多种实现。正是因为多态性的存在,为了使子类的析构函数随时都能够执行,基类的析构函数一般都声明为虚析构函数。
10、全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
答:区别在于它们的作用域不同,全局变量可以在整个程序被使用,局部变量只能在子程序或函数中使用,函数执行完后,局部变量的也被销毁了。操作系统和编译器可能是通过它们所分配的内存区来知道的,全局变量被放在全局数据区,而局部变量放在堆栈中。