其他公司的笔试题7

 
int    a,b,c   请写函数实现C=a+b    ,不可以改变数据类型,如将c改为long    int,关键是如何处理溢出问题
bool   add   (int   a,   int   b,int   *c)  
 {  
 *c=a+b;  
 return   (a>0   &&   b>0   &&(*c<a   ||   *c<b)   ||   (a<0   &&   b<0   &&(*c>a   ||   *c>b));  
 }  
  溢出返回 1
 
  1--      简述操作系统内存管理方式和区别   
段式,页式,段页式。区别:段式,内存分为若干大小不等的段;页式,内存分为大小等同的页;段页式,先分段,段内再分成若干页。   区别,,是否产生碎片?
 2---    什么是死锁,什么是 饿死   
死锁是系统处于的某种状态,这种状态下,所有处于死锁进程都处于”等待态“,并且循环等待别的进程的资源。饿死是指某一(些)进程永远得不到所期望的资源。
 3---    什么叫IPC,有几种方式?
 
桌面上有三个盒子,其中一个里面有手机,而另外两个是空的.主持人首先让你选择一个,然后她去打开剩下的一个空的盒子,然后他问你要不要和最后剩下的那个盒子交换, 请写个程序证明是换好还是不换好 !
换好
这个是玛丽莲小姐问题。答案是换。   
  当主持人去掉一个错误答案后,   
  如果不换,那么开始选对就选对了,没选对就没选对,主持人的行为对你没有任何影响,所以选对的概率是 1/3   
  如果换,那么如果开始选对,现在就错了,如果开始选错,现在就对了。也就是说,如果开始选错了,那么结果就能选对。因为空盒子有 2 个,选错的概率是 2/3 ,也就是说,最后选对的概率是 2/3   
  所以答案是换。   
void   main()  
{  
       int   i,b,c,j;  
       int   a[3];  
       int   change=0;  
       int   nochange=0;  
       for(i=0;i<10000;i++)  
       {  
              a[0]=0;  
              a[1]=0;  
              a[2]=0;  
              a[int(rand()%3)]=1;                                 // 一个手机   
              b=int(rand()%3);                                       // 选择的一个   
              while(1)  
              {
                     c=int(rand()%3);  
                     if(c!=b&&a[c]==0)                               // 主持人打开一个空的   
                            break;  
              }  
              if(a[b]==1)   nochange++;                           // 不换   
              else change++;
       }  
       printf("change:%d/n",change);  
       printf("nochange:%d/n",nochange);  
}  
结果为:
change:6613
nochange:3387
 
假如把网络40.15.0.0分成两个子网,第一个是40.15.0.0/17, 那么第二个子网将是:   d
 a.    40.15.1.0/17  
 b.    40.15.2.0/16  
 c.    40.15.100.0/17  
 d.    40.15.128.0/17 
17 表示转换为二进制时前 17 位为子网号,在第前 17 位加 1 ,也就是点分 10 进制第三部分加上 1000   0000   也就是 128
 
中软面最后一道面试题
class    ABase  
 {   
 public:   
 ABase():Aval(10)    { cout<<"construct   ABase!"<<endl;   }  
   
 ~ABase()    {   cout<<"destory   ABase!"<<endl;   }  
 protected:   
 int    Aval;  
 };   
 class    CBase  
 {   
 public:     
 CBase(ABase    &at):a(at)  
 {   
                    cout<<"construct   CBase!"<<endl;  
 }   
 ~CBase()     
 {     
 cout<<"destory    CBase!"<<endl;    
 }   
 private:   
                    int   Cval;  
 ABase    a;  
 };   
 int    main()  
 {   
        ABase   aa;  
        CBase   bb(aa);  
        return   0;  
 }   
 输出结果是什么?为什么?   
   
 如果把类CBase的构造函数改成如下:   
 CBase(ABase    &at)  
 {   
          a   =   at;    
          cout<<"construct   CBase!"<<endl;  
 }   
 输出结果是什么?并说明原因?
construct   ABase!  
 construct   CBase!  
 destroy   CBase!  
 destroy  ABase!  
 destroy   ABase!  
  然后改成 a   =   at; 结果是 :  
 construct   ABase!  
 construct   ABase!  
 construct   CBase!  
 destroy   CBase!  
 destroy   ABase!  
 destroy   Abase!   
 
CBase(ABase   &at):a(at)  
 {  
  。。。   
 }  
  指明了调用 a copy   constructor
CBase(ABase   &at)  
 {  
          a   =   at;    
          cout<<"construct   CBase!"<<endl;  
 }  
  构造函数等效于   
 CBase(ABase   &at)   :   a()  
 {  
          a   =   at;    
          cout<<"construct   CBase!"<<endl;  
 }  
 
5*(5-1/5) 5*4.8 24
 
1。const,volatile,makefile的作用是什么?   
是防止编译器把数据优化入 cache, 比如我们要访问的某个地址其实是个外设端口 , 如果优化入 cahce, 那么每次访问就不一定能得到预期的值
 2。 使用函数指针数组替代 switch 语句   
        原始代码示例:   
        enum   NodeType   {NodeA,NodeB,NodeC};  
        switch(getNodeType())  
        {      
              case   NodeA:  
                  ...  
                  ...  
              case   NodeB:  
                  ...  
                  ...  
              case   NodeC:  
                  ...  
                  ...  
        }  
        更改后的代码示例(请填写):   
              int   processNodeA(void);  
              int   processNodeB(void);  
              int   processNodeC(void);            
          /*Establishment   of   a   table   of   points   to   functions*/  
   
int   (*p[3])(void);  
      p[NodeA]   =   processNodeA;  
      p[NodeB]   =   processNodeB;  
      p[NodeC]   =   processNodeC;  
      //execute   the   function  
      p[getNodeType()]();      
          /*The   entire   switch   statement   is   replaced   by   next   line*/  
   
   
 3。please    implements   follow   functions  
   
        LISTNODE   and   TREENODE   are   two   data   types   that   you   are   going   to   used   in   answering   some   of   the   questions.These   two   data   types   are   defined   as   follows:  
   
 struct    listNode{  
                    char   data;  
                    struct   listNode   *   next;  
 };   
 typedef    LISTNODE   struct   listNode;  
   
 struct    treeNode{  
                    char   data;  
                    struct   treeNode   *   left;  
                    struct   treeNode   *   right;  
 };   
 typedef    TREENODE   struct   treeNode;  
         
      1)   write   a   recursive   function   that   returns   the   depth   of   a   given   node.   note   that   a   terminal   node   should   have   a   depth   of   zero.The   prototype   of   the   desired   function   looks   like   this:  
               
                  int   treeDepth   (TREENODE   *   root);  
    递归得出树的高度,空树高度为 0
      int   treeDepth   (TREENODE   *   root)  
    {  
        int   nDepth   =   0;  
        if   (NULL   !=   root)  
        {  
              int   nDepthLeft   =   treeDepth(root->left);  
              int   nDepthRight   =   treeDepth(root->right);  
              nDepth   =   nDepthLeft   >   nDepthRight   ?   nDepthLeft   :   nDepthRight;  
              nDepth++;  
        }  
        return   nDepth;  
 }
        2)A   set   can   be   implemented   as   a   linked   list.   write   a   function   that   returns   a   new   list   that   represents   the   union   of   two   given   lists.   Note   that:  
        2.1)   Since   the   list   represents   a   set   ,there   is   no   special   ordering   and   no   duplicated   items   in   the   given   and   returned   lists.  
        2.2)   The   function   should   not   change   either   of   the   given   lists.  
