[轉(zhuǎn)]某些公司的筆試題
1.想想結(jié)果是如何出來的:
?int main()??
{
?? unsigned?? char?? i=1;??
?? i-=3;??
?? printf("the?? value?? of?? i?? is:%d",i);??
}??
結(jié)果:the?? value?? of?? i?? is:254
答案:
??? 0000?? 0001??
-?? 0000?? 0011??
------------------??
??? 1111?? 1110???????? 而???? 1111?? 1110?????? 化為十制進(jìn)正好是254!?
2.看看下列的程序有什么問題
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?為什么?
答案:1.內(nèi)存泄漏 2.str仍然是空指針
3.
int n = 10;
為什么sizeof ( n ) = 4?
?答案:sizeof(x)返回x的類型占用的字節(jié)數(shù),該機(jī)器是在32位下
4.請(qǐng)問C++的類和C里面的struct有什么區(qū)別?
5.請(qǐng)講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?
6.全局變量和局部變量有什么區(qū)別?是怎么實(shí)現(xiàn)的?
7.設(shè)計(jì)函數(shù) int atoi(char *s)。
8.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少?
9.解釋局部變量、全局變量和靜態(tài)變量的含義
10.解釋堆和棧的區(qū)別。
11.論述含參數(shù)的宏與函數(shù)的優(yōu)缺點(diǎn)。
12.實(shí)現(xiàn)雙向鏈表刪除一個(gè)節(jié)點(diǎn)P,在節(jié)點(diǎn)P后插入一個(gè)節(jié)點(diǎn),寫出這兩個(gè)函數(shù)。
13.寫一個(gè)函數(shù),將其中的 都轉(zhuǎn)換成4個(gè)空格。
14.Windows程序的入口是哪里?寫出Windows消息機(jī)制的流程。
15.如何定義和實(shí)現(xiàn)一個(gè)類的成員函數(shù)為回調(diào)函數(shù)?
16.C++里面是不是所有的動(dòng)作都是main()引起的?如果不是,請(qǐng)舉例。
17.C++里面如何聲明const void f(void)函數(shù)為C程序中的庫函數(shù)?
18.下列哪兩個(gè)是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
19.內(nèi)聯(lián)函數(shù)在編譯時(shí)是否做參數(shù)類型檢查?
void g(base & b)
????? {
b.play;
}
void main()
????? {
son s;
??????????? g(s);
??????????? return;
}
20.請(qǐng)你分別劃劃OSI的七層網(wǎng)絡(luò)結(jié)構(gòu)圖,和TCP/IP的五層結(jié)構(gòu)圖?
21.請(qǐng)你詳細(xì)的解釋一下IP協(xié)議的定義,在哪個(gè)層上面,主要有什么作用? TCP與UDP呢?
22.請(qǐng)問交換機(jī)和路由器分別的實(shí)現(xiàn)原理是什么?分別在哪個(gè)層次上面實(shí)現(xiàn)的?
頭文件中<>? 和“”的區(qū)別?
4、定義一個(gè)宏,輸入兩個(gè)參數(shù),輸出積。
1. 以下三條輸出語句分別輸出什么?[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; // 輸出什么?
答:分別輸出false,false,true。str1和str2都是字符數(shù)組,每個(gè)都有其自己的存儲(chǔ)區(qū),它們的值則是各存儲(chǔ)區(qū)首地址,不等;str3 和str4同上,只是按const語義,它們所指向的數(shù)據(jù)區(qū)不能修改。str5和str6并非數(shù)組而是字符指針,并不分配存儲(chǔ)區(qū),其后的“abc”以常量形式存于靜態(tài)數(shù)據(jù)區(qū),而它們自己僅是指向該區(qū)首地址的指針,相等。
12. 以下代碼中的兩個(gè)sizeof用法有問題嗎?[C易]
void UpperCase( char str[] ) // 將 str 中的小寫字母轉(zhuǎn)換成大寫字母
{
for( size_t i=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;
答:函數(shù)內(nèi)的sizeof有問題。根據(jù)語法,sizeof如用于數(shù)組,只能測出靜態(tài)數(shù)組的大小,無法檢測動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。
[color=#DC143C]13. 非C++內(nèi)建型別 A 和 B,在哪幾種情況下B能隱式轉(zhuǎn)化為A?[C++中等]
答:
a. class B : public A { ……} // B公有繼承自A,可以是間接繼承的
b. class B { operator A( ); } // B實(shí)現(xiàn)了隱式轉(zhuǎn)化為A的轉(zhuǎn)化
c. class A { A( const B& ); } // A實(shí)現(xiàn)了non-explicit的參數(shù)為B(可以有其他帶默認(rèn)值的參數(shù))構(gòu)造函數(shù)
d. A& operator= ( const A& ); // 賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,但也可以勉強(qiáng)算一個(gè)[/color]
4. 以下代碼有什么問題?[C++易]
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
答:變量b定義出錯(cuò)。按默認(rèn)構(gòu)造函數(shù)定義對(duì)象,不需要加括號(hào)。
5. 以下代碼有什么問題?[C++易]
cout << (true?1:"1") << endl;
答:三元表達(dá)式“?:”問號(hào)后面的兩個(gè)操作數(shù)必須為同一類型。
8. 以下代碼能夠編譯通過嗎,為什么?[C++易]
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2定義出錯(cuò),size2非編譯器期間常量,而數(shù)組定義要求長度必須為編譯期常量。
2. 以下反向遍歷array數(shù)組的方法有什么錯(cuò)誤?[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數(shù)組
{
cout << array[i] << endl;
}
答:首先數(shù)組定義有誤,應(yīng)加上類型參數(shù):vector array。其次vector::size_type被定義為unsigned int,即無符號(hào)數(shù),這樣做為循環(huán)變量的i為0時(shí)再減1就會(huì)變成最大的整數(shù),導(dǎo)致循環(huán)失去控制。
[color=#DC143C]9. 以下代碼中的輸出語句輸出0嗎,為什么?[C++易]
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;
答:不能。在默認(rèn)構(gòu)造函數(shù)內(nèi)部再調(diào)用帶參的構(gòu)造函數(shù)屬用戶行為而非編譯器行為,亦即僅執(zhí)行函數(shù)調(diào)用,而不會(huì)執(zhí)行其后的初始化表達(dá)式。只有在生成對(duì)象時(shí),初始化表達(dá)式才會(huì)隨相應(yīng)的構(gòu)造函數(shù)一起調(diào)用。[/color]
[color=#DC143C]10. C++中的空類,默認(rèn)產(chǎn)生哪些類成員函數(shù)?[C++易]
答:
class Empty
{
public:
Empty(); // 缺省構(gòu)造函數(shù)
Empty( const Empty& ); // 拷貝構(gòu)造函數(shù)
~Empty(); // 析構(gòu)函數(shù)
Empty& operator=( const Empty& ); // 賦值運(yùn)算符
Empty* operator&(); // 取址運(yùn)算符
const Empty* operator&() const; // 取址運(yùn)算符 const
};[/color]
[color=#DC143C]3. 以下兩條輸出語句分別輸出什么?[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; // 輸出什么?
答:分別輸出false和true。注意轉(zhuǎn)換的應(yīng)用。(int)a實(shí)際上是以浮點(diǎn)數(shù)a為參數(shù)構(gòu)造了一個(gè)整型數(shù),該整數(shù)的值是1,(int&)a則是告訴編譯器將a當(dāng)作整數(shù)看(并沒有做任何實(shí)質(zhì)上的轉(zhuǎn)換)。因?yàn)?以整數(shù)形式存放和以浮點(diǎn)形式存放其內(nèi)存數(shù)據(jù)是不一樣的,因此兩者不等。對(duì)b的兩種轉(zhuǎn)換意義同上,但是0的整數(shù)形式和浮點(diǎn)形式其內(nèi)存數(shù)據(jù)是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數(shù)值意義上)。
注意,程序的輸出會(huì)顯示(int&)a=1065353216,這個(gè)值是怎么來的呢?前面已經(jīng)說了,1以浮點(diǎn)數(shù)形式存放在內(nèi)存中,按 ieee754規(guī)定,其內(nèi)容為0x0000803F(已考慮字節(jié)反序)。這也就是a這個(gè)變量所占據(jù)的內(nèi)存單元的值。當(dāng)(int&)a出現(xiàn)時(shí),它相當(dāng)于告訴它的上下文:“把這塊地址當(dāng)做整數(shù)看待!不要管它原來是什么。”這樣,內(nèi)容0x0000803F按整數(shù)解釋,其值正好就是1065353216 (十進(jìn)制數(shù))。
通過查看匯編代碼可以證實(shí)“(int)a相當(dāng)于重新構(gòu)造了一個(gè)值等于a的整型數(shù)”之說,而(int&)的作用則僅僅是表達(dá)了一個(gè)類型信息,意義在于為cout<<及==選擇正確的重載版本。
[/color]
6. 以下代碼有什么問題?[STL易]
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數(shù)組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor ) array.erase( itor );
}
答:同樣有缺少類型參數(shù)的問題。另外,每次調(diào)用“array.erase( itor );”,被刪除元素之后的內(nèi)容會(huì)自動(dòng)往前移,導(dǎo)致迭代漏項(xiàng),應(yīng)在刪除一項(xiàng)后使itor--,使之從已經(jīng)前移的下一個(gè)元素起繼續(xù)遍歷。
[color=#DC143C]11. 寫一個(gè)函數(shù),完成內(nèi)存之間的拷貝。[考慮問題是否全面]
答:
void* mymemcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast( dest );
const char* psrc = static_cast( src );
if( pdest>psrc && pdest
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i
pdest[i] = psrc[i];
}
return dest;
}[/color]
?
原題如下:
#i nclude
struct bit
{
int a:3;
int b:2;
int c:3;
};
int main(int argc, char* argv[])
{
bit s;
char *c = (char*)&s;
*c = 0x99;
cout <<<<<<
return 0;
}
Output:?
答案:
此題在在X86 little-endian 下是 1 -1 -4
在powerPC等big endian機(jī)器下,還要重新考慮
因?yàn)?x99在內(nèi)存中表示為 100 11 001 , a = 001, b = 11, c = 100
當(dāng)c為有符號(hào)數(shù)時(shí), c = 100, 最高位1表示c為負(fù)數(shù),負(fù)數(shù)在計(jì)算機(jī)用補(bǔ)碼表示,所以c = -4;同理
b = -1;當(dāng)c為有符合數(shù)時(shí), c = 100,即 c = 4,同理 b = 3
位域的概念
有些信息在存儲(chǔ)時(shí),并不需要占用一個(gè)完整的字節(jié), 而只需占幾個(gè)或一個(gè)二進(jìn)制位。例如在存放一個(gè)開關(guān)量時(shí),只有0和1 兩種狀態(tài),用一位二進(jìn)位即可。為了節(jié)省存儲(chǔ)空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域, 并說明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個(gè)不同的對(duì)象用一個(gè)字節(jié)的二進(jìn)制位域來表示。一、位域的定義和位域變量的說明位域定義與結(jié)構(gòu)定義相仿,其形式為:
struct 位域結(jié)構(gòu)名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結(jié)構(gòu)變量說明的方式相同。 可采用先定義后說明,同時(shí)定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共占兩個(gè)字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。對(duì)于位域的定義尚有以下幾點(diǎn)說明:
1. 一個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。如一個(gè)字節(jié)所剩空間不夠存放另一位域時(shí),應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個(gè)位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。
2. 由于位域不允許跨兩個(gè)字節(jié),因此位域的長度不能大于一個(gè)字節(jié)的長度,也就是說不能超過8位二進(jìn)位。
3. 位域可以無位域名,這時(shí)它只用來作填充或調(diào)整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型, 不過其成員是按二進(jìn)位分配的。
二、位域的使用位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
pbit = new bs;
bit.a=1;
bit.b=7;
bit.c=15;
pbit->a = 1;
pbit->b = 2;
pbit->c = 3;
printf("%d, %d, %d",bit.a, bit.b, bit.c);
printf("%d, %d, %d",pbit->a, pbit->b, pbit->c);
}
?
一、 單項(xiàng)選擇題(從四個(gè)備選答案中選擇一個(gè)正確答案,每小題1分,共20分)
1. C++中,關(guān)鍵字struct和class的區(qū)別僅僅在于( C )。
(A)struct 用來定義結(jié)構(gòu)體, 而class用來定義類;
(B)struct 用來定義類, 而class用來定義類結(jié)構(gòu)體;
(C)struct定義的類的缺省成員為公有的,而class定義的類的缺省成員為私有的;
(D)struct定義的類的成員須全部為公有的,而class定義的類的成員可以為私有的;
2. 以下程序執(zhí)行后,輸出結(jié)果為( C ).
#i nclude
int Var=3 ;
void main(void)
{ int Var=10;
::Var++;
cout<<”Var=”<<<”, ::Var=”<<::Var<
}
(A)Var=11, ::Var=11 (B)Var=11, ::Var=3
(C)Var=10, ::Var=4 (D)Var=4, ::Var=10
3. 抽象基類是指( C )。
(A)嵌套類 (B)派生類
(C)含有純虛函數(shù) (D)多繼承類
4.如果有#define AREA(a,b)a+b 則語句int s=AREA(3,4)*AREA(3,4)執(zhí)行后變量s值為( D )。
(A) 24 (B)49 (C)144 (D)19
5. C++中條件表達(dá)式的值為( C )。
(A)–1或者+1 (B)–231~231 –1 (C)0或者1 (D) 0~231–1
6. 現(xiàn)在有以下語句:
struct MyBitType
{ int a:3;
unsigned b:3;
unsigned c:20;
int d;
};
int sz=sizeof(MyBitType);
則執(zhí)行后,變量sz的值將得到( B )。
(A)2 (B)8 (C)28 (D)58
7. 假設(shè)有一個(gè)C++類名為Country, 則此類的析構(gòu)函數(shù)為( C ).
(A)::Country() (B)void ~Country(void)
(C)~Country() (D)void ~Country()
8. 如果定義一個(gè)C++類CDate, 語句“CDate *p = new CDate;”的含義是( A )。
(A)調(diào)用CDate類的缺省構(gòu)造函數(shù)從內(nèi)存中分配一個(gè)CDate類型的對(duì)象,并將該對(duì)象地址賦值給指針p;
(B)調(diào)用CDate類的拷貝構(gòu)造函數(shù)從內(nèi)存中分配一個(gè)CDate類型的對(duì)象,并將該對(duì)象地址賦值給指針p;
(C)調(diào)用CDate類的析構(gòu)函數(shù)從內(nèi)存中分配一個(gè)CDate類型的對(duì)象,并將該對(duì)象地址賦值給指針p;
(D)從內(nèi)存中釋放指針p所指向的CDate類的對(duì)象;
9.如果有一個(gè)類CRect及語句“CRect x1, x2;” 要使語句 “x1=x2;”合法,可在類中定義成員函數(shù)( C )。
(A) int operator(x2) (B)int operator=(x2)
(C) void operator=(CRect &); (D) void operator=()
10. 結(jié)構(gòu)體變量S實(shí)際所占內(nèi)存的大小為( A )字節(jié)。
(A)sizeof(S) (B)strlen(S)
(C)結(jié)構(gòu)體中最長成員的長度 (D)結(jié)構(gòu)體中最短成員的長度
11.在C++中,下列算符( D )不能重載。
(A)<< (B)>> (C)delete (D)::
12.下列正確的是( D )
(A)結(jié)構(gòu)不能有構(gòu)造函數(shù)、析構(gòu)函數(shù); (B)缺省時(shí)類的成員是公有的;
(C)類中如果定義了析構(gòu)函數(shù),則必須定義構(gòu)造函數(shù);
(D)缺省時(shí)結(jié)構(gòu)的成員是公有的;
13. 下列關(guān)于靜態(tài)數(shù)據(jù)成員正確的是( B )
(A)可以通過this指針訪問靜態(tài)數(shù)據(jù); (B)可以用類名和作用域訪問靜態(tài)數(shù)據(jù);
(C)靜態(tài)數(shù)據(jù)在類內(nèi)聲明并初始化; (D)只能由該類的靜態(tài)成員函數(shù)訪問;
14. 下列關(guān)于友元正確的說法是( D )
(A)友元只能在類的public區(qū)聲明;(B)友元具有this指針;
(C)類的成員函數(shù)不能聲明為另一個(gè)類的友元;
(D)一個(gè)函數(shù)如果被聲明為一個(gè)類的友元,則該函數(shù)具有訪問該類私有成員的權(quán)利。
15. 基類的( A )在派生類內(nèi)不能被訪問。
(A)私有成員 (B)保護(hù)成員
(C)公有數(shù)據(jù)成員 (D)公有靜態(tài)數(shù)據(jù)成員
16. 下列關(guān)于運(yùn)算符重載的描述中正確的是( D )
(A)運(yùn)算符重載可以改變?cè)撨\(yùn)算符的優(yōu)先級(jí);
(B)運(yùn)算符重載可以改變?cè)撨\(yùn)算符目數(shù),即該算符運(yùn)算的操作數(shù)個(gè)數(shù);
(C)運(yùn)算符重載函數(shù)只能在類中定義;
(D)new和delete允許重載;
17.左值是指( A )
(A)賦值算符左邊的變量; (B)賦值算符左邊的表達(dá)式的值;
(D)出現(xiàn)在賦值算符右邊的表達(dá)式的值;
(E)二元算符左邊表達(dá)式的值;
18. 下列為純虛函數(shù)的正確聲明的是( B )
(A)void virtual print()=0; (B)virtual void print()=0;
(C)virtual void print(){ }; (D)virtual void print();
19. 如果在類對(duì)象a的類中重載運(yùn)算符“+”,則a+5的顯示調(diào)用方式為( C )
(A)a.operator(5) (B)a->operator+(5);
(C)a.operator+(5) (D)5.operator+(a)
20.一個(gè)類如果有一個(gè)以上的基類就叫做( B )。
(A)循環(huán)繼承 (B)單繼承
(C)非法繼承 (D)多繼承
二、 多項(xiàng)選擇題(從五個(gè)備選答案中選擇2~5個(gè)正確答案,每小題2分,共10分)
1. 如果已定義了一個(gè)C++類CMyList并有以下語句:
CMyList list(3);
以下說法正確的是( AC )。
(A)該語句會(huì)創(chuàng)建一個(gè)CMyList類的一個(gè)對(duì)象;
(B)該語句會(huì)創(chuàng)建一個(gè)CMyList類的3個(gè)對(duì)象;
(C)必須為類CMyList定義一個(gè)構(gòu)造函數(shù);
(D)必須為類CMyList定義一個(gè)析構(gòu)函數(shù);
(E) 必須定義函數(shù)CMyList list(int);
2. 以下說法正確的是( ABCDE )。
(A)內(nèi)聯(lián)(inline)函數(shù)改善了函數(shù)調(diào)用的執(zhí)行效率。
(B)類A的友元(friend)函數(shù)可以訪問類A的私有成員。
(C)類A的友元(friend)類B可以訪問類A的私有成員。
(D)類A的靜態(tài)數(shù)據(jù)成員為類A的所有對(duì)象所共享。
(E)類A的靜態(tài)成員函數(shù)沒有傳遞this 指針作為參數(shù)。
3.類B從類A派生,則類B可以訪問類A中的( AC )成員。
(A)public成員 (B)private成員 (C)protected成員
(D)數(shù)據(jù)成員 (E)函數(shù)成員
4. 面向?qū)ο蟮某绦蛟O(shè)計(jì)語言具有( ABE )等共同特性。
(A)封裝性 (B)多態(tài)性 (C)簡單性 (D)復(fù)雜性
(E)繼承性
5. 現(xiàn)有一個(gè)程序如下:
#i nclude
class A
{ public:
void f(){ cout<< "A::f()"<
};
class B
{ public:
void f(){ cout<< "B:f()"<
void g(){ cout<< "B:g()"<
};
class C:public A, public B
{ public:
void g(){ cout<<"C::g()"<
void h()
{ cout<<"C::h()"<
f(); //語句1
}
};
void main()
{ C obj;
obj.f(); //語句2
obj.A::f(); //語句3
obj.B::f(); //語句4
obj.g(); //語句5
}
則編譯時(shí)會(huì)產(chǎn)生錯(cuò)誤的語句有( AB )。
(A)語句1 (B)語句2 (C)語句3
(D)語句4 (E)語句5
三、 判斷分析題(正確的畫上√,錯(cuò)誤的畫上×,每小題1分,共10分)
1.如果一個(gè)類的所有對(duì)象都共享某一個(gè)變量,則應(yīng)當(dāng)將該變量定義為該類的static成員。 ( √ )
2.語句“ typedef struct _MYSTRUC { int x; int y; double z; } MYSTRUC; ”是非法語句。 ( × )
3.語句“ int (*p)(int x, int y);”說明了p是一個(gè)指向整數(shù)的指針。 ( × )
4.Visual C++集成開發(fā)環(huán)境中,一個(gè)Workspace中只能創(chuàng)建一個(gè)Project。 ( × )
5.能訪問一個(gè)類CMyClass中的private成員的可以是類CMyClass的成員函數(shù),友元函數(shù)和友元類中的函數(shù)。 ( √ )
6. 所有的MFC應(yīng)用程序都必須有一個(gè)且只有一個(gè)CWinApp對(duì)象。 ( √ )
7.C++中的多態(tài)性就是指在編譯時(shí),編譯器對(duì)同一個(gè)函數(shù)調(diào)用,根據(jù)情況調(diào)用不同的實(shí)現(xiàn)代碼。 ( × )
8.在for循環(huán)中,是先執(zhí)行循環(huán)體后再判斷循環(huán)條件。 ( × )
9.C++中,如果條件表達(dá)式值為-1, 則表示邏輯為假。 ( × )
10. 在C++中用new分配的內(nèi)存空間,在不需要時(shí)一般用free將該空間釋放。 ( × )
四、 填空題(每空2分,共20分)
1.以下函數(shù)完成求表達(dá)式 的值,請(qǐng)?zhí)羁帐怪瓿纱斯δ堋?
float sum( float x )
{ float s=0.0;
int sign=1;
float t=1.0;
for(int i=1; i<=100; i++)
{
t=t*x;
s=s+-sign*i/(t+sign*i);
sign=-sign;
}
return s;
}
2.以下程序中實(shí)現(xiàn)類CSort, 完成對(duì)其成員p所指向的整數(shù)數(shù)組進(jìn)行從小到大排序,該數(shù)組的元素個(gè)數(shù)由num表示,請(qǐng)?zhí)羁胀晟圃摮绦颉?
#i nclude
class CSort
{
int *p;
int num;
public:
void Order();
CSort(int *, int);
void Disp();
};
CSort::CSort(int *arry, int n)
:p(arry), num(n)
{ }
void CSort::Order() //函數(shù)Order原型
{ int m, tmp;
for(int i=0; i
{ m=i;
for(int j=i+1; j
{ if(p[j]
m=j;
}
if(m!=i)
{ tmp=p[i];
p[i]=p[m];
p[m]=tmp;
}
}
}
void CSort::Disp()
{ for(int i=0; i
cout<<<",";
cout<<
}
void main( )
{ static int a[]={10, -15, -3, 5, -4, 7,2};
CSort obj(a,2);
obj.Disp(); //應(yīng)輸出一行:10,-15,-3,5,-4,7,2
obj.Order(); //對(duì)數(shù)組排序
obj.Disp(); //應(yīng)輸出一行:-15,-4,-3,2,5,7,10
}
3.以下函數(shù)完成求兩個(gè)數(shù)n1和n2的最大公約數(shù)。
#i nclude
int fac(int n1, int n2)
{ int tmp;
if( n1 < n2 )
{ tmp=n1;
n1=n2 ;
n2=tmp ;
}
while(n1%n2!=0)
{ tmp=n1%n2; n1=n2; n2=tmp;
}
return n2;
}
2005年華為招聘--C語言筆試試題
?
一、判斷題(對(duì)的寫T,錯(cuò)的寫F并說明原因,每小題4分,共20分)
1、有數(shù)組定義int a[2][2]={{1},{2,3}};則a[0][1]的值為0。(???? )
2、int (*ptr) (),則ptr是一維數(shù)組的名字。(???? )
3、指針在任何情況下都可進(jìn)行>,<,>=,<=,==運(yùn)算。(???? )
4、switch(c) 語句中c可以是int ,long,char ,float ,unsigned int 類型。(?? )
5、#define print(x)? printf("the no, "#x",is ")
?
二、填空題(共30分)
1、在windows下,寫出運(yùn)行結(jié)果,每空2分,共10分。
char str[ ]= "Hello";
char *p=str;
int n=10;
sizeof(str)=(????? )
sizeof(p)=(?????? )
sizeof(n)=(?????? )
void func(char str[100])
{??? }
sizeof(str)=(???? )
?
2、void setmemory(char **p, int num)
{ *p=(char *) malloc(num);}
void test(void)
{? char *str=NULL;
?? getmemory(&str,100);
?? strcpy(str,"hello");
?? printf(str);
}
運(yùn)行test函數(shù)有什么結(jié)果?(??????????????????????????????? )10分
?
3、設(shè)int arr[]={6,7,8,9,10};
???? int *ptr=arr;
?? *(ptr++)+=123;
?printf("%d,%d",*ptr,*(++ptr));
(?????????????????????????????????? ) 10分
?
二、編程題(第一小題20,第二小題30分)
1、? 不使用庫函數(shù),編寫函數(shù)int strcmp(char? *source, char *dest)
相等返回0,不等返回-1;
?
2、? 寫一函數(shù)int fun(char *p)判斷一字符串是否為回文,是返回1,不是返回0,出錯(cuò)返回-1
?
五、 閱讀程序題(每個(gè)小題5分,共20分)
1.閱讀以下程序,概括地寫出程序的功能。
#i nclude
double Exp(double x)
{ double sum=1.0;
double term=x;
double i=1 ;
while (term>=1.0E-8)
{ sum+=term ;
i++;
term=term*x/i ;
}
return sum ;
}
void main()
{ double s;
s=Exp(1.0)+Exp(2.0);
cout.precision(8);
cout<<"s="<<
}
zz
2. 閱讀程序,寫出程序執(zhí)行時(shí)輸出結(jié)果。
#i nclude
const int SIZE=10;
class stack
{ char stck[SIZE];
int top;
public:
void init();
void push(char ch);
char pop();
};
void stack::init()
{ top=0; }
void stack::push(char ch)
{ if(top==SIZE)
{ cout<<"Stack is full.\n";
return ;
}
stck[top++]=ch;
}
char stack::pop()
{ if(top==0)
{ cout<<"Stack is empty.\n";
return 0;
}
return stck[--top];
}
void main()
{ stack s1, s2;
s1.init();
s2.init();
s1.push('a');
s1.push('b');
s1.push('c');
s2.push('x');
s2.push('y');
s2.push('z');
for(int i=0; i<3; i++)
cout<<"Pop s1:"<<
for(i=0; i<3; i++)
cout<<"Pop s2:"<<
}
程序結(jié)果:
Pop s1: c
Pop s1: b
Pop s1: a
Pop s2: z
Pop s2: y
Pop s2: z
3.閱讀程序,寫出程序運(yùn)行時(shí)輸出結(jié)果。
#i nclude
class Tdate
{ public:
Tdate();
Tdate(int d);
Tdate(int m, int d);
Tdate(int m, int d, int y);
protected:
int month;
int day;
int year;
};
Tdate::Tdate()
{ month=4;
day=15;
year=1995;
cout<<<"/" <<<"/" <<
}
Tdate::Tdate(int d)
{ month=4;
day=d;
year=1996;
cout<<<"/" <<<"/" <<
}
Tdate::Tdate(int m, int d)
{ month=m;
day=d;
year=1997;
cout<<<"/" <<<"/" <<
}
Tdate::Tdate(int m, int d, int y)
{ month=m;
day=d;
year=y;
cout<<<"/" <<<"/" <<
}
void main()
{ Tdate aday;
Tdate bday(10);
Tdate cday(2,12);
Tdate dday(1,2,1998);
}
運(yùn)行結(jié)果:
4/15/1995
4/10/1996
2/12/1997
1/2/1998
4.閱讀程序,寫出程序運(yùn)行時(shí)輸出結(jié)果。
#i nclude
#i nclude
class shape
{ public:
shape(double x, double y):xCoord(x), yCoord(y){}
virtual double Area()const {return 0.0; }
protected:
double xCoord, yCoord;
};
class AA :public shape
{ public:
AA(double x, double y, double r): shape(x,y), rad(r){}
virtual double Area()const { return 3.0 * rad * rad; }
protected:
double rad;
};
class BB :public shape
{ public:
BB(double x1, double y1, double x2, double y2)
:shape(x1, y1), x2Coord(x2), y2Coord(y2){ }
virtual double Area()const;
protected:
double x2Coord, y2Coord;
};
double BB:Area()const
{ return fabs((xCoord-x2Coord)* (yCoord - y2Coord));
//庫函數(shù)fabs(double t)求得t的絕對(duì)值
}
void fun(const shape& sp)
{ cout<<
}
void main()
{ AA aa(2.0, 5.0, 4.0);
fun(aa);
BB bb(2.0, 8.0, 12.0, 17.0);
fun(bb);
}
運(yùn)行結(jié)果:
48
30
六、 編寫程序題(每小題10分,共20分)
1.編寫一個(gè)函數(shù)int Judge(int *pArray, int n),判斷一個(gè)n×n二維整數(shù)數(shù)組pArray 是否為“魔方陣”,若是返回1,否則返回0。所謂魔方陣就是將1到n2的各個(gè)數(shù)字組成的方陣,它的每一行、每一列以及兩個(gè)對(duì)角線上數(shù)字之和均相等。例如,3×3的中,A是魔方陣,而B不是魔方陣。然后在主程序中調(diào)用Judge函數(shù)判斷數(shù)組A是否為魔方陣。
參考程序
#i nclude
int Judge(int *pArray, int n)
{ int s1, s2, s3,s4,sum=0;
int *p=pArray;
for(int i=1; i<= n*n; i++)
{ int Found=0; //為0,不在方陣中;
for(int j=0; j
if(p[j]==i)
{ Found=1; //為1,在方陣中
break;
}
if(Found==0) return 0; // 值為 i 的元素不在數(shù)組中,顯然不是魔方陣
}
for( i=1; i<=n*n; i++)
sum=sum+i;
sum=sum / n; // 各行、各列、對(duì)角線元素應(yīng)當(dāng)?shù)玫降暮?
s3=0;
s4=0;
for( i=0; i
{ s1=0, s2=0;
p=pArray;
for(int j=0; j
{ s1=s1+p[i*n+j]; //第i行的元素和
s2=s2+p[j*n+i]; //第i列的元素和
}
if ( s1!=sum)
return 0;
if ( s2!=sum)
return 0;
s3=s3+pArray[i*n+i]; // 對(duì)角線一元素和
s4=s4+pArray[i*n+(n-1-i)]; // 對(duì)角線二元素和
}
if(s3!=sum)
return 0;
if(s4 != sum)
return 0;
return 1;
}
void main()
{ int Array[3][3]={{ 8, 1, 6},{ 3, 5, 7},{ 4, 9, 2}};
當(dāng) x 輸入值為9999時(shí),函數(shù)返回值為多少?
int fun ( unsigned int x )
{
int count = 0;
while(x)
{
x = x & (x-1);
count++;
}
return count;
}
答案:此函數(shù)是在計(jì)算 x 中含有1的個(gè)數(shù),所以返回值為8。
if(Judge((int*)Array, 3))
cout<<"Yes, it's a magic array"<
else
cout<<"No, it isn't a magic array"<
}
/*********************************
* 兩個(gè)超大數(shù)相乘算法
*********************************/
#i nclude
void main()
{
int a[30],b[30],c[60];
int i,j;
/* 給乘數(shù)和被乘數(shù)賦值,并把結(jié)果賦零 */
for (i=0;i<30;i++)
{
a[i]=i%10;
b[i]=i%10;
c[2*i]=0;
c[2*i+1]=0;
}
/* 給每位結(jié)果賦值,這里應(yīng)該考慮清楚為什么這么寫
還有這里的位的值的最大限度應(yīng)該是-128 -- +127
所以就算是10*10也可以滿足存進(jìn)去一個(gè)char類型里 */
for(i=0;i<30;i++)
for(j=0;j<30;j++)
c[i+j]+=a[i]*b[j];
/* 這里把每個(gè)位>10的數(shù)進(jìn)位和把余數(shù)重新賦值給這一位 */
for(i=0;i<59;i++)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
/* 打印出來 */
for(i=0;i<30;i++)
printf("%d",a[30-i-1]);
printf("\n");
for(i=0;i<30;i++)
printf("%d",b[30-i-1]);
printf("\n");
for(i=0;i<60;i++)
printf("%d",c[60-i-1]);
printf("\n");
}
posted on 2006-06-15 06:54
Jerry Cat 閱讀(1017)
評(píng)論(0) 編輯 收藏 引用