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

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
C语言程序设计 主讲教师 :张群燕 电话:
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
第一章 C语言概述 计算机公共教学部.
请将手机调整到静音状态 实验网站:program3.ccshu.net 资源网站:class.ccshu.org/ /
第三章 控制结构.
复习与总结.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
資料大樓 --談指標與陣列 綠園.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
函數(一) 自訂函數、遞迴函數 綠園.
C++程序设计 第二讲 清华大学软件学院.
C++语言.
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
程式撰寫流程.
Introduction to the C Programming Language
第四章 小技巧.
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
K60基础课程 02 首都师范大学物理系 王甜.
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
計數式重複敘述 for 迴圈 P
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++大学基础教程 第5章 数组 北京科技大学 信息基础科学系.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第二章Java基本程序设计.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第三章 C++的语句和简单的程序设计 主要内容:
第 二 章 数据类型、运算符与表达式.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
Oop8 function函式.
请编写程序在屏幕上打印出一个“*”? printf(”*\n”); 请编写程序在屏幕上打印四行,每行一个“*”?
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C程序设计.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
复杂度和测试数据 吴章昊.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
程序设计基础.
#include <iostream.h>
第七章  数 组.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
迴圈(重複性結構) for while do while.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

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

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

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

例: 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 回车

例: 求 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

对比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循环更为简洁

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

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

例:求解圆周率 #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循环实现程序: 控制循环次数 分母的计算 控制符号

例:求解圆周率 计算结果

九九乘法表 行数 列数 控制行数 控制列数 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; 控制行数 控制列数

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

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

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

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

猜数程序 #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; 猜数程序

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

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

算法分析 编程求解 小鸡一重循环 母鸡一重循环 公鸡一重循环 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

程序实现 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整除

程序修正 丢失重要条件: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秒 循环体执行1000000次 2: 公鸡= 4 母鸡=18 小鸡=78 3: 公鸡= 8 母鸡=11 小鸡=81 4: 公鸡=12 母鸡= 4 小鸡=84

程序改进 这就是最佳程序吗? 减少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次 程序运行时间0.00017秒! 这就是最佳程序吗? 母鸡3元1只,仅需循环33次 减少1层循环 化简判断条件

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

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

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

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

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

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

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的功能

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

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

例: 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

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

通过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语句起到了循环的作用

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

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 网络课程平台http://course.cn/G2S/Template/View.aspx?action=view&courseType=0&courseId=2272