《C与C++程序员面试宝典》第5章流程控制.pdf

上传人:奔*** 文档编号:88102824 上传时间:2023-04-22 格式:PDF 页数:15 大小:1.68MB
返回 下载 相关 举报
《C与C++程序员面试宝典》第5章流程控制.pdf_第1页
第1页 / 共15页
《C与C++程序员面试宝典》第5章流程控制.pdf_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《《C与C++程序员面试宝典》第5章流程控制.pdf》由会员分享,可在线阅读,更多相关《《C与C++程序员面试宝典》第5章流程控制.pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第5章 流 程 控 制流程控制是程序的基本问题。通过流程控制编程者可以完成业务逻辑,模块的整合等。在 C/C+中,程序的基本结构分为顺序、循环、分支等3 类。在编程的时候,通过判断、分支和循环来对程序的流程进行控制,很多程序在设计的时候也会做出流程图,以方便开发者更好地理解程序的流程,更准确地判断采取怎样的控制方式。5.1 条 件 语 句C/C+中,表达式的返回值都可以用来判断真假,除非没有任何返回值的void型和返回无法判断真假的结构。当表达式的返回值不等于。时,它的判断就是“真”,否则就是“假”。一个表达式可以包含其他表达式和运算符,并且基于整个表达式的运算结果可以得到一个真或假的条件值。

2、当一个表达式在程序中被用于检验其真或假的值时,称它为条件语句。面试题5 9条件语句有哪几种形式【出现频率】【关键考点】条件语句的概念;条件语句的几种形式。【考题分析】条件语句是根据特定的表达式来判断是否真的有条件来执行另外的一些语句,条件语句有3 种 形 式,if、ifelse和 ifelse ifelse形式,其中后两种形式带有条件分支。最简单的if条件语句示例代码如下:if(condition)/condition 为判断条件(Statement)其中condition就是判断条件,它返回一个bool值,如果为true就执行statement语句,判断条件必须用()括起来,它可以是一个表达