链表合并,没有重复项,无序,不能改变原来的链表
先对各自链表排序,然后合并?这样空间复杂度高
 
1。C++的类型转换有几种?     
 2。标准C++的动态类型识别信息是什么类? 
type_info  
 3。MFC支持那些异常处理,举几个例子   
 4。如果一个包容器包含指向对象的指针,当从该包容器中删除某个指针时,会析构该指针指向的对象吗?   
  5 。请说明哪些运算符必须是类的成员变量?   
 6。如何阻止构造函数的自动转换。 
Explicit
 7。说明一下两个程序的区别   
 1.   
 #include    <stdio>  
 struct    tt   {  
 char    t1;  
 long    t2;  
 };   
 void    main()  
  {   
 printf("%d/n",    sizeof(struct   tt));  
 }   
 2.   
 #pragma    pack(1)  
 #include    <stdio>  
 struct    tt   {  
 char    t1;  
 long    t2;  
 };   
 void    main()  
 {   
 printf("%d/n",    sizeof(struct   tt));  
 }   
    8 5
 8。说明抽象基类的功能   
 9。如果要求一个类Singleton中只可以有一个实例,如何实现?   
 头文件中的声明部分:   
 class    Singleton  
 {   
 public:   
 static    Singleton*   Instance();  
 protected:   
 Singleton();   
 private:   
 static    Singleton*   _instance;  
 }   
   
 实现部分的实现:   
   
 10。已知一结构名为struct    aaa,   member是其一个数据成员。请问如何在不定义任何该结构变量的情况下,取得member在struct    aaa内的偏移量(单位:字节)?   
 
今天NEC笔试的题,请各位高手教我
题目:   
 以下是求“斐波纳契数列:1,1,2,3,5,8,13,21..."用循环实现的函数,后一函数将程序精简(也用循环实现)   
 请在划线处填空,每空只能填一个语句   
   
 原函数:   
 int    fib2(int   n)     /*n表示求斐波纳契数列的第n个数*/   
 {   
 int    a=1,b=1,c=0,k;  
 if(n==0)    return   0;  
 else   
      {  
          if(n==1||n==2)   return   1;  
          for(k=2;k<n;k++)  
          {  
              c=b;b=a+b;a=c;  
              i++;   /*说明,此处i用于记录循环的次数    */  
          }  
      }  
 return    b;  
 }   
   
 精简函数:   
 int    fib2(int   n)  
 {   
 int    a=1,b=1,c=0,k;  
 if(n==0)    return   0;  
  if(n==1||n==2)   return   1; ________________;     /*第一个空*/   
 for(k=2;k<n;k++)   
      {  
           b=(c=b)+a; ______________;     /*第二个空*/   
          a=c;  
      }  
   
 return    b;  
 }   
   
   
 请各位高手作答,我实在弄不明白,想请教
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值