C++面試題.doc

C++面試題
2008-11-4

1 #i nclude “filename.h”和#i nclude <filename.h>的區別?
答:對於#i nclude <filename.h>編譯器從標準庫開始搜索filename.h
對於#i nclude “filename.h”編譯器從用戶工作路徑開始搜索filename.h
2 頭文件的作用是什麼?
答:一、通過頭文件來調用庫功能。在很多場合,源代碼不便(或不準)向用戶公佈,只要向用戶提供頭文件和二進制的庫即可。用戶只需
要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎麼實現的。編譯器會從庫中提取相應的代碼。
二、頭文件能加強類型安全檢查。如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規
則能大大減輕程序員調試、改錯的負擔。
3 C++函數中值的傳遞方式有哪幾種?
答:C++函數的三種傳遞方式爲:值傳遞、指針傳遞和引用傳遞。
4 內存的分配方式的分配方式有幾種?
答:一、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量。
二、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內
存分配運
算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
三、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free
或delete釋放
內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。


5 實現雙向鏈表刪除一個節點P,在節點P後插入一個節點,寫出這兩個函數;
答:雙向鏈表刪除一個節點P
template<class type> void list<type>::delnode(int p)
{
int k=1;
listnode<type> *ptr,*t;
ptr=first;

while(ptr->next!=NULL&&k!=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"你已經將數據項 "<<t->data<<"刪除"<<endl;

ptr->next=ptr->next->next;
length--;
delete t;
}

在節點P後插入一個節點:
template<class type> bool list<type>::insert(type t,int p)
{
listnode<type> *ptr;
ptr=first;

int k=1;
while(ptr!=NULL&&k<p)
{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!=p)
return false;
else
{
listnode<type> *tp;
tp=new listnode<type>;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;

return true;
}
}


6 寫一個函數,將其中的/t都轉換成4個空格。
void change(char* pstr)
{
while(*pstr++ != '/0')
{
if (*pstr == '/t')


}
}

7 Windows程序的入口是哪裏?寫出Windows消息機制的流程.

8 如何定義和實現一個類的成員函數爲回調函數?

9 C++裏面是不是所有的動作都是main()引起的?如果不是,請舉例.
答:在運行c++程序時,通常從main()函數開始執行。因此如果沒有main(),程序將不完整,編譯器將指出未定義main()函數。
例外情況:如, 在windows編程中,可以編寫一個動態連接庫(dll)模塊,這是其他windows程序可以使用的代碼。由於
DLL模塊不是獨立的程序,因此不需要main().用於專用環境的程序--如機器人中的控制器芯片--可能不需要main().但常規的
獨立程序都需要main().

10 C++裏面如何聲明const void f(void)函數爲C程序中的庫函數?
11 下列哪兩個是等同的

int b;

A const int* a = &b;

B const* int a = &b;

C const int* const a = &b;

D int const* const a = &b;

 

12 內聯函數在編譯時是否做參數類型檢查


13 三個float:a,b,c
問值
(a+b)+c==(b+a)+c
(a+b)+c==(a+c)+b
14 把一個鏈表反向填空
void reverse(test* head)
{
test* pe = head;
test* ps = head->next;
while(ps)
{
pe->next = ps->next;
ps->next = head;
head = ps;
ps = pe->next;
}
}


15 設計一個重採樣系統,說明如何anti-alias

16 某個程序在一個嵌入式系統(200M的CPU,50M的SDRAM)中已經最化了,換到另一個系統(300M的CPU,50M的SDRAM)中運行,還需要優化嗎?

17. 下面哪種排序法對12354最快
a quick sort
b.buble sort
c.merge sort

18. 哪種結構,平均來講,獲取一個值最快
a. binary tree
b. hash table
c. stack


19 請問C++的類和C裏面的struct有什麼區別?
答:c++的類的成員默認情況下是私有的,c的struct的成員默認情況下是公共的.

20 請講一講析構函數和虛函數的用法和作用?
答:析構函數的作用是當對象生命期結束時釋放對象所佔用的資源。 析構函數用法:析構函數是特殊的類成員函數
它的名字和類名相同,沒有返回值,沒有參數不能隨意調用也沒有重載。只是在類對象生命期結束時有系統自動調用。
虛函數用在繼承中,當在派生類中需要重新定義基類的函數時需要在基類中將該函數聲明爲虛函數,作用爲使程序支持動態聯遍。


21 全局變量和局部變量有什麼區別?是怎麼實現的?操作系統和編譯器是怎麼知道的?
答:一些變量整個程序中都是可見的,它們稱爲全局變量,一些變量在函數內部定義且只在函數中可知,則稱爲局部變量。
全局變量由編譯器建立且存放在內存的全局數據區,局部變量存放在棧區

22 一些寄存器的題目,主要是尋址和內存管理等一些知識。

23 8086是多少尉的系統?在數據總線上是怎麼實現的?

24 多態。overload 和 override的區別。
答:重載在相同範圍(同一個類中),函數名字相同,參數不同,virtual關鍵字可有可無。
覆蓋是指派生類函數覆蓋基類函數,不同的範圍,函數名字相同,參數相同,基類函數必須有virtual關鍵字。

<<Sony筆試題>>
25.完成下列程序

*

*.*.

*..*..*..

*...*...*...*...

*....*....*....*....*....

*.....*.....*.....*.....*.....*.....

*......*......*......*......*......*......*......

*.......*.......*.......*.......*.......*.......*.......*.......

#i nclude<iostream>
using namespace std;

const int n = 8;

main()
{
int i;
int j;
int k;

for(i = n; i >= 1; i--)
{
for(j = 0; j < n-i+1; j++)
{
cout<<"*";
for(k=1; k < n-i+1; k++)
{
cout<<".";
}
}
cout<<endl;
}
system("pause");
}


26 完成程序,實現對數組的降序排序

#i nclude <iostream>
using namespace std;

void sort(int* arr, int n);

int main()

{
int array[]={45,56,76,234,1,34,23,2,3};
sort(array, 9);
for(int i = 0; i <= 8; i++)//曾經在這兒出界
cout<<array[i]<<" ";
cout<<endl;
system("pause");
}

void sort(int* arr, int n)
{
int temp;
for(int i = 1; i < 9; i++)
{
for(int k = 0; k < 9 - i; k++)//曾經在這兒出界
{
if(arr[k] < arr[k + 1])
{
temp = arr[k];
arr[k] = arr[k + 1];
arr[k + 1] = temp;
}
}
}
}


27 費波那其數列,1,1,2,3,5……編寫程序求第十項。可以用遞歸,也可以用其他方法,但要說明你選擇的理由。
非遞歸
#i nclude <iostream>
using namespace std;

int Pheponatch(int n);

main()
{
int Ph = Pheponatch(10);
cout<<Ph<<endl;
system("pause");

}

int Pheponatch(int n)
{
int elem;
int n1 = 1;
int n2 = 1;
if(n == 1 || n ==2)
return 1;
else
{
for(int i = 3; i <= n; i++)
{
elem = n1 + n2;
n1 = n2;
n2 = elem;
}
return elem;
}
}

遞歸
#i nclude <iostream>
using namespace std;

int Pheponatch(int n);

main()
{
int n;
cin>>n;
int ph = Pheponatch(n);
cout<<ph<<endl;
system("pause");

}

int Pheponatch(int n)
{
if(n <= 0)
exit(-1);
else
if(n == 1 || n ==2)
return 1;
else
return Pheponatch(n - 1) + Pheponatch(n - 2);
}

28 下列程序運行時會崩潰,請找出錯誤並改正,並且說明原因。

#i nclude <stdio.h>

#i nclude <malloc.h>

 

typedef struct{

TNode* left;

TNode* right;

int value;

} TNode;

 

TNode* root=NULL;

 

void append(int N);

 

int main()

{

append(63);

append(45);

append(32);

append(77);

append(96);

append(21);

append(17); // Again, 數字任意給出

}

 

void append(int N)

{

TNode* NewNode=(TNode *)malloc(sizeof(TNode));

NewNode->value=N;

 

if(root==NULL)

{

root=NewNode;

return;

}

else

{

TNode* temp;

temp=root;

while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL

))

{

while(N>=temp.value && temp.left!=NULL)

temp=temp.left;

while(N<temp.value && temp.right!=NULL)

temp=temp.right;

}

if(N>=temp.value)

temp.left=NewNode;

else

temp.right=NewNode;

return;

}

}


