創維筆試題目(精華)
面試筆試1.38W
是當時面創維數字的筆試題,題目比較簡單,只涉及到了基本的C語法,沒有考到資料結構以及演算法,試題在前面說明這套題並不能反映應聘者實際的軟體開發及程式設計能力。
一、請填寫BOOL , float, 指標變數 與“零值”比較的 if 語句。(10分)
請寫出 BOOL flag 與“零值”比較的 if 語句。
if ( flag )
if ( !flag )
請寫出 float x 與“零值”比較的 if 語句。
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可將浮點變數用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。
請寫出 char *p 與“零值”比較的 if 語句。
if (p == NULL)
if (p != NULL)
二、以下為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
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分,共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( char *p )函式的形參為字串指標,在函式內部修改形參並不能真正的改變傳入形參的值,執行完 char *str = NULL; GetMemory( str ); 後的str仍然為NULL;
二.
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問執行Test函式會有什麼樣的結果?
答:可能是亂碼。 char p[] = "hello world";
return p;
的p[]陣列為函式內的區域性自動變數,在函式返回後,記憶體已經被釋放。這是許多程式設計師常犯的錯誤,其根源在於不理解變數的生存期。
三.
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 )Test函式中也未對malloc的記憶體進行釋放。(3)GetMemory避免了試題1的問題,傳入GetMemory的引數為字串指標的指標,但是在GetMemory中執行申請記憶體及賦值語句
p = (char *) malloc( num );
後未判斷記憶體是否申請成功,應加上: if ( *p == NULL ) {
...//進行申請記憶體失敗處理
}
四.
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問執行Test函式會有什麼樣的結果?
答:執行 char *str = (char *) malloc(100); 後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導致可能變成一個“野”指標,應加上: 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++) != ‘/0’ ) // 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 = ‘/0’;
}
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:perate =(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;
}
一、請填寫BOOL , float, 指標變數 與“零值”比較的 if 語句。(10分)
請寫出 BOOL flag 與“零值”比較的 if 語句。
if ( flag )
if ( !flag )
請寫出 float x 與“零值”比較的 if 語句。
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可將浮點變數用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。
請寫出 char *p 與“零值”比較的 if 語句。
if (p == NULL)
if (p != NULL)
二、以下為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
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分,共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( char *p )函式的形參為字串指標,在函式內部修改形參並不能真正的改變傳入形參的值,執行完 char *str = NULL; GetMemory( str ); 後的str仍然為NULL;
二.
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問執行Test函式會有什麼樣的結果?
答:可能是亂碼。 char p[] = "hello world";
return p;
的p[]陣列為函式內的區域性自動變數,在函式返回後,記憶體已經被釋放。這是許多程式設計師常犯的錯誤,其根源在於不理解變數的生存期。
三.
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 )Test函式中也未對malloc的記憶體進行釋放。(3)GetMemory避免了試題1的問題,傳入GetMemory的引數為字串指標的指標,但是在GetMemory中執行申請記憶體及賦值語句
p = (char *) malloc( num );
後未判斷記憶體是否申請成功,應加上: if ( *p == NULL ) {
...//進行申請記憶體失敗處理
}
四.
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問執行Test函式會有什麼樣的結果?
答:執行 char *str = (char *) malloc(100); 後未進行記憶體是否申請成功的判斷;另外,在free(str)後未置str為空,導致可能變成一個“野”指標,應加上: 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++) != ‘/0’ ) // 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 = ‘/0’;
}
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:perate =(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;
}
-
聯想(lenovo)筆試記
今天去聯想筆試,在上地軟體園的聯想研發中心。唉,那個地方真是遠得十萬八千里啊。到那邊工作的人都是怎麼上班的呀?看來以後一定要買輛車......筆試時間在13:30,不過我和jackie8兩個人中午11點的時候就風塵僕僕地往那裡趕了。一路上我都很好奇,因為對那塊高科技孵化...
-
浪潮筆試
基礎知識:軟體工程,面向物件,網路,編譯原理之類的一些知識和常識。1。資料庫:給你2個表,寫出建立它的語句;寫觸發器(具體忘了);寫查詢語句,大概是要求用一條語句同時查詢兩個表的內容,並把結果降序排列。2。程式:從硬碟讀取一個檔案,檔案的內容是幾個數字,建立連結串列,將這幾個數...
-
中鋼筆試感悟
今天去中鋼筆試,才走近中鋼的那棟大廈就有一種撲面而來的奢華氣。待進到會議室,更是感受到了那種氣勢。大概200平方米的大會議室,然後前臺還播著中鋼的視訊介紹,果然央企就是不一樣啊。1個小時的英語,覺得自己的英語真的還不如大學了,畢竟是熟能生巧啊。1個半小時的...
-
申銀萬國筆經
我不是學金融的,今天去宣講會,以為和以前的經驗一樣專業門檻不是很高,講了一個小時左右就發題讓大家筆試。一看題目就傻眼了,這是我遇到的最專業的一次筆試了。現實專業材料的兩篇英譯漢,然後幾段話的漢譯英,100分題。之後100分專業知識,我大致抄了一下,有:1短期償債能...