C-程序设计(第3章)new解析课件_第1页
C-程序设计(第3章)new解析课件_第2页
C-程序设计(第3章)new解析课件_第3页
C-程序设计(第3章)new解析课件_第4页
C-程序设计(第3章)new解析课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C/C+程序设计教程郑秋生 主编10/10/20221C/C+程序设计教程郑秋生 主编10/9/20221第3章 C+流程控制 本章学习重点掌握内容:结构化程序设计的程序结构选择结构和构成选择的语句循环结构和构成循环的语句结构化程序设计的典型算法和应用10/10/20222第3章 C+流程控制 本章学习重点掌握内容:10/9/2第3章 C+流程控制3.1 算法与流程图3.2 C+语句和程序的三种基本结构3.3 顺序结构程序3.4 选择结构程序3.5 循环结构程序设计3.6 常用算法及应用实例10/10/20223第3章 C+流程控制3.1 算法与流程图10/9/203.1 算法与流程图 3.1

2、.1 算法的概念 所谓算法,是指为了解决一个问题而采取的方法和步骤。当利用计算机来解决一个具体问题时,也要首先确定算法。 例如,要计算S = 1 + 2 + 3 + + 100, 算法是程序设计的灵魂,而程序设计语言是表达算法的形式。10/10/202243.1 算法与流程图 3.1.1 算法的概念10/9/23.1.2 算法的描述一、传统流程图流程图由一些特定意义的图形、流程线及简要的文字说明构成,它能清晰明确地表示程序的运行过程,传统流程图由以下图形组成:10/10/202253.1.2 算法的描述一、传统流程图10/9/202253.1.2 算法的描述二、N-S图在这种流程图中,全部算法

3、写在一个大矩形框内,该框中还可以包含一些从属于它的小矩形框。例如网上购物的N-S图 10/10/202263.1.2 算法的描述二、N-S图10/9/202263.2C+语句和程序的三种基本结构 语句是程序中最小的可执行单位。一条语句可以完成一种基本操作, 3.2.1 C+语句1表达式语句任何一个表达式后面加上分号;例如: c=a+b;2空语句 ;3复合语句复合语句是用一对花括号 括起来的语句块。 4控制语句控制语句改变程序执行的方向。例如:if语句、for语句等。10/10/202273.2C+语句和程序的三种基本结构 语句是程3.2.2 C+程序的三种基本结构 在过程化程序设计中,按照结构

4、化设计的思想由语句构成三种基本结构。1顺序结构 程序按照语句的书写顺序依次执行,语句在前的先执行,语句在后的后执行,顺序结构只能满足设计简单程序的要求。2. 选择结构(也称分支结构) 在选择结构中,程序根据判断条件是否成立,来选择执行不同的程序段。3. 循环结构 在循环结构中,程序根据判断条件是否成立,来决定是否重复执行某个程序段。 10/10/202283.2.2 C+程序的三种基本结构 在过程化程序设3.2.3 结构化算法解决任何一个复杂的问题,都可以由3种基本结构来完成:顺序结构,选择结构,循环结构。由这3种基本结构构成的算法称为结构化算法,它不存在无规律的转移,只有在本结构内才允许存在

5、分支或者向前向后的跳转。由结构化算法编写的程序称为结构化程序。结构化程序便于阅读和修改,提高了程序的可读性和可维护性。10/10/202293.2.3 结构化算法解决任何一个复杂的问题,都可以由3种3.3 顺序结构程序【例3.1】“鸡兔同笼”问题。鸡有2只脚,兔有4只脚,如果已知鸡和兔的总头数为h,总脚数为f。问笼中鸡和兔各有多少只?10/10/2022103.3 顺序结构程序【例3.1】“鸡兔同笼”问题。鸡有2只“鸡兔同笼”问题#include int main( ) int h,f,x,y; couth; coutf; x = (4 * h - f) / 2; y = (f - 2 * h

6、) / 2; cout则笼中鸡有 x 只,兔有 y 只。endl; return 0;10/10/202211“鸡兔同笼”问题#include 13.4 选择结构程序 它能根据给定条件,从事先编写好的各个不同分支中执行并且仅执行某一分支的相应操作。 10/10/2022123.4 选择结构程序 它能根据给定条件,从事先编写好的各个3.4.1 if语句 if语句语法格式为:if(表达式) 语句1;else 语句2;if语句的语句2可以为空 .【例3.2】输入一个年份,判断是否闰年。闰年的年份必须满足以下两个条件之一:(1)能被4整除,但不能被100整除的年份都是闰年。(2)能被400整除的年份都

7、是闰年。10/10/2022133.4.1 if语句 if语句语法格式为:10/9/2023.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 int main( ) int year; cout输入年份:year; if(year%4=0 & year%100!=0 | year%400=0) coutyear是闰年endl; el