29. A class B network on the internet has a subnet mask of 255.255.240.0, what is the maximum number of hosts per subnet .

a. 240 b. 255 c. 4094 d. 65534

30. What is the difference: between o(log n) and o(log n^2), where both logarithems have base 2 .

a. o(log n^2) is bigger b. o(log n) is bigger

c. no difference
31. For a class what would happen if we call a class’s constructor from with the same class’s constructor .

a. compilation error b. linking error

c. stack overflow d. none of the above

32. “new” in c++ is a: .

a. library function like malloc in c

b. key word c. operator

d. none of the above

33. Which of the following information is not contained in an inode .

a. file owner b. file size

c. file name d. disk address

34. What’s the number of comparisons in the worst case to merge two sorted lists containing n elements each .

a. 2n b.2n-1 c.2n+1 d.2n-2

35. Time complexity of n algorithm T(n), where n is the input size ,is T(n)=T(n-1)+1/n if n>1 otherwise 1 the order of
this algorithm is .

a. log (n) b. n c. n^2 d. n^n

36. The number of 1’s in the binary representation of 3*4096+ 15*256+5*16+3 are .

a. 8 b. 9 c. 10 d. 12


37.設計函數 int atoi(char *s)。

38.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少?

39.解釋局部變量、全局變量和靜態變量的含義。

