入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

C/C++笔试题(很多)

创建时间:2016-08-29 投稿人: 浏览次数:21756


1.进程和线程的差别。


线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. 
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。


2.测试方法


人工测试:个人复查、抽查和会审
机器测试:黑盒测试和白盒测试


2.Heap与stack的差别


Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行


3.Windows下的内存是如何管理的?


4.介绍.Net和.Net的安全性。


5.客户端如何访问.Net组件实现Web Service?


6.C/C++编译器中虚表是如何完成的?


7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。


8.谈谈IA32下的分页机制


小页(4K)两级分页模式,大页(4M)一级


9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?


一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方   ??


10.在IA32中一共有多少种办法从用户态跳到内核态?


通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等


11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?

用内存映射或全局原子(互斥变量)、查找窗口句柄.. 
FindWindow,互斥,写标志到文件或注册表,共享内存。. 


12.如何截取键盘的响应,让所有的‘a’变成‘b’?


键盘钩子SetWindowsHookEx


13.Apartment在COM中有什么用?为什么要引入?


14.存储过程是什么?有什么用?有什么优点?

 

    存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程用于实现频繁使用的查询、业务规则、被其他过程使用的公共例行程序

存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快

15.Template有什么特点?什么时候用?


16.谈谈Windows DNA结构的特点和优点。


17.网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?


1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
区别:两者都可以提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

 

 


1写出下列算法的时间复杂度。


(1)冒泡排序; 
(2)选择排序; 
(3)插入排序; 
(4)快速排序; 
(5)堆排序; 
(6)归并排序;

 

2写出下列程序在X86上的运行结果。

 

struct mybitfields 

unsigned short a : 4; 
unsigned short b : 5; 
unsigned short c : 7; 
}test

void main(void)  

int i; 
test.a=2; 
test.b=3; 
test.c=0;

i=*((short *)&test); 
printf("%d/n",i); 
}

 

3写出下列程序的运行结果。

 

unsigned int i=3; 
cout<<i * -1;

 

4写出下列程序所有可能的运行结果。

int a; 
int b; 
int c;

void F1() 

b=a*2; 
a=b; 
}

void F2() 

c=a+1; 
a=c; 
}

main() 

a=5; 
//Start F1,F2 in parallel 
F1(); F2(); 
printf("a=%d/n",a); 
}

 

5考察了一个CharPrev()函数的作用。

 

6对 16 Bits colors的处理,要求:


(1)Byte转换为RGB时,保留高5、6bits; 
(2)RGB转换为Byte时,第2、3位置零。

 

7一个链表的操作,注意代码的健壮和安全性。要求:


(1)增加一个元素; 
(2)获得头元素; 
(3)弹出头元素(获得值并删除)。

 

8一个给定的数值由左边开始升位到右边第N位,如 0010<<1 == 0100 或者 
0001 0011<<4 == 0011 0000 请用C或者C++或者其他X86上能运行的程序实现。

 

附加题(只有在完成以上题目后,才获准回答)


1。In C++, what does "explicit" mean? what does "protected" mean?

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit,反之默认类型转换可能会造成无法预期的问题。

protected控制的是一个函数对一个类的成员(包括成员变量及成员方法)的访问权限。protected成员只有该类的成员函数及其派生类的成员函数可以访问

 

1.  在C++中有没有纯虚构造函数?

构造函数不能是虚的。只能有虚的析构函数

 

2.  在c++的一个类中声明一个static成员变量有没有用?

在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,也就是说不管创建多少对象,static修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。

static是加了访问控制的全局变量,不被继承。  


3。在C++的一个类中声明一个静态成员函数有没有用? (同上?)


4。如何实现一个非阻塞的socket?


5。setsockopt, ioctl都可以对socket的属性进行设置,他们有什么不同? (linux)


6。解释一下进程和线程的区别? (重复,参见微软亚洲技术中心笔试)
7。解释一下多播(组播)和广播的含义?

组播:主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。

