c/c++筆試題目(林銳)

來源:互聯網
上載者:User
本試題僅用於考查C++/C程式員的基本編程技能。內容限於C++/C常用文法,不涉及資料結構、演算法以及深奧的文法。考試成績能反映出考生的編程品質以及對C++/C的理解程度,但不能反映考生的智力和軟體開發能力。 筆試時間90分鐘。請考生認真答題,切勿輕視。 一、請填寫BOOL , float, 指標變數 與“零值”比較的 if 語句。(10分) 提示:這裡“零值”可以是0, 0.0 , FALSE或者“null 指標”。例如 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、#include <filename.h> 和 #include “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();
} 優點:
缺點:
優點:
缺點:   四、有關記憶體的思考題(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   (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個函數。 頑主 評論於 2006-10-17 22:27
# re: c++面試題  回複    
附錄C :C++/C試題的答案與評分標準   一、請填寫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、#include <filename.h> 和 #include “filename.h” 有什麼區別?(5分) 答:對於#include <filename.h> ,編譯器從標準庫路徑開始搜尋 filename.h 對於#include “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)語句 不起作用。   五、編寫strcpy函數(10分) 已知strcpy函數的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字串,strSrc是源字串。 (1)不調用C++/C的字串庫函數,請編寫函數 strcpy char *strcpy(char *strDest, const char *strSrc); { assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 char *address = strDest; // 2分 while( (*strDest++ = * strSrc++) != ‘’ ) // 2分 NULL ; return address ; // 2分 }   (2)strcpy能把strSrc的內容複寫到strDest,為什麼還要char * 類型的傳回值? 答:為了實現鏈式運算式。 // 2分 例如 int length = strlen( strcpy( strDest, “hello world”) );     六、編寫類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個函數。   標準答案: // String的解構函式 String::~String(void) // 3分 { delete [] m_data; // 由於m_data是內部資料類型,也可以寫成 delete m_data; }   //String的普通建構函式 String::String(const char *str) // 6分 { if(str==NULL) { m_data = new char[1]; // 若能加 NULL 判斷則更好 *m_data = ‘’; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判斷則更好 strcpy(m_data, str); } }   // 拷貝建構函式 String::String(const String &other) // 3分 { int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判斷則更好 strcpy(m_data, other.m_data); }   // 賦值函數 String & String::operate =(const String &other) // 13分 { // (1) 檢查自賦值 // 4分 if(this == &other) return *this; // (2) 釋放原有的記憶體資源 // 3分 delete [] m_data; // (3)分配新的記憶體資源,並複製內容 // 3分 int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判斷則更好 strcpy(m_data, other.m_data); // (4)返回本對象的引用 //3分 return *this; }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.