40.解釋堆和棧的區別。
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
堆:一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於
鏈表.

41.論述含參數的宏與函數的優缺點。


42. 以下三條輸出語句分別輸出什麼?[C易]
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 輸出什麼?
cout << boolalpha << ( str3==str4 ) << endl; // 輸出什麼?
cout << boolalpha << ( str5==str6 ) << endl; // 輸出什麼?

43. 非C++內建型別 A 和 B,在哪幾種情況下B能隱式轉化爲A?[C++中等]
答:
a. class B : public A { ……} // B公有繼承自A,可以是間接繼承的
b. class B { operator A( ); } // B實現了隱式轉化爲A的轉化
c. class A { A( const B& ); } // A實現了non-explicit的參數爲B(可以有其他帶默認值的參數)構造函數
d. A& operator= ( const A& ); // 賦值操作,雖不是正宗的隱式類型轉換,但也可以勉強算一個

44. 以下代碼中的兩個sizeof用法有問題嗎?[C易]
void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符長度爲: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;

45. 以下代碼有什麼問題?[C難]
void char2Hex( char c ) // 將字符以16進製表示
{
char ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
char cl = c%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);
cout << ch << cl << ' ';
}
char str[] = "I love 中國";
for( size_t i=0; i<strlen(str); ++i )
char2Hex( str[i] );
cout << endl;

46. 以下代碼有什麼問題?[C++易]
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
*** Test b();//定義了一個函數

47. 以下代碼有什麼問題?[C++易]
cout << (true?1:"1") << endl;

8. 以下代碼能夠編譯通過嗎,爲什麼?[C++易]
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];

48. 以下代碼中的輸出語句輸出0嗎,爲什麼?[C++易]
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;

49. C++中的空類,默認產生哪些類成員函數?[C++易]
答:
class Empty
{
public:
Empty(); // 缺省構造函數
Empty( const Empty& ); // 拷貝構造函數
~Empty(); // 析構函數
Empty& operator=( const Empty& ); // 賦值運算符
Empty* operator&(); // 取址運算符
const Empty* operator&() const; // 取址運算符 const
};

50. 以下兩條輸出語句分別輸出什麼?[C++難]
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 輸出什麼?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 輸出什麼?

51. 以下反向遍歷array數組的方法有什麼錯誤?[STL易]
vector array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 3 );
for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍歷array數組
{
cout << array[i] << endl;
}

52. 以下代碼有什麼問題?[STL易]
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor ) array.erase( itor );
}

53. 寫一個函數,完成內存之間的拷貝。[考慮問題是否全面]
答:
void* mymemcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast<char*>( dest );
const char* psrc = static_cast<const char*>( src );
if( pdest>psrc && pdest<psrc+cout ) 能考慮到這種情況就行了
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i<count; ++i )
pdest[i] = psrc[i];
}
return dest;
}
int main( void )
{
char str[] = "0123456789";
mymemcpy( str+1, str+0, 9 );
cout << str << endl;

system( "Pause" );
return 0;
}


54 線程與進程的區別

55:請你分別劃劃OSI的七層網絡結構圖,和TCP/IP的五層結構圖?

56:請你詳細的解釋一下IP協議的定義,在哪個層上面,主要有什麼作用? TCP與UDP呢?
IP協議是網絡層的協議,它實現了Internet中自動路由的功能,即尋徑的功能,TCP協議是一個傳輸性的協議它向下屏蔽了IP協議不可靠傳輸的特性,向上提供一個可靠的點到點的傳輸,UDP提供的是一種無連接的服務,主要考慮到很多應用不需要可靠的連接,但需要快速的傳輸


57:請問交換機和路由器分別的實現原理是什麼?分別在哪個層次上面實現的?
交換機用在局域網中,交換機通過紀錄局域網內各節點機器的MAC地質(物理地址)就可以實現傳遞報文,無需看報文中的IP地質。路由器識別不同網絡的方法是通過識別不同網絡的網絡ID號(IP地址的高端部分)進行的,所以爲了保證路由成功,每個網絡都必須有一個唯一的網絡編號。路由器通過察看報文中IP地址,來決定路徑,向那個子網(下一跳)路由,也就是說交換機工作在數據鏈路層看MAC地址,路由器工作在網際層看IP地質
但是由於現在網絡設備的發展,很多設備既有交換機的功能有由路由器的功能(交換試路由器)使得兩者界限越來越模糊。