广播:主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要).

 

8。多播采用的协议是什么?


9。在c++中纯虚析构函数的作用是什么?请举例说明。


10。编程,请实现一个c语言中类似atoi的函数功能(输入可能包含非数字和空格)

 

 

一、选择题:15分 共10题 
1.    在排序方法中,关键码比较次数与记录地初始排列无关的是    . 
A. Shell排序      B. 归并排序       C. 直接插入排序     D. 选择排序

 

2.    以下多线程对int型变量x的操作,哪几个需要进行同步: 
A. x=y;         B. x++;         C. ++x;            D. x=1;

 

3.    代码 
void func() { 
        static int val; 
        … } 中,变量val的内存地址位于: 
A. 已初始化数据段    B.未初始化数据段      C.堆              D.栈

 

4.    同一进程下的线程可以共享以下 
A. stack            B. data section   C. register set        D. thread ID

 

5.    TCP和IP分别对应了 OSI中的哪几层? 
A.  Application layer 
B.  Data link layer 
C.  Presentation layer 
D.  Physical layer 
E.  Transport layer 
F.  Session layer 
G.  Network layer

 

6.    short a[100],sizeof(a)返回? 
A 2     B 4       C 100       D 200        E 400

 

7.    以下哪种不是基于组件的开发技术_____。 
A XPCOM        B XP           C COM                D CORBA

 

8.    以下代码打印的结果是(假设运行在i386系列计算机上): 
    struct st_t 
    { 
        int    status; 
        short* pdata; 
        char   errstr[32]; 
    };

    st_t  st[16]; 
    char* p = (char*)(st[2].errstr + 32); 
    printf("%d", (p - (char*)(st)));

A 32          B 114       C 120         D 1112

 

9.    STL中的哪种结构是连续形式的存储 
A  map      B  set         C  list      D  vector

 

10.    一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出序列是( ) 
A、EDCBA;   B、DECBA;    C、DCEAB;    D、ABCDE

 

参考答案:D /ABC/ A/ BC /EG /D /B/ C/ D/ C

 

二、简答题:20分,共2题

1.    (5分)重复多次fclose一个打开过一次的FILE *fp指针会有什么结果,并请解释。 
考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。

2.    (15分)下面一段代码,想在调用f2(1)时打印err1,调用f2(2)时打印err4,但是代码中有一些问题,请做尽可能少的修改使之正确。 
     
1    static int f1(const char *errstr, unsigned int flag) { 
2        int copy, index, len; 
3        const static char **__err = {“err1”, “err2”, “err3”, “err4”}; 
4     
5        if(flag & 0x10000) 
6            copy = 1; 
7        index = (flag & 0x300000) >> 20; 
8      
9        if(copy) { 
10            len = flag & 0xF; 
11            errstr = malloc(len); 
12            if(errstr = NULL) 
13                return -1; 
14            strncpy(errstr, __err[index], sizeof(errstr)); 
15        } else 
16            errstr =  __err + index;     
17    } 
18 
19    void f2(int c) { 
20        char *err; 
22        swtch(c) { 
23        case 1: 
24            if(f1(err, 0x110004) != -1) 
25                printf(err); 
26        case 2: 
27            if(f2(err, 0x30000D) != -1) 
28                printf(err); 
29        } 
30 }    

三、编程题:30分 共1题    注意:要求提供完整代码,如果可以编译运行酌情加分。

1.    求符合指定规则的数。 
给定函数d(n) = n + n的各位之和,n为正整数,如 d(78) = 78+7+8=93。 这样这个函数可以看成一个生成器,如93可以看成由78生成。  
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出1至10000里的所有符合数A定义的数。 
输出: 


 

四、设计题:35分 共1题 
注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。

