微軟研究院是一個聽起來就牛B的地方啊,反正我是進不去,不過不妨礙我看看他的筆試題究竟是怎麼樣的。下面四道題就是微軟研究院的筆試題目,題後附有個人解答。
微軟研究院(亞洲)的網址是:http://research.microsoft.com/asia/
若是您想轉載本文,別刪個人信息哦,也算幫我宣傳下個人網站嘛。
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)
{
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
#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
#include //malloc函數的頭文件
char * GetName (void)
{
//To return 「MSR Asia」 String
//char name[]=」MSR Asia」;
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++)
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);
}
----------------------------------------------
插播廣告咯:版權全部:朱科 歡迎光臨個人網站:www.goodsoft.cn,各位轉貼別刪,宣傳下嘛
----------------------------------------------
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);
}
答:XYBCDCBAIBAA
FindSubString返回連續出現字母增長又遞減的個數,且增長個數恰好等於遞減個數。如ABA返回1,ABAB返回1,ABCBA返回2,BCBA返回0。
sprintf(p2, 「%I」, count);將*p2=’I',*(p2+1)=’\0′。
(轉載者注:對原文有部分修改)數組