1、C/C+程序设计教程郑秋生 主编11/14/20221第第3章章 C+流程控制流程控制 n本章学习重点掌握内容:本章学习重点掌握内容:n结构化程序设计的程序结构结构化程序设计的程序结构n选择结构和构成选择的语句选择结构和构成选择的语句n循环结构和构成循环的语句循环结构和构成循环的语句n结构化程序设计的典型算法和应用结构化程序设计的典型算法和应用11/14/20222第第3章章 C+流程控制流程控制n3.1 算法与流程图算法与流程图n3.2 C+语句和程序的三种基本结构语句和程序的三种基本结构n3.3 顺序结构程序顺序结构程序n3.4 选择结构程序选择结构程序n3.5 循环结构程序设计循环结构程
2、序设计n3.6 常用算法及应用实例常用算法及应用实例11/14/202233.1 算法与流程图算法与流程图 3.1.1 算法的概念算法的概念 所谓算法,是指为了解决一个问题而采取的方法和步所谓算法,是指为了解决一个问题而采取的方法和步骤。当利用计算机来解决一个具体问题时,也要首先骤。当利用计算机来解决一个具体问题时,也要首先确定算法。确定算法。例如,要计算例如,要计算S=1+2+3+100,算法是程序设计的算法是程序设计的灵魂灵魂,而程序设计语言是,而程序设计语言是表达算法表达算法的形式的形式。11/14/202243.1.2 算法的描述算法的描述一、传统流程图一、传统流程图流程图由一些特定意
3、义的图形、流流程图由一些特定意义的图形、流程线及简要的文字说明构成,它能程线及简要的文字说明构成,它能清晰明确地表示程序的运行过程,清晰明确地表示程序的运行过程,传统流程图由以下图形组成:传统流程图由以下图形组成:11/14/202253.1.2 算法的描述算法的描述二、N-S图在这种流程图中,全部算法写在一个大矩形框内,该在这种流程图中,全部算法写在一个大矩形框内,该框中还可以包含一些从属于它的小矩形框。例如网上框中还可以包含一些从属于它的小矩形框。例如网上购物的购物的N-S图图 11/14/202263.2 C+语句和程序的三种基本结构语句和程序的三种基本结构 语句是程序中最小的可执行单位
4、。一条语句可以语句是程序中最小的可执行单位。一条语句可以完成一种基本操作,完成一种基本操作,3.2.1 C+C+语句语句1 1表达式语句表达式语句任何一个表达式后面加上分号;任何一个表达式后面加上分号;例如:例如:c=a+b;2 2空语句空语句 ;3 3复合语句复合语句复合语句是用一对花括号复合语句是用一对花括号 括起来的语句块。括起来的语句块。4 4控制语句控制语句控制语句改变程序执行的方向。例如:控制语句改变程序执行的方向。例如:if语句、语句、for语语句等。句等。11/14/202273.2.2 C+程序的三种基本结构程序的三种基本结构 在过程化程序设计中,按照结构化设计的思想由语句在
5、过程化程序设计中,按照结构化设计的思想由语句构成三种基本结构。构成三种基本结构。n1顺序结构顺序结构 程序按照语句的书写顺序依次执行,语句在前的先执程序按照语句的书写顺序依次执行,语句在前的先执行,语句在后的后执行,顺序结构只能满足设计简单行,语句在后的后执行,顺序结构只能满足设计简单程序的要求。程序的要求。n2.选择结构(也称分支结构)选择结构(也称分支结构)在选择结构中,程序根据判断条件是否成立,来选择在选择结构中,程序根据判断条件是否成立,来选择执行不同的程序段。执行不同的程序段。n3.循环结构循环结构 在循环结构中,程序根据判断条件是否成立,来决定在循环结构中,程序根据判断条件是否成立
6、,来决定是否重复执行某个程序段。是否重复执行某个程序段。11/14/202283.2.3 结构化算法结构化算法解决任何一个复杂的问题,都可以由解决任何一个复杂的问题,都可以由3种基本结构来种基本结构来完成:顺序结构,选择结构,循环结构。由这完成:顺序结构,选择结构,循环结构。由这3种基本种基本结构构成的算法称为结构化算法,它不存在无规律的结构构成的算法称为结构化算法,它不存在无规律的转移,只有在本结构内才允许存在分支或者向前向后转移,只有在本结构内才允许存在分支或者向前向后的跳转。由结构化算法编写的程序称为结构化程序。的跳转。由结构化算法编写的程序称为结构化程序。结构化程序便于阅读和修改,提高
7、了程序的可读性和结构化程序便于阅读和修改,提高了程序的可读性和可维护性。可维护性。11/14/202293.3 顺序结构程序顺序结构程序【例例3.13.1】“鸡兔同笼鸡兔同笼”问题。鸡有问题。鸡有2 2只脚,兔有只脚,兔有4 4只脚,只脚,如果已知鸡和兔的总头数为如果已知鸡和兔的总头数为h h,总脚数为,总脚数为f f。问笼中鸡。问笼中鸡和兔各有多少只?和兔各有多少只?11/14/202210“鸡兔同笼鸡兔同笼”问题问题#include int main()int h,f,x,y;couth;coutf;x=(4*h-f)/2;y=(f-2*h)/2;cout则笼中鸡有则笼中鸡有 x 只,兔有
8、只,兔有 y 只。只。endl;return 0;11/14/2022113.4 选择结构程序选择结构程序 它能根据给定条件,从事先编写好的各个不同分它能根据给定条件,从事先编写好的各个不同分支中执行并且仅执行某一分支的相应操作。支中执行并且仅执行某一分支的相应操作。11/14/2022123.4.1 if语句语句 if语句语法格式为:语句语法格式为:if(表达式表达式)语句语句1;else 语句语句2;if语句的语句语句的语句2可以为空可以为空.【例例3.2】输入一个年份,判断是否闰年。闰年的年份必输入一个年份,判断是否闰年。闰年的年份必须满足以下两个条件之一:须满足以下两个条件之一:(1)
9、能被)能被4整除,但不能被整除,但不能被100整除的年份都是闰年。整除的年份都是闰年。(2)能被)能被400整除的年份都是闰年。整除的年份都是闰年。11/14/2022133.4.1 if语句语句 分析:设变量分析:设变量year表示年份,判断表示年份,判断year是否满足是否满足条件(条件(1)的逻辑表达式是:)的逻辑表达式是:year%4=0&year%100!=0条件(条件(2)的逻辑表达式是:)的逻辑表达式是:year%400=0两者取两者取“或或”,即得判断闰年的逻辑表达式:,即得判断闰年的逻辑表达式:(year%4=0&year%100!=0)|year%400=0#include
10、 int main()int year;cout输入年份输入年份:year;if(year%4=0&year%100!=0|year%400=0)coutyear是闰年是闰年endl;else cout year不是闰年不是闰年score80为良,为良,80score70为中等,为中等,70score60为及格,为及格,score60为不及格。为不及格。#include int main()int score;cout score;if(score=90)cout 优优 =80)cout 良良 =70)cout 中中 =60)cout 及格及格 endl;else cout 不及格不及格 en
11、dl;return 0;11/14/2022173.4.2 嵌套嵌套if语句语句n第二种是嵌套在第二种是嵌套在if分支中为:分支中为:if(表达式表达式1)if(表达式表达式2)语句语句1;else 语句语句2;要特别注意要特别注意else和和if的配对关系。的配对关系。C+规定了规定了if和和else的的“就近配对就近配对”原则,即相距最近且还没有配对原则,即相距最近且还没有配对的一对的一对if和和else首先配对。首先配对。如果根据程序的逻辑需要改变配对关系,则要将属于如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对同一层的语句放在一对“”中。中。11/14/202218
12、3.4.2 嵌套嵌套if语句语句请看以下两个语句:请看以下两个语句:语句语句1:if(n%3=0)if(n%5=0)coutn“是是15的倍数的倍数”;else coutn“是是3的倍数但不是的倍数但不是5的倍数的倍数”;语句语句2:if(n%3=0)if(n%5=0)coutn“是是15的倍数的倍数”;else coutn“是是3的倍数但不的倍数但不是是5的倍数的倍数”endl;11/14/202219条件运算符条件运算符“?:”格式为:格式为:表达式表达式1?表达式表达式2:表达式表达式3。【例【例3.5】输入一个字符,判别它是否为大写字母,如果输入一个字符,判别它是否为大写字母,如果是,
13、将它转换成小写字母;如果不是,不转换。然后是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。输出最后得到的字符。分析:大写字母转换成小写字母,由于小写字母分析:大写字母转换成小写字母,由于小写字母ASCII值比大写字母值比大写字母ASCII值大值大32,所以加,所以加32可以实现大写可以实现大写字母转换成小写字母。字母转换成小写字母。11/14/202220条件运算符条件运算符“?:”#include int main()char ch;cinch;ch=(ch=A&ch=Z)?(ch+32):ch;/判别判别ch是否大写是否大写字母,是则转换字母,是则转换 coutchend
14、l;return 0;11/14/2022213.4.3 swich语句用嵌套用嵌套if语句可以实现多选一的情况。语句可以实现多选一的情况。switch语句,语句,称为多分支语句(开关语句),可以用来实现多选称为多分支语句(开关语句),可以用来实现多选一:一:switch语句语法格式为:语句语法格式为:switch(表达式表达式)case常量表达式常量表达式1:语句序列语句序列1;break;case常量表达式常量表达式2:语句序列语句序列2;break;case常量表达式常量表达式n:语句序列语句序列n;break;default:语句序列语句序列n+1;11/14/202222swich语
15、句(1)各个)各个case(包括(包括default)分支出现的次序)分支出现的次序可以任意,通常将可以任意,通常将default放在最后。放在最后。(2)break语句可选语句可选(3)每个常量表达式的取值必须各不相同)每个常量表达式的取值必须各不相同(4)允许多个常量表达式对应同一个语句序列。)允许多个常量表达式对应同一个语句序列。(5)开关语句中限定了条件表达式的取值类型。开关语句中限定了条件表达式的取值类型。【例例3.6】用用switch语句实现例语句实现例3.4的功能。的功能。分析:由题意可知分析:由题意可知10分一个等级,采用分一个等级,采用score/10整除可以得到等级。整除可
16、以得到等级。11/14/202223swich语句#includeint main()int score;int a;coutscore;a=score/10;switch(a)case 10:case 9:cout 优优 endl;break;case 8:cout 良良 endl;break;case 7:cout 中中 endl;break;case 6:cout 及格及格 endl;break;default:cout不及格不及格 endl;return 0;11/14/2022243.5 循环结构程序设计循环结构程序设计 3.5.1 while语句3.5.2 do-while语句3.
17、5.3 for循环语句3.5.4 循环的嵌套3.5.5 转向语句3.5.6 三种循环的比较11/14/2022253.5.1 while语句while语句的语法格式如下:语句的语法格式如下:while(表达式表达式)循环体语句循环体语句11/14/2022263.5.1 while语句【例例3.8】求求1+2+3+100。n分析:计算累加和需要两个变量,设用变量分析:计算累加和需要两个变量,设用变量sum存放存放累加和,变量累加和,变量i存放加数。重复将加数存放加数。重复将加数i加到加到sum中。中。#include int main()int i=1,sum=0;while(i=100)su
18、m=sum+i;i+;coutsum=sumendl;return 0;11/14/2022273.5.2 do-while语句语法格式如下:语法格式如下:do 循环体语句循环体语句 while(表达式表达式);11/14/2022283.5.2 do-while语句【例例3.11】do-while语句求语句求1+2+3+100#include int main()int i=1,sum=0;do sum=sum+i;i+;while(i=100);coutsum=sumendl;return 0;11/14/2022293.5.2 do-while语句【例例】输入两个正整数,求它们最大公输入
19、两个正整数,求它们最大公约数。约数。分析:求最大公约数可以用分析:求最大公约数可以用“辗转相除辗转相除法法”,方法如下:,方法如下:(1)比较两数,并使)比较两数,并使m大于大于n。(2)将)将m作被除数,作被除数,n作除数,相除后作除数,相除后余数为余数为r。(3)将)将mn,nr;(4)若)若r=0,则,则m为最大公约数,结为最大公约数,结束循环。若束循环。若r0,执行步骤步骤(,执行步骤步骤(2)和(和(3)。)。11/14/202230求两个正整数最大公约数求两个正整数最大公约数#include int main()int m,n,r,t;int m1,n1;coutm;coutn;m
20、1=m;n1=n;/保存原始数据供输出使用保存原始数据供输出使用 if(m n)t=m;m=n;n=t;/m,n交换值交换值 dor=m%n;m=n;n=r;while(r!=0);coutm1和和n1的最大公约数是的最大公约数是m;return 0;11/14/202231计算级数和#includeint main()int k;double sum,d,f;sum=0;k=1;f=1;do d=1.0/(k*(k+1);sum=sum+f*d;k=k+1;f=-f;while(d=1.0e-4);printf(sum=%lfn,sum);return 0;11/14/2022323.5.3
21、 for循环语句for循环语句的语法格式如下:循环语句的语法格式如下:for(表达式表达式1;表达式;表达式2;表达式;表达式3)循环体语句循环体语句n该语句的执行过程是图该语句的执行过程是图3-14 11/14/2022333.5.3 for循环语句n【例例3.14】求求1+2+3+100。用。用for语句实现循环。语句实现循环。#includeint main()int i,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;coutsum=sumendl;return 0;11/14/2022343.5.3 for循环语句n【例例3.15】打印出所有的打印出所有的“
22、水仙花数水仙花数”,所谓,所谓“水仙花水仙花数数”是指一个三位数,其各位数字立方和等于该数本身。是指一个三位数,其各位数字立方和等于该数本身。例如:例如:153是一个是一个“水仙花数水仙花数”,因为,因为153=135333。n分析:利用分析:利用for循环控制循环控制100-999之间的数,每个数分之间的数,每个数分解出个位,十位,百位;然后判断立方和是否等于该数解出个位,十位,百位;然后判断立方和是否等于该数本身。本身。11/14/202235打印出所有的“水仙花数”#include int main()int a,b,c;for(int i=100;i1000;i+)a=i%10;/分解
23、出个位分解出个位b=(i/10)%10;/分解出十位分解出十位c=i/100;/分解出百位分解出百位if(a*a*a+b*b*b+c*c*c=i)coutit;coutendl;return 0;11/14/202236省略for循环语句中的表达式for循环语句中循环语句中3个表达式都可省略。个表达式都可省略。n(1)for语句中的语句中的“表达式表达式1”一般用于给循环变量赋初值;一般用于给循环变量赋初值;如果省略如果省略for语句中的语句中的“表达式表达式1”,此时应在,此时应在for语句之语句之前给循环变量赋初值。前给循环变量赋初值。n(2)for语句中的语句中的“表达式表达式2”一般用
24、于判断循环结束条件;一般用于判断循环结束条件;如果表达式如果表达式2省略,即不判断循环条件,循环无终止地进省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式行下去。也就是认为表达式2始终为真。始终为真。n(3)for语句中的语句中的“表达式表达式3”一般用于循环变量的增量;一般用于循环变量的增量;如果表达式如果表达式3省略,则循环变量的增量应在循环体内实现。省略,则循环变量的增量应在循环体内实现。n(4)如果省略如果省略for语句中的语句中的3个表达式,则成为以下形式:个表达式,则成为以下形式:for(;)11/14/2022373.5.4 循环的嵌套 在一个循环的循环体中又包含另
25、一个循环语句,在一个循环的循环体中又包含另一个循环语句,称为循环嵌套。嵌套层次一般不超过称为循环嵌套。嵌套层次一般不超过3层,以保层,以保证可读性。证可读性。11/14/2022383.5.4 循环的嵌套 n【例【例3.16】输出一个金字塔图形输出一个金字塔图形。n分析:利用双重分析:利用双重for循环,外循环循环,外循环控制层,内循环控制星号个数。控制层,内循环控制星号个数。该图形有该图形有10层,可用外循环控制。层,可用外循环控制。第第1层有层有1个星号,第个星号,第2层有层有3个星个星号,第号,第3层有层有5个星号,个星号,可,可用公式用公式j=2*i-1表示。其中,表示。其中,i表表示
26、层数,示层数,j表示该层星号的数量。表示该层星号的数量。还需要用还需要用setw()控制每层输出星控制每层输出星号的起始位置。号的起始位置。11/14/202239金字塔图形金字塔图形#include#includeint main()int i,j;for(i=1;i=10;i+)coutsetw(20-i);for(j=1;j2*i;j+)cout*;coutendl;return 0;11/14/202240金字塔图形金字塔图形【例例3.18】计算并输出计算并输出10以内以内(包括包括10)所有自然数的阶乘所有自然数的阶乘值。即计算值。即计算1!,2!,3!,4!,5!,6!,7!,8!
27、,9!,10!。#include int main()int n,k;double s;for(n=1;n=10;n=n+1)s=1.0;for(k=1;k=n;k=k+1)s=s*k;printf(%2d!=%fn,n,s);return 0;11/14/2022413.5.5 转向语句这一类语句的功能是改变程序的流程,是非结构化语句。这一类语句的功能是改变程序的流程,是非结构化语句。1.break语句break语句的一般形式为:语句的一般形式为:break;该语句只能用于两种情况:(该语句只能用于两种情况:(1)用在)用在switch结构中,当结构中,当某个某个case子句执行完后,使用子
28、句执行完后,使用break语句跳出语句跳出switch结构。结构。(2)用在循环结构中,用)用在循环结构中,用break语句来结束循环。如果在语句来结束循环。如果在嵌套循环中,嵌套循环中,break语句只能结束其所在的那层循环。语句只能结束其所在的那层循环。2.continue语句continue语句的一般形式为:语句的一般形式为:continue;该语句只能用在循环结构中。当在循环结构中遇到该语句只能用在循环结构中。当在循环结构中遇到continue语句时,则跳过语句时,则跳过continue语句后的其它语句结束语句后的其它语句结束本次循环,并转去判断循环控制条件,以决定是否进行下本次循环,
29、并转去判断循环控制条件,以决定是否进行下一次循环。一次循环。11/14/2022423.5.5 转向语句【例例3.21】输出输出0100之间之间所有不能被所有不能被3整除的数。整除的数。#includeint main()int i;for(i=0;i=100;i+)if(i%3=0)continue;coutiendl;return 0;对比结果对比结果:#includeint main()int i;for(i=0;i=100;i+)if(i%3=0)break;coutiscore;if(score=0)/表达式为真,转移到表达式为真,转移到loop标号处标号处 goto loop;11
30、/14/2022444return语句nreturn语句用于结束函数的执行,返回到调用语句用于结束函数的执行,返回到调用者,如果是主函数,则返回至操作系统。者,如果是主函数,则返回至操作系统。n利用一个利用一个return语句可以将一个数据返回给调语句可以将一个数据返回给调用者。通常,当函数的返回类型为用者。通常,当函数的返回类型为void时,时,return语句可以省略,如果使用也仅作为函数语句可以省略,如果使用也仅作为函数或程序结束的标志。或程序结束的标志。11/14/2022453.6 常用算法及应用实例3.6.1 累加与累乘累加与累乘是最常见的一类算法,这类算法就是在原有的基础上不累加
31、与累乘是最常见的一类算法,这类算法就是在原有的基础上不断地加上或乘以一个新的数。断地加上或乘以一个新的数。【实例一实例一】求数列求数列2/3,4/5,6/7,前前30项的和。项的和。分析:该数列的通式为分析:该数列的通式为2n/(2n+1)#include int main()double sum=0;for(int i=1;i=30;i+)sum+=2.0*i/(2.0*i+1);coutsumendl;return 0;11/14/2022463.6.2 求最大数、最小数n求数据中的最大数和最小数的算法是类似的,可采用求数据中的最大数和最小数的算法是类似的,可采用“打擂打擂”算法。以求最大
32、数为例,可先用其中第一个算法。以求最大数为例,可先用其中第一个数作为最大数,再用其与其它数逐个比较,并找到的数作为最大数,再用其与其它数逐个比较,并找到的较大的数替换为最大数。较大的数替换为最大数。【实例三实例三】求区间求区间100,200内内10个随机整数中的最大个随机整数中的最大数、最小数和平均值。数、最小数和平均值。n分析:随机函数分析:随机函数rand()返回一个返回一个032767之间的随之间的随机整数,为了生成区间机整数,为了生成区间m,n之间的随机整数,可使之间的随机整数,可使用公式用公式(rand()%(n-m+1)+m)。故产生区间。故产生区间100,200内随机整数的计算公
33、式为:内随机整数的计算公式为:rand()%101+100。11/14/202247#include#include#include#include int main()int max,min,x;x=rand()%101+100;/产生一个产生一个100,200之间的随机数之间的随机数xcoutsetw(4)x;max=x;min=x;/设定最大数和最小数设定最大数和最小数 for(int i=1;i10;i+)x=rand()%101+100;/再产生一个再产生一个100,200之间随机数之间随机数xcoutsetw(4)max)max=x;/若新的随机数大于最大数,则替换若新的随机数大于
34、最大数,则替换 if(x min)min=x;/若新的随机数小于最小数,则进行替换若新的随机数小于最小数,则进行替换 coutendl最大数:最大数:max,最小数最小数:minendl;return 0;11/14/2022483.6.3 求素数素数是除素数是除1和本身,不能被其它任何整数整除的整数。判和本身,不能被其它任何整数整除的整数。判断一个数断一个数m是否为素数,只要依次用是否为素数,只要依次用2,3,4,m-1作除数去除作除数去除m,只要有一个能被整除,只要有一个能被整除,m就不是素数。就不是素数。【实例四实例四】从键盘上输入一个大于从键盘上输入一个大于2的自然数,判断其是的自然数
35、,判断其是否为素数。否为素数。分析:可使用一个逻辑变量分析:可使用一个逻辑变量flag来表示自然数来表示自然数m是否为是否为素数。首先标志素数。首先标志flag默认为默认为true,然后循环判断,然后循环判断m能能否被否被2,3,4,m-1整除,只要有一个整除,就可停整除,只要有一个整除,就可停止循环并修改标志止循环并修改标志flag,根据标志,根据标志flag是否被修改即是否被修改即可知道可知道m是否是素数。是否是素数。11/14/202249#include int main()int m,i;bool flag;cout输入整数输入整数m:m;flag=true;/设标志为设标志为tru
36、e for(i=2;im;i+)if(m%i=0)/能被能被i整除整除 flag=false;/设标志为设标志为false break;/只要有一个整除,只要有一个整除,m不是一个素数就可停止不是一个素数就可停止 if(flag=true)/根据标记根据标记flag输出判断结果输出判断结果 cout m是素数是素数endl;else cout m不是素数不是素数endl;return 0;11/14/2022503.6.4 枚举法n枚举法又称为穷举法,此算法将所有可能出现的情枚举法又称为穷举法,此算法将所有可能出现的情况一一进行测试,从中找出符合条件的所有结果。况一一进行测试,从中找出符合条件
37、的所有结果。如计算如计算“百钱买百鸡百钱买百鸡”问题,又如列出满足问题,又如列出满足x*y=100的所有组合等。的所有组合等。n【实例六实例六】公鸡每只公鸡每只5元,母鸡每只元,母鸡每只3元,小鸡元,小鸡3只只1元,现要求用元,现要求用100元钱买元钱买100只鸡,问公鸡、母鸡只鸡,问公鸡、母鸡和小鸡各买几只?和小鸡各买几只?11/14/202251#include#include#includeint main()int x,y,z;for(x=0;x=100;x+)/可优化为可优化为x=19for(y=0;y100;y+)/可优化为可优化为y=33z=100-x-y;if(5*x+3*y+
38、z/3.0=100)coutxyzendl;return 0;11/14/2022523.6.5 递推与迭代 利用递推算法或迭代算法,可以将一个复杂的问题转换利用递推算法或迭代算法,可以将一个复杂的问题转换为一个简单过程的重复执行。这两种算法的共同特点是,为一个简单过程的重复执行。这两种算法的共同特点是,通过前一项的计算结果推出后一项。不同的是,递推算通过前一项的计算结果推出后一项。不同的是,递推算法不存在变量的自我更迭,而迭代算法则在每次循环中法不存在变量的自我更迭,而迭代算法则在每次循环中用变量的新值取代其原值。用变量的新值取代其原值。一、递推【实例七实例七】输出(输出(Fibonacci
39、)数列的前)数列的前20项。即项。即1,1,2,3,5,8,。分析:设数列中相邻的分析:设数列中相邻的3项分别为变量项分别为变量f1、f2和和f3,则有如下递推算法:,则有如下递推算法:(1)f1和和f2的初值为的初值为1。(2)每次执行循环,用)每次执行循环,用f1和和f2产生后项,即产生后项,即f3=f1+f2。(3)通过递推产生新的)通过递推产生新的f1和和f2,即,即f1=f2,f2=f3。(4)如果未达到规定的循环次数,返回步骤)如果未达到规定的循环次数,返回步骤2;否则停止计算;否则停止计算。11/14/202253#include#include int main()long f
40、1,f2,f3;f1=1;f2=1;/初始条件初始条件 coutf1endlf2endl;for(int i=3;i=20;i+)f3=f1+f2;/递推公式递推公式 coutf3endl;f1=f2;f2=f3;/递推公式递推公式 return 0;输出(输出(Fibonacci)数列的前)数列的前20项项11/14/202254n二、迭代二、迭代n在工程技术中,经常使用数值算法来求解超越方程在工程技术中,经常使用数值算法来求解超越方程和代数方程的根。解决这类问题,一般采用和代数方程的根。解决这类问题,一般采用“迭代迭代法法”。3.6.5 递推与迭代11/14/202255【实例九实例九】迭
41、代法求迭代法求a的平方根。求平方根的的平方根。求平方根的公式为:公式为:xn+1=(xn+a/xn)/2,求出的,求出的平方根精度是前后项差绝对值小于平方根精度是前后项差绝对值小于10-5。#include#include int main()float a;/*被开方数被开方数*/float x0,x1;/*分别代表前一项和后一项分别代表前一项和后一项*/cout Input a positive number:a;x0=a/2;/*任取的初值任取的初值*/x1=(x0+a/x0)/2;3.6.5 递推与迭代11/14/2022563.6.5 递推与迭代 while(fabs(x1-x0)=
42、1e-5)/*fabs(x)函数用来求参数函数用来求参数x绝绝对值对值*/x0=x1;x1=(x0+a/x0)/2;coutThe square root is x1;return 0;11/14/2022573.7 程序的调试n程序的错误可以分为:编译错误、连接错误及程序的错误可以分为:编译错误、连接错误及运行错误。运行错误。nVisual C+集成环境中编译器能够发现编译集成环境中编译器能够发现编译错误(即语法错误)和连接错误。编译错误通错误(即语法错误)和连接错误。编译错误通常是编程者违反了常是编程者违反了C+语言的语法规则,如语言的语法规则,如保留字输入错误、大括号不匹配、语句少分号保
43、留字输入错误、大括号不匹配、语句少分号等。连接错误通常由于未定义或未指明要连接等。连接错误通常由于未定义或未指明要连接的函数,或者函数调用不匹配等,对系统函数的函数,或者函数调用不匹配等,对系统函数的调用必须通过的调用必须通过“include”说明。说明。11/14/2022583.7 程序的调试n在程序运行时,也会产生运行错误。对于运行错误,在程序运行时,也会产生运行错误。对于运行错误,在在Visual C+集成环境中,提供了调试器,能跟踪程集成环境中,提供了调试器,能跟踪程序的运行过程。它可以一行一行(单步)地执行程序序的运行过程。它可以一行一行(单步)地执行程序源代码,以观察程序的运行过
44、程中,哪些语句执行了,源代码,以观察程序的运行过程中,哪些语句执行了,哪些语句没有执行,执行的顺序如何以及内存中各变哪些语句没有执行,执行的顺序如何以及内存中各变量当前的值。从而确定应用程序在运行的各个阶段发量当前的值。从而确定应用程序在运行的各个阶段发生了什么,以及是如何发生的。生了什么,以及是如何发生的。Visual C+提供的调提供的调试技术包括单步运行和断点运行,设置中断表达式和试技术包括单步运行和断点运行,设置中断表达式和监视表达式,显示变量的动态值等。监视表达式,显示变量的动态值等。11/14/2022593.7 程序的调试调试工具栏调试工具栏 11/14/2022603.7.1
45、进入调试n首先完成编译连接,只有编译连接正确,才能开始调首先完成编译连接,只有编译连接正确,才能开始调试,你不能指望通过调试来检查编译或连接的错误,试,你不能指望通过调试来检查编译或连接的错误,调试已经属于程序运行阶段。调试已经属于程序运行阶段。n使用使用“编译编译”菜单,选择菜单,选择“开始调试开始调试”一一“Step Into”,然后程序将开始单步调试。也可以直接按,然后程序将开始单步调试。也可以直接按Fl0键。此时屏幕上会出现一个如图键。此时屏幕上会出现一个如图3-20所示浮动的所示浮动的“调调试试”工具栏(如果没有出现,可在工具栏上单击鼠标工具栏(如果没有出现,可在工具栏上单击鼠标右键
46、,在快捷菜单中选择右键,在快捷菜单中选择“调试调试”)。同时)。同时“编译编译”菜单变成了菜单变成了“调试调试”(Debug)菜单。)菜单。11/14/2022613.7.2 单步调试n单步执行按单步执行按“调试调试”工具栏中工具栏中“Step Over”按钮或按按钮或按Fl0键。如果遇到自定义函数调用,键。如果遇到自定义函数调用,想进入函数进行单步执行,可按想进入函数进行单步执行,可按“Step Into”按钮或按按钮或按F11键。对不是函数调用的普通语句键。对不是函数调用的普通语句来说,来说,F11键与键与Fl0键作用相同。但一般对系键作用相同。但一般对系统函数不要用统函数不要用F11键。
47、建议使用键。建议使用Fl0键进行单键进行单步调试。步调试。11/14/2022623.7.3 查看变量、表达式的值nVisual C+支持查看变量、表达式值。所有这些观察都必须是支持查看变量、表达式值。所有这些观察都必须是在调试的情况下进行。观看变量的值最简单,当箭头指示将运行在调试的情况下进行。观看变量的值最简单,当箭头指示将运行的语句是所需查看变量所在的语句时,把光标移动到这个变量上,的语句是所需查看变量所在的语句时,把光标移动到这个变量上,停留一会就可以看到变量的值。停留一会就可以看到变量的值。n变量窗口变量窗口(Variable)会自动显示所有当前程序执行中可见的变量会自动显示所有当前
48、程序执行中可见的变量的值。特别是当前语句涉及的变量,以红色显示。在变量窗口的的值。特别是当前语句涉及的变量,以红色显示。在变量窗口的下部有三个标签:下部有三个标签:Auto,Locals,this。选中不同的标签,不。选中不同的标签,不同类型的变量将会显示在该窗口中。也可以通过同类型的变量将会显示在该窗口中。也可以通过“查看查看”“调调试窗口试窗口”“Variables”打开变量窗口。打开变量窗口。n查看变量、表达式的值也可通过查看变量、表达式的值也可通过Watch窗口实现。单击窗口实现。单击Debug工具条上的工具条上的Watch按钮,就出现一个按钮,就出现一个Watch窗口(含窗口(含Wa
49、tch1,Watch2,Watch3,Watch4视图),在该视图中输入变量或视图),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。者表达式,就可以观察变量或者表达式的值。11/14/2022633.7.4 停止调试n如果用户想停止调试,可以使用如果用户想停止调试,可以使用“调试调试”菜单菜单下下“Stop Debugging”菜单项,或菜单项,或“调试调试”(Debug)工具栏终止调试按钮。从而回到正)工具栏终止调试按钮。从而回到正常的运行状态。常的运行状态。11/14/202264实例说明单步调试过程实例说明单步调试过程有一分数序列:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的求出这个数列的前前20项之和。参考代码如下:项之和。参考代码如下:#include int main()int n,number=20;float a=2,b=1,s=0;for(n=1;n=number;n+)s=s+a/b;/a是数据项的分子,是数据项的分子,b是分母是分母 a=a+b;b=a;couts;return 0;调试时可以观察每次循环求出的数据项a/b值是否正确。11/14/20226511/14/202266
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。