c++

 

微软研究院是一个听起来就牛B的地方啊,反正我是进不去,不过不妨碍我看看他的笔

试题到底是怎么样的。下面四道题就是微软研究院的笔试题目,题后附有我的解答。

  微软研究院(亚洲)的网址是:http://research.microsoft.com/asia/

 

  如果您想转载本文,别删我的信息哦,也算帮我宣传下我的网站嘛。

 

1.改错

 

#include <stdio.h>

#include <String.h>

class CBuffer

{

  char * m_pBuffer;

  int m_size;

  public:

    CBuffer()

    {

      m_pBuffer=NULL;

    }

    ~CBuffer()

    {

      Free();

    }

    void Allocte(int size)  (3)    {

      m_size=size;

      m_pBuffer= new char[size];

    }

  private:

    void Free()

    {

      if(m_pBuffer!=NULL)

      {

        delete m_pBuffer;

        m_pBuffer=NULL;

      }

    }

    public:

    void SaveString(const char* pText) const

    {

      strcpy(m_pBuffer, pText);

    }

    char* GetBuffer() const

    {

      return m_pBuffer;

    }

};

 

void main (int argc, char* argv[])

{

  CBuffer buffer1;

  buffer1.SaveString("Microsoft");

  printf(buffer1.GetBuffer());

}

 

 

答:改正后

主要改正SaveString函数

void SaveString(const char* pText) const

{

strcpy(m_pBuffer, pText);

}

改为

void SaveString(const char* pText) (1)

{

if(m_pBuffer!=NULL)

Free();

Allocte(strlen(pText)+1); (2)

strcpy(m_pBuffer, pText);

}

原因:

(1) const成员函数表示不会修改数据成员,而SaveString做不到,去掉const声明

(2) m_pBuffer指向NULL,必须用Allocte分配空间才能赋值。

(3) 另外需要将Allocte成员函数声明为私有成员函数更符合实际

 

2.下来程序想打印“Welcome MSR Asia”,改正错误

 

#include <stdio.h>

#include <string.h>

char * GetName (void)

{

  //To return “MSR Asia” String

  char name[]="MSR Asia";

  return name;

}

void main(int argc, char* argv[])

{

  char name[32];

  //Fill in zeros into name

  for(int i=0;i<=32;i++)

  {

    name[ i ]= \0 ;

  }

  //copy “Welcome” to name

  name="Welcome";

  //Append a blank char

  name[8]=" ";

  //Append string to name

  strcat(name,GetName());

  //print out

  printf(name);

}

 

 

答:改正后为

 

#include <stdio.h>

#include <string.h>

#include <malloc.h> //malloc函数的头文件

char * GetName (void)

{

  //To return “MSR Asia” String

  //char name[]="MSR Asia";      

  char *name=(char *)malloc(strlen("MSR Asia")+1);    //在函数内部定义的变量在

函数结束时就清空了,必须动态分配内存或者char *name =”helloword”

  strcpy(name,"MSR Asia");

  return name;

}

void main(int argc, char* argv[])

{

  char name[32];

  //Fill in zeros into name

 // for(int i=0;i<=32;i++)

for(int i=0;i<=31;i++) //数组越界

  {

    name[ i ]= \0 ;

  }

  //copy “Welcome” to name

  //name="Welcome";       

  strcat(name,"Welcome");//字符串赋值语句错误,应该用strcat

  //Append a blank char

//  name[8]=" ";            

strcat(name, " "); //或者 name[8]=    ;name[9]=  \0 ;

  //Append string to name

  char *p=GetName();        //定义一个指针指向动态分配的内存,用完后需用free语

句释放

  strcat(name,p);

  free (p);

  //print out

  printf(name);

}

 

 

3.写出下面程序的输出结果

 

 

#include <stdio.h>

class A

{

public:

  void FuncA()

  {

    printf("FuncA called\n");

  }

  virtual void FuncB()

  {

    printf("FuncB called\n");

  }

};

 

class B: public A

{

public:

  void FuncA()

  {

    A::FuncA();

    printf("FuncAB called\n");

  }

  virtual void FuncB()

  {

    printf("FuncBB called\n");

  }

};

 

void main(void)

{

  B b;

  A *pa;

  pa=&b;

  A *pa2=new A;

  b.FuncA();      (1)

  b.FuncB();      (2) 

        pa->FuncA();      (3)

  pa->FuncB();      (4)

  pa2->FuncA();      (5)

  pa2->FuncB();

  delete pa2;

}

 

答:

1.b.FuncA(); 输出

FuncA called

FuncAB called

2.b.FuncB();输出

FuncBB called

上两者好理解,直接调用类B的相应成员函数

3.pa->FuncA();输出

FuncA called 调用类A的FuncA()

4.pa->FuncB();输出

FuncBB called调用类B的FuncB(),原因是C++的动态决议机制,当基类函数声明为virtua

l时,指向派生类对象的基类指针来调用该函数会选择派生类的实现,除非派生类没有才调

用基类的虚函数。还有一点注意的是:指向基类类型的指针可以指向基类对象也可以指向

派生类对象,如pa=&b;

5. pa2->FuncA();

pa2->FuncB();输出

FuncA called

FuncB called

这也好理解,直接调用类A的相应成员函数

 

4.In the main() function, after ModifyString(text) is called, what’s the val

ue of ‘text’?

 

#include <stdio.h>

#include <string.h>

int FindSubString(char* pch)

{

  int count=0;

  char* p1=pch;

  while(*p1!= \0 )

  {

    if(*p1==p1[1]-1)

    {

      p1++;

      count++;

    }

    else

    {

      break;

    }

  }

  int count2=count;

  while(*p1!= \0 )

  {

    if(*p1==p1[1]+1)

    {

      p1++;

      count2--;

    }

    else

    {

      break;

    }

  }

  if(count2==0)

    return count;

  return 0;

}

 

void ModifyString(char* pText)

{

  char* p1=pText;

  char* p2=p1;

  while(*p1!= \0 )

  {

    int count=FindSubString(p1);

    if(count>0)

    {

      *p2++=*p1;

      sprintf(p2, "%I", count);

      while(*p2!=  \0 )

      {

        p2++;

      }

      p1+=count+count+1;

    }

    else

    {

      *p2++=*p1++;

    }

  }

}

void main(void)

{

  char text[32]="XYBCDCBABABA";

  ModifyString(text);

  printf(text);

}

 

答:XYBCDCBAIBAA

FindSubString返回连续出现字母增加又递减的个数,且增加个数刚好等于递减个数。如A

BA返回1,ABAB返回1,ABCBA返回2,BCBA返回0。

sprintf(p2, "%I", count);将*p2= I ,*(p2+1)= \0 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值