批改网c++笔试题
批改网c++笔试题
姓名:李松
联系电话:
选择题(每题5分)
1. 面向对象程序设计思想的主要特征中不包括(D)
A. 封装性
B. 多态性
C. 继承性
D. 功能分解,逐步求精
2. 如果派生类以protected方式继承基类,则原基类的protected和public成员在派生类的访问性分别是(D )
A.public和public
B.public和protected
C.protected和public
D.protected和protected
3. 下面对构造函数的不正确描述是( B )
A). 系统可以提供默认的构造函数
B). 构造函数可以有参数,所以可以有返回值
C). 构造函数可以重载
D.构造函数可以设置默认参数
4. 假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的(D)
A.h(K)=K/N;
B.h(K)=1;
C.h(K)=K mod N;
D.h(K)=(K+rand(N)) mod N, rand(N)返回0到N-1的整数
5. 下列关于线程的叙述中,正确的是( A )。
A.线程包含CPU现场,可以独立执行程序
B.每个线程有自己独立的地址空间
C.进程只能包含一个线程
D.线程之间的通信必须使用系统调用函数
6. 在下面的叙述中,正确的是(D)。
A.引入线程后,处理器只能在线程间切换
B.引入线程后,处理器仍在进程间切换
C.线程的切换,不会引起进程的切换
D.线程的切换,可能引起进程的切换
问答题(每题10分)
7. 指针和引用的区别。生么情况下用指针,什么情况下用引用。
答:1.指针指向一块内存,所存储的是这快内存的地址. 引用是某块内存的别名.
2.严格意义上讲,指针是一个地址,是一个常量. 引用只是一个别名.
3.指针需要解引用(即加上*). 引用不需要解引用.
4.指针可变. 引用只能在定义的时候初始化一次,之后不可变.
5.指针有const,const修饰的指针是不可变的. 引用没有const
6.指针可以为空 . 引用不可以为空.
7.sizeof 指针得到的是指针本身(所指向对象或变量的地址). sizeof引用得到的是所指向变量(对象)的大小.
8.指针的自增(++)运算是地址的自增. 引用的自增是值的自增.
9.程序会为指针变量分配内存区域. 引用则没有.
8. 什么是UDP和TCP?它们的区别是什么?
答: UDP:数据报文协议. TCP:传输控制协议
UDP只管发送,不确认对方是否接收到,每个数据报大小在64K以内,是不可靠协议,速度快.
TCP 建立连接形成数据传输通道,可以大数据传输,是可靠协议,速度慢.
9. 为什么进程之间的通信必须借助于操作系统内核功能?简单说明进程通信的几种主要方式。
答:每个进程都有自己独立的地址空间.在操作系统和硬件的地址保护机制下,进程无法访问其他进程的地址空间,所以必须借助于操作系统调用函数实现进程之间的通信.
进程通信主要方式:1,共享内存区 2,消息传递 3,管道系统 4,共享文件
编程题(每题20分)
10. 将原字符串逆序。例如输入字符串“asdf”,则输出字符串“fdsa”。需要考虑到各种边界条件,例如输入字符串为null等。注意:不需要分配内存,原字符串逆序。
函数原型:char* reverseString(char* src)
答: 只会OC的.
int main(intargc, constchar * argv[]) {
@autoreleasepool {
// insert code here...
//NSString *asdf = @"asdf";
NSString *asdf = nil;
if (asdf.length>0) {
NSMutableString *fdsa = [[NSMutableStringalloc]
initWithCapacity:asdf.length];
for (inti = asdf.length - 1; i>= 0; i--) {
[fdsaappendFormat:@"%c", [asdfcharacterAtIndex:i]]; }
NSLog(@"%@", fdsa);
}
NSLog(@"输入的字符不能为空");
}
return0;
}
11. 二分查找的时间复杂度是多少?请实现二分查找算法。自己定义二分查找的函数原型。
答: (百度的答案.)
二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数
由于n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
12. 已知单向链表的头结点head,写一个函数把这个链表逆序,需要考虑边界情况。
答: (百度的答案)
void reverse(node*& head)
{
if ( (head == 0) || (head->next == 0) ) return;// 边界检测
node* pNext = 0;
node* pPrev = head;// 保存链表头节点
node* pCur = head->next;// 获取当前节点
while (pCur != 0)
{
pNext = pCur->next;// 将下一个节点保存下来
pCur->next = pPrev;// 将当前节点的下一节点置为前节点
pPrev = pCur;// 将当前节点保存为前一节点
pCur = pNext;// 将当前节点置为下一节点
} }