Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.

Similar presentations


Presentation on theme: "第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析."— Presentation transcript:

1 第4讲 C++程序控制结构(二) 循环结构 转向控制 综合案例分析

2 循环结构的实现方式 While循环 循环结构 Do-While循环 For循环

3 for循环结构 for语句实现 循环变量增值 循环结束条件 假(0) 循环变量赋初值 真(非0) for(表达式1;表达式2;表达式3) {
求解表达式1 真(非0) 假(0) 循环体语句组 求解表达式3 循环结束条件 循环变量赋初值 for(表达式1;表达式2;表达式3) { 循环体语句组; } for语句实现

4 例: 1 2 void main(void) 循环条件 循环语句为多重语句,需要括号。 {
for(int num=0; num<=2; num++) cout<<num<<endl; } cout<<endl; 循环条件 循环语句为多重语句,需要括号。 1 2 num 循环条件 输出 1 2 3 1 2 回车

5 例: 求 1+2+3+……+100的值 1+100=101 2+99 =101 3+98 =101 50次 4+97 =101 …
高斯10岁时的求解 编写VC程序求解 void main(void) { int i, sum; for (i=1, sum=0; i<=100; i++) sum=sum+i; cout<<“sum=”<<sum<<endl; } 1+100=101 2+99 =101 赋初值 循环条件 3+98 =101 50次 4+97 =101 50+51=101 变量自增 循环体语句 总和为 101×50=5050

6 对比for循环和while循环 for循环相对while循环更为简洁 求 1+2+3+……+100 void main(void)
{ int i, sum; i=1; sum=0; while(i<=100) { sum=sum+i; i=i++; } cout<<“sum=”<<sum<<endl; void main(void) { int i, sum; for (i=1, sum=0; i<=100; i++) sum=sum+i; cout<<“sum=”<<sum<<endl; } for循环相对while循环更为简洁

7 例:求解圆周率 π=C/d=3.1415926…. 祖冲之的割圆法 如何用编程的方法计算圆周率? 日期 计算者 纪录 前3世纪 阿基米德
π=3.1418 公元前20年 维特鲁威 π= 3.125 130年 张衡 π= 150年 托勒密 π= 250年 王蕃 π= 263年 刘徽 π= 480年 祖冲之 <π< 1400年 Madhava π= 如何用编程的方法计算圆周率?

8 例:求解圆周率 算法分析 分子都是1 分母是奇数 分母从1开始 偶数项符号为负 奇数项符号为正 Leibniz定理: 高斯积分: 欧拉公式:
斯特林公式: 偶数项符号为负 欧拉公式: 奇数项符号为正

9 例:求解圆周率 #include <iostream.h> void main() { int i,d=1;
float s=0; for(i=1;(float)i<=1e06;i++) s+=(float)d/(i*2-1); d=-d; } cout<<“PI=”<<s*4; 用For循环实现程序: 控制循环次数 分母的计算 控制符号

10 例:求解圆周率 计算结果

11 九九乘法表 行数 列数 控制行数 控制列数 int main(int argc, char* argv[]) { int i, j;
for(i=1;i<=9;i++) for( j=1; j<=i; j++) cout<<i<<"*"<<j<<"\t"; cout<<"\n"; } return 0; 控制行数 控制列数

12 循环的嵌套 循环嵌套 三种循环语句可 以相互嵌套,实 现多种循环功能。 while( ) for( ; ; ) { …… { ……
while-while组合 for-while组合 while( ) { …… { …… } …… } for( ; ; ) { …… while( ) { …… } …… } 一个循环体中又包含另一个循环体 do-while和do-while组合 do-while和for组合 do { do {……} while(); } while( ); do { for( ; ; ) { …… } …… } while( ); 三种循环语句可 以相互嵌套,实 现多种循环功能。

13 嵌套的外循环和内循环 外循环 内循环 循环次数 =内循环次数*外循环次数 内外循环次数由内外循环变量的值决定 外循环变量赋初值;
while(外循环条件) { 内循环变量赋初值; while(内循环条件) 内循环体; 外程序段 } 外循环 内循环 循环次数 =内循环次数*外循环次数 内外循环次数由内外循环变量的值决定

14 例:猜数游戏 6名同学轮流玩 计算机设置一个整数,请1位同学从键盘输入猜想 的数据。计算机告诉参与者是猜大了还是小了。10次以 内猜对,该同学获胜。否则,公布正确答案。并由下一 名同学再玩。 分析: 1. 猜数的大小或相等的判断 2. 10次机会,获胜或失败两种可能 3. 6名参与者玩游戏

15 算法分析 外循环 num=1 set=123 n=1 N n<=10 输出正确的答案 Y 输入猜的数据guess 内循环
guess与set比较 > = < 输出“偏大” 输出“偏小” 输出“猜对了” num增1 N Y num>6 结束

16 猜数程序 #include “iostream.h” void main() { int set=123;
int guess, n, num; for(num=1;num<=6;num++) for(n=1;n<=10;n++) cout<<“guess”<<n; cin>>guess; if(guess==set) {cout<<“Win!”<<endl; break;} if(guess>set) cout<<“Bigger!”<<endl; if(guess<set) cout<<“Smaller”<<endl; } if(n==11) cout<<“Sorry! The number is”<<guess<<endl; 猜数程序

17 例:百钱百鸡问题 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 张丘建 北魏清河人 《张丘建算经》共三卷

18 问题分析 公鸡5元一只,母鸡3元一只,小鸡1元三只。100元买100只鸡,能买公鸡、母鸡、小鸡各多少只? 运用方程求解:
设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x + y + z = ① 5 x + 3 y + z / 3 = ② 取值范围:0 <= x、y、z <= 100

19 算法分析 编程求解 小鸡一重循环 母鸡一重循环 公鸡一重循环 1,1,1 1,2,1 1,1,2 1,2,2 N 1,1,100
x=1 y=1 编程求解 1,1,1 1,1,2 1,1,100 1,2,1 1,2,2 1,2,100 z=1 N …… …… x+y+z==100 5x+3y+z/3==100 …… Y Y 输出结果 结束 x<=100 N z增1 Y Z<=100 x增1 Y y<=100 y增1 N

20 程序实现 main( ) { int x,y,z; for(x=1;x<=100;x++)
for(y=1;y<=100;y++) for(z=1;z<=100;z++) if(x+y+z==100 && 5*x+3*y+z/3==100 ) cout<<“公鸡=”<<x<<“母鸡=”<<y<<“小鸡=”<<z<<endl; } 公鸡 = 3, 母鸡 = 20, 小鸡 = 77 公鸡 = 4, 母鸡 = 18, 小鸡 = 78 公鸡 = 7, 母鸡 = 13, 小鸡 = 80 公鸡 = 8, 母鸡 = 11, 小鸡 = 81 公鸡 = 11, 母鸡 = 6, 小鸡 = 83 公鸡 = 12, 母鸡 = 4, 小鸡 = 84 小鸡数量不能被3整除

21 程序修正 丢失重要条件:z应该能够被3整除。 运行程序,正确的结果: main( ) { int x,y,z,j=0;
for(x=1;x<=100;x++) for(y=1;y<=100;y++) for(z=1;z<=100;z++) if( z%3= =0&&x+y+z==100&&5*x+3*y+z/3= =100 ) cout<<++j<<“:公鸡=”<<x<<“母鸡=”<<y<<“小鸡=”<<z<<endl; } 运行程序,正确的结果: 程序运行时间2.3秒 循环体执行 次 2: 公鸡= 4 母鸡=18 小鸡=78 3: 公鸡= 8 母鸡=11 小鸡=81 4: 公鸡=12 母鸡= 4 小鸡=84

22 程序改进 这就是最佳程序吗? 减少1层循环 化简判断条件 main( ) { int x,y,z,j=0;
for(x=1;x<=20;x++) for(y=1;y<=33;y++) for(z=1;z<=100;z++) if( z%3= =0&&x+y+z==100&&5*x+3*y+z/3= =100 ) cout<<++j<<“:cock=”<<x<<“hen=”<<y<<“chicken=”<<z<<endl; } main( ) { int x, y, z, j=0; for(x=1; x<=20; x++) for(y=1; y<=33; y++) { z=100-x-y; if(z%3==0&&5*x+3*y+z/3==100) cout<<++j<<“:cock=”<<x<<“hen=”<<y<<“chicken=”<<z<<endl; } main( ) { int x,y,z,j=0; for(x=1;x<=100;x++) for(y=1;y<=100;y++) for(z=1;z<=100;z++) if( z%3= =0&&x+y+z==100&&5*x+3*y+z/3= =100 ) cout<<++j<<“:cock=”<<x<<“hen=”<<y<<“chicken=”<<z<<endl; } main( ) { int x,y,z,j=0; for(x=1;x<=100;x++) for(y=1;y<=100;y++) for(z=1;z<=100;z++) if( z%3= =0&&x+y+z==100&&5*x+3*y+z/3= =100 ) cout<<++j<<“:cock=”<<x<<“hen=”<<y<<“chicken=”<<z<<endl; } 循环体执行次数降到660次! 公鸡5元1只,仅需循环20次 程序运行时间 秒! 这就是最佳程序吗? 母鸡3元1只,仅需循环33次 减少1层循环 化简判断条件

23 总结: 循环嵌套程序的构成及编程技巧 循环嵌套的程序都可以从内循环入手,由简到繁; 精益求精,实现程序的优化。

24 内容 循环结构 转向控制 综合案例分析

25 转向控制 转向控制 continue break goto 用于改变程序的控制流程,使程序从某条语句跳转 到另一条语句继续执行;
用于改变程序的控制流程,使程序从某条语句跳转 到另一条语句继续执行; continue 转向控制语句 break continue goto break goto

26 break转向控制语句 在while循环中 while(表达式1) { 语句组1; if(表达式2) break; 语句组2; } 假(0)
终止并跳出循环体语句 真(非0) 语句组1 真(非0) break 表达式2 假(0) 语句组2

27 break转向控制语句 在for循环中 for(表达式1;表达式2;表达式3) 终止并跳出循环体语句 { 语句组1; if(表达式4)
语句组2; } 终止并跳出循环体语句 假(0) 表达式2 真(非0) 语句组1 表达式3 真(非0) 表达式4 break 假(0) 语句组2

28 break转向控制语句 在多重循环中 注意:如果是多重循环,break语句只能终止它所在的那一重循环。 for(……) { …… if(…)
} 注意:如果是多重循环,break语句只能终止它所在的那一重循环。

29 break跳出for循环,起到了结束for循环的作用
例: #include <iostream.h> int main() {    int sum=0;    for (int i=1; ; i++)    {       if (i>100)       {          break;       }       sum=sum+i;    }    cout <<sum <<endl;    return 0; } 无循环结束条件 当i>100时执行if语句 break跳出for循环,起到了结束for循环的作用 完成从1加到100的功能

30 continue转向控制语句 在while循环中 while(表达式1) { 语句组1; if(表达式2) continue; 语句组2;
假(0) 终止本轮循环执行下一轮判断 在while循环中 表达式1 while(表达式1) { 语句组1; if(表达式2) continue; 语句组2; } 真(非0) 语句组1 真(非0) continue 表达式2 假(0) 语句组2

31 continue转向控制语句 在for循环中 终止本轮循环执行下一轮判断 for(表达式1;表达式2;表达式3) { 语句组1;
if(表达式4) continue; 语句组2; } 假(0) 表达式2 真(非0) 语句组1 表达式3 真(非0) 表达式4 continue 假(0) 语句组2

32 例: i=0 i<2 第一次 i=1 i<2 第二次 i=2 i<2 结束 输出:x=8 1 2 3 4 假 真 假 真
void main(void) { int i, j, x=0 ; for (i=0 ; i<2; i++) { x++; for (j=0;j<=3; j++) { if ( j%2 ) continue; x++; } cout<<“x=“<< x<<endl; j j%2 x 1 2 3 4 2 2 3 3 4 i=1 i<2 第二次 j j%2 x 1 2 3 4 6 6 7 7 8 i=2 i<2 结束 输出:x=8

33 goto转向控制语句 语句组1; ……. goto 标识符; 标识符:语句组2; 程序无条件地转移到语句标号所标识的语句处 语句组1

34 通过goto跳转,if语句起到了循环的作用
例: int main(int argc, char* argv[]) { int n=0; cout<<"input a string"<<"\n"; loop: if(getchar()!='\n') n++; goto loop; } cout<<n<<endl; return 0; 通过goto跳转,if语句起到了循环的作用

35 内容 循环结构 转向控制 综合案例分析

36 m被n除得到余数r(0≤r ≤n) ,r=m%n
思考题-课本P69, 3.7题和3.12题 编程求两自然数m , n的最大公约数 如何使用转向控制完成该程序? 欧几里德算法(m>n) 第一步: m被n除得到余数r(0≤r ≤n) ,r=m%n 例: 设m=6;n=4 r=m%n=6%4=2 第二步: 若r=0,则算法结束,n为最大公约数,否则进行第三步 m=4;n=2 r=m%n=4%2=0 第三步: mn , nr , 回到1 公约数=2 网络课程平台


Download ppt "第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析."

Similar presentations


Ads by Google