58:請問C++的類和C裏面的struct有什麼區別?

59:請講一講析構函數和虛函數的用法和作用?

60:全局變量和局部變量有什麼區別?實怎麼實現的?操作系統和編譯器是怎麼知道的?
全局變量是整個程序都可訪問的變量,誰都可以訪問,生存期在整個程序從運行到結束(在程序結束時所佔內存釋放),而局部變量存在於模塊(子程序,函數)中,只有所在模塊可以訪問,其他模塊不可直接訪問,模塊結束(函數調用完畢),局部變量消失,所佔據的內存釋放。
全局變量分配在全局數據段並且在程序開始運行的時候被加載. 局部變量則分配在堆棧裏面。


61:一些寄存器的題目,主要是尋址和內存管理等一些知識。

 

 


2、交換機用在局域網中,交換機通過紀錄局域網內各節點機器的MAC地質(物理地址)就可以實現傳遞報文,無需看報文中的IP地質。路由器識別不同網絡的方法是通過識別不同網絡的網絡ID號(IP地址的高端部分)進行的,所以爲了保證路由成功,每個網絡都必須有一個唯一的網絡編號。路由器通過察看報文中IP地址,來決定路徑,向那個子網(下一跳)路由,也就是說交換機工作在數據鏈路層看MAC地址,路由器工作在網際層看IP地質
但是由於現在網絡設備的發展,很多設備既有交換機的功能有由路由器的功能(交換試路由器)使得兩者界限越來越模糊。
3、IP協議是網絡層的協議,它實現了Internet中自動路由的功能,即尋徑的功能,TCP協議是一個傳輸性的協議它向下屏蔽了IP協議不可靠傳輸的特性,向上提供一個可靠的點到點的傳輸,UDP提供的是一種無連接的服務,主要考慮到很多應用不需要可靠的連接,但需要快速的傳輸
4、
Test b();//定義了一個函數


62:8086是多少位的系統?在數據總線上是怎麼實現的?

<<IBM>>
63.怎樣用最快的方法判斷鏈表是否有環?

64.c++中引用和指針有什麼不同?指針加上什麼限制等於引用?
答:1 引用被創建的時候必須被初始化,而指針不是必需的。2 引用在創建後就不能改變引用的關係,而指針在初始化後可以隨時指向
其它的變量或對象。3 沒有NULL引用,引用必須與合法的存儲單元關聯,而指針可以是NULL。

65.做的項目,遇到的困難,怎樣解決?

 

69.操作符重載
class CMyObject:pulic CObject
{
Public:
CMyObject();
CMyObject &operator=(const CMyObject &my);
private:
CString strName;
int nId:
};
請重載賦值操作符


70.鏈表
Struct structList
{
int value;
structList *pHead;
}
Struct LinkedList *pMyList;
請編寫刪除鏈表的頭、尾和第n個節點的程序


71.用Socket API製作一個聊天程序,通訊協議使用tcp/ip。要求有簡單界面即可,支持多人聊天。

 

72.如果有過工作經驗,請說明在先前公司的工作以及離職原因(如無,請說明畢業後的個人展望)


***************************************************************************
73 對於C++中類(class) 與結構(struct)的描述正確的爲:
A,類中的成員默認是private的,當是可以聲明爲public,private 和protected,結構中定義的成員默認的都是public;
B,結構中不允許定義成員函數,當是類中可以定義成員函數;
C,結構實例使用malloc() 動態創建,類對象使用new 操作符動態分配內存;
D,結構和類對象都必須使用new 創建;
E,結構中不可以定義虛函數,當是類中可以定義虛函數.
F,結構不可以存在繼承關係,當是類可以存在繼承關係.
答:A,D,F

74,兩個互相獨立的類:ClassA 和 ClassB,都各自定義了非靜態的公有成員函數 PublicFunc() 和非靜態的私有成員函數 PrivateFunc();
現在要在ClassA 中增加定義一個成員函數ClassA::AdditionalPunction(ClassA a,ClassB b);則可以在AdditionalPunction(ClassA x,ClassB y)的實現部分(函數功能體內部)
出現的合法的表達是最全的是:
A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();
B,x.PrivateFunc();x.PublicFunc();y.PublicFunc();
C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc();
D,x.PublicFunc();y.PublicFunc();
答:B
75,C++程序下列說法正確的有:
A,對調用的虛函數和模板類都進行遲後編譯.
B,基類與子類中函數如果要構成虛函數,除了要求在基類中用virtual 聲名,而且必須名字相同且參數類型相同返回類型相同
C,重載的類成員函數都必須要:或者返回類型不同,或者參數數目不同,或者參數序列的類型不同.
D,靜態成員函數和內聯函數不能是虛函數,友員函數和構造函數也不能是虛函數,但是析構函數可以是虛函數.
答:A
***************************************************************************