1.    假设一个mp3搜索引擎收录了2^24首歌曲,并记录了可收听这些歌曲的2^30条URL,但每首歌的URL不超过2^10个。系统会定期检查这些URL,如果一个URL不可用则不出现在搜索结果中。现在歌曲名和URL分别通过整型的SONG_ID和URL_ID唯一确定。对该系统有如下需求: 
1)    通过SONG_ID搜索一首歌的URL_ID,给出URL_ID计数和列表 
2)    给定一个SONG_ID,为其添加一个新的URL_ID 
3)    添加一个新的SONG_ID 
4)    给定一个URL_ID,将其置为不可用

限制条件:内存占用不超过1G,单个文件大小不超过2G,一个目录下的文件数不超过128个。

为获得最佳性能,请说明设计的数据结构、搜索算法,以及资源消耗。如果系统数据量扩大,该如何多机分布处理?

 


Q:When speaking of software products, how do you define the term“quality”.
问:当说到软件产品的时候,你如何定义术语“质量”

       Meeting customer requirements
Q:What is the role of software debelopers and quality assuranle engineers in ensuring the quality of the product? How are other functional areas important to developing a quality product?
问:在确定产品的质量方面,什么是软件开发工程师和质量保证工程师要做的?其他的功能对如何发展产品质量有什么重要?

 软件测试是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其目的是尽快尽早地发现在软件产品中所存在的各种问题——与用户需求、预先定义的不一致性。Quality assuranle engineers: use a set of activities designed to ensure the development process to meet the requirements.
Q:What is cyclomatic complexity?
问:(这是一个复杂度模型吧)

一种代码复杂度的衡量标准,中文名称叫做圈复杂度。圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。
Q:What are black-box texing and white-box texting?
问:什么是黑盒测试和白盒测试?

黑盒测试(Black-box Testing,又称为功能测试或数据驱动测试)是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。黑盒测试注重于测试软件的功能性需求,也即黑盒测试使软件工程师派生出执行程序所有功能需求的输入条件。黑盒测试并不是白盒测试的替代品,而是用于辅助白盒测试发现其他类型的错误。

白盒测试(White-box Testing,又称逻辑驱动测试,结构测试)是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试又称为结构测试和逻辑驱动测试。白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。

Black box testing: a testing without knowledge of the internal working of the item being tested.

white box testing: use specific knowledge of programming code to examine outputs.


Q:The following function divides a by b and out put to c,returns -1 as error.
  Int divide (int a,int b,int c)
  List you test cases in a black-box testing.
问:对 Int divide (int a,int b,int c)函数写出黑盒测试用例

先等价,后边界值 

a       b         c         预期         结果   
  g       g   
  5       0     
  6       2     
  0       1   
  -10   10   
  -10     -10   
  10.0   10.0  
Q:Int a ctivity(int nage,bool bmale)
  {if (nage<60)
    return zoo;
    else if(bmale)
    return golf;
    else return movie;
  } 
用cyclomatic   complexity,共有多少条路径   
   3
Q:The following function tests whether the three numbers can be the lengths of the three sides of a triangle.
Bool triangle(float a,float b,float c)
List you test cases in a black-box testing.
问:也是让写黑盒测试用例,是一个三个数是否是三角形的三条边的测试

先等价,后边界值

a       b         c         预期         结果   
  g       j         0   
  -1     2           2   
  10     2         3   
  2       3         4   
  2       2         5   
  6       6         6  

IQ,EQ题

然后是英文的数据结构,c/c++,数据库,3D建模,软件工程,软件测试

题目几乎都是英文的

后面还要填表格,一张中文的,一张英文的

一般有三个步骤
首先会笔试。笔试题分为EQ题和专业题,EQ题没什么好说的,大家自由发挥就行,不过其中有一些逻辑推理题要注意。专业题目全英文,考的内容很多,数据结构,C/C++语法,COM,3D建模,软件测试基础知识,如黑盒,白盒测试等,题不难,每方面有三到五题左右。
笔试成绩达到一定分数过后才能进入第二轮人事部面试。这部分面试一般是五人一组在一房间里,面试人员会问很多问题,然后每个人做答,问题很随机,当时好像问了“最尊敬的人是谁,最难忘的事是什么,有何职业规划,如何处理与同事之间的关系矛盾等等”。
这轮过后就到技术部面试,会问一些基础知识,如数据结构常用的有哪些,如何用C/C++写出其中的一种,面象对像有哪些特性,XML是什么等等,可能他会用英语问你这些问题,各位练下听力口语哈(当时俺被问的很郁闷)

