1、const char*, char const*, char*const的差別問題:
bjarne在他的the c++ programming language裡面給出過一個助記的方法:
把一個聲明從右向左讀
<a href="http://my.oschina.net/jacedy/blog/323307#">?</a>
1
<code>char</code> <code>* </code><code>const</code> <code>cp; </code><code>// ( * 讀成 pointer to )</code>
cp is a const pointer to char
<code>const</code> <code>char</code> <code>* p;</code>
p is a pointer to const char;
2、char類型為一個位元組,取值範圍是[-128,127],unsigned char [0 ,255]
3、n階階層的遞歸算法:--(常考)
2
3
4
5
6
7
<code>int</code> <code>fact(</code><code>int</code> <code>n)</code>
<code>{</code>
<code> </code><code>if</code><code>(n == 1)</code>
<code> </code><code>return</code> <code>1;</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>n*fact(n-1);</code>
<code>}</code>
4、求數組a[ ]中最大值的遞歸算法:
8
9
10
11
<code>int</code> <code>max(</code><code>int</code> <code>a[ ], </code><code>int</code> <code>first, </code><code>int</code> <code>n) </code><code>//first = 0; n為數組長度</code>
<code> </code><code>int</code> <code>max;</code>
<code> </code><code>if</code><code>(first == n-1)</code>
<code> </code><code>return</code><code>(a[first]);</code>
<code> </code><code>max = max(a, first+1, n);</code>
<code> </code><code>if</code><code>(max < a[first])</code>
<code> </code><code>return</code> <code>a[first];</code>
<code> </code><code>return</code> <code>max;</code>
5、折半查找法(二分法)的遞歸算法:
12
13
14
15
<code>int</code> <code>bsearch</code><code>(</code><code>int</code> <code>b[], </code><code>int</code> <code>x, </code><code>int</code> <code>l, </code><code>int</code> <code>r) </code><code>//在下屆為l,上界為r的數組b 中折半查找資料元素x</code>
<code> </code><code>int</code> <code>mid;</code>
<code> </code>
<code> </code><code>if</code><code>(l > r)</code>
<code> </code><code>return</code> <code>-1;</code>
<code> </code><code>mid = (l+r)/2;</code>
<code> </code><code>if</code><code>(x == b[mid])</code>
<code> </code><code>return</code> <code>mid;</code>
<code> </code><code>if</code><code>(x < b[mid])</code>
<code> </code><code>return</code> <code>bsearch</code><code>(b, x, l, mid-1);</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>bsearch</code><code>(b, x, mid+1, r);</code>
6、非遞歸計算如下遞歸函數的值(斐波拉契):--(常考)
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2) n>2
解:
<code>int</code> <code>f(</code><code>int</code> <code>n)</code>
<code> </code><code>int</code> <code>i,s,s1,s2;</code>
<code> </code><code>s1=1;</code><code>/*s1用于儲存f(n-1)的值*/</code>
<code> </code><code>s2=1;</code><code>/*s2用于儲存f(n-2)的值*/</code>
<code> </code><code>s=1;</code>
<code> </code><code>for</code><code>(i=3;i<=n;i++)</code>
<code> </code><code>{</code>
<code> </code><code>s=s1+s2;</code>
<code> </code><code>s2=s1;</code>
<code> </code><code>s1=s;</code>
<code> </code><code>}</code>
<code> </code><code>return</code><code>(s);</code>
7、交換兩個數,不用第三塊兒記憶體:
int a = ……;
int b = ……;
解:
<code>a = a + b;</code>
<code>b = a - b;</code>
<code>a = a - b;</code>
8、osi的七層協定:--(常考)
應用層、表示層、回話層、運輸層、網絡層、資料鍊路層、實體層
a 實體層 為資料鍊路層提供實體連接配接,在其上串行傳送比特流,即所傳送資料的機關是比特。此外,該層中還具有确定連接配接裝置的電氣特性和實體特性等功能。
b 資料鍊路層 負責在網絡節點間的線路上通過檢測、流量控制和重發等手段,無差錯地傳送以幀為機關的資料。為做到這一點,在每一幀中必須同時帶有同步、位址、差錯控制及流量控制等控制資訊。
c 網絡層 為了将資料分組從源(源端系統)送到目的地(目标端系統),網絡層的任務就是選擇合适的路由和交換節點,使源的傳輸層傳下來的分組資訊能夠正确無誤地按照位址找到目的地,并傳遞給相應的傳輸層,即完成網絡的尋址功能。
d 傳輸層 傳輸層是高低層之間銜接的接口層。資料傳輸的機關是封包,當封包較長時将它分割成若幹分組,然後交給網絡層進行傳輸。傳輸層是計算機網絡協定分層中的最關鍵一層,該層以上各層将不再管理資訊傳輸問題。
e 會話層 該層對傳輸的封包提供同步管理服務。在兩個不同系統的互相通信的應用程序之間建立、組織和協調互動。例如,确定是雙工還是半雙工工作。
f 表示層 該層的主要任務是把所傳送的資料的抽象文法變換為傳送文法,即把不同計算機内部的不同表示形式轉換成網絡通信中的标準表示形式。此外,對傳送的資料加密(或解密)、正文壓縮(或還原)也是表示層的任務。
g 應用層 該層直接面向使用者,是osi中的最高層。它的主要任務是為使用者提供應用的接口,即提供不同計算機間的檔案傳送、通路與管理,電子郵件的内容處理,不同計算機通過網絡互動通路的虛拟終端功能等。
9、tcp/ip的四層協定:--(常考)
應用層、運輸層、網際層ip、網絡接口層
a 網絡接口層 這是tcp/ip協定的最低一層,包括有多種邏輯鍊路控制和媒體通路協定。網絡接口層的功能是接收ip資料報并通過特定的網絡進行傳輸,或從網絡上接收實體幀,抽取出ip資料報并轉交給網際層。
b 網際網層(ip層) 該層包括以下協定:ip(網際協定)、icmp(internet control message protocol,網際網路控制封包協定)、arp(address resolution protocol,位址解析協定)、rarp(reverse address resolution protocol,反向位址解析協定)。該層負責相同或不同網絡中計算機之間的通信,主要處理資料報和路由。在ip層中,arp協定用于将ip位址轉換成實體位址,rarp協定用于将實體位址轉換成ip位址,icmp協定用于報告差錯和傳送控制資訊。ip協定在tcp/ip協定組中處于核心地位。
c 傳輸層 該層提供tcp(傳輸控制協定)和udp(user datagram protocol,使用者資料報協定)兩個協定,它們都建立在ip協定的基礎上,其中tcp提供可靠的面向連接配接服務,udp提供簡單的無連接配接服務。傳輸層提供端到端,即應用程式之間的通信,主要功能是資料格式化、資料确認和丢失重傳等。
d 應用層 tcp/ip協定的應用層相當于osi模型的會話層、表示層和應用層,它向使用者提供一組常用的應用層協定,其中包括:telnet、smtp、dns等。此外,在應用層中還包含有使用者應用程式,它們均是建立在tcp/ip協定組之上的專用程式。
(五層協定:應用層、運輸層、網絡層、資料鍊路層、實體層)
10、ip協定 是支援網間互連的資料報協定,它與tcp協定(傳輸控制協定)一起構成了tcp/ip協定族的核心。
與ip協定配套使用的還有三個協定:位址解析協定arp、網際控制封包協定icmp、網際組管理協定igmp。
ip位址的劃分:
資料幀:首部(soh:01)+ ip資料報 + 尾部(eot:04)
11、面向對象的三大特征是封裝性、繼承性和多态性:
(1)封裝性:将客觀事物抽象成類,每個類對自身的資料和方法實行 protection(private, protected,
public)。
(2)繼承性:廣義的繼承有三種實作形式:實作繼承(使用基類的屬性和方法而無需額外編碼的能力)、可
視繼承(子窗體使用父窗體的外觀和實作代碼)、接口繼承(僅使用屬性和方法,實作滞後到子類實作)。
(3)多态性:是将父類對象設定成為和一個或更多它的子對象相等的技術。用子類對象給父類對象指派
之後,父類對象就可以根據目前指派給它的子對象的特性以不同的方式運作。
12、簡述指針常量與常量指針差別:
指針常量是指定義了一個指針,這個指針的值隻能在定義時初始化,其他地方不能改變。常量指針是指定義了一個指針,這個指針指向一個隻讀的對象,不能通過常量指針來改變這個對象的值。指針常量強調的是指針的不可改變性,而常量指針強調的是指針對其所指對象的不可改變性。
13、數組名和指針的差別:--(常考)
16
17
18
<code>#include <iostream.h></code>
<code>#include <string.h></code>
<code>void</code> <code>main(</code><code>void</code><code>)</code>
<code> </code><code>char</code> <code>str[13]=</code><code>"hello world!"</code><code>; </code>
<code> </code><code>char</code> <code>*pstr=</code><code>"hello world!"</code><code>;</code>
<code> </code><code>cout<<</code><code>sizeof</code><code>(str)<<endl;</code>
<code> </code><code>cout<<</code><code>sizeof</code><code>(pstr)<<endl;</code>
<code> </code><code>cout<<</code><code>strlen</code><code>(str)<<endl;</code>
<code> </code><code>cout<<</code><code>strlen</code><code>(pstr)<<endl;</code>
<code>列印結果:</code>
<code>13</code>
<code>4</code>
<code>12</code>
14、談談你對面向對象的認識。
面向對象可以了解成對待每一個問題,都是首先要确定這個問題由幾個部分組成,而每一個部分其
實就是一個對象。然後再分别設計這些對象,最後得到整個程式。傳統的程式設計多是基于功能的思想
來進行考慮和設計的,而面向對象的程式設計則是基于對象的角度來考慮問題。這樣做能夠使得程式更
加的簡潔清晰。
15、重載 (overload)和重寫(overried, 有的書也叫做“覆寫”) 的差別?
從定義上來說:
重載: 是指允許存在多個同名函數, 而這些函數的參數表不同 (或許參數個數不
同,或許參數類型不同,或許兩者都不同)。
重寫:是指子類重新定義複類虛函數的方法。
16、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。要用全局變量,需要使用"::"
17、tcp/udp有何優缺點?
tcp 服務提供了資料流傳輸、可靠性、有效流控制、全雙工操作和多路複用技術等。 與 tcp 不同, udp 并不提供對 ip 協定的可靠機制、流控制以及錯誤恢複功能等。由于 udp 比較簡單, udp 頭包含很少的位元組,比 tcp 負載消耗少。
tcp: 提供穩定的傳輸服務,有流量控制,缺點是標頭大,備援性不好
udp: 不提供穩定的服務,標頭小,開銷小
18、cpu排程算法:
(1)先到先服務fcfs
(2)最短作業/程序優先 sjf/spf
sj(p)f算法從就緒隊列中選出估計運作時間最短的作業(程序),為之配置設定處理機,如果運作時間相同,按fcfs排程。
(3)優先級排程
(4)輪轉法排程 rr;
(5)多級隊列排程。
19、pv操作:
20、死鎖: 指多個程序因競争共享資源而造成的一種僵局, 若無外力作用, 這些程序都将永遠不能再向前推進。
銀行家算法是最有代表性的死鎖避免政策:
21、将字元型轉換成整型
<code>int</code> <code>atoi(</code><code>const</code> <code>char</code> <code>*str){ </code>
<code> </code><code>int</code> <code>i=0,result=0,sign=1; </code>
<code> </code><code>if</code><code>(str==null){ </code><code>//判斷是否為空 </code>
<code> </code><code>return</code> <code>0; </code>
<code> </code><code>} </code>
<code> </code><code>while</code> <code>(</code><code>isspace</code><code>(str[i])) </code><code>//跳過開頭的空格字元 </code>
<code> </code><code>i++; </code>
<code> </code><code>if</code> <code>(str[i]==</code><code>'+'</code><code>||str[i]==</code><code>'-'</code><code>){</code><code>//如果除去空格後第一個出現的字元是"-","+"則跳過并辨別sign </code>
<code> </code><code>sign=(str[i]==</code><code>'-'</code><code>)?-1:1; </code><code>//如果字元是"-" 則sign為-1 </code>
<code> </code><code>i++; </code>
<code> </code><code>while</code><code>(</code><code>isdigit</code><code>(str[i])){ </code><code>//循環直到遇到非數字結束循環 </code>
<code> </code><code>result=result*10+str[i]-</code><code>'0'</code><code>;</code><code>//将數字字元轉換成整形數字 </code>
<code> </code><code>result=result * sign; </code><code>//數字加上符号 </code>
<code> </code><code>return</code> <code>result; </code>
22、strcpy()函數--(常考)
<code>char</code><code>* </code><code>strcpy</code><code>(</code><code>char</code> <code>*strdest,</code><code>const</code> <code>char</code><code>*strsrc) </code><code>//第二個參數的const要寫上 </code>
<code>{ </code>
<code> </code><code>if</code><code>((null==strdest)||(null==strsrc))</code><code>//先判斷參數是否為空 </code>
<code> </code><code>return</code> <code>null;</code><code>//當然這裡可以抛出異常或者直接用斷言,以便在衆多應聘者中突出自己^^ </code>
<code> </code><code>char</code> <code>*strtemp = strdest; </code><code>//用strtemp指向strdest開始位址</code>
<code> </code><code>while</code><code>((*strtemp++ = *strsrc++) != </code><code>'\0'</code><code>); </code>
<code> </code><code>return</code> <code>strdest; </code>
23、逗号表達式的要領:
(1) 逗号表達式的運算過程為:從左往右逐個計算表達式。
(2) 逗号表達式作為一個整體,它的值為最後一個表達式(也即表達式n)的值。
例:
<code>int</code> <code>i=(j=4,k=8,l=16,m=32); </code>
<code>printf</code><code>(“ %d” , i); </code><code>//輸出是多少,答:32</code>
24、解釋堆和棧的差別:
棧區(stack)--由編譯器自動配置設定釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于資料結構中的棧。
堆區(heap) --一般由程式員配置設定釋放, 若程式員不釋放,程式結束時可能由os回收 。注意它與資料結構中的堆是兩回事,配置設定方式倒是類似于連結清單。
25、論述含參數的宏與函數的優缺點:
(1).函數調用時,先求出實參表達式的值,然後帶入形參。而使用帶參的宏隻是進行簡單的字元替換。
(2).函數調用是在程式運作時處理的,配置設定臨時的記憶體單元;而宏展開則是在編譯時進行的,在展開時并不配置設定記憶體單元,不進行值的傳遞處理,也沒有“傳回值”的概念。
(3).對函數中的實參和形參都要定義類型,二者的類型要求一緻,如不一緻,應進行類型轉換;而宏不存在類型問題,宏名無類型,它的參數也無類型,隻是一個符号代表,展開時帶入指定的字元即可。宏定義時,字元串可以是任何類型的資料。
(4).調用函數隻可得到一個傳回值,而用宏可以設法得到幾個結果。
(5).使用宏次數多時,宏展開後源程式長,因為每展開一次都使程式增長,而函數調用不使源程式變長。
(6).宏替換不占運作時間,隻占編譯時間;而函數調用則占運作時間(配置設定單元、保留現場、值傳遞、傳回)。
一般來說,用宏來代表簡短的表達式比較合适。
26、windows 程式的入口是哪裡?寫出 windows 消息機制的流程
windows程式的入口是winmain()函數。
windows應用程式消息處理機制:
a. 作業系統接收應用程式的視窗消息,将消息投遞到該應用程式的消息隊列中
b. 應用程式在消息循環中調用getmessage函數從消息隊列中取出一條一條的消息,取出消息後,應用程式可以對消息進行一些預處理。
c. 應用程式調用dispatchmessage,将消息回傳給作業系統。
d. 系統利用wndclass結構體的lpfnwndproc成員儲存的視窗過程函數的指針調用視窗過程,對消息進行處理
27、實作雙向連結清單删除一個節點p,在節點p後插入一個節點,寫出這兩個函數
<code>{ </code><code>//删除</code>
<code> </code><code>p->pre->next=p->next;</code>
<code> </code><code>p->next->pre=p->pre;</code>
<code> </code><code>delete</code> <code>p;</code>
<code>{ </code><code>//插入</code>
<code> </code><code>new</code><code>->next=p->next;</code>
<code> </code><code>new</code><code>->pre=p;</code>
<code> </code><code>p->next->pre=</code><code>new</code><code>;</code>
<code> </code><code>p->next=</code><code>new</code><code>;</code>
28、程序:
程序是執行中的程式(程序是程式的一次執行過程);
程序是動态概念,有生命周期;
它是作業系統進行資源配置設定和排程的基本機關;
線程:
29、向伺服器發送請求有幾中方式?有什麼差別?
答:get,post。get一般為連結方式,post一般為按鈕方式。
30、(1)判斷單連結清單是否有環:使用兩個指針。一個每次前進1,另一個每次前進2,且都從連結清單第一個元素開始。顯然,如果有環,兩個指針必然會相遇。
19
20
21
22
<code>//判斷單連結清單是否有環 </code>
<code>bool</code> <code>iscircle( node *phead ) </code>
<code> </code><code>//空指針 或 隻有一個元素且next為空時,必無環 </code>
<code> </code><code>if</code><code>( phead == null || phead->next == null ) </code><code>return</code> <code>false</code><code>; </code>
<code> </code>
<code> </code><code>node *pslow = phead; </code>
<code> </code><code>node *pfast = phead; </code>
<code> </code>
<code> </code><code>while</code><code>( ( pfast != null ) && ( pfast->next != null ) ) </code>
<code> </code><code>{ </code>
<code> </code><code>//分别按步長1、2前進 </code>
<code> </code><code>pslow = pslow->next; </code>
<code> </code><code>pfast = pfast->next->next; </code>
<code> </code><code>if</code><code>( pslow == pfast ) </code><code>break</code><code>; </code>
<code> </code><code>if</code><code>( ( pfast == null ) || ( pfast->next == null ) ) </code>
<code> </code><code>return</code> <code>false</code><code>; </code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>true</code><code>; </code>
(2)求環的長度:記下第一次的相遇點,這個指針再次從相遇點出發,直到第二次相遇。此時,步長為1的指針所走的步數恰好就是環的長度。
23
24
25
26
27
28
29
<code>int</code> <code>getlen( node *phead ) </code>
<code> </code><code>//求相遇點 </code>
<code> </code><code>//計算長度 </code>
<code> </code><code>int</code> <code>cnt = 0; </code>
<code> </code><code>cnt++; </code>
<code> </code><code>//再次相遇時,累計的步數就是環的長度 </code>
<code> </code><code>return</code> <code>cnt; </code>
(3)求環的連結點:記下第一次的相遇點,使一個指針指向這個相遇點,另一個指針指向連結清單第一個元素。然後,兩個指針同步前進,且步長都為1。當兩個指針相遇時所指的點就是環的連接配接點。
<code>//求環的入口點 </code>
<code>node* getentrance( node* phead ) </code>
<code> </code><code>pslow = phead; </code>
<code> </code><code>while</code><code>( pslow != pfast ) </code>
<code> </code><code>//同步前進 </code>
<code> </code><code>pfast = pfast->next; </code>
<code> </code><code>return</code> <code>pslow; </code>
31、産生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序運作推進的順序不合适。
(3) 資源配置設定不當等。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因争奪有限的資源而陷入死鎖。其次,程序運作推進順序與速度不同,也可能産生死鎖。
産生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次隻能被一個程序使用。
(2) 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若幹程序之間形成一種頭尾相接的循環等待資源關系。