logo资料库

微软研究院笔试题目附参考答案.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
微软研究院笔试题目附参考答案 1.改错 #include #include 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) { 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 #include 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 #include char * GetName (void) { //To return “MSR Asia” String //char name[]="MSR Asia"; (1) char *name=(char *)malloc(strlen("MSR Asia")+1); 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++) { name[i]='\0'; } //copy “Welcome” to name //name="Welcome"; (2) strcat(name,"Welcome "); //Append a blank char // name[8]=' '; (3) //Append string to name char *p=GetName(); (4) strcat(name,p); free (p); //print out printf(name); } 原因:(1)在函数内部定义的变量在函数结束时就清空了,必须动态分配内存 (2)字符串赋值语句错误,应该用 strcat (3)该语句无效,可去掉 (4)定义一个指针指向动态分配的内存,用完后需用 free 语句释放 3.写出下面程序的输出结果
#include 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++的动态决议机制,当基类函数声明为 virtual 时,指向派生类对象的基类指针来调用该函数会选择派生类的实现,除非派生类没有才调用 基类的虚函数。还有一点注意的是:指向基类类型的指针可以指向基类对象也可以指向派生 类对象,如 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 value of ‘text’? #include #include 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); } 答 : 我 不 知 道 这 个 结 构 混 乱 的 程 序 到 底 想 考 察 什 么 , 只 能 将 最 后 运 行 结 果 写 出 来 是 XYBCDCBAIBAAP
分享到:
收藏