8、se 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 不及格 endl; return 0;10/10/202217【例3.4】输入学生的成绩score,按分数输出其等级:sc3.4.2 嵌套if语句第二种是嵌套在if分支中为:if (表达式1) if (表达式2) 语句1; else 语句

9、2; 要特别注意else和if的配对关系。C+规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。 如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“”中。 10/10/2022183.4.2 嵌套if语句第二种是嵌套在if分支中为:10/93.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的倍数”en

10、dl;10/10/2022193.4.2 嵌套if语句请看以下两个语句:10/9/2022条件运算符“?:”格式为:表达式1 ?表达式2 : 表达式3。【例3.5】输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。分析:大写字母转换成小写字母,由于小写字母ASCII值比大写字母ASCII值大32,所以加32可以实现大写字母转换成小写字母。 10/10/202220条件运算符“?:”格式为:表达式1 ?表达式2 : 表达式3条件运算符“?:”#include int main( ) char ch; cinch; ch=(ch=A & ch

11、=Z)?(ch+32):ch; /判别ch是否大写字母,是则转换 coutchendl; return 0;10/10/202221条件运算符“?:”#include 3.4.3 swich语句用嵌套if语句可以实现多选一的情况。switch语句,称为多分支语句(开关语句),可以用来实现多选一:switch语句语法格式为:switch (表达式) case常量表达式1: 语句序列1; break; case常量表达式2: 语句序列2; break; case常量表达式n: 语句序列n; break; default:语句序列n+1; 10/10/2022223.4.3 swich语句用嵌套if

12、语句可以实现多选一的情swich语句(1)各个case(包括default)分支出现的次序可以任意,通常将default放在最后。(2)break语句可选(3)每个常量表达式的取值必须各不相同 (4)允许多个常量表达式对应同一个语句序列。 (5)开关语句中限定了条件表达式的取值类型。 【例3.6】用switch语句实现例3.4的功能。 分析:由题意可知10分一个等级,采用score/10整除可以得到等级。10/10/202223swich语句(1)各个case(包括default)分支出swich语句#includeint main() int score; int a; coutscore;

13、 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;10/10/202224swich语句#include10/3.5 循环结构程序设计 3.5.1 while语句3.5.2 do- while语句3.5.3 for循环语句3.5.4 循环的嵌套3.5.5 转向语句3.5.6 三种循环的比较10/

14、10/2022253.5 循环结构程序设计 3.5.1 while语句10/3.5.1 while语句while语句的语法格式如下:while (表达式) 循环体语句10/10/2022263.5.1 while语句while语句的语法格式如下:13.5.1 while语句【例3.8】求1+2+3+100。分析:计算累加和需要两个变量,设用变量sum存放累加和,变量i存放加数。重复将加数i加到sum中。#include int main( ) int i=1,sum=0; while (i=100) sum=sum+i; i+; coutsum=sumendl; return 0; 10/10

15、/2022273.5.1 while语句【例3.8】求1+2+3+13.5.2 do- while语句语法格式如下:do 循环体语句 while (表达式);10/10/2022283.5.2 do- while语句语法格式如下:10/9/3.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;10/10/2022293.5.2 do- while语句【例3.11】do-wh3.

16、5.2 do- while语句【例】输入两个正整数,求它们最大公约数。分析:求最大公约数可以用“辗转相除法”,方法如下:(1)比较两数,并使m大于n。(2)将m作被除数,n作除数,相除后余数为r。(3)将mn,nr;(4)若r=0,则m为最大公约数,结束循环。若r0,执行步骤步骤(2)和(3)。10/10/2022303.5.2 do- while语句【例】输入两个正整数,求求两个正整数最大公约数#include int main( ) int m,n,r,t;int m1,n1;coutm;coutn; m1=m; n1 = n; /保存原始数据供输出使用 if(m n) t = m; m

17、= n; n = t; /m,n交换值 dor = m % n;m = n;n = r;while(r!=0);coutm1和n1的最大公约数是m; return 0;10/10/202231求两个正整数最大公约数#include iostream计算级数和 #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;10/10/20223

18、2计算级数和 #include10/9/203.5.3 for循环语句for循环语句的语法格式如下:for(表达式1;表达式2;表达式3) 循环体语句该语句的执行过程是图3-14 10/10/2022333.5.3 for循环语句for循环语句的语法格式如下:13.5.3 for循环语句【例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;10/10/2022343.5.3 for循环语句【例3.14】 求

19、1+2+3+3.5.3 for循环语句【例3.15】打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=135333。分析:利用for循环控制100-999之间的数,每个数分解出个位,十位,百位;然后判断立方和是否等于该数本身。10/10/2022353.5.3 for循环语句【例3.15】打印出所有的“水仙打印出所有的“水仙花数” #include int main() int a,b,c;for(int i=100;i1000;i+)a=i%10; /分解出个位b=(i/10)%10; /分解出十位c=i/10

