笔试题分为:性格测试+单选+不定项选+附加题
题目链接:http://blog.csdn.net/hxz_qlh/article/details/14110221
测试:
计算机科学或相关专业,本四或研二
每周保证四天以上,实习时间6个月以上
熟悉Linux测试优先
熟练掌握Python程序开发
Web基础知识强,有数据库设计和操作经验优先
有项目实践经验者优先
4.D
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也 可以使用联合体来发挥其长处。首先看一段代码: union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =4; a.u.y =5; a.u.z =6; a.k = 0; printf("%d %d %d\n",a.u.x,a.u.y,a.u.z); return 0; } union 类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体 的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋 值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的 值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6 当程序变成 union myun { struct { int x; int y; int z; }u; int k; int j; }a; int main() { a.u.x =4; a.u.y =5; a.u.z =6; a.k = 0; a.j = 1; printf("%d %d %d\n",a.u.x,a.u.y,a.u.z); return 0; } 结果为1,5,6 因为还是从最低的地址开始覆盖,而不是像有些人想象的是 0,1,6
21. BD
#include <iostream> using namespace std; //int numbers[5] = {1,2,3,4,5}; extern int *numbers; int main() { cout<<&numbers[1]<<endl; cout<<numbers[0]<<endl; return 0; }百度百科的介绍:在一个源文件里定义了一个数组:char a[6];在另外一个文件里用下列语句进行了声明:extern char *a;请问,这样可以吗
1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 (数组的起始地址),而*a是重新定义了一个指针变量,a的地址可能是0x87654321,直接使用*a是错误的.
42. 36
#include <iostream> using namespace std; struct Base { virtual ~Base()=0; char ch; }; struct A1:virtual public Base { int i; }; struct A2:virtual public Base { int *p; }; struct A3:virtual public Base { long l; }; struct Foo:public A1,public A2,public A3 { short id; }; int main() { cout<<sizeof(Foo)<<endl; return 0; }
提示:虚函数表和继承的构造函数都要考虑
44. 66
#include <iostream> #include <exception> #include <stdlib.h> using namespace std; template<unsigned int size> class CTestObj { private: int *m_pvalue; public: CTestObj(int &arr[size]) { m_pvalue = new int[]; *m_pvalue = 0; for(unsigned int i = 0;i<size;i++) { *m_pvalue+=arr[i]; } } ~CTestObj() { delete m_pvalue; } void Test() { if(*m_pvalue>100) throw std::exception(); } }; int main() { try { int arr[]={1,2,3,4,500}; CTestObj<_countof(arr)> *pobj = new CTestObj<_countof(arr)>(arr); pobj->Test(); delete pobj; } catch (std::exception &) { cout<<"exception"<<endl; } cout<<"end"<<endl; return 0; }附加题
1.
#include<stdio.h> #define max 100 bool flag[max]; int main() { __int64 i,j,num; for(i=2;i<=max;i++) { if(!flag[i]) { for(j=i*i;j<=max;j=j+i) flag[j]=true; //这是标记倍数筛选的主要部分都在这儿 } } for(i=2;i<=max;i++) { if(!flag[i]) { printf("%I64d ",i);//这句如过不注释的话,可以输出每一个质数具体是多少 } } return 0; }
面试:
(1)从一个文件中取出数据,排序(排序算法需要自己写),然后重新存入到一个文件中(写出代码);并设计测试用例,针对你写的代码;并考虑各种情况;引申出一系列问题:比如在什么情况下创建文件会失败?文件的相对路径中可以存在中文字符吗?
(2)window环境下的copy过程是怎么实现的?(我晕),我胡扯一番,把进程,操作系统的系统函数都搬出来了。
就针对以上的问题和我探讨了半个多小时,还有十几分钟和我闲聊了一些工作问题,整个过程不错。。。
第二天我就收到了录用通知,鼓掌!!!