




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,课件制作:C/C+教材编写组 哈尔滨理工大学 计算中心 , 基于计算思维,2,第 1 章 初识C/C+程序设计语言,第 2 章 数据类型、运算符与表达式,第 3 章 顺序结构程序设计,第 5 章 循环结构程序设计,第 6 章 数组,第 7 章 字符串,第 8 章 指针,总复习,第 4 章 选择结构程序设计, 课程概述,第 9 章 函数,第11章 类与对象自定义数据类型,第12章 继承与多态,第13章 C+输入/输出流类库,第14章异常处理,第15章图形界面编程简介,第 10章 自定义数据类型,第 2 章 数据类型、运算符与表达式,第 5 章 循环结构程序设计,3,循环结构程序设计,第 5 章
2、, 了解循环程序的概念 掌握while、dowhile、for三种循环语句 掌握break、continue、goto三种跳转语句 掌握循环的嵌套,4,5.1 案例剖析:输出学生最高成绩,输入20个学生成绩,输出其中最高的成绩 在该问题中,输入成绩和判断成绩的语句需要重复执行20次,这就构成了循环结构。循环结构就是指某一程序段(循环体)需重复执行多次。,问题的提出,5,算法及程序设计分析 定义存储输入成绩和最高成绩的变量score和max; 输入第1个成绩存入score; 将score存入max; 重复以下步骤19次: 输入一个成绩存入score 如果scoremax,则max=score 输
3、出结果max,5.1 案例剖析:输出学生最高成绩,max相当于一个擂台,第一个成绩进入max后,其它成绩逐一上台与max比较,若大于max,就留在max中,所有成绩都比完后,max中就是最大值,6,流程图,7,用for语句实现的源程序 #include using namespace std; int main( ) int max,score; coutscore; max=score; for (int n=1; nscore; if (scoremax) max=score; coutmax=maxscore; if (scoremax) max=score; n+ ; coutmax=
4、max0,输出平均成绩=总成绩/成绩个数;,13,#include using namespace std; int main( ) int scoe,n=0; double sum=0; coutscore; while (score=0) sum=sum+score; n=n+1; coutscore; if (n0) coutaverage=sum/nendl; return 0; ,例5.1 输入一组成绩,输出平均成绩,5.2 循环控制语句,14,5.2 循环控制语句,可将该问题转换成 sum=0; sum=sum+1; sum=sum+3; sum=sum+99; 每次将一项值加入s
5、um,第n项值等于2*n-1,例 5.2 计算 sum=1+3+5+99,15,例 5.2 计算 sum=1+3+5+99,5.2 循环控制语句,算法及程序设计分析 定义初值为0的变量存放和,即 int sum=0; 定义变量t存放当前项的值,并将第一项值存入t; 定义变量n记录当前项是第几项,n初值1; 当t=99 时重复以下步骤: 将t加入sum n加1 计算新的t值,t=2*n-1 输出sum;,16,5.2 循环控制语句,#include using namespace std; int main( ) int sum=0; /sum记录总和 int t=1; /t记录当前项值 int
6、 n=1; /n记录当前项是第几项 while (t= 99 ) sum=sum+t; n=n+1; t=2*n-1; coutsum=sum=0) sum=sum+score; n+; while (score=0); if (n0) coutaverage=sum/nendl; return 0; ,20,5.2 循环控制语句, for循环语句,for (表达式1;表达式2;表达式3) 循环体 for语句的执行过程如下: 求解或执行表达式1; 计算表达式2,若表达式2为假,结束循环,转到循环体 下面的程序继续执行,否则执行第3步; 执行循环程序段; 求解或执行表达式3; 转到第2步。,21
7、,5.2 循环控制语句, for循环语句的说明,若循环程序段是一条语句,可以不用花括号 表达式1通常是一条赋值语句,也可以是变量定义语句,此处定义的变量在循环结束后仍可使用 表达式2是循环控制条件,通常是一个关系或逻辑表达式 表达式3通常是一个增量表达式,22, for循环语 句的流程图,23,例 5.4用for语句求sum=1+3+5+99,5.2 循环控制语句,#include using namespace std; int main( ) int sum=0, n; for(n=1;n=99; n=n+2) sum=sum+n; coutsum=sumendl; return 0; ,
8、程序运行结果,24,当,例5.5 输出Fibonacci数列,5.2 循环控制语句,Fibonacci数列的第一项和第二项是1,从第三项开始是前2项之和,要求输出前20项 用循环语句计算Fibonacci数列时,需用2个变量保存当前项和当前项的前一项,如用f2保存当前项,用f1保存当前项的前一项。在每次循环中用f1和f2计算下次循环时的f1和f2: f1=f1+f2; f2=f2+f1;,25,5.2 循环控制语句,算法及程序设计分析 定义初值为1的变量f1和f2保存数列当前项和前一项; 用循环变量i控制重复以下步骤10次: 输出f1和f2 f1=f1+f2; f2=f2+f1; 若i是偶数,
9、输出换行符(每行输出4个数),例5.5 输出Fibonacci数列,26,5.2 循环控制语句,#include #include using namespace std; int main() int f1=1,f2=1; for(int i=1;i=10;i+) coutsetw(10)f1setw(10)f2; f1=f1+f2; f2=f2+f1; if(i%2=0) coutx2,则x3=x2,x2=y; 否则,若yx3,则x3=y; 输出x1,x2,x3;,例5.6 输入10个正整数,输出其中最大的3个数,30,5.2 循环控制语句,#include using namespace
10、 std; int main( ) int x1=0, x2=0, x3=0, int y; for (int n=1; ny; if ( yx1 ) x3=x2, x2=x1, x1=y; else if (yx2 ) x3=x2, x2=y; else if (yx3) x3=y; coutx1=x1x2=x2x3=x3endl; return 0; ,例5.6 输入10个正整数,输出其中最大的3个数,31,5.3 循环的嵌套,在循环程序段中又包含另一个完整的循环结构的形式称为循环的嵌套。包含在循环程序段中的循环称为内循环,其外面的循环结构称为外循环。while语句、dowhile语句、和
11、for语句都可相互嵌套。,32,5.3 循环的嵌套,例5.7 输出如下图形,* * * * *,算法分析: 用循环控制变量i控制输出行 for (i=1; i=5; i+) 输出第i行; 每行输出的*的个数与行号i相等,用循环控制变量j控制第i行输出*的个数 for (j=1; j=i; j+) cout*; coutendl; /在第i行结束时换行,33,5.3 循环的嵌套,* * * * *,#include using namespace std; int main( ) int i, j; for (i=1; i=5; i+) for (j=1; j=i; j+) cout*; cou
12、tendl; return 0; ,输出第i行,例5.7 输出如下图形,34,5.4 循环的提前结束和跳转语句,用break语句结束循环,break语句的形式为: break; break语句的功能是跳出所在循环结构,转向执行该循环结构后面的语句,35,5.4 循环的提前结束和跳转语句,例5.8 输出100150间的全部素数,首先采用枚举法,对100150间所有整数逐个判断,若是素数,就输出。 在判断某数n是否为素数时可根据素数的定义,用2n-1间整数逐个尝试,看n能否被其整除,只要n能被其中1个数整除,n就不是素数。,36,5.4 循环的提前结束和跳转语句,算法及程序设计分析 外层循环:用n
13、扫描100150间所有整数; 内层循环:判断n是否为素数 定义标志变量flag=1,表示n是素数; 用i扫描2n-1间的所有整数,若n能被其中某个 整除,n就不是素数,将flag改成0,并用break 语句退出循环。 内循环结束后,如果flag=1就输出n;,例5.8 输出100150间的全部素数,37,5.4 循环的提前结束和跳转语句,#include using namespace std; int main( ) for (int n=100; n=150; n+) int flag=1; for (int i=2; i=n-1; i+) if (n%i =0 ) flag=0; bre
14、ak; if (flag=1) coutnyz; for (int n=x; n=1; n=n-1) if (x%n=0 ,例5.9 输入3个正整数,输出他们最大公约数,42,5.4 循环的提前结束和跳转语句,用continue语句提前结束本次循环,continue语句的形式是: continue; continue语句被称为继续语句,其功能是提前结束本次循环,即跳过本次循环中尚未执行的语句,直接进入下一次循环的条件判断,43,5.4 循环的提前结束和跳转语句,例5.10 计算sum=1+2+4+100,不含3的倍数,该问题属于逐项累加,第n项的值就是n。在每次累加前,先判断该项值是否是3的倍
15、数,若是,用continue语句跳过累加运算。,44,5.4 循环的提前结束和跳转语句,算法及程序设计分析 定义初值为0的变量sum存储和; 用循环变量n控制重复以下步骤,n从1循环到100: 如果n除3的余数都是0,continue; sum=sum+n; 输出sum;,例5.10 计算sum=1+2+4+100,不含3的倍数,45,5.4 循环的提前结束和跳转语句,#include using namespace std; int main( ) int sum=0; for (int n=1; n=100; n+) if (n%3=0 ) continue; sum=sum+n; cou
16、tsum=sumendl; return 0; ,例5.10 计算sum=1+2+4+100,不含3的倍数,46,5.4 循环的提前结束和跳转语句,goto语句,goto语句被称为跳转语句,它的一般形式为: goto 标号; 该语句的功能是跳转到标号所在语句处执行。带标号的语句的形式是: 标号: 语句;,47,5.4 循环的提前结束和跳转语句,例5.11,用goto语句计算sum=1+2+3+99,#include using namespace std; int main( ) int sum=0, n=1; loop: sum=sum+n; n=n+2; if (n=99) goto lo
17、op; coutsum=sumendl; return 0; ,如果n=99,转到loop标号所在语句执行,48,5.5 几种循环语句的比较,while语句和dowhile语句的比较,while语句和do.while语句的区别在于: while语句是先判断循环条件表达式,再根据判断结果来决定是否执行循环体 do.while语句是先执行一遍循环体,再判断循环条件表达式,以确定是否继续下次循环 do.while语句可保证循环体至少执行一次,而while语句则不能 while语句和do.while语句适合于条件不确定的循环结构;for语句适合于循环次数已知的循环结构。,49,5.5 几种循环语句的比
18、较,for语句和while语句的比较,for(表达式1;表达式2;表达式3) 循环体 执行次序与下列语句相同: 表达式1; while (表达式2) 循环体 表达式3; 相比之下,for语句显得结构紧凑、清晰,50,5.5 几种循环语句的比较,例12a,用for语句计算sum=1+2+3+100,#include using namespace std; int main( ) int sum=0; for (int n=1; n=100; n+) sum=sum+n; coutsum=sumendl; return 0; ,51,5.5 几种循环语句的比较,例12b,用while语句计算su
19、m=1+2+3+100,#include using namespace std; int main( ) int sum=0, n=1; while (n =100 ) sum=sum+n; n=n+1; coutsum=sumendl; return 0; ,52,例5.13 用迭代法解方程组,x+sin(x+y)=0 x+cos(x+y)=0,解决实际问题的一种普遍策略是通过数学建模将实际问题转化为数学问题,然后通过求解数学问题来解决实际问题。 方程组是最常见的数学模型形式,解方程组是理工科学生应该掌握的技能。由于许多方程组无法获得解析解,所以,学生应该了解一些方程组的数值解法。 迭代法
20、是比较简单的数值方法,虽然迭代法在理论上并不完善,不能保证收敛,即不能保证计算结果逐渐逼近问题的解,但由于其简单,适用面广,仍获得大量实际应用。,5.5 几种循环语句的比较,53,迭代法: 首先将方程组化成以下迭代形式: x=f(x, y) y=g(x, y) 给x和y一个初值,一般用随机小数,然后重复执行迭代式: x=f(x, y) y=g(x, y) 即把x和y的初值代入迭代式右边算出新的x和y,再把新的x和y代入迭代式右边算出新的x和y,重复此过程。,例5.13 用迭代法解方程组,x+sin(x+y)=0 x+cos(x+y)=0,5.5 几种循环语句的比较,54,将方程组化成: x=-
21、 sin(x+y) y= -x+arccos(-x) 算法及程序设计分析 定义变量x和y并给它们一个随机初值; 给x和y定义一个副本变量xx和yy; 重复执行以下步骤,一般几千次: xx=x; yy=y; x=- sin(xx+yy); y= -xx+arccos(-xx); 输出x,y及其副本变量;,例5.13 用迭代法解方程组,x+sin(x+y)=0 x+cos(x+y)=0,5.5 几种循环语句的比较,55,流程图,56,#include #include using namespace std; int main( ) double x=0.1, y=-0.2, xx, yy; fo
22、r (int n=1; n=100; n+) xx=x; yy=y; x=- sin(xx+yy); y= -xx+acos(-xx); if (n%5=0) double e; e=pow(x-xx, 2)+pow(y-yy, 2); coutn e=eendl; coutx=xendl; couty=yendl; return 0; ,每隔5步察看一下迭代误差,例5.13 用迭代法解方程组,5.5 几种循环语句的比较,57,程序运行结果,58,例5.14 百鸡问题,公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只,用穷举法尝试所有可能的组合,然后
23、查看各个组合是否满足100元钱买100只鸡的条件,若满足,输出该组合。 用x代表公鸡个数,用y代表母鸡个数,用z代表小鸡个数,x、y、z的取值范围都是0100,逐个查看x、y、z在取值范围内的所有组合,若满足: x+y+z=100 int main( ) int x, y, z; for (x=0; x=100; x+) for (y=0; y=100; y+) for (z=0; z=100; z+) if (x+y+z=100 ,5.5 几种循环语句的比较,例5.14 百鸡问题,60,例5.15 鸡兔同笼问题,鸡兔同笼,共有98个头,386只脚,问鸡兔各有几只,用穷举法尝试所有可能的组合,然后查看各个组合是否满足98个头,386只脚的条件,若满足,输出该组合。 用x代表鸡的个数,用y代表兔的个数,x、y的取值范围都是098,逐个查看x、y在取值范围内的所有组合,若满足: x+y=98 int main( ) int x,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学生知党史感党恩课件
- 临海小学招生管理办法
- 会议同意通过管理办法
- 人员核酸台账管理办法
- 云南电梯安全管理办法
- 小学生省略号课件
- 会员礼品管理办法细则
- 云南学校管理办法细则
- 企业资金流动管理办法
- 互助担保贷款管理办法
- 偏执性精神障碍
- 中医跟师总结论文3000字(通用3篇)
- 附件1:上海市新增医疗服务项目价格申请受理表
- 2022年陕西二级造价工程师造价管理考试真题及答案
- 《服务设计》课程教学大纲
- 消防维保方案(消防维保服务)(技术标)
- 阿勒泰布尔津县高校毕业生“三支一扶”计划招募考试题库
- 少儿硬笔书法启蒙教学30讲PPT课件配套教案
- 岩棉施工方案改
- 钢筋配筋全套表格
- GB/T 1688-1986硫化橡胶伸张疲劳的测定
评论
0/150
提交评论