76,C++中的類與結構的區別?

77,構造函數和析構函數是否可以被重載,爲什麼?
答:構造函數可以被重載,析構函數不可以被重載。因爲構造函數可以有多個且可以帶參數,而析構函數只能有一個,且不能帶參數。

78,一個類的構造函數和析構函數什麼時候被調用,是否需要手工調用?
答:構造函數在創建類對象的時候被自動調用,析構函數在類對象生命期結束時,由系統自動調用。

 

1 #i nclude “filename.h”和#i nclude <filename.h>的區別?
答:#i nclude “filename.h”表明該文件是用戶提供的頭文件,查找該文件時從當前文件目錄開始;#i nclude <filename.h>表明這個文件是一個工程或標準頭文件,查找過程會檢查預定義的目錄。

2 頭文件的作用是什麼?
答:一、通過頭文件來調用庫功能。在很多場合,源代碼不便(或不準)向用戶公佈,只要向用戶提供頭文件和二進制的庫即可。用戶只需要按照頭文件中的接口聲明來調用庫功能,而不必關心接口怎麼實現的。編譯器會從庫中提取相應的代碼。
二、頭文件能加強類型安全檢查。如果某個接口被實現或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程序員調試、改錯的負擔。

3 C++函數中值的傳遞方式有哪幾種?
答:C++函數的三種傳遞方式爲:值傳遞、指針傳遞和引用傳遞。

4 內存的分配方式的分配方式有幾種?
答:一、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量。
二、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
三、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。