3、式或者一个初始化声明。例如:if(a+b c)/判断条件用括号括起来(M第5章流程控制if(int a=compute_value()判断条件用括号括起来(Mi f 语 句 的 else分支可以将一些条件语句放在一起形成一个执行语句序列。示例代码如下:if(condition)条件判断(statementlelse 当if条件判断不通过时执行(statement2)如果condition为 真,则执行statementl;否则,执行statement2。If,else ifelse条件分支代码示例:if(minVal ivec i)判断条件(M)else if(minVal=ivec i)/分

4、支 1(+occurs;else/分支 2(minVal=iveci;occurs=1;这样就可以实现多条件的判断,根据不同的条件来选择要执行的功能代码,这种方式常常用来处理程序多状态等。【答案】条件语句分为if和 ifelse和 ifelse ifelse等 3 种形式。面试题6 0 条件语句如何嵌套?如何匹配else子句【出现频率】【关键考点】条件语句的嵌套【考题分析】在 C+中,条件语句是支持嵌套的。可以在条件语句的执行语句中再嵌套条件语句。示例代码如下:if(minVal=ivec i)条件语句 1(if(minVal=ivec i)嵌套条件语句 59第2篇C/C+基础知识+o ccu

5、 r s;e l s e(m i n V a l =i v e c i ;o ccu r s =1;这样就在if条件的执行语句中嵌套了条件语句,但如果编程者将代码修改如下:i f (m i n V a l =i v e c i )条件语句 1(i f (m i n V a l =i v e c i )条件语句2,没有嵌套+o ccu r s;)e l s e(m i n V a l =i v e c i ;o ccu r s =1;就会产生二义性问题,由于有两个if语句,下面的else不知道与哪个if进行匹配,这种情况往往称为悬垂else问题,无法判断else语句归属于那个if语句。这样的话会

6、导致程序产生错误。如果编程者将第2 个 if语句用 括起来,就使得else语句与第一个if进行匹配,这样也就完成了 else子句的匹配。同样的编程者也可以在else的字句中嵌套条件语句,一个完整的程序实例代码如下:#in c l u d e v o id m a i n()(in t a=0;in t b=0;in t c=0;c o u t np l e ase in p u t 3 n u m be rs b c;if(ab)(if(ac)(c o u t a is m ax!”;e l se/定义3个整型变量c o u t c is m ax!”;)e l se(if(bc)(c o u

7、 t b is m axn e n d l;e l se(c o u t c is m a x!*;/通过嵌套输出3个变量最大值/在e l s e语句中嵌套,输出3个变量最大值 6 0 第 5 章流程控制)以上代码是通过在if和 else的两个字句中嵌套大小判断条件,得出比较大小的3 个数中的最大值。【答案】条件语句可以在不同的执行语句作用域内进行嵌套,else子句通过 划分作用域来实现匹配。5.2 循 环 语 句在 C/C+程序中,不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。例如依次输出一个数组的每一个成员的值,一组被重复执行的语句被称作循环体,循环体能否继

8、续重复循环操作,要取决于循环的终止条件。如果没有达到循环的终止条件,循环就会一直执行。循环语句是由循环体及循环的终止条件两个部分组成的。面试题61 for循环语句的计算顺序是什么【出现频率】【关键考点】for语句的使用【考题分析】for语句是C+中最常见的循环语句,也是在程序,特别是算法中经常用到的一种语句,编程者所了解的大部分排序算法就是通过for语句来实现的,它的语法形式如下:for(initializer;condition;expression)/循环条件(Statement在 for语句的语法中,initializer是对每次循环过程中都要修改的变量进行初始化,或者赋给一个起始值。而

9、 condition语句是用来控制循环的。当 condition为 true时,循环执行 statement。如果第一次求解condition就得false值,则不执行statement。它就是循环语句的终止条件。expression通常用于修改在initializer中初始化并在condition中检查的变量的值。它在每次循环迭代后都要求解。如果在第一次求解condition就得到false值的话,则不会执行expression语句。一个使用for语句来实现数字排序的示例代码如下:#include#include using namespace std;int main(int argc,c

10、har*argv)(int a 10;61 第 2篇C/C+基础知识int i,j,t;cout 请输入10个需要排序的数字:endl;for(i=0;i10;i+)(cina i;coutendl;for(j=0;j9;j+)(for(i=0;iai+l)(t=ai;ai=ai+l;ai+1=t;)cout”排序的结果是:endl;for(i=0;i10;i+)(couta i ;)coutendl;system(HPAUSE);return EXIT_SUCCESS;/定义基本变量和数组/for循环语句 第 2 个 for循环/准备输出结果/循环输出排序结果以上代码是通过fo r语句实现了

11、一个冒泡排序,通过循环扫描数组,从第一个开始与后面的值进行比较,如果大于的话就两两互换,最终达到10个数字从小到大排列,并且循环扫描数组输出。冒泡排序是数字排序的最基础算法之一,在后面的算法章节中,会更多地介绍循环在排序算法中的重要作用。2 注意:如果循环中需要修改的变量值不需要初始化或者已经初始化了,则可以省略initializer 语句。【答案】for语句的执行顺序是先从左至右执行循环条件语句,如果循环条件语句的判断语句为tru e,则在循环条件语句执行之后继续执行一次循环执行语句,然后再回到循环条件语句。如果循环语句判断条件为false,则停止循环。面试题62 while循环与do-wh

12、ile循环有什么区别【出现频率】【关键考点】while 和 do-while 的使用【考题分析】当条件语句值为true时;while语句就反复循环执行语句。while语句的语法形式如下:while(condition)/condition 为循环条件62第 5 章流程控制Statement)如果条件condition的 值 为 tru e,执行语句statement condition不能为空。当condition求解为false则不再执行退出循环。如果第一次求解condition就产生false值,则不执行 statement odo-while语句则会先执行一次执行语句,不论第一次求解co

13、ndition是否产生false值,do-while语句的语法形式如下:do(statementwhile(condition)/condition 为循环条件一个使用while语句和do-while语句的示例代码如下:#include void main()(int if 3 f suml,sum2;i=1;j =1;suml=0;sum2=0;while(i 101)/循环开始,计算1100的和(suml+=i;i+;)printf(suml=%dnHz suml);输出计算结果do(sum2+=i;i+;)while(i 101);/注意这里的分号不可省,while和 do-while区

14、别之一printf(sum=%dnz sum2);一般来说,用 while语句和do-while语句来处理同一问题时,如果二者的循环体是一样的,执行结果也会是一样。但是如果while的条件语句一开始就为假的话,两者执行的结果就不一样了。A 注 意:通 常,循环条件自身或者在循环体内必须做一些相关操作来更改循环条件表达式的值。否则,循环可能永远不会开始或者结束,不结束的循环就是死循环,它可能会导致程序最终崩溃。【答案】while循环与do-while循环的主要区别在于,如果循环条件语句为false,while语句不会执行循环,而 do-while保证循环体执行一次。63第2篇 C/C+基础知识面

15、试题6 3 典型循环语句【出现频率】【关键考点】几种典型循环语句【考题分析】C/C+的典型循环语句包括for循环语句、while循环语句和do-while循环语句,在前面小节中已经做了相关地介绍示例代码如下:while循环:int*source=arrl;/定义整型数组 arrlsize_t i=sizeof(arrl)/sizeof(*arrl);int*dest=new inti;while(source!=arrl+i)/while 循环(*dest+=*source+;for循环:for(a:size_type ind=0;ind!=svec.size();+ind)(cout sve

16、cind;if(ind+1!=svec.size()cout ”,do-while 循环:string rsp;do/至少会先执行一次(cout please enter two values:;int vail,va!2;cin vail va12;cout The sum of vail fo r或sw itch语句,并将程序的执行顺序传递给紧接在结束语句之后的语句。示例代码如下:v e c to r:ite r a to r i t e r =v e c.b e g in();w hile(ite r !=v ec.en d()(i f (value=*ite r)break;跳出循环)

17、e lse+ite r;/不跳出)i f (ite r !=v ec.end()/跳出以后从这里开始执行(M上面的代码在v ecto r中循环搜索某个特殊值的第一次出现。一旦找到,则通过break退出循环。continue语句可以让最近的循环语句的当次迭代提前结束。对 于w hile和do w hile循环,会继续求解循环条件,如果没有达到循环终止条件则会继续执行循环执行语句。而对于fo r循环,程序则会继续求解fo r语句头中的expression表达式,示例代码如下:s trin g inB uf;w hile(cin inBuf&!inBuf.empty()/循环条件判断i f (inB

18、uf 0!=)/嵌套条件判断continue;)e lseM)上面的循环每次从标准输入中读入一个单词,如果碰到以下划线开头的单词就进行处理。如果不是,终止当前循环,接着读取下一个单词。【答案】continue语句只能出现在循环语句中,而break语句可以出现在sw itch语句中,continue语句不会退出循环,只会终止当次执行循环体并且进入下一次循环体的执行,break语句会退出循环语句。65第2篇 C/C+基础知识5.3 switch 语句对于多选择分支的情况,可以用if 语句的ifelseif 形式或if 语句嵌套处理,但大多数情况下却略显麻烦。为此,C+提供了另一种方法,switch

19、语句,也称为开关语句。面试题65 sw计ch语句的执行顺序是什么【出现频率】【关键考点】switch语句的执行顺序【考题分析】在使用深层嵌套的if else语句时,往往语法是正确的,但在逻辑方面却没有正确地反映程序员的意图。例如,错误的else if匹配很容易被忽略。即使添加新的条件和逻辑关系,或者对语句做其他修改,都很难保证正确。switch语句提供了一种更方便的方法来实现深层嵌套的if/else逻辑。switch语句的示例代码如下:char ch;int al=0,el=0,il=0,ol=0,ul=0;while(cin ch)(switch(ch)(case a*:+albreak;c

20、ase e1:+el;break;case i1:+il;break;case o*:+ol;break;case 1u*:+ul;break;/初始化变量数据/开始分支语句/case语句进行匹配通过对switch后的圆括号内表达式的值,与其后的花括号中用case列出的关键字做比较,实现switch语句的分支功能。圆括号内的表达式必须产生一个整数结果,其值与每个case的值进行比较。关键字case和它所关联的值称为case标号。每个case标号的值都必须是一个常量表达式,当 case标号的值和switch后圆括号的产生的结果对应时,则执行相应的case后的操作。66 第5章流程控制另外,在 s

21、witch语句中,还有一个default语句,表示如果圆括号内表达式的值与case后的关键字都没有匹配的情况下,可以设定一个默认执行的语句。示例代码如下:#include f,stdio.hmain()(int year,month,days,flat;printf(请输入月份n);scanf(n%d%d,&year,smonth);flag=l;switch(month)/判断月份的值(case 1:case 3:case 5:case 7:case 8:case 10:case 12:days=31;break;case 4:case 6:case 9:case 11:day=30;bre

22、ak;case 2:if(!(year%4)&(year%100)I I!(year%400)day=29;elsedays=28;break;default:flag=0;/如果输入的月份不在112的范围之内if(flag)(printf(天数=)dn”,days);else(printf(不存在的月份nn);以上代码实现的是输入一个年月,然后输出该月有多少天数。如果是闰年的话,则 2月份有29天。【答案】如果表达式与其中一个case标号的值匹配,则程序将从该标号后面的第一个语句开始依次执行各个语句,直到switch结束或遇到break语句为止。如果没有发现匹配的case标号,则在存在def

23、ault语句时执行default语句,否则程序从switch语句后面的第一条语句继续执行。面试题6 6 如何在sw计 ch语句内部定义变量【出现频率】【关键考点】在 switch语句内部定义变量 67 第 2 篇 C/C+基础知识【考题分析】在C+中,对 于switch结构,能而且只能在它的最后一个case标号或default标号后面定义变量。示例代码如下:case tr u e:s trin g file_nam e=g et_ file_ n am e();break;d e fa u lt:M这个规则的制定是为了避免出现代码跳过变量的定义和初始化的情况。另外也可以引入块语句,并且在该块语

24、句中来定义变量,从而保证变量在使用前可以被定义和初始化。示例代码如下:case tr u e:(s trin g file n a m e =g e t_ file n a m e();Mbreak;case f a ls e:(M)【答案】在switch结构中可以在最后一 一 个case标号或default标号后面定义变量,或者引入块语句来定义变量。5.4 递 归递归是一项非常重要的编程技术,它让函数可以从函数体内部调用自身。递归通常把一个大型复杂的问题层层简化为一个,与原问题相似的规模较小的问题来求解,使用递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,这样就大大地减少了程序

25、的代码量。递归的能力在于能运用有限的语句来定义对象的无限集合。面试题6 7 什么是递归【出现频率】【关键考点】递归的概念【考题分析】递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或递归函数。一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个 68 第5章流程控制大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义

26、对象的无限集合。用递归思想写出的程序往往十分简洁易懂。一般来说,递归使用时需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。层 注 意:递归算法解题的运行效率相对较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。使用递归的时候需要消耗比较多的栈空间,所以递归次数过多容易造成栈溢出等。在堆栈尺寸受到限制的时候,一般需要避免使用递归。【答案】一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或递归函数。面试题6 8 汉诺塔问题【出现频率】【关键考点】汉诺塔问题的概念;汉诺塔问题的算法。【考题分析】汉诺塔问题的起源是印

27、度的一个古老的传说。传说中开天辟地的神勃拉玛在一个庙里留下了 3 根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,这样看来,众僧们耗尽毕生精力也不可能完成金片的移动。后来,这个传说就演变成为汉诺塔游戏。汉诺塔问题是程序设计中的经典递归问题。汉诺塔问题有多种算法,其中使用递归解决汉诺塔问题是递归算法的经典案例,它的示例代码如下:#include#inc

28、lude using namespace std;ofstream fout(out.txt);void Move(int nz char i,char j)(0仇 把”号从9:”移动至卜 功 6回;)void Hannoi(int n,char a,char bz char c)(if(n=l)(Move(1,az c);)69第2篇C/C+基础知识else(Hannoi(n-1,a,c,b);递归调用 Hannoi()函数Move(n,a,c);Hannoi(n-1,b,a,c);/递归调用 Hannoi()函数)int main()(以下是10层汉诺塔的解法:endl;Hannoi(10

29、,a,b,c);fout.close();coutv”输出结果完毕。endl;return 0;上面代码描述了一个10层汉诺塔的算法 HannoiO方法中的第一个参数就是需要计算的汉诺塔层数,编程者可以通过修改它的值来计算不同层次的汉诺塔问题。另外汉诺塔问题也有非递归的算法,所有递归的算法都可以转化为非递归算法,使用非递归算法相对来说能节约资源消耗。汉诺塔问题的非递归算法示例代码如下:#include using namespace std;const int MAX=64;struct stint sMAX;int top;char name;int Top()(return stop;)i

30、nt Pop()(return stop-;)void Push(int x)(s+top=X;);long Pow(int x,int y);void Creat(st ta,int n);void Hannuota(st ta ,longint main(void)(int n;cin n;st ta3;Creat(ta,n);long max=Pow(2,n)-1;Hannuota(ta,max);system(pause);return 0;void Creat(st ta z int n)/圆盘的个数设定为最多为64/栈顶,用来最上面的圆盘/柱子的名字,可以是A、B、C中的一个取栈顶

31、元素/出栈入栈max);/输入圆盘的个数/3根柱子的信息用结构数组存储/给结构数组设置初值/移动的次数应等于2-n-1/移动汉诺塔的主要函数 70 第5章流程控制t a 0 .n a m e =*A;t a 0 ,t o p =n-1;fo r (i n t i=0;i n;i+)(t a 0 .s i =n -i;t a 1 .t o p =t a 2 .t o p =0;fo r (i n t i=0;i n;i+)(t a l .s i =t a 2 .s i =0;i f(n%2 =0)/如果n为偶数,按顺时针方向依次摆放A BC(t a 1 .n a m e =1B *;t a 2

32、.n a m e =*C ;e l s e /如果n为奇数,按顺时针方向依次摆放A C B(t a 1 .n a m e =*C*;t a 2 .n a m e =1 B,;l o n g P o w(i n t x,i n t y)(l o n g s u m =1;fo r (i n t i=0;i y;i+)(s u m *=x;r e t u r n s u m;)v o i d H a n n u o t a(s t t a ,l o n g m a x)(i n t k =0;i n t i =0;i n t c h;w h i l e (k m a x)循环语句(c h =t a

33、 i%3 .P o p();t a (i+1)%3 .P u s h(c h);c o u t +k :”M o v e d i s k c h fr o m t a i%3 .n a m e “t o t a (i +1)%3 .n a m e e n d l;i+;i f(k 0&t a (i+1)%3 .To p()t a (i-l)%3 .To p()c h =t a (i-1)%3 .P o p();t a (i+1)%3 .P u s h (c h);c o u t +k ”:n M o v e d i s k c h ”fr o m t a (i-1)%3 .n a m e t

34、o t a (i +1)%3 .n a m e e n d l;/输出结果)e l s ec h =t a (i+1)%3 .P o p();t a (i-1)%3 .P u s h(c h);71 第 2 篇 C/C+基础知识cout +k:Move disk ch from ta(i+1)%3.name)0 to ta(i-1)%3.name endl;输出结果递归和循环相关性很大,能使用递归处理的算法也可以使用循环来实现,反过来也一样。编程者在使用的时候,可以根据实际的需要来选择一种最贴切的方法即可。【答案】汉诺塔问题是程序设计中的经典递归问题,它在说明递归算法时有不可替代的重要性。它可以形象完整的解释递归算法的调用。汉诺塔问题也可以使用非递归算法来解决。72

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