《C與C++程序員面試寶典》第5章流程控制_第1頁
《C與C++程序員面試寶典》第5章流程控制_第2頁
《C與C++程序員面試寶典》第5章流程控制_第3頁
《C與C++程序員面試寶典》第5章流程控制_第4頁
《C與C++程序員面試寶典》第5章流程控制_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章流程控制流程控制是程序的基本問題。通過流程控制編程者可以完成業(yè)務邏輯,模塊的整合等。在C/C++中,程序的基本結構分為順序、循環(huán)、分支等3類。在編程的時候,通過判斷、分支和循環(huán)來對程序的流程進行控制,很多程序在設計的時候也會做出流程圖,以方便開發(fā)者更好地理解程序的流程,更準確地判斷采取怎樣的控制方式。條件語句C/C++中,表達式的返回值都可以用來判斷真假,除非沒有任何返回值的void型和返回無法判斷真假的結構。當表達式的返回值不等于0時,它的判斷就是“真”,否則就是“假”。一個表達式可以包含其他表達式和運算符,并且基于整個表達式的運算結果可以得到一個真或假的條件值。當一個表達式在程序中被用于檢驗其真或假的值時,稱它為條件語句。面試題59條件語句有哪幾種形式【出現(xiàn)頻率】★★★【關鍵考點】□條件語句的概念;□條件語句的幾種形式?!究碱}分析】條件語句是根據(jù)特定的表達式來判斷是否真的有條件來執(zhí)行另外的一些語句,條件語句有3種形式,if、if…else和if…elseif…else形式,其中后兩種形式帶有條件分支。最簡單的if條件語句示例代碼如下:if(condition) //condition為判斷條件Statement其中condition就是判斷條件,它返回一個bool值,如果為true就執(zhí)行stalement語句,判斷條件必須用()括起來,它可以是一個表達式或者一個初始化聲明。例如:if(a+b>c) //判斷條件用括號括起來Mif(inta=compute_value())〃判斷條件用括號括起來Mif語句的else分支可以將一些條件語句放在一起形成一個執(zhí)行語句序列。示例代碼如下:if(condition) //條件判斷statementlelse 〃當if條件判斷不通過時執(zhí)行statement2如果condition為真,則執(zhí)行statement1;否則,執(zhí)行statement2。If…elseif…else條件分支代碼示例:if(minVal<ivec[i]) //判斷條件Melseif(minVal==ivec[i]) //分支1++occurs;else //分支2minVal=ivec[i];occurs=1;這樣就可以實現(xiàn)多條件的判斷,根據(jù)不同的條件來選擇要執(zhí)行的功能代碼,這種方式常常用來處理程序多狀態(tài)等。【答案】條件語句分為if和if…else和if…elseif…else等3種形式。面試題60條件語句如何嵌套?如何匹配else子句【出現(xiàn)頻率】★★★【關鍵考點】□條件語句的嵌套【考題分析】在C++中,條件語句是支持嵌套的??梢栽跅l件語句的執(zhí)行語句中再嵌套條件語句。示例代碼如下:if(minVal<=ivec[i]) 〃條件語句1if(minVal==ivec[i]) 〃嵌套條件語句