COM:

(COM),是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块;等等。COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。

开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。
COM所含的概念并不止是在Microsoft Windows操作系统下才有效。COM并不是一个大的API,它实际上象结构化编程及面向对象编程方法那样,也是一种编程方法。在任何一种操作系统中,开发人员均可以遵循“COM方法”。 有的组件必须满足两个条件:第一,组件必须动态链接;第二,它们必须隐藏(或封装)其内部实现细节。动态链接对于组件而言是一个至关重要的要求,而消息隐藏则是动态链接的一个必要条件。对于COM来讲,接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数地址。

 

1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)

int a = 4;

(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

a = ?

答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;

改后答案依次为9,10,10,11

 

2.某32位系统下, C++程序,请计算sizeof 的值(5分).

char str[] = “www.ibegroup.com”

char *p = str ;

int n = 10;

请计算

sizeof (str ) = ?(1)

sizeof ( p ) = ?(2)

sizeof ( n ) = ?(3)

void Foo ( char str[100]){

请计算

sizeof( str ) = ?(4)

}

void *p = malloc( 100 );

请计算

sizeof ( p ) = ?(5)

答:(1)17 (2)4 (3) 4 (4)4 (5)4

 

3. 回答下面的问题. (4分)

(1).头文件中的 ifndef/define/endif 干什么用?预处理

答:防止头文件被重复引用

(2). #include 和 #include “filename.h” 有什么区别?

答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。

(3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?

答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

(4). switch()中不允许的数据类型是?

答:实型

4. 回答下面的问题(6分)

(1).Void GetMemory(char **p, int num){

*p = (char *)malloc(num);

}

void Test(void){

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test 函数会有什么样的结果?

答:输出“hello”

(2). void Test(void){

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL){

strcpy(str, “world”);

printf(str);

}

}

请问运行Test 函数会有什么样的结果?

答:输出“world”

(3). char *GetMemory(void){

char p[] = "hello world";

return p;

}

void Test(void){

char *str = NULL;

str = GetMemory();

printf(str);

}

请问运行Test 函数会有什么样的结果?

答:无效的指针,输出不确定

 

5. 编写strcat函数(6分)

已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);

其中strDest 是目的字符串,strSrc 是源字符串。

(1)不调用C++/C 的字符串库函数,请编写函数 strcat

答:

VC源码:

char * __cdecl strcat (char * dst, const char * src)

{

char * cp = dst;

while( *cp )

cp++; /* find end of dst */

while( *cp++ = *src++ ) ; /* Copy src to end of dst */

return( dst ); /* return dst */

}

(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?

答:方便赋值给其他变量

 

6.MFC中CString是类型安全类么?

答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换

 

7.C++中为什么用模板类。

答:(1)可用来创建动态增长和减小的数据结构

(2)它是类型无关的,因此具有很高的可复用性。

(3)它在编译时而不是运行时检查数据类型,保证了类型安全

(4)它是平台无关的,可移植性

(5)可用于基本数据类型

 

8.CSingleLock是干什么的。

答:同步多个线程对一个数据类的同时访问

9.NEWTEXTMETRIC 是什么。

答:物理字体结构,用来设置字体的高宽大小

10.程序什么时候应该使用线程,什么时候单线程效率高。

答:1.耗时的操作使用线程,提高应用程序响应

2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

3.多CPU系统中,使用线程提高CPU利用率

4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

其他情况都使用单线程。

 

11.Windows是内核级线程么。

答:见下一题

 

12.Linux有内核级线程么。

答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程

 

13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。