题1:
如果x=2014,下面函数的返回值是()
int fun(unsigned int x)
{
int n=0;
while((x+1))
{
n++;
x=x|(x+1);
}
return n;
}
A.20 B.21 C.23 D.25
答案: C
题2:
以下代码的输出是()
int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
- 1,2
- 2,5
- 2,1
- 1,5
-
解析:
题关键就在于第二个点,*(ptr-1)输出为多少?
解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以int *ptr=(int *)(&a+1);其实ptr实际是&(a[5]),也就是a+5.
原因为何呢?
&a是数组指针,其类型为int(*)[5];
函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数()
- int a[4][4];
- int **a;
- int **a[4]
- int (*a)[4];
题4
下面说法正确的是()
- C++已有的任何运算符都可以重载
- const对象只能调用const类型成员函数
- 构造函数和析构函数都可以是虚函数
- 函数重载返回值类型必须相同
答案: B
题5
典型的创建Windows窗口过程的流程为()
- 注册窗口类->创建窗口->显示窗口->更新窗口->消息循环
- 注册窗口类->创建窗口->更新窗口->显示窗口->消息循环
- 创建窗口->注册窗口类->更新窗口->显示窗口->消息循环
- 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环
在屏幕上显示一个窗口的过程一般有以下步骤,这就是主程序的结构流程:
(1)得到应用程序的句柄(GetModuleHandle)。
(2)注册窗口类(RegisterClassEx)。在注册之前,要先填写RegisterClassEx的参数WNDCLASSEX结构。
(3)建立窗口(CreateWindowEx)。
(4)显示窗口(ShowWindows)。
(5)刷新窗口客户区(UpdateWindow)。
(6)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),如果有消息到达,则将消息分派到回调函数处理(DispatchMessage),如果消息是WM_QUIT,则退出循环。
题6
下面哪个API返回的不属于windows内核对象()
- CreateFile
- CreateSemaphore
- CreateDC
- CeateEvent
内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。 除了内核对象外,也可以使用其他类型的对象,如菜单、窗口、鼠标光标、刷子和字体等。这些对象属于用户对象或图形设备接口(GDI)对象,而不是内核对象。
C选项是GDI对象。设备上下文(HDC) CreateDC
用户双击鼠标时产生的消息序列,下面正确的是()
- WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP
- WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONUP,WM_LBUTTONDBLCLK
- WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONDBLCLK
- WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP
题8
- 1,2
- 1,3
- 1
- 以上都不正确
题9
以下哪些线程同步锁可以为递归锁
1.信号量 2.读写锁 3.互斥量 4.事件 5.临界区(Critical Section)
- 1,3,4,5
- 5
- 3,5
- 1,3,5
答案:C
常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。
在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。
递归锁/非递归锁
Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。
二者唯一的区别是:
同一个线程可以多次获取同一个递归锁,不会产生死锁。
如果一个线程多次获取同一个非递归锁,则会产生死锁。
Windows下的Mutex和Critical Section是可递归的。
Linux下的pthread_mutex_t锁是默认是非递归的。可以通过设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递归锁。
题10
- postmessage发出消息后,将消息放到消息队列中,马上返回
- sendmessage发出消息后,一直等到该消息执行完毕,才返回
- 用sendmessage给其他线程创建的窗口发送消息时,消息也会进消息队列
- 用2个函数只能给当前进程的窗口发送消息
-
题11
关于WM_COPYDATA消息的处理,下面描述错误的是()
- 可以在不同进程之间传递少量只读数据
- 只能通过sendmessage方式来发送该消息
- 只能在窗口过程函数中处理该消息
- 可以在消息队列或窗口过程函数中处理该消息
答案:C
题12
堆排序的空间复杂度是(),堆排序中构建堆的时间复杂度是()。
- O(logn),O(n)
- O(logn),O(nlogn)
- O(1),O(n)
- O(1),O(nlogn)
题13
- 正向最大匹配法
- 逆向最大匹配法
- 最少切分
- 条件随机场
-
目前的分词方法归纳起来有3 类:
第一类是基于语法和规则的分词法。其基本思想就是在分词的同时进行句法、语义分析, 利用句法信息和语义信息来进行词性标注, 以解决分词歧义现象。因为现有的语法知识、句法规则十分笼统、复杂, 基于语法和规则的分词法所能达到的精确度远远还不能令人满意, 目前这种分词系统还处在试验阶段。
第二类是机械式分词法(即基于词典)。机械分词的原理是将文档中的字符串与词典中的词条进行逐一匹配, 如果词典中找到某个字符串, 则匹配成功, 可以切分, 否则不予切分。基于词典的机械分词法, 实现简单, 实用性强, 但机械分词法的最大的缺点就是词典的完备性不能得到保证。据统计, 用一个含有70 000 个词的词典去切分含有15 000 个词的语料库, 仍然有30% 以上的词条没有被分出来, 也就是说有4500 个词没有在词典中登录。
第三类是基于统计的方法。基于统计的分词法的基本原理是根据字符串在语料库中出现的统计频率来决定其是否构成词。词是字的组合, 相邻的字同时出现的次数越多, 就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映它们成为词的可信度。
最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描,这是基于词典分词的方法
1.正向最大匹配法
2.逆向最大匹配法
3.最少切分法:使每一句中切出的词数最小,这也是基于词典分词的方法
条件随机场是一个基于统计的序列标记和分割的方法,属于基于统计的分词方法范畴。它定义了整个标签序列的联合概率,各状态是非独立的,彼此之间可以交互,因此可以更好地模拟现实世界的数据.
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
以上三种是机械分词方法:
条件随机域(场)(conditional random fields,简称 CRF,或CRFs),是一种判别式概率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列。
条件随机场(CRF)由Lafferty等人于2001年提出,结合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,基于统计学,可以作为一种分词方法
题14