5 實現雙向鏈表刪除一個節點P,在節點P後插入一個節點,寫出這兩個函數;
答:雙向鏈表刪除一個節點P
template<class type> void list<type>::delnode(int p)
{
int k=1;
listnode<type> *ptr,*t;
ptr=first;

while(ptr->next!=NULL&&k!=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"你已經將數據項 "<<t->data<<"刪除"<<endl;

ptr->next=ptr->next->next;
length--;
delete t;
}

在節點P後插入一個節點:
template<class type> bool list<type>::insert(type t,int p)
{
listnode<type> *ptr;
ptr=first;

int k=1;
while(ptr!=NULL&&k<p)
{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!=p)
return false;
else
{
listnode<type> *tp;
tp=new listnode<type>;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;

return true;
}
}

 

 

 

//上海貝爾的面試題43分即可進入複試
一、請填寫BOOL , float, 指針變量 與“零值”比較的 if 語句。(10分)
提示:這裏“零值”可以是0, 0.0 , FALSE或者“空指針”。例如 int 變量 n 與“零值”比較的 if 語句爲:
if ( n == 0 )
if ( n != 0 )
以此類推。
請寫出 BOOL flag 與“零值”比較的 if 語句:
請寫出 float x 與“零值”比較的 if 語句:
請寫出 char *p 與“零值”比較的 if 語句:
二、以下爲Windows NT下的32位C++程序,請計算sizeof的值(10分)
char str[] = “Hello” ;
char *p = str ;
int n = 10;
請計算
sizeof (str ) =
sizeof ( p ) =
sizeof ( n ) =void Func ( char str[100])
{
請計算
sizeof( str ) =
}
void *p = malloc( 100 );
請計算
sizeof ( p ) =
、簡答題(25分)
1、頭文件中的 ifndef/define/endif 幹什麼用?
2、#i nclude <filename.h> 和 #i nclude “filename.h” 有什麼區別?
3、const 有什麼用途?(請至少說明兩種)
4、在C++ 程序中調用被 C編譯器編譯後的函數,爲什麼要加 extern “C”聲明?
5、請簡述以下兩個for循環的優缺點
// 第一個
for (i=0; i<N; i++)
{
if (condition)
DoSomething();
else
DoOtherthing();
}// 第二個
if (condition)
{
for (i=0; i<N; i++)
DoSomething();
}
else
{
for (i=0; i<N; i++)
DoOtherthing();
優點:N次中,每次都要對condition進行判斷
缺點: 優點:一次判斷condition後,對something或Otherthing執行N次
缺點:

四、有關內存的思考題(20分)

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

請問運行Test函數會有什麼樣的結果?

char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}

請問運行Test函數會有什麼樣的結果?


Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test函數會有什麼樣的結果?

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問運行Test函數會有什麼樣的結果?

 

五、編寫strcpy函數(10分)
已知strcpy函數的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。

(1)不調用C++/C的字符串庫函數,請編寫函數 strcpy
char *strcpy(char *strDest,const char *strSrc){
int n=0;
while(strSrc[n]!=NULL){
n++:
}
*srtDest=new char[n];
for(int i=0;i<n;i++) {
strDest=strSrc[i];
i++;
}
return *strDest;
}
(2)strcpy能把strSrc的內容複製到strDest,爲什麼還要char * 類型的返回值?
因爲該函數的還可以把複製的字符串首地址指針給其他的指針,而且這種需要也是有用的。
六、編寫類String的構造函數、析構函數和賦值函數(25分)
已知類String的原型爲:
class String
{
public:
String(const char *str = NULL);// 普通構造函數
String(const String &other); // 拷貝構造函數
~ String(void); // 析構函數
String & operate =(const String &other);// 賦值函數
private:
char *m_data;// 用於保存字符串
};
請編寫String的上述4個函數。

 


//答案一併給出
一、請填寫BOOL , float, 指針變量 與“零值”比較的 if 語句。(10分)

請寫出 BOOL flag 與“零值”比較的 if 語句。(3分)
標準答案:
if ( flag )
if ( !flag )如下寫法均屬不良風格,不得分。
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
請寫出 float x 與“零值”比較的 if 語句。(4分)
標準答案示例:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。

如下是錯誤的寫法,不得分。
if (x == 0.0)
if (x != 0.0)

請寫出 char *p 與“零值”比較的 if 語句。(3分)
標準答案:
if (p == NULL)
if (p != NULL)如下寫法均屬不良風格,不得分。
if (p == 0)
if (p != 0)
if (p)
if (!)

二、以下爲Windows NT下的32位C++程序,請計算sizeof的值(10分)

char str[] = “Hello” ;
char *p = str ;
int n = 10;
請計算
sizeof (str ) = 6 (2分)

sizeof ( p ) = 4 (2分)

sizeof ( n ) = 4 (2分)void Func ( char str[100])
{
請計算
sizeof( str ) = 4 (2分)
}

void *p = malloc( 100 );
請計算
sizeof ( p ) = 4 (2分)


三、簡答題(25分)

1、頭文件中的 ifndef/define/endif 幹什麼用?(5分)
答:防止該頭文件被重複引用。

2、#i nclude <filename.h> 和 #i nclude “filename.h” 有什麼區別?(5分)
答:對於#i nclude <filename.h> ,編譯器從標準庫路徑開始搜索 filename.h
對於#i nclude “filename.h” ,編譯器從用戶的工作路徑開始搜索 filename.h

3、const 有什麼用途?(請至少說明兩種)(5分)
答:(1)可以定義 const 常量
(2)const可以修飾函數的參數、返回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。

4、在C++ 程序中調用被 C編譯器編譯後的函數,爲什麼要加 extern “C”? (5分)
答:C++語言支持函數重載,C語言不支持函數重載。函數被C++編譯後在庫中的名字與C語言的不同。假設某個函數的原型爲: void foo(int x, int y);
該函數被C編譯器編譯後在庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字。
C++提供了C連接交換指定符號extern“C”來解決名字匹配問題。

5、請簡述以下兩個for循環的優缺點(5分)

for (i=0; i<N; i++)
{
if (condition)
DoSomething();
else
DoOtherthing();
}if (condition)
{
for (i=0; i<N; i++)
DoSomething();
}
else
{
for (i=0; i<N; i++)
DoOtherthing();
}
優點:程序簡潔

缺點:多執行了N-1次邏輯判斷,並且打斷了循環“流水線”作業,使得編譯器不能對循環進行優化處理,降低了效率。優點:循環的效率高

缺點:程序不簡潔

 

四、有關內存的思考題(每小題5分,共20分)

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

請問運行Test函數會有什麼樣的結果?
答:程序崩潰。
因爲GetMemory並不能傳遞動態內存,
Test函數中的 str一直都是 NULL。
strcpy(str, "hello world");將使程序崩潰。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}

請問運行Test函數會有什麼樣的結果?
答:可能是亂碼。
因爲GetMemory返回的是指向“棧內存”的指針,該指針的地址不是 NULL,但其原現的內容已經被清除,新內容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test函數會有什麼樣的結果?
答:
(1)能夠輸出hello
(2)內存泄漏

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問運行Test函數會有什麼樣的結果?
答:篡改動態內存區的內容,後果難以預料,非常危險。
因爲free(str);之後,str成爲野指針,
if(str != NULL)語句不起作用。

 

27 費波那其數列,1,1,2,3,5……編寫程序求第十項。可以用遞歸,也可以用其他方法,但要說明你選擇的理由。
-------------------------------------------------------------------------------------

#i nclude <stdio.h>
#i nclude <cstdlib>

int Pheponatch(int);
int Pheponatch2(int);

int main()

{
printf("The 10th is %d",Pheponatch2(20));
system("pause");
return 0;
}

