笔试

把我近来参加的一些公司的笔试题目纪录下来,希望和大家一起分享经验,祝福大家都能找到理想的工作!
 

趋势:考你在混乱状态下的编程能力。
全英文试卷,先考智力题,图形题比较难,做晕了。然后开始看程序,改错题一般,另外出了两道UML题目,全不会。
编程题比较基础简单,
1.
实现memcpy(char *dst, char *src, int size)函数;可惜偶看错题目,写成strcpy()函数了。
2.
线性链表的倒序排列。

华为:考基础编程。
改错题颇有些难度,稍不留神就易犯错。
第一题:很多人误把 4<x 这样的表达式看成错误,偶开始也被蒙住了,因为自己编程时很少把常量写成左值,幸亏及时反应过来。其实就是考函数返回类型,呵呵。
第二题,把10000内的十进制数转换成BCD码。看起来很烦,因为忘记BCD码怎么转换了,仔细看了半天,后来才发现错误原来很简单,忘了赋初值了。
第三题,题目大致是这样:
void *GetMemory(char ** str, int count)
{
   *str = malloc char(count);
}

func()
{
  char *str = NULL;
  GetMemory(str, 1000);
  strcpy(str, "hello");
  //...
}
考的时候想起林锐博士的那本书,专门介绍了若干种字符串申请内存的出错点,都没对上号,后来一看,原来是函数参数传错了,应该是传str的地址,GetMemory(&str, 1000); hoho,就这么简单,还有内存分配没有释放,不知道这算不算另一个错误。

第四题,考静态成员函数的,牢记static 函数不能引用this指针,就可以了。

编程题也比较简单,两道题。
1.
写一个函数,看单词是否是reversive word,如level
2. n
张不同面值的邮票,一次最多可以贴m张。问最多可以得到多大的连续区间,每个值都可以用这些邮票表示?如n=4, 邮票为1,4,12,21; m=5.求闭合区间。

