2014年趋势科技笔试+面试(实习生)

笔试题分为:性格测试+单选+不定项选+附加题

题目链接: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过程是怎么实现的?(我晕),我胡扯一番,把进程,操作系统的系统函数都搬出来了。

就针对以上的问题和我探讨了半个多小时,还有十几分钟和我闲聊了一些工作问题,整个过程不错。。。

第二天我就收到了录用通知,鼓掌!!!

你可能感兴趣的:(2014年趋势科技笔试+面试(实习生))