//遞歸算法
int Pheponatch(int N)
{
if( N == 1 || N == 2)
{
return 1;
}
else
return Pheponatch( N -1 ) + Pheponatch( N -2 );
}

//非遞歸算法
int Pheponatch2(int N)
{
int x = 1, y = 1, temp;
int i = 2;
while(true)
{
temp = y;
y = x + y;
x = temp;
i++;
if( i == N )
break;
}
return y;
}

 


25.完成下列程序

*

*.*.

*..*..*..

*...*...*...*...

*....*....*....*....*....

*.....*.....*.....*.....*.....*.....

*......*......*......*......*......*......*......

*.......*.......*.......*.......*.......*.......*.......*.......

#i nclude <stdio.h>

#define N 8

int main()

{

int i;

int j;

int k;

---------------------------------------------------------

| |

| |

| |

---------------------------------------------------------

return 0;

}


#i nclude <stdio.h>
#i nclude <iostream.h>

#define N 8

int main()

{
int i;
int j;
int k;

for(i=N; i>=1; i--)
{
for(j=0; j<N-i+1; j++)
{
cout<<"*";
for(k=1; k<N-i+1; k++)
cout<<".";
}
cout<<"/n";
}

return 0;
}

 

"28 下列程序運行時會崩潰,請找出錯誤並改正,並且說明原因。"
// void append(int N) ;
//指針沒有初始化:
//NewNode->left=NULL;
//NewNode->right=NULL;

#i nclude <stdio.h>

#i nclude <malloc.h>

 

typedef struct TNode{

TNode* left;

TNode* right;

int value;

} TNode;

 

TNode* root=NULL;

 

void append(int N);

 

int main()

{

append(63);

append(45);

append(32);

append(77);

append(96);

append(21);

append(17); // Again, 數字任意給出
return 0;

}

 

void append(int N)

{

TNode* NewNode=(TNode *)malloc(sizeof(TNode));

NewNode->value=N;

NewNode->left=NULL;
NewNode->right=NULL;

if(root==NULL)

{

root=NewNode;

return;

}

else

{

TNode* temp;

temp=root;

while((N>=temp->value && temp->left!=NULL) || (N<temp->value && temp->right!=NULL))

{

while(N>=temp->value && temp->left!=NULL)

temp=temp->left;

while(N<temp->value && temp->right!=NULL)

temp=temp->right;

}

if(N>=temp->value)

temp->left=NewNode;

else

temp->right=NewNode;

return;

}

}

 


算法:
1.什麼是NPC,NP-Hard?
2.起泡排序的時間複雜度是多少?
說出至少一個比它更快的算法;
排序的極限時間複雜度是多少?
3.有一個鏈表,如何判斷它是一個循環鏈表?
如果鏈表是單向的呢?
如果出現循環的點可能在任意位置呢?
如果緩存空間是有限的,比如是一個常數呢?
如果只能使用2個緩存呢?
4.有一個文件,保存了若干個整數,如何以平均的概率隨機得到其中的一個整數?
如果整數的個數是未知的呢?
如果整數是以字符串形式存放,如:(即如何得到隨機的一個字符串)
123<enter>
-456<enter>

如果只允許便歷文件一次呢?
5.用兩組數據,都在內存中,對它們排序分別需要1和2分鐘;那麼使用兩個線程一起排序,大概需要多少時間?

C/C++:
1.C與C++的異同,優劣;
2.C,C++,VC,BC,TC的區別;
3.C++中try…catch關鍵字的用法與優點;
4.枚舉的用法,以及它與宏的區別;
5.const的用法,以及聲明const變量與宏的區別;
const的用法有四種:
區別:const常量有數據類型, 而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只能進行字符替換,沒有類型
安全檢查。而且字符替換可能會帶來料想不到的邊界效應。
有些集成化工具可以對const常量進行調試, 但不能對宏量進行調試。
6.C++中引用與指針的區別;
答:1 引用實際上是所引用的對象或變量的別名,而指針是包含所指向對象或變量的地址的變量。
2 引用在定義時必須初始化,而指針在定義時不初始化。
3 不可以有努NULL的引用,而可以有指向NULL的指針。
4 引用在初始化後不可以改變引用關係,而指針可以隨時指向其他對象(非const指針)。
7.C++中virtual與inline的含義分別是什麼?
答:在基類成員函數的聲明前加上virtual關鍵字,意味着將該成員函數聲明爲虛函數。
inline與函數的定義體放在一起,使該函數稱爲內聯。inline是一種用於實現的關鍵字,而不是用於聲明的關鍵字。
虛函數的特點;如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義爲虛方法,這樣可以啓用動態聯編。
內聯函數的特點;使用內聯函數的目的是爲了提高函數的運行效率。內聯函數體的代碼不能過長,因爲內聯函數省去調用函數
的時間是以代碼膨脹爲代價的。內聯函數不能包含循環語句,因爲執行循環語句要比調用函數的開銷大。
一個函數能否即是虛函數又是內聯函數?
8.以下關鍵字的含義與用法:
extern,extern “C”,static,explicit,register,#undef,#ifndef
9.什麼是函數重載與覆蓋?
爲什麼C不支持函數重載?
爲什麼C++能支持函數重載?
10.VC中,編譯工具條內的Debug與Release選項是什麼含義?
11.編寫my_memcpy函數,實現與庫函數memcpy類似的功能,不能使用任何庫函數;
void* mymemcpy(void* pvTo, const char* pvFrom, size_t size)
{
assert((dest != NULL) && (src != NULL));
byte* psTo = (byte*)pvTo;
byte* psFrom = (byte*)pvFrom;
while (size-- > 0)
{
*psTo++ = *psFrom++;
}
return pvTo;
}
12.編寫my_strcpy函數,實現與庫函數strcpy類似的功能,不能使用任何庫函數;
答:char* my_strcpy(char* strdest, const char* strsrc)
{
assert(strdest != NULL) && (strsrc != NULL))
char* address = strdest;
while((*strdest++ = *strsrc++) != NULL)
return address;
}