后记:面试时看到自己的笔试成绩了,汗,才考了63分,基础太差了,连好多本科生都不如啊~~
微软工程院:和华为面试冲突,放弃了:( 听说智力题蛮难的。

贝尔阿尔卡特:
移动部门:主要考察通信方面的知识,还有许多听都没听过的专业问题。
首先让你选择都会哪些方面的知识?比如编程语言,DSP,驱动,PCI,中间件,GSMCDMACDMA2000WCMDATDSCDMA
问题大致有:信道编码的目的?交换和软交换的概念和目的,电路交换和报文交换的优缺点比较,软件工程的生存周期,IP V4的报文格式,虚函数的作用,怎么防止程序的crack
两道编程题,1.编写给定个数的字符拷贝函数(和趋势的第一道编程题刚巧重复)2.考察双向链表的删除给定项节点。
只考一个小时,时间非常紧张,全英文答题,一紧张很多专业术语都不知怎么表述了。

NI公司:
软件:10道基础程序题,一个英文表述题。共一个小时。
感觉都是考察非常基础的知识。
1. const
常量的作用:1可以定义const常量。 2可以修饰函数的参数、返回值,函数的定义体。被const修饰的东西受到强制保护,提高程序的稳健性。
2. #ifndef #define
作用:防止头文件被重复引用。
3.
虚函数和纯虚函数的作用和区别:
虚函数是为了实现多态性,在子类重载实现。纯虚函数不定义函数体,只在派生类中实现;告诉系统:1.这个函数可以没有函数定义;2、拥有本函数的类是抽象类;抽象类不可以生成实例。
4.
运算顺序,压栈顺序  
   int a = 12, b=1;
   a+=a-=a*=a;      //first: a*=a,a = 144; a-=a, a=0; a+=a, a=0;
   b+= ++b + b++; //first: ++b, b=2, 2+2=4, b=3; 3+4=7;
5.
改错题:
  char *chStr = new char [10];
  strcpy(chStr, "abcde");
  chStr ++;
  printf("%s", chStr);
  delete chStr;
 
问题:chStr指针后移一个字节后删除,第一个字节无法释放,内存泄漏。
  
修改方法:
  char *chStr = new char [10];
  strcpy(chStr, "abcde");
  char *p = chStr;
  chStr ++;
  printf("%s", chStr);
  delete p;
6. 
输出结果:
 char *a = "this is a dog";
 char *b = "this is a dog";
 char *p = a;
 p[0] = 'T';
printf("%s", b);
 a,b
指针共用一段内存,指向常量字符串,p[0]='T';异常,试图修改常量字符串内容。
char a[] = "asdlfj"  //
这样的才可以改, 运行时会从常量区给你复制过一份到a[],改的是复制过来的。
release
版本下,可改写,最后输出是"This is a dog".
7.
实现同步的基本方法:
  
临界区critical sections,信号量SemaphoreMutex ,锁Lock,事件Event
8.
黑盒测试和白盒测试
  黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,检测每个功能是否都能正常使用,测试者在程序接口进行测试。黑盒测试方法主要有等价类划分、边值分析、因—果图、错误推测等,主要用于软件确认测试。
   白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
10.
编程题:strcmp()函数实现


南京摩托罗拉:
全英文考卷,原计划一小时,无人能完成,改成一个半小时。
基本C++,网络部分,软件工程,概念题,测试,逻辑题,编程题ltoa()函数实现


各个公司都考到软件工程的概念。
1.
软件生存周期
一、软件定义
1
、系统分析 :系统分析的任务是确定待开发软件的总体要求和适用范围,以及与之有关的硬件、支撑软件的要求。
2
、软件项目计划:确定待开发软件的目标,作出可行性分析,并对资源分配、进度安排等作出合理的计划。
3
、需求分析:需求分析的任务是确定软件的功能、性能、数据、界面等要求,从而确定系统的逻辑模型。
二、软件开发
1
、软件设计:分为概要设计和详细设计,概要设计主要是模块分解,确定软件的结构,以及全局数据结构的设计。详细设计的任务是设计每个模块的实现细节和局部数据结构。
2
、编码 
3
、软件测试:对软件中的错误进行修正,分为黑盒测试和白盒测试。
三、软件维护
一是在软件的运行过程中发现了隐藏的错误,二是适应变化了的环境来进行修改,三是修改或扩充原有软件的功能。

或者分成:问题定义、可行性研究、需求分析、总体设计(概要设计)、详细设计、编码和单元测试、综合测试、软件维护。
 
2.
黑盒测试和白盒测试:
黑盒测试
  黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,

测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因—果图、错误推测等,主要用于软件确认测试。 “黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。
白盒测试:
 
 白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。“白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

3.
软件设计的开发模型 
瀑布式waterfall:规定了各项软件工程活动。包括:制定开发计划、进行需求分析和说明、软件设计、程序编码、测试及维护。特点:自上而下,相互衔接的固定次序,如瀑布流水、逐级下落。在需求明确的情况下使用瀑布模型。

原型式prototype:第一次只是试验开发,其目标只在于探索可行性,弄清软件需求;第二次则在此基础上获得较为满意的软件产品,通常把一次得到的试验性产品称"原型"。特点:减少由于软件需求不明确而给开发带来的风险。对于自主开发及客户需求不明并有较长的设计时间可以用原型演化模型。

螺旋模型spire:将瀑布模型及演化螺旋模型结合起来,并且加入被两种模型都忽略了的风险分析,弥补了两者的不足。 适于适合于大型软件开发,吸收了"演化"概念,不过有时也用于用户需求不明的情况下。


常见函数编程:
char *strcpy(char *strDest, const char *strSrc)
{
   ASSERT(strDest != NULL && strSrc != NULL);
   char *addr = strDest;
    while(*strDest++=*strSrc++);
}    
    return addr;
}

void *memcpy(void *dest, const void *src, int count)
{
   ASSERT(dest!= NULL && src!= NULL);
   for(int i=0; i< cout; i++)
    {
      dest[i] = src[i];
    }
}
int strcmp(const char*str1, const char *str2)
{
while (str1 != NULL && str2 != NULL)
{
if(*str1 < *str2)  return -1;
else if(*str1 > *str2) return 1;
else { str1++; str2++;}
}
if(str1 == NULL && str2 != NULL)
return -1;
else if(str1 != NULL && str2 == NULL)
return 1;
else return 0;
}

//way2
more compact
int strcmp(const char*str1, const char *str2)
{
int i = strlen( str1 );
int j;
for(j=0; j<=i; j++)
{
if(str1[j] > str2[j]) return 1;      //if str2 terminates, then str2[j]=0, str1[j]>str2[j], return 1;
else if(str1[j] < str2[j]) return -1;
else if(str1[j] == '\0') return 0;
}
}
//way3: optimize again.
int strcmp(const char * str1, const char * str2 )
{
while(1)
{
if(*str1 > *str2) return 1;
else if(*str1 < *str2) return -1;
else if(*str1 == '\0') return 0;
str1++;str2++;
}
}

char *ltoa(long value, char *string, int radix)
{
//under study.

}

 

posted on 2004-11-23 11:37  水精灵  阅读(1534)  评论(4)    收藏  举报

导航