1、下列是错误的转义字符的是:
A: ‘\0’
B: ‘\’
C: ‘\091’
D: ‘’’
答案:c
当\后面有数字时,\后面的1-3个小于8的数字会被看作八进制数,他对应的字符为八进制数转化为十进制后所对应的AScll码表中的字符。
2、c++程序下列说法正确的是:A
A、对调用的虚函数和模板类都进行迟后编译;
B、基类与子类中函数如果要构成虚函数,除了要求在基类中用virtual声明外,而且必须名字相同且参数类型相同返回类型相同;
C、重载的类成员函数必须要返回类型不同,或者参数数目不同,或者参数序列的类型不同。
D、静态成员函数和内联函数不能是虚函数,友元函数和构造函数也不能是虚函数,但是析构函数可以是虚函数。
3、对数组名做函数的参数,下面描述正确的是:B
A、数组名做函数的参数,调用时将实参数组复制给形参数组;
B、数组名做函数的参数,主调函数和被调函数共用一段内存单元;
C、数组名做参数时,形参定义的数组长度不能省略;
D、数组名作参数,不能改变主调函数中的数据。
数组名作为函数的实参实质是地址的传递,将数组的首地址传给形参,形参和实参共用同一存储空间,形参的变化就是实参的变化。
4、在参数传递过程中,对形参和实参的要求是:B
A、函数定义时,形参一直占用存储空间。
B、形参和实参类型和个数都可以不同。
C、形参可以是常量、变量或表达式。
D、实参可以是常量、变量或表达式
形参不可以是表达式,因为在调用函数时需要对形参分配内存空间以用于接收实参传递的值,所以形参不可以是表达式,也不能在形参处对其赋值,比如 int result(int a=3)是不可以的。 但是实参可以是表达式。
5、有类AB,对于AB a(2),b[3],*p[4];执行后创建了几个对象: 4次
因为
AB a(4)相当于调用了一次构造函数,这个构造函数是有参数的
AB b[3]调用了三次构造函数
AB* p[2]由于只声明了指针,没有调用构造函数,指针在使用new的时候调用构造函数。
6、Linux是否有内核级线程?
Linux内核可以看作服务进程(管理软硬件资源,响应用户进程的各种进程)
内核需要多个执行流并行,为了防止可能的阻塞,支持多线程。
内核线程就是内核的一个分身,可以用以处理一件特定事情,内核线程的调度由内核负责,一个内核线程的处于阻塞状态时不影响其他的内核线程。
内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程执行,它与内核中的其他“进程”并行执行。内核线程经常被称之为内核守护进程。当前的内核中,内核线程就负责下面的工作:
1、周期性地将修改的内存页与页来源块设备同步
2、实现文件系统的事务日志
3、内核线程由内核创建,所以内核线程在内核态执行,只能访问内核虚拟地址空间,不能访问用户空间。
4、在linux所有的线程都当作进程来实现,也没有单独为线程定义调度算法以及数据结构,一个进程相当于包含一个线程,就是自身,多线程,原本的线程称为主线程,他们一起构成线程组。
5、进程拥有自己的地址空间,所以每个进程都有自己的页表,而线程却没有,只能和其它线程共享主线程的地址空间和页表
7、SQL Server 是否支持行级锁,有什么好处?
支持。设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一 致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用 户所修改。因而行级锁既可保证数据的一致性又能提高数据操作的并发性。
8、输入http://www.chinalacoo.com后执行的全部过程。
9、1、有1,2,…一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数。
void sortArray(int *a,int num)
{
int temp;
for(int i=0;i<num;i++)
{
temp=a[a[i]-1];
a[a[i]-1]=a[i];
a[i]=temp;
if(a[i]==i-1)
i++;
}
}
int main()
{
int a[]={10,3,9,6,2,5,7,1,4,8};
int num=sizeof(a)/sizeof(int);
sortArray(a,num);
for(int i=0;i<num;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
10、输入一个二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
/*
* Problem_1.cpp
*
* Created on: 2012-8-27
* Author: Administrator
*/
#include<stdio.h>
struct BSTreeNode{
int value;
struct BSTreeNode *pLeft,*pRight;
BSTreeNode(){
pLeft=pRight=NULL;
}
};
//创建链表用到的两个指针
BSTreeNode *head=NULL,*tail=NULL;
//只要调整输出的位置,就分别对应着三种不同的遍历方式
void createList(BSTreeNode *cur){
cur->pLeft=tail;//把当前的root接到链表的尾部
if(tail!=NULL){//双向连接
tail->pRight=cur;
}else{
head=cur;
}
tail=cur;//更新尾结点为当前结点,或者说:尾结点后移
}
BSTreeNode* visit(BSTreeNode *root){
if(root!=NULL){
// printf("%d ",root->value);//先序
visit(root->pLeft);
// printf("%d ",root->value);//中序
createList(root);
visit(root->pRight);
// printf("%d ",root->value);//后序
}
return root;
}
void addNode(BSTreeNode **root,int value){
BSTreeNode *p;
if(NULL!=*root){
if(value>(*root)->value){
addNode(&((*root)->pRight),value);
}else if(value<(*root)->value){
addNode(&((*root)->pLeft),value);
}else{
printf("the node with value %d is in the tree!\n",value);
}
}else{
p=new BSTreeNode();
p->value=value;
*root=p;
}
}
int main(){
BSTreeNode *root=NULL;
int data[]={10,6,14,4,8,12,16};
for(int i=0;i<7;i++){
addNode(&root,data[i]);
}
visit(root);
//output 其实只选择一种即可,如果选择tail,则是降序输出,选择head,则是升序输出
while(tail!=NULL){
printf("%d ",tail->value);
tail=tail->pLeft;
}
prinft("\n");
while(head!=NULL){
printf("%d ",head->value);
head=head->pRight;
}
return 0;
}