趋势科技笔试题1
2008-08-19 22:21趋势的笔试题
1,你有5瓶药,每个药丸重10克,只有一瓶受到污染的药丸重量发生了变化,每个药丸重9克。给你一个天平,你怎样一次就能测出哪一瓶是受到污染的药呢? 1:2 :2
2. 十个苹果,有一个不同.或轻或重.称三次.
3,有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必要带着手电筒。手电筒必须要传来传去,不能扔过去。每个女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。
第一个女人:过桥需要1分钟;
第个女人:过桥需要2分钟;
第三个女人:过桥需要5分钟;
第四个女人:过桥需要10分钟。
===================================================
1.
调试好天平后,天平 左右盘各放两瓶,有下列情况:
1,天平平衡,则余下那瓶的是受污染的药:
2,天平左倾,则目标瓶在右盘,现在同时从左右盘拿下一瓶,观察到:若天平恢复平衡,则目标瓶就是右盘拿下的那瓶,若天平依旧左倾则目标就是右盘余下的那瓶.:
3.天平右倾,用上述2 类似的方法判断.
整个过程只用天平一次,只是注意拿下药瓶时从左右盘同时拿一瓶,然后稍作分析即可.
2.答案解析:
4:4:2分别对应A:B;C
1) 先取4A个苹果,一边2A个放天平.结果有a和b两种:
a) 重量相同,另取4B个来称.结果有a1和b1两种:
a1) 如重量相同,留4B个其中的1B个,取剩余2C个中的1C个放天平另一边来称.如不同,那个1C就是了.如相同,C中的另一个就是了.
b1) 如重量不同,参照b方案.
b) 重量不同,取任意一边的2个若是B中的两个即2B,一边1个来称.结果有c和d两种:
c) 相同,则留其中一个1B,取剩余2个中的1个即1C放天平另一边来称.如不同,那个1C就是了.如相同,最后的那个1C就是了.
d) 不同,则留其中一个1B,从已称过的中取1个(若是1A)放天平另一边来称.如不同,那个1B就是了.如相同,B中另一个就是了.
答案3
1,2 go 2
1 back 1
5,10 go 10
2 back 2
1,2 go 2
趋势科技笔试题2
2008-04-18 17:59 以下的代码可放在VC++6.0里面运行。题目是要求输出:TrendMicroSoftUSCN然后要求修改程序,使程序能输出以上结果.
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc,char * argv[])
{
string strArr1[]={ "Trend ", "Micro ", "soft "};
string *p=new string[2];
p[0]= "US ";
p[1]= "CN ";
cout <<sizeof(strArr1) <<endl;
cout <<sizeof(p) <<endl;
cout <<sizeof(string) < <endl;
for(int i=0;i <sizeof(strArr1)/sizeof(string);i++)
cout <<strArr1[i];
for(i=0;i <sizeof(p)/sizeof(string);i++) //sizeof(p)*8/sizeof(string)
cout <<p[i];
cout <<endl;
}
我在VC里面调过了,sizeof(strArr1)=48.
sizeof(string)=16.
sizeof(p)=4(指针变量)
我不明白的是为什么sizeof(string)=16,以及string 好象是在C#里面的,怎么用到C++里面了.
给出的答案是:for(i=0;i <sizeof(p)/sizeof(string);i++)
改为for(i=0;i <sizeof(p)*2/sizeof(string);i++)
我又调了下,应该是sizeof(p)*8 (这才对的),
给位来帮我看看呢???
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
首先要明确sizeof 不是函数,也不是一元运算符,他是个类似宏定义的特殊关键字,sizeof();括号内在编译过程中是不被编译的,而是被替代类型,如 int a=8;sizeof(a);在编译过程中,它不管a的值是什么,只是被替换成类型 sizeof(int); 结果为4.如果sizeof(a=6);呢,也是一样的转换成a的类型,但是要注意 因为a=6是不被编译的,所以执行完sizeof(a=6);a的值还是6,是不变的!
记住以下几个结论:
1.unsigned影响的只是最高位bit的意义(正负),数据长度不会被改变的。所以sizeof(unsigned int) == sizeof(int);
2.自定义类型的sizeof取值等同于它的类型原形。如typedef short WORD;sizeof(short) == sizeof(WORD)。
3.对函数使用sizeof,在编译阶段会被函数返回值的类型取代。如:int f1(){return 0;};
cout < <sizeof(f1()) < <endl; // f1()返回值为int,因此被认为是int
4.只要是指针,大小就是4。如:cout < <sizeof(string*) < <endl; // 4
5.数组的大小是各维数的乘积*数组元素的大小。如:char a[] = "abcdef ";
int b[20] = {3, 4};
char c[2][3] = { "aa ", "bb "};
cout < <sizeof(a) < <endl; // 7
cout < <sizeof(b) < <endl; // 20*4
cout < <sizeof(c) < <endl; // 6
数组a的大小在定义时未指定,编译时给它分配的空间是按照初始化的值确定的,也就是7,包括‘/0’的。
6.字符串的sizeof和strlen,用例子说明:
char a[] = "abcdef ";
char b[20] = "abcdef ";
string s = "abcdef ";
cout < <strlen(a) < <endl; // 6,字符串长度
cout < <sizeof(a) < <endl; // 7,字符串容量
cout < <strlen(b) < <endl; // 6,字符串长度
cout < <sizeof(b) < <endl; // 20,字符串容量
cout < <sizeof(s) < <endl; // 16, 这里不代表字符串的长度,而是string类的大小
cout < <strlen(s) < <endl; // 错误!s不是一个字符指针。
a[1] = '/0 ';
cout < <strlen(a) < <endl; // 1
cout < <sizeof(a) < <endl; // 7,sizeof是恒定的
所以你的问题就解决的差不多了,sizeof(string)=16如yi-0220所说,
给出的答案是:for(i=0;i <sizeof(p)/sizeof(string);i++)
改为for(i=0;i <sizeof(p)*2/sizeof(string);i++) 答案也是不对的,sizeof(p)只是指针大小 为4, 要想求出数组p指向数组的成员个数,应该为sizeof(*p)*8/sizeof(string),为什么?
指针p指向数组,则*p就是指向数组中的成员了,成员的类型是什么,string型,ok那么sizeof(*p)为16,乘以2才是整个数组的大小
趋势科技笔试题3
2008-04-18
1、
#include <iostream>
class A{
public:
A() {func(0);}
virtual void func(int data) {printf("A1 :%d/n",data);}
virtual void func(int data) const {printf("A2 :%d/n",data);}
void func(char *str) {printf("A3 :(%s)/n",str);}
};
class B:public A{
public:
void func() {printf("B1 :%s/n","");}
void func(int data) {printf("B2 :%d/n",data);}
void func(char *str) {printf("B3 :(%s)/n",str);}
};
int main()
{
A *pA;
B b;
const A *pcA;
pA=&b;
pA->func(1);
pA->func("test");
A().func(1);
pcA=&b;
pcA->func(2);
return 0;
}
程序运行的结果:
A1 :0
B2 :1
A3 :(test)
A1 :0
A1 :1
A2 :2
1) 基类的指针指向派生类对象:那么该指针只能够调用基类所定义的函数,但是如果该函数为虚函数,则调用该派生类自己的成员函数。(B2 :1)
2) 如果以派生类的指针指向基类对象,则必须事先做明显的转型操作,但是这种做法很危险。
2、
#include <iostream>
template
void func(const int &t)
{
cout<<t+100<<endl;
}
template <typename T>
void func(const T&t)
{
cout<<t;
}
int main()
{
func(10.3);
func(1000);
return 0;
}
程序运行结果:
10.3
1000
如果上述函数改为
#include <iostream>
void func(const int &t)
{
cout<<t+100<<endl;
}
template <typename T>
void func(const T&t)
{
cout<<t<<endl;
}
int main()
{
func(10.3);
func(1000);
return 0;
}
则程序的运行结果为:
10.3
1100
如果使用函数的非模板形式,不能在前面加上template关键字。
3、改错:
#include <iostream>
class klass
{
public:
klass(){}
private:
~klass(){}
void func(int n){cout<<"klass!!"<<endl;}
public:
void test(){func(100);}
};
int main()
{
klass k;
k.test();
return 0;
}
运行后程序显示:error C2248: 'klass::~klass' : cannot access private member declared in class 'klass'
证明析构函数的属性必须为public。
但是,如果把klass k改为klass* pk; pk=new klass; pk->test();程序通过,但是klass不能释放.