20、0; /分解出百位if(a*a*a+b*b*b+c*c*c=i)coutit;coutendl; return 0;10/10/202236打印出所有的“水仙花数” #include iostrea省略for循环语句中的表达式for循环语句中3个表达式都可省略。(1) for语句中的“表达式1”一般用于给循环变量赋初值;如果省略for语句中的“表达式1”,此时应在for语句之前给循环变量赋初值。(2) for语句中的“表达式2”一般用于判断循环结束条件;如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。 (3) for语句中的“表达式3”一般用于循环变量的增

21、量;如果表达式3省略,则循环变量的增量应在循环体内实现。(4) 如果省略for语句中的3个表达式,则成为以下形式:for( ; ; )10/10/202237省略for循环语句中的表达式for循环语句中3个表达式都可省3.5.4 循环的嵌套 在一个循环的循环体中又包含另一个循环语句,称为循环嵌套。嵌套层次一般不超过3层,以保证可读性。 10/10/2022383.5.4 循环的嵌套 在一个循环的循环体中又包含3.5.4 循环的嵌套 【例3.16】输出一个金字塔图形。分析:利用双重for循环,外循环控制层,内循环控制星号个数。该图形有10层,可用外循环控制。第1层有1个星号,第2层有3个星号,第

22、3层有5个星号,可用公式j = 2*i-1表示。其中,i表示层数,j表示该层星号的数量。还需要用setw( )控制每层输出星号的起始位置。10/10/2022393.5.4 循环的嵌套 【例3.16】输出一个金字塔图形金字塔图形#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;10/10/202240金字塔图形10/9/202240金字塔图形【例3.18】计算并输出10以内(包括10)所有自然数的阶乘值。即计算1!,2!

23、,3!,4!,5!,6!,7!,8!,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;10/10/202241金字塔图形【例3.18】计算并输出10以内(包括10)所有自3.5.5 转向语句这一类语句的功能是改变程序的流程,是非结构化语句。1. break语句break语句的一般形式为: break;该语句只能用于两种情况:(1)用在switch结构中,当某个case子句执行

24、完后,使用break语句跳出switch结构。(2)用在循环结构中,用break语句来结束循环。如果在嵌套循环中,break语句只能结束其所在的那层循环。2.continue语句continue语句的一般形式为: continue;该语句只能用在循环结构中。当在循环结构中遇到continue语句时,则跳过continue语句后的其它语句结束本次循环,并转去判断循环控制条件,以决定是否进行下一次循环。10/10/2022423.5.5 转向语句这一类语句的功能是改变程序的流程,是非3.5.5 转向语句【例3.21】 输出0100之间所有不能被3整除的数。#includeint main() in

25、t 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;10/10/2022443goto语句goto语句和标号语句一起使用,所谓标号语句4return语句return语句用于结束函数的执行,返回到调用者,如果是主函数,则返回至操作系统。利用一个return语句可以将一个数据返回给调用者

26、。通常,当函数的返回类型为void时, return语句可以省略,如果使用也仅作为函数或程序结束的标志。10/10/2022454return语句return语句用于结束函数的执行,返回3.6 常用算法及应用实例3.6.1 累加与累乘累加与累乘是最常见的一类算法,这类算法就是在原有的基础上不断地加上或乘以一个新的数。 【实例一】求数列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; re

27、turn 0;10/10/2022463.6 常用算法及应用实例3.6.1 累加与累乘10/93.6.2 求最大数、最小数求数据中的最大数和最小数的算法是类似的,可采用“打擂”算法。以求最大数为例,可先用其中第一个数作为最大数,再用其与其它数逐个比较,并找到的较大的数替换为最大数。【实例三】求区间100, 200内10个随机整数中的最大数、最小数和平均值。分析:随机函数rand()返回一个032767之间的随机整数,为了生成区间m, n之间的随机整数,可使用公式 (rand()%(n - m + 1) + m)。故产生区间100, 200内随机整数的计算公式为:rand()%101+100。1

28、0/10/2022473.6.2 求最大数、最小数求数据中的最大数和最小数的算法#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; / 若新的随机数大于最大数,则替换 if(x min)min = x; /

29、 若新的随机数小于最小数,则进行替换 coutendl最大数:max,最小数:minendl; return 0;10/10/202248#include 10/9/20223.6.3 求素数素数是除1和本身,不能被其它任何整数整除的整数。判断一个数m是否为素数,只要依次用2, 3, 4, , m-1作除数去除m,只要有一个能被整除,m就不是素数。【实例四】从键盘上输入一个大于2的自然数,判断其是否为素数。分析:可使用一个逻辑变量flag来表示自然数m是否为素数。首先标志flag默认为true,然后循环判断m能否被2, 3, 4, , m-1整除,只要有一个整除,就可停止循环并修改标志flag