13.編寫gbk_strlen函數,計算含有漢字的字符串的長度,漢字作爲一個字符處理;
已知:漢字編碼爲雙字節,其中首字節<0,尾字節在0~63以外;(如果一個字節是-128~127)
14.函數assert的用法?
答:斷言assert是僅在debug版本起作用的宏,用於檢查“不應該“發生的情況。程序員可以把assert看成一個
在任何系統狀態下都可以安全使用的無害測試手段。
15.爲什麼在頭文件的最前面都會看到這樣的代碼:
#ifndef _STDIO_H_
#define _STDIO_H_
16.爲什麼數組名作爲參數,會改變數組的內容,而其它類型如int卻不會改變變量的值?
答:當數組名作爲參數時,傳遞的實際上是地址。而其他類型如int作爲參數時,由於函數參數值實質上是實參的一份拷貝,被調
函數內部對形參的改變並不影響實參的值。
1.實現雙向鏈表刪除一個節點P,在節點P後插入一個節點,寫出這兩個函數。
  2.寫一個函數,將其中的/t都轉換成4個空格。
  3.Windows程序的入口是哪裏?寫出Windows消息機制的流程。
  4.如何定義和實現一個類的成員函數爲回調函數?
  5.C++裏面是不是所有的動作都是main()引起的?如果不是,請舉例。
  6.C++裏面如何聲明const void f(void)函數爲C程序中的庫函數?
  7.下列哪兩個是等同的
  int b;
  A const int* a = &b;
  B const* int a = &b;
  C const int* const a = &b;
  D int const* const a = &b;
  8.內聯函數在編譯時是否做參數類型檢查?
  void g(base & b){
   b.play;
  }
  void main(){
   son s;
   g(s);
   return;
  }
3、WinMain
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


MSRA Interview Written Exam(December 2003,Time:2.5 Hours)


1寫出下列算法的時間複雜度。
(1)冒泡排序;
(2)選擇排序;
(3)插入排序;
(4)快速排序;
(5)堆排序;
(6)歸併排序;

2寫出下列程序在X86上的運行結果。

struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
}test

void main(void)
{
int i;
test.a=2;
test.b=3;
test.c=0;

i=*((short *)&test);
printf("%d/n",i);
}

3寫出下列程序的運行結果。

unsigned int i=3;
cout<<i * -1;

4寫出下列程序所有可能的運行結果。

int a;
int b;
int c;

void F1()
{
b=a*2;
a=b;
}

void F2()
{
c=a+1;
a=c;
}

main()
{
a=5;
//Start F1,F2 in parallel
F1(); F2();
printf("a=%d/n",a);
}
轉貼請註明 : 志遠工作室 http://www.pghome.net
5考察了一個CharPrev()函數的作用。

6對 16 Bits colors的處理,要求:
(1)Byte轉換爲RGB時,保留高5、6bits;
(2)RGB轉換爲Byte時,第2、3位置零。

7一個鏈表的操作,注意代碼的健壯和安全性。要求:
(1)增加一個元素;
(2)獲得頭元素;
(3)彈出頭元素(獲得值並刪除)。

8一個給定的數值由左邊開始升位到右邊第N位,如
0010<<1 == 0100
或者
0001 0011<<4 == 0011 0000
請用C或者C++或者其他X86上能運行的程序實現。

附加題(只有在完成以上題目後,才獲准回答)
In C++, what does "explicit" mean? what does "protected" mean?

發佈了39 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章