




已閱讀5頁,還剩12頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1.實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,寫出這兩個函數;答:/假設線性表的雙向鏈表存儲結構typedef struct DulNodestruct DulNode *prior; /前驅指針ElemType data; /數據struct DulNode *next; /后繼指針DulNode,*DuLinkList;/刪除操作Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)if(!(p=GetElemP_DuL(L,i) /此處得到i位置的節點指針,如果有需要也得寫出具體函數實現return ERROR;e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);return OK;/插入操作Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)if(!(p=GetElemP_DuL(L,i)return ERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode)return ERROR;s-data=e;s-prior=p-prior;p-prior-next=s;s-next=p;p-prior=s;return OK;2.寫一個函數,將其中的t都轉換成4個空格。答:該函數命名為convert,參數的意義為:*strDest目的字符串,*strSrc源字符串,length源字符串的長度函數實現為:char* convert(char *strDest, const char *strSrc,int length)char * cp = strDest;int i=0;while(*strSrc & iif (*strSrc=t) /將t轉換成4個空格for(int j=0;j= EPSINON) & (x =”或“=”形式。如果寫成if (x = 0.0),則判為錯,得0分。試題2:以下為Windows NT下的32位C+程序,請計算sizeof的值void Func ( char str100 ) sizeof( str ) = ?void *p = malloc( 100 );sizeof ( p ) = ?解答:sizeof( str ) = 4sizeof ( p ) = 4剖析:Func ( char str100 )函數中數組名作為函數形參時,在函數體內,數組名失去了本身的內涵,僅僅只是一個指針;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。數組名的本質如下:(1) 數組名指代一種數據結構,這種數據結構就是數組;例如:char str10;cout sizeof(str) endl;輸出結果為10,str指代數據結構char10。(2) 數組名可以轉換為指向其指代實體的指針,而且是一個指針常量,不能作自增、自減等操作,不能被修改;char str10;str+; /編譯出錯,提示str不是左值(3) 數組名作為函數形參時,淪為普通指針。Windows NT 32位平臺下,指針的長度(占用內存的大小)為4字節,故sizeof( str ) 、sizeof ( p ) 都為4。試題3:寫一個“標準”宏MIN,這個宏輸入兩個參數并返回較小的一個。另外,當你寫下面的代碼時會發生什么事?least = MIN(*p+, b);解答:#define MIN(A,B) (A) = (B) ? (A) : (B)MIN(*p+, b)會產生宏的副作用剖析:這個面試題主要考查面試者對宏定義的使用,宏定義可以實現類似于函數的功能,但是它終歸不是函數,而宏定義中括弧中的“參數”也不是真的參數,在宏展開的時候對“參數”進行的是一對一的替換。程序員對宏定義的使用要非常小心,特別要注意兩個問題:(1) 謹慎地將宏定義中的“參數”和整個宏用用括弧括起來。所以,嚴格地講,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN(A,B) (A = B ? A : B ) 都應判0分;(2) 防止宏的副作用。宏定義#define MIN(A,B) (A) = (B) ? (A) : (B)對MIN(*p+, b)的作用結果是:(*p+) = (b) ? (*p+) : (*p+) 這個表達式會產生副作用,指針p會作三次+自增操作。除此之外,另一個應該判0分的解答是:#define MIN(A,B) (A) 1 + 2 * 3 其實是想要(1 + 2) * 32) 作為值返回時,類似1)#define ADD(a,b) (a) + (b)int c = ADD(a,b) * 3; = (a) + (b) * 3 其實是想要(a + b) * 3所以,一般的規則是:宏里面參數全部用括號括起來;如果作為值返回,整個表達式也用括號括起來。所以,上面最好這么寫:#define MULTI(a,b) (a) * (b)#define ADD(a,b) (a) + (b)2、實際使用參數和宏內部變量同名#define HASH(str,sz,rst) dounsigned int n = 0; n = xxx; rst = n % sz;while(0)這是一個hash的宏實現,其中定義了一個臨時變量n,根據str計算n,然后對sz求模并把返回值賦給傳進來的rst.這么調用:int n;HASH(“hello”,7,n);不會達到改變n的效果,因為實際使用參數n和宏內部的變量n同名。宏擴展中最后一條語句是:n = n % sz;因為宏內部n有更小作 用域,實際賦值的是宏內部的那個臨時變量n。外面調用的n不會有任何改變。這個副作用有些隱蔽,一般的規則是:宏內部變量使用一種不同風格的命名方式。比如:#define HASH(str,sz,rst) dounsigned int _n = 0; _n = 3、+,#define MAX(a,b) (a) (b) ? (a) : (b)int a = 3,b = 2;int c = MAX(a+,b);執行看看,不但a的值不是和想要的一致,返回值c也會讓你大吃一驚,哈哈。(a = 5,c = 4)在宏內部一個變量”執行”多少次,它就自增或自減了多少次。所以一般使用宏最好不要傳入自增自減。如果你一定要在宏里消除這個副作用,可以這樣:#define MAX(a,b) (int _x = (a), _y = (b);(_x _y) ? _x : _y;)也就是:保證傳入宏的參數在內部只使用一次。(注意:傳入a+或+a都能得到各自正確的效果)這里的內部變量_x,_y是不需要用括號包起來的,原因可以自己想想。另外對宏中括號的使用補充說明兩點:因為宏中定義了臨時變量,所以要用括起來;因為要返回值,所以外面還要用()括起來(不返回值);另外,這里還有一個問題:實際中a,b不一定是int的,這個宏中的臨時變量聲明為int,不通用。改進:#define MAX(a,b,type) (type _x = (a), _y = (b);(_x _y) ? _x : _y;)使用:MAX(1,2,int); MAX(1.1,1.2,double);是不是感覺怪怪的,有點c+的感覺 這樣的使用太復雜了,而且也會給代碼的閱讀帶來難度。我覺得好的態度是多了解些宏的可能的副作用,在實際編碼中遵守第1、2條規則,不要往宏中傳入自增自減的東西,就夠了。不要把過多的復雜度全扔給宏,”通用”也不能盲目,因為畢竟:yy是沒有極限的。試題4:為什么標準頭文件都有類似以下的結構?Code#ifndef _INCvxWorksh#define _INCvxWorksh#ifdef _cplusplusextern “C” #endif/*/#ifdef _cplusplus#endif#endif /* _INCvxWorksh */解答:頭文件中的編譯宏#ifndef_INCvxWorksh#define_INCvxWorksh#endif的作用是防止被重復引用。作為一種面向對象的語言,C+支持函數重載,而過程式語言C則不支持。函數被C+編譯后在symbol庫中的名字與C語言的不同。例如,假設某個函數的原型為:void foo(int x, int y);該函數被C編譯器編譯后在symbol庫中的名字為_foo,而C+編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函數名和函數參數數量及類型信息,C+就是考這種機制來實現函數重載的。為了實現C和C+的混合編程,C+提供了C連接交換指定符號extern “C”來解決名字匹配問題,函數聲明前加上extern “C”后,則編譯器就會按照C語言的方式將該函數編譯為_foo,這樣C語言中就可以調用C+的函數了。試題5:編寫一個函數,作用是把一個char組成的字符串循環右移n個。比如原來是“abcdefghi”如果n=2,移位后應該是“hiabcdefgh”函數頭是這樣的:/pStr是指向以0結尾的字符串的指針/steps是要求移動的nvoid LoopMove ( char * pStr, int steps ) /請填充解答:正確解答1:Codevoid LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) steps; char tmpMAX_LEN; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = 0; strcpy( pStr, tmp );正確解答2:Codevoid LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) steps; char tmpMAX_LEN; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps );剖析:這個試題主要考查面試者對標準庫函數的熟練程度,在需要的時候引用庫函數可以很大程度上簡化程序編寫的工作量。最頻繁被使用的庫函數包括:(1) strcpy(2) memcpy(3) memsetmemcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由src所指內存區域復制count個字節到dest所指內存區域。說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針。注意:與strcpy相比,memcpy并不是遇到0就結束,而是一定會拷貝完n個字節。舉例:/ memcpy.c#include #include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;clrscr();memcpy(d,s,strlen(s);dstrlen(s)=0;printf(“%s”,d);getchar();return 0;截取view#include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;memcpy(d,s+14,4);/memcpy(d,s+14*sizeof(char),4*sizeof(char);也可d4=0;printf(“%s”,d);getchar();return 0;輸出結果:View初始化數組char msg10;memcpy(msg,0,sizeof(msg);memset函數原型void *memset(void *s, int ch, unsigned n);編輯本段程序例#include #include #include memset函數int main(void)char buffer = “Hello worldn”;printf(“Buffer before memset: %sn”, buffer);memset(buffer, *, strlen(buffer) );printf(“Buffer after memset: %sn”, buffer);return 0;輸出結果:Buffer before memset: Hello worldBuffer after memset: *編譯平臺:Microsoft Visual C+ 6.0也不一定就是把內容全部設置為ch指定的ASCII值,而且該處的ch可為int或者其他類型,并不一定要是char類型。例如下面這樣:int array5 = 1,4,3,5,2;for(int i = 0; i 5; i+)cout0.000001&x-0.000001)10.Internet采用哪種網絡協議?該協議的主要層次結構?Tcp/Ip協議主要層次結構為: 應用層/傳輸層/網絡層/數據鏈路層/物理層。11.Internet物理地址和IP地址轉換采用什么協議?ARP (Address Resolution Protocol)(地址解析協議)12.IP地址的編碼分為哪倆部分?IP地址由兩部分組成,網絡號和主機號。不過是要和“子網掩碼”按位與上之后才能區分哪些是網絡位哪些是主機位。13.用戶輸入M,N值,從1至N開始順序循環數數,每數到M輸出該數值,直至全部輸出。寫出C程序。循環鏈表,用取余操作做14.不能做switch()的參數類型是:switch的參數不能為實型。1.寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值(3分)int a = 4;(A)a += (a+); (B) a += (+a) ;(C) (a+) += a;(D) (+a) += (a+);a = ?答:C錯誤,左側不是一個有效變量,不能賦值,可改為(+a) += a;改后答案依次為9,10,10,112.某32位系統下, C+程序,請計算sizeof 的值(5分).char str = “/”char *p = str ;int n = 10;請計算sizeof (str ) = ?(1)sizeof ( p ) = ?(2)sizeof ( n ) = ?(3)void Foo ( char str100)請計算sizeof( str ) = ?(4)void *p = malloc( 100 );請計算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)43. 回答下面的問題. (4分)(1).頭文件中的 ifndef/define/endif 干什么用?預處理答:防止頭文件被重復引用(2). i nclude 和 i nclude “filename.h” 有什么區別?答:前者用來包含開發環境提供的庫頭文件,后者用來包含自己編寫的頭文件。(3).在C+ 程序中調用被 C 編譯器編譯后的函數,為什么要加 extern “C”聲明?答:函數和變量被C+編譯后在符號庫中的名字與C語言的不同,被extern C修飾的變量和函數是按照C語言方式編譯和連接的。由于編譯后的名字不同,C+程序不能直接調用C 函數。C+提供了一個C 連接交換指定符號extern“C”來解決這個問題。(4). switch()中不允許的數據類型是?答:實型4. 回答下面的問題(6分)(1).Void GetMemory(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello);printf(str);請問運行Test 函數會有什么樣的結果?答:輸出“hello”(2). void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL)strcpy(str, “world”);printf(str);請問運行Test 函數會有什么樣的結果?答:輸出“world”(3). char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);請問運行Test 函數會有什么樣的結果?答:無效的指針,輸出不確定5. 編寫strcat函數(6分)已知strcat函數的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。(1)不調用C+/C 的字符串庫函數,請編寫函數 strcat答:VC源碼:char * _cdecl strcat (char * dst, const char * src)char * cp = dst;while( *cp )cp+; /* find end of dst */while( *cp+ = *src+ ) ; /* Copy src to end of dst */return( dst ); /* return dst */(2)strcat能把strSrc 的內容連接到strDest,為什么還要char * 類型的返回值?答:方便賦值給其他變量6.MFC中CString是類型安全類么?答:不是,其它數據類型轉換到CString可以使用CString的成員函數Format來轉換7.C+中為什么用模板類。答:(1)可用來創建動態增長和減小的數據結構(2)它是類型無關的,因此具有很高的可復用性。(3)它在編譯時而不是運行時檢查數據類型,保證了類型安全(4)它是平臺無關的,可移植性(5)可用于基本數據類型19 關于內存對齊的問題以及sizof()的輸出答:編譯器自動對齊的原因:為了提高程序的性能,數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的內存訪問僅需要一次訪問。20 int i=10, j=10, k=3; k*=i+j; k最后的值是?答:60,此題考察優先級,實際寫成: k*=(i+j);,賦值運算符優先級最低19. 如何引用一個已經定義過的全局變量?答:extern可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。20. 全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?答:可以,在不同的C文件中以static形式來聲明同名全局變量。可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。21. 語句for( ;1 ;)有什么問題?它是什么意思?答:無限循環,和while(1)相同。22. dowhile和whiledo有什么區別?答:前一個循環一遍再判斷,后一個判斷以后再循環。23. 請寫出下列代碼的輸出內容#includemain()int a,b,c,d;a=10;b=a+;c=+a;d=10*a+;printf(b,c,d:%d,%d,%d,b,c,d);return 0;答:10,12,1201. 以下三條輸出語句分別輸出什么?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都是字符數組,每個都有其自己的存儲區,它們的值則是各存儲區首地址,不等;str3和str4同上,只是按const語義,它們所指向的數據區不能修改。str5和str6并非數組而是字符指針,并不分配存儲區,其后的“abc”以常量形式存于靜態數據區,而它們自己僅是指向該區首地址的指針,相等。2. 以下代碼中的兩個sizeof用法有問題嗎?void UpperCase( char str ) / 將 str 中的小寫字母轉換成大寫字母for( size_t i=0; iif( a=stri & stri=z )stri -= (a-A );char str = aBcDe;cout str字符長度為: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函數內的sizeof有問題。根據語法,sizeof如用于數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小為6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用于上只將其當指針看,一個指針為4個字節,因此返回4。3. 非C+內建型別 A 和 B,在哪幾種情況下B能隱式轉化為A?答: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& ); / 賦值操作,雖不是正宗的隱式類型轉換,但也可以勉強算一個4. 以下代碼有什么問題?struct TestTest( int ) Test() void fun() ;void main( void )Test a(1);a.fun();Test b();b.fun();答:變量b定義出錯。按默認構造函數定義對象,不需要加括號。5. 以下代碼有什么問題?cout (true?1:1) temp;unsigned int const size2 = temp;char str2 size2 ;答:str2定義出錯,size2非編譯器期間常量,而數組定義要求長度必須為編譯期常量。7. 以下反向遍歷array數組的方法有什么錯誤?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 arrayi endl;答:首先數組定義有誤,應加上類型參數:vector array。其次vector:size_type被定義為unsigned int,即無符號數,這樣做為循環變量的i為0時再減1就會變成最大的整數,導致循環失去控制。8. 以下代碼中的輸出語句輸出0嗎,為什么?struct CLSint m_i;CLS( int i ) : m_i(i) CLS()CLS(0);CLS obj;cout obj.m_i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年體育休閑廣場健身俱樂部市場分析初步評估報告
- 藥品調劑分裝管理制度
- 藥品間接銷售管理制度
- 藥店員工獎罰管理制度
- 藥店督導各項管理制度
- 菜園農藥使用管理制度
- 設備人員技能管理制度
- 設備單獨使用管理制度
- 設備技術檔案管理制度
- 設備檢測檢驗管理制度
- 2025年全國新高考II卷高考全國二卷真題英語試卷(真題+答案)
- 《老年人認知記憶訓練》課件
- 2024年廣東省中考生物+地理試卷(含答案)
- 高考語文必備古詩文(含翻譯及賞析)
- 內蒙古自治區安全評價收費指導性意見(試行)(2006年)
- 食品中日文加工用語
- 小班化教育課堂教學.ppt
- ISO 鑄件尺寸公差標準 ISO8062
- 巧克力糖自動包裝機說明書
- 等效內摩擦角計算表
- 繼承不動產登記具結書
評論
0/150
提交評論