30、,根据标志flag是否被修改即可知道m是否是素数。10/10/2022493.6.3 求素数素数是除1和本身,不能被其它任何整数整除#include int main() int m,i;bool flag;cout输入整数m:m; flag = true; /设标志为true 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;1

31、0/10/202250#include 10/9/20223.6.4 枚举法枚举法又称为穷举法,此算法将所有可能出现的情况一一进行测试,从中找出符合条件的所有结果。如计算“百钱买百鸡”问题,又如列出满足x*y=100的所有组合等。【实例六】公鸡每只5元,母鸡每只3元,小鸡3只1元,现要求用100元钱买100只鸡,问公鸡、母鸡和小鸡各买几只?10/10/2022513.6.4 枚举法枚举法又称为穷举法,此算法将所有可能出现#include #include #includeint main()int x,y,z;for(x=0;x=100;x+) /可优化为x=19for(y=0 ;y100;y

32、+)/ 可优化为y=33z=100-x-y;if(5*x+3*y+z/3.0=100) coutxyzendl; return 0;10/10/202252#include 10/9/20223.6.5 递推与迭代 利用递推算法或迭代算法,可以将一个复杂的问题转换为一个简单过程的重复执行。这两种算法的共同特点是,通过前一项的计算结果推出后一项。不同的是,递推算法不存在变量的自我更迭,而迭代算法则在每次循环中用变量的新值取代其原值。一、递推【实例七】输出(Fibonacci)数列的前20项。即1,1,2,3,5,8,。分析:设数列中相邻的3项分别为变量f1、f2和f3,则有如下递推算法:(1)f

33、1和f2的初值为1。(2)每次执行循环,用f1和f2产生后项,即f3 = f1 + f2。(3)通过递推产生新的f1和f2,即f1 = f2,f2 = f3。(4)如果未达到规定的循环次数,返回步骤2;否则停止计算。10/10/2022533.6.5 递推与迭代 利用递推算法或迭代算法,可以#include #include int main()long f1, f2, f3; f1 = 1; f2 = 1; / 初始条件 coutf1endlf2endl; for(int i=3;i=20;i+)f3=f1+f2; /递推公式 coutf3endl;f1 = f2; f2 = f3; /递推

34、公式 return 0;输出(Fibonacci)数列的前20项10/10/202254#include 输出(Fibona二、迭代在工程技术中,经常使用数值算法来求解超越方程和代数方程的根。解决这类问题,一般采用“迭代法”。3.6.5 递推与迭代10/10/202255二、迭代3.6.5 递推与迭代10/9/202255【实例九】迭代法求a的平方根。求平方根的公式为:xn+1= (xn+a/xn) /2,求出的平方根精度是前后项差绝对值小于10-5。#include #include int main() float a; /* 被开方数 */ float x0, x1; /* 分别代表前一

35、项和后一项 */ cout Input a positive number:a; x0 = a / 2; /* 任取的初值 */ x1 = (x0 + a / x0) / 2;3.6.5 递推与迭代10/10/202256【实例九】迭代法求a的平方根。求平方根的公式为:xn+1= 3.6.5 递推与迭代 while (fabs(x1 - x0) = 1e-5) /*fabs(x)函数用来求参数x绝对值*/ x0 = x1; x1 = (x0 + a / x0) / 2; coutThe square root is x1; return 0;10/10/2022573.6.5 递推与迭代 wh

36、ile (fabs(x1 - 3.7 程序的调试程序的错误可以分为:编译错误、连接错误及运行错误。Visual C+集成环境中编译器能够发现编译错误(即语法错误)和连接错误。编译错误通常是编程者违反了C+语言的语法规则,如保留字输入错误、大括号不匹配、语句少分号等。连接错误通常由于未定义或未指明要连接的函数,或者函数调用不匹配等,对系统函数的调用必须通过“include”说明。10/10/2022583.7 程序的调试程序的错误可以分为:编译错误、连接错误及3.7 程序的调试在程序运行时,也会产生运行错误。对于运行错误,在Visual C+集成环境中,提供了调试器,能跟踪程序的运行过程。它可以一行一行(单步)地执行程序源代码,以观察程序的运行过程中,哪些语句执行了,哪些语句没有执行,执行的顺序如何以及内存中各变量当前的值。从而确定应用程序在运行的各个阶段发生了什么,以及是如何发生的。Visual C+提供的调试技术包括单步运行和断点运行,设置中断表达式和监视表达式,显示变量的动态值等。10/10/2022593.7 程序的调试在程序运行时,也会产生运行错误。对于运行3.7 程序的调试调试工具栏 10/10/2022603.7 程序的调试调试工具栏 10/9/2022603.7.1 进入调试首先完成编译连接,只有编译连接正确,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论