笔试面试题2Word格式.docx
《笔试面试题2Word格式.docx》由会员分享,可在线阅读,更多相关《笔试面试题2Word格式.docx(83页珍藏版)》请在冰点文库上搜索。
为什么?
执行结果是IamA
因为b对象构造时调用基类A的构造函数A(),得此结果。
3、在STL的应用中map这种key-value的应用很多,如果key的类型是GUID,该如何处理?
谁知道怎么处理补上吧。
4、一个内存变量a=5,有5个线程需要对其进行操作,其中3个对a进行加1操作,2个对a进行减1操作,为了保证能够得到正常结果6,需要使用什么方法?
(列出越多越好)
即要求列出线程同步方法,具体答案可见下面一题。
5、描述并比较以下对象:
事件,信标,临界区,互斥对象。
这些对象都是用于线程同步的对象。
临界区:
一种保证在某一时刻只有一个线程能访问数据的简便办法。
它只可以在同一进程内部使用。
主要API函数有,产生临界区:
InitializeCriticalSection,删除临界区:
DeleteCriticalSection,进入临界区:
EnterCriticalSection,退出临界区:
LeaveCriticalSection。
互斥对象:
互斥对象跟临界区相似,但它不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享,当然下面两者也有这个特点。
主要API函数有,创建互斥量:
CreateMutex,打开一个存在的互斥量:
OpenMutex,释放互斥量的使用权:
ReleaseMutex,关闭互斥量:
CloseHandle。
信标:
使用信号量(信标)最重要用途是:
信号允许多个线程同时使用共享资源,它指出了同时访问共享资源的线程最大数目。
它的API函数和使用方法都与互斥对象相似,如创建信号灯:
CreateSemaphore,传入的参数可以指定信号灯的初始值。
事件:
用来通知其他进程/线程某件操作已经完成。
API函数有创建,打开事件对象等,特殊点的是可以用函数SetEvent人工设置事件为有无信号状态,因此创建事件对象时可以有两种方式,一种为自动重置,一种为人工重置。
只有人工重置方式创建的事件对象才能正确使用函数SetEvent。
鉴于本套题考的是VC,有必要说明的是在MFC中对于各种同步对象都提供了相对应的类CCtiticalSection,CMutex,CSemaphore,CEvent,另外为使用等待功能封装了两个类:
CSingleLock和CMultiLock。
这些类方便了使用这些同步对象。
6、cdecl、stdcall、fastcall是什么?
哪种可以实现个数不定的入口参数,为什么?
三者都是函数调用的约定。
cdecl:
cdeclare(C调用约定)的缩写,是C和C++程序的缺省调用方式,规则是,按从右至左的顺序压参数入栈,由调用者把参数弹出栈,对于传送参数的内存栈是由调用者来维护的,正因为如此,只有这种调用方式可实现个数不定的入口参数(可变参数)。
stdcall:
是Pascal程序的缺省调用方式,规则是,按从右至左的顺序压参数入栈,被调用的函数在返回前清理传送参数的内存栈。
上两者的主要区别是前者由调用者清理栈,后者由被调用的函清理栈。
当然函数名的修饰部分也是不同的。
fastcall:
采用寄存器传递参数,特点就是快了。
二、程序设计(以下题目请写出实现代码)
1、有一段文本,统计其中的单词数。
例如:
Asatechnology,"
HailStorm"
issonewthatitisstillonlyknownbyits
codename.
注意:
单词间的间隔不一定是一个空格。
可执行程序代码如下,假设该文本已存入text这个数组里。
main()
char
text[1000]={"
As
a
technology
'
HailStorm'
is
so
new
that
it
still
only
known
by
its
code
name."
int
i=0,count=0;
bool
flag=false;
//前面的字符是否为字母
while
(text[i]&
&
i<
1000)
if
(flag
!
((text[i]>
='
a'
text[i]<
z'
)||(text[i]>
A'
text[i]<
Z'
)))
{//前面是字母,当前不是字母,表示出现一个单词
count++;
else
(!
flag
{
//
前面不是字母,当前是字母
flag=true;
i++;
if(flag)
cout<
<
count;
----------------------------------------------
插播广告啦:
版权所有:
朱科欢迎光临我的网站:
,各位转贴别删,劳动成果啊
2、国际象棋有8×
8格,每个格子可放一个棋子。
皇后的规则是可以横、竖、斜移动。
在一个棋盘放置8个皇后,并使它们互相无法威胁到彼此。
以下是可执行C代码,采用非递归解法,你如果想了解皇后问题的算法的详细过程可看下面网址:
不过下面的代码是以列优先进行试探的,不是上面网址介绍的那样以行优先的,当然本质是一样的。
#include
iostream.h>
#define
QUEEN
8
//皇后数量
queen[QUEEN]
;
//下标代表所在列号,值代表所在行号,
//如queen[1]=2表示第1列第2行有个皇后
row_YN[QUEEN]
//棋局的每一行是否有棋,有则为1,无为0
passive_YN[2*QUEEN-1]
//斜率为1的斜线方向上是否有棋,共有2*QUEEN-1个斜线
negative_YN[2*QUEEN-1]
//斜率为负1的斜线方向上是否有棋
//用全局变量,因全局数组元素值自动为0
row
=
0
//游标,当前移动的棋子(以列计)
false
//当前棋子位置是否合法
queen[0]
-1
//第0列棋子准备,因一开始移动的就是第0列棋子
count
//一共有多少种解法的计数器
while(row>
=0
)
//跳出条件是回溯到无法回溯时
queen[row]++
//row列上的皇后走到下一行试试
if(queen[row]
>
QUEEN)
//当前列全部走完
queen[row]
//当前列棋子置于准备状态
row--
//回溯到上一列的棋子
if(row>
=0)
//回溯时要清理如下行,斜线的标志位
row_YN[queen[row]]
passive_YN[queen[row]
+
row]
negative_YN[QUEEN-1
-
queen[row]]
}
else
//先判断棋子所在行没有棋子
if(row_YN[queen[row]]
==
false)
true
//以下检查当前棋子是否与之前的棋子斜线相交
if(
||
true)
if(flag)
flag为真表示位置合法
if(row
QUEEN-1)
//列到达最后,即最后一个皇后也找到位置,输出解
count++
//解法的数目加一
"
***第"
count<
种解法***"
endl
for(int
i=0;
QUEEN;
i++)
第"
列皇后在第"
queen[i]<
行"
endl;
当前行设为有棋子
//当前行正斜率方向有棋子
//当前行负斜率方向上也有棋子
row++
找到解后再次回溯找另外的解,这同上面无解回溯是一样的
//原理同回溯
QUEEN<
皇后问题一共有"
种解法"
return
3、输入二个64位的十进制数,计算相乘之后的乘积。
以下代码为网上别人贴出的,输入任意位数十进制数(包括小数,负数)都可以得出正确结果。
思路是:
将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写乘法。
MAX
100
str_num(char
str[])
//计算字符串的长度,等效于strlen(str);
i=0,num_str=0;
while(str[i]!
=0)
{num_str++;
return(num_str);
place(int
num_str,char
//将字符串高低颠倒。
temp=0,i=0,j=0;
for(i=0,j=num_str-1;
j;
i++,j--)
{temp=str[j];
str[j]=str[i];
str[i]=temp;
transition(unsigned
a[],char
str1[])
//数字字符转化为数字。
while(str1[i]!
{a[i]=str1[i]-'
0'
multiply_int(unsigned
a[],unsigned
b[],unsigned
c[])
//大数相乘算法,入口为整形数组。
i=0,j=0;
for(i=0;
MAX;
for(j=0;
j<
j++)
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
output(int
sign,unsigned
c[],int
quan)
//数据输出。
sign_temp=0,i=0;
The
result
is:
if(sign==1)
-"
for(i=MAX-1;
i>
-1;
i--)
if(sign_temp==0)
{if(c[i]!
sign_temp=1;
if(sign_temp==1)
if(i==quan-1)
."
c[i];
c[i]=0;
multiply_string(char
str1[],char
str2[],unsigned
//大数相乘,入口为字符串。
unsigned
a[MAX]={0},b[MAX]={0};
sign=0;
transition(a,str1);
transition(b,str2);
multiply_int(a,b,c);
sign_comp(char
str2[])
//符号判断,如果为负数将作相应处理。
i=0,sign_num=0;
if(str1[0]==45)
{sign_num=!
sign_num;
MAX-1;
str1[i]=str1[i+1];
if(str2[0]==45)
str2[i]=str2[i+1];
(sign_num);
format(char
//将输入的字符串进行格式化。
以得到字符的一些标志信息和相应格式的新数据串。
point=0,quan=0,i=0,j,k=0,sign_point=0,num_str=0;
num_str=str_num(str);
if(str[i]<
||str[i]>
9'
)
if(str[i]!
.'
{cout<
data
error"
return(-1);
{point++;
sign_point=i;
if(point>
1)
if(point==1)
for(j=sign_point;
num_str;
str[j]=str[j+1];
num_str--;
quan=num_str-sign_point;
place(num_str,str);
return(quan);
clear(char
//清空函数。
i;
str[i]=0;
main(void)
//主函数。
str1[MAX]={0},str2[MAX]={0};
quan1=0,quan2=0,sign=0;
c[MAX*2+1]={0};
do
Please
input
the
first
number:
cin>
str1;
second
str2;
sign=sign_comp(str1,str2);
quan1=format(str1);
quan2=format(str2);
if(quan1==-1||quan2==-1)
clear(str1);
clear(str2);
}while(quan1==-1||quan2==-1||str1[0]==0||str2[0]==0);
multiply_string(str1,str2,c);
output(sign,c,quan1+quan2);
所有题目到此结束,说实话后面两题的算法我就是看别人的代码(呵呵,再次实话,后两题代码也不是我写的,只是对已有代码做了些修改,使结构更清晰,便于阅读)理解清楚也用了2个小时以上,所以我还真没有自信将答案发到那个邮箱呢。
看白云黄鹤上别的学生的反响,让人怀疑这套题是否出得有点难了。
C++笔试题(十一)
constchar*,charconst*,char*const的区别问题几乎是C++面试中每次都会有的题目。
事实上这个概念谁都有只是三种声明方式非常相似很容易记混。
Bjarne在他的TheC++ProgrammingLanguage里面给出过一个助记的方法:
把一个声明从右向左读。
*constcp;
(*读成pointerto)
cpisaconstpointertochar
constchar*p;
pisapointertoconstchar;
charconst*p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
---------------------------------
下面这个程序执行后会有什么错误或者效果:
#defineMAX255
intmain()
unsignedcharA[MAX],i;
for(i=0;
=MAX;
A[i]=i;
解答:
MAX=255
数组A的下标范围为:
0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for(i=0;
i++)语句时,
由于unsignedchar的取值范围在(0..255),i++以后i又为0了..无限循环下去.
注:
char类型为一个字节,取值范围是[-128,127],unsignedchar[0,255]
---------------------------------
编写用C语言实现的求n阶阶乘问题的递归算法:
longintfact(intn)
intx;
longinty;
if(n<
0)
{
printf("
error!
}
if(n==0)
return1;
x=n-1;
y=fact(x);
return(n*y);
--------------------------------
二分查找算法:
1、递归方法实现:
intBSearch(elemtypea[],elemtypex,intlow,inthigh)
/*在下届为low,上界为high的数组a中折半查找数据元素x*/
intmid;
if(low>
high)return-1;
mid=(low+high)/2;
if(x==a