++occurs;}else(minVal=ivec[i];occurs=1;)這樣就在if條件的執(zhí)行語句中嵌套了條件語句,但如果編程者將代碼修改如下:if(minVal<=ivec[i]) 〃條件語句1{if(minVal==ivec[i]){ 〃條件語句2,沒有嵌套++occurs;))else(minVal=ivec[i];occurs=1;就會產(chǎn)生二義性問題,由于有兩個if語句,下面的else不知道與哪個if進行匹配,這種情況往往稱為懸垂else問題,無法判斷else語句歸屬于那個if語句。這樣的話會導致程序產(chǎn)生錯誤。如果編程者將第2個if語句用{}括起來,就使得else語句與第一個if進行匹配,這樣也就完成了else子句的匹配。同樣的編程者也可以在else的字句中嵌套條件語句,一個完整的程序實例代碼如下:#include<iostream.h>voidmain()(inta=0;intb=0;intc=0;cout?voidmain()(inta=0;intb=0;intc=0;cout?npleasecin?a>>b?c;if(a>b){if(a>c)(cout?Ma)else(cout?*'c})else{if(b>c)(cout?Mb}else(cout?Mc}//定義3個整型變量input3numbersn<<endl;ismaxn<<endl;//通過嵌套輸出3個變量最大值//在else語句中嵌套,輸出3個變量最大值以上代碼是通過在if和else的兩個字句中嵌套大小判斷條件,得出比較大小的3個數(shù)中的最大值?!敬鸢浮織l件語句可以在不同的執(zhí)行語句作用域內進行嵌套,else子句通過{}劃分作用域來實現(xiàn)匹配。5.2循環(huán)語句在C/C++程序中,不少實際問題中有許多具有規(guī)律性的重復操作,因此在程序中就需要重復執(zhí)行某些語句。例如依次輸出一個數(shù)組的每一個成員的值,一組被重復執(zhí)行的語句被稱作循環(huán)體,循環(huán)體能否繼續(xù)重復循環(huán)操作,要取決于循環(huán)的終止條件。如果沒有達到循環(huán)的終止條件,循環(huán)就會一直執(zhí)行。循環(huán)語句是由循環(huán)體及循環(huán)的終止條件兩個部分組成的。面試題61for循環(huán)語句的計算順序是什么【出現(xiàn)頻率】★★★★【關鍵考點】for語句的使用【考題分析】for語句是C++中最常見的循環(huán)語句,也是在程序,特別是算法中經(jīng)常用到的一種語句,編程者所了解的大部分排序算法就是通過for語句來實現(xiàn)的,它的語法形式如下:for(initializer;condition;expression) //循環(huán)條件Statement在for語句的語法中,initializer是對每次循環(huán)過程中都要修改的變量進行初始化,或者賦給一個起始值。而condition語句是用來控制循環(huán)的。當condition為true時,循環(huán)執(zhí)行statement。如果第一次求解condition就得false值,則不執(zhí)行statement。它就是循環(huán)語句的終止條件。expression通常用于修改在initializer中初始化并在condition中檢查的變量的值。它在每次循環(huán)迭代后都要求解。如果在第一次求解condition就得到false值的話,則不會執(zhí)行expression語句。一個使用for語句來實現(xiàn)數(shù)字排序的示例代碼如下:#include<cstdlib>#include<iostream>usingnamespacestd;intmain(intargc,char*argv[])inta[10];

intcout<<”請輸入intcout<<”請輸入10個需要排序的數(shù)字:for(i=0;i<10;i++)(cin?a[i];)cout<<endl;for(j=0;j<9;j++)(for(i=0;i<9-j;i++){if(a[i]>a[i+l])(t=a[i];a[i]=a[i+l];a[i+1]=t;})}cout<<"排序的結果是:"<<endl;for(i=0;i<10;i++)(cout?a[i]?Mn;}cout<<endl;system(nPAUSEH);returnEXITSUCCESS;//定義基本變量和數(shù)組?endl;//for循環(huán)語句〃第2個for循環(huán)//準備輸出結果//循環(huán)輸出排序結果以上代碼是通過for語句實現(xiàn)了一個冒泡排序,通過循環(huán)掃描數(shù)組,從第一個開始與后面的值進行比較,如果大于的話就兩兩互換,最終達到10個數(shù)字從小到大排列,并且循環(huán)掃描數(shù)組輸出。冒泡排序是數(shù)字排序的最基礎算法之一,在后面的算法章節(jié)中,會更多地介紹循環(huán)在排序算法中的重要作用?!髯⒁猓喝绻h(huán)中需要修改的變量值不需要初始化或者已經(jīng)初始化了,則可以省略initializer語句?!敬鸢浮縡or語句的執(zhí)行順序是先從左至右執(zhí)行循環(huán)條件語句,如果循環(huán)條件語句的判斷語句為true,則在循環(huán)條件語句執(zhí)行之后繼續(xù)執(zhí)行一次循環(huán)執(zhí)行語句,然后再回到循環(huán)條件語句。如果循環(huán)語句判斷條件為false,則停止循環(huán)。面試題62while循環(huán)與do-while循環(huán)有什么區(qū)別【出現(xiàn)頻率】★★★★【關鍵考點】while和do-while的使用【考題分析】當條件語句值為true時,while語句就反復循環(huán)執(zhí)行語句。while語句的語法形式如下:while(condition) "condition為循環(huán)條件Statement如果條件condition的值為true,執(zhí)行語句statement語句。condition不能為空。當condition求解為false則不再執(zhí)行退出循環(huán)。如果第一次求解condition就產(chǎn)生false值,則不執(zhí)行statementodo-while語句則會先執(zhí)行一次執(zhí)行語句,不論第一次求解condition是否產(chǎn)生false值,do-while語句的語法形式如下:dostatementwhile(condition) //condition為循環(huán)條件一個使用while語句和do-while語句的示例代碼如下:#include<stdio.h>voidmain()intsuml,sum2;i=1;j=1;suml=0;sum2=0;while(i<101) //循環(huán)開始,計算1?100的和suml+=i;i++;printf(*'suml=%ci\nn/suml);//輸出計算結果dosum2+=i;i++;while(i<101); //注意這里的分號不可省,while和do-while區(qū)別之一printf("sum=^d\n”,sum2);一般來說,用while語句和do-while語句來處理同一問題時,如果二者的循環(huán)體是一樣的,執(zhí)行結果也會是一樣。但是如果while的條件語句一開始就為假的話,兩者執(zhí)行的結果就不一樣了。A注意:通常,循環(huán)條件自身或者在循環(huán)體內必須做一些相關操作來更改循環(huán)條件表達式的值。否則,循環(huán)可能永遠不會開始或者結束,不結束的循環(huán)就是死循環(huán),它可能會導致程序最終崩潰?!敬鸢浮縲hile循環(huán)與do-while循環(huán)的主要區(qū)別在于,如果循環(huán)條件語句為false,while語句不會執(zhí)行循環(huán),而do-while保證循環(huán)體執(zhí)行一次。面試題63典型循環(huán)語句【出現(xiàn)頻率】★★★★★【關鍵考點】□幾種典型循環(huán)語句【考題分析】C/C++的典型循環(huán)語句包括for循環(huán)語句、while循環(huán)語句和do-while循環(huán)語句,在前面小節(jié)中已經(jīng)做了相關地介紹。示例代碼如下:while循環(huán):int*source=arrl; 〃定義整型數(shù)組arrlsize_ti=sizeof(arrl)/sizeof(*arrl);int*dest=newint[i];while(source!=arrl+i) //while循環(huán)*dest++=*source++;for循環(huán):for(a<string>::size_typeind=0;ind!=svec.size();++ind)cout?svec[ind];if(ind+1!=svec.size())cout?”do-while循環(huán):stringrsp;do //至少會先執(zhí)行一次cout?”pleaseentertwovalues: ;intvail,val2;cin?vail?va!2;cout<<"Thesumof”<<vail?"and"<<va!2?“="?vail+val2?"\n\nH?"More?[yes][no]";cin?rsp;while(!rsp.empty()&&rsp[0]!=*n*); 〃循環(huán)條件語句【答案】C++典型循環(huán)語句包括for循環(huán)語句、while循環(huán)語句和do-while循環(huán)語句。其中for循環(huán)語句更多的用于需要遍歷的情況,而while和do-while循環(huán)語句可以用于狀態(tài)判斷并且根據(jù)狀態(tài)執(zhí)行操作等。面試題64break語句與continue語句有什么區(qū)別【出現(xiàn)頻率】★★★★★【關鍵考點】□break和continue的使用【考題分析】break語句是用于結束最近的while、dowhile>for或switch語句,并將程序的執(zhí)行順序傳遞給緊接在結束語句之后的語句。示例代碼如下:vector<int>::iteratoriter=vec.begin();while(iter!=vec.end())if(value==*iter)break; 〃跳出循環(huán)else++iter; //不跳出if(iter!=vec.end())//跳出以后從這里開始執(zhí)行:M上面的代碼在vector中循環(huán)搜索某個特殊值的第一次出現(xiàn)。一旦找到,則通過break退出循環(huán)。continue語句可以讓最近的循環(huán)語句的當次迭代提前結束。對于while和dowhile循環(huán),會繼續(xù)求解循環(huán)條件,如果沒有達到循環(huán)終止條件則會繼續(xù)執(zhí)行循環(huán)執(zhí)行語句。而對于for循環(huán),程序則會繼續(xù)求解for語句頭中的expression表達式,示例代碼如下:stringinBuf;while(cin?inBuf&&!inBuf.empty()) //循環(huán)條件判斷if(inBuf[0]!= 〃嵌套條件判斷continue;else:M上面的循環(huán)每次從標準輸入中讀入一個單詞,如果碰到以下劃線開頭的單詞就進行處理。如果不是,終止當前循環(huán),接著讀取下一個單詞?!敬鸢浮縞ontinue語句只能出現(xiàn)在循環(huán)語句中,而break語句可以出現(xiàn)在switch語句中,continue語句不會退出循環(huán),只會終止當次執(zhí)行循環(huán)體并且進入下一次循環(huán)體的執(zhí)行,break語句會退出循環(huán)語句。

5.3switch語句對于多選擇分支的情況,可以用if語句的if…else…if形式或if語句嵌套處理,但大多數(shù)情況下卻略顯麻煩。為此,C++提供了另一種方法,switch語句,也稱為開關語句。面試題65switch語句的執(zhí)行順序是什么【出現(xiàn)頻率】★★★【關鍵考點】□switch語句的執(zhí)行順序【考題分析】在使用深層嵌套的ifelse語句時,往往語法是正確的,但在邏輯方面卻沒有正確地反映程序員的意圖。例如,錯誤的elseif匹配很容易被忽略。即使添加新的條件和邏輯關系,或者對語句做其他修改,都很難保證正確。switch語句提供了一種更方便的方法來實現(xiàn)深層嵌套的if/else邏輯。switch語句的示例代碼如下://初始化變量數(shù)據(jù)////初始化變量數(shù)據(jù)//開始分支語句//case語句進行匹配intal=0,el=0,il=0,ol=0,ul-0;while(cin?ch)switch(ch)a*:++albreak;case:++el;break;*:++il;break;case1o1:++ol;break;case1uf:++ul;break;通過對switch后的圓括號內表達式的值,與其后的花括號中用case列出的關鍵字做比較,實現(xiàn)switch語句的分支功能。圓括號內的表達式必須產(chǎn)生一個整數(shù)結果,其值與每個case的值進行比較。關鍵字case和它所關聯(lián)的值稱為case標號。每個case標號的值都必須是一個常量表達式,當case標號的值和switch后圓括號的產(chǎn)生的結果對應時,則執(zhí)行相應的case后的操作。另外,在switch語句中,還有一個default語句,表示如果圓括號內表達式的值與case后的關鍵字都沒有匹配的情況下,可以設定一個默認執(zhí)行的語句。示例代碼如下:#includeMstdio.hnmain()intyear,month,days,flat;printf(”請輸入月份"\n");scanf(H%d%dn,&year,&month);flag=l;switch(month) //判斷月份的值case1:case3:case5:case10:case12:days=31;break;case4:case6:case9:case11:day=30;break;case2:if((!(year%4)&&(year%100))II!(year%400))day=29;elsedays=28;break;default:flag=0; 〃如果輸入的月份不在1?12的范圍之內if(flag)printf(H^l&=%d\nMrdays);elseprintf("不存在的月份\n");以上代碼實現(xiàn)的是輸入一個年月,然后輸出該月有多少天數(shù)。如果是閏年的話,則2月份有29天?!敬鸢浮咳绻磉_式與其中一個case標號的值匹配,則程序將從該標號后面的第一個語句開始依次執(zhí)行各個語句,直到switch結束或遇到break語句為止。如果沒有發(fā)現(xiàn)匹配的case標號,則在存在default語句時執(zhí)行default語句,否則程序從switch語句后面的第一條語句繼續(xù)執(zhí)行。面試題66如何在switch語句內部定義變量【出現(xiàn)頻率】★★【關鍵考點】□在switch語句內部定義變量【考題分析】在C++中,對于switch結構,能而且只能在它的最后一個case標號或default標號后面定義變量。示例代碼如下:casetrue:stringfile_name=get_file_name();break;default:M這個規(guī)則的制定是為了避免出現(xiàn)代碼跳過變量的定義和初始化的情況。另外也可以引入塊語句,并且在該塊語句中來定義變量,從而保證變量在使用前可以被定義和初始化。示例代碼如下:casetrue:stringfile_name=get_file_name();Mbreak;casefalse::M【答案】在switch結構中可以在最后一個case標號或default標號后面定義變量,或者引入塊語句來定義變量。5.4遞歸遞歸是一項非常重要的編程技術,它讓函數(shù)可以從函數(shù)體內部調用自身。遞歸通常把一個大型復雜的問題層層簡化為一個,與原問題相似的規(guī)模較小的問題來求解,使用遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,這樣就大大地減少了程序的代碼量。遞歸的能力在于能運用有限的語句來定義對象的無限集合。面試題67什么是遞歸【出現(xiàn)頻率】★★★★【關鍵考點】□遞歸的概念【考題分析】遞歸作為一種算法在程序設計語言中廣泛應用,是指函數(shù)/過程/子程序在運行過程序中直接或間接調用自身而產(chǎn)生的重入現(xiàn)象。一個過程或函數(shù)直接或間接調用自己本身,這種過程或函數(shù)叫遞歸過程或遞歸函數(shù)。一個過程或函數(shù)在其定義或說明中又直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規(guī)模較小的問題來求解。遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語句來定義對象的無限集合。用遞歸思想寫出的程序往往十分簡潔易懂。一般來說,遞歸使用時需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進:當邊界條件滿足時,遞歸返回。A注意:遞歸算法解題的運行效率相對較低。在遞歸調用的過程當中系統(tǒng)為每一層的返回點、局部量等開辟了棧來存儲。使用遞歸的時候需要消耗比較多的??臻g,所以遞歸次數(shù)過多容易造成棧溢出等。在堆棧尺寸受到限制的時候,一般需要避免使用遞歸?!敬鸢浮恳粋€過程或函數(shù)直接或間接調用自己本身,這種過程或函數(shù)叫遞歸過程或遞歸函數(shù)。面試題68漢諾塔問題【出現(xiàn)頻率】★★★【關鍵考點】□漢諾塔問題的概念;□漢諾塔問題的算法?!究碱}分析】漢諾塔問題的起源是印度的一個古老的傳說。傳說中開天辟地的神勃拉瑪在一個廟里留下了3根金剛石的棒,第一根上面套著64個圓的金片,最大的一個在底下,其余一個比一個小,依次疊上去,廟里的眾僧不倦地把它們一個個地從這根棒搬到另一根棒上,規(guī)定可利用中間的一根棒作為幫助,但每次只能搬一個,而且大的不能放在小的上面。面對龐大的數(shù)字(移動圓片的次數(shù))18446744073709551615,這樣看來,眾僧們耗盡畢生精力也不可能完成金片的移動。后來,這個傳說就演變成為漢諾塔游戲。漢諾塔問題是程序設計中的經(jīng)典遞歸問題。漢諾塔問題有多種算法,其中使用遞歸解決漢諾塔問題是遞歸算法的經(jīng)典案例,它的示例代碼如下:#include<fstream>#include<iostream>usingnamespacestd;ofstreamfout(Mout.txtn);voidMove(intn,chari,charj)把”號從”移動至voidHannoi(intn,chara.,charb,charc)if(n==l)Move(1,a,c);

else(Hannoi(n-1,a,c,b); //遞歸調用Hannoi()函數(shù)Move(n,a,c);Hannoi(n-1,b,a,c); //遞歸調用Hannoi()函數(shù))}intmain()(fout<<“以下是10層漢諾塔的解法:"<<endl;Hannoi(10,*a*,1b*,*c1);font.close();cout<<“輸出結果完畢。',?endl;return0;上面代碼描述了一個10層漢諾塔的算法。Hannoi。方法中的第一個參數(shù)就是需要計算的漢諾塔層數(shù),編程者可以通過修改它的值來計算不同層次的漢諾塔問題。另外漢諾塔問題也有非遞歸的算法,所有遞歸的算法都可以轉化為非遞歸算法,使用非遞歸算法相對來說能節(jié)約資源消耗。漢諾塔問題的非遞歸算法示例代碼如下://圓盤的個數(shù)設定為最多為//圓盤的個數(shù)設定為最多為64structstints[MAX];inttop;structstints[MAX];inttop;charname;intTop()returns[top];intPop()returns[top--];voidPush(intx)s[++top]=x;longPow(intx,inty);voidCreat(stta[]zint//棧頂,用來最上面的圓盤//柱子的名字,可以是A、B、C中的一個//取棧頂元素//出棧〃入棧n);voidHannuota(stta[],longmax);intmain(void)intn;cin?n; 〃輸入圓盤的個數(shù)stta[3]; //3根柱子的信息用結構數(shù)組存儲Creat(ta,n); //給結構數(shù)組設置初值longmax=Pow(2,n)-1;//移動的次數(shù)應等于2~-1Hannuota(ta,max); //移動漢諾塔的主要函數(shù)system("pause");return0;voidCreat(stta[],intn)ta[0].name=*A*;ta[0],top=n-1;for(inti=0;i<n;i++)ta[0].s[i]=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論