电子ppt课件_第1页
电子ppt课件_第2页
电子ppt课件_第3页
电子ppt课件_第4页
电子ppt课件_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第 4 单元 循环结构程序设计,信息学奥赛课课通(C+),1,第 1 课 while 语句,学习目标 1. 理解循环结构的含义。 2. 熟练掌握 while 语句的格式和功能。 3. 初步应用 while 语句解决一些实际问题。,2,循环结构,在程序设计中,经常需要反复执行某一条语句或一个语句块,这种结构称为“循环结构”或者“重复结构”。其实,计算机最擅长的就是重复做一件事情,所以循环结构在程序设计中应用非常广泛。 在 C+ 中,循环结构有三种实现语句:while 语句、do-while 语句和 for 语句。,3,1. while 语句的含义,其含义为:先计算表达式(一般称为循环条件)的值,当表达式的值为真(循环条件成立)时,去执行一次循环体。和 if 语句不同的是,执行完一次循环体后,while 语句又回到开始处,继续计算和判断表达式的真假,决定是否再次执行循环体。也就是“当表达式成立时,不断重复执行循环体”,所以又称为“当型循环”。,while 语句的格式如下: while(表达式) 循环体 ,4,2.while 语句的应用举例,【问题分析】 设 sum 存放答案,初始化为 0。再设 i 为循环控制变量,初始化为 1。当循环条件(i=100)成立时,反复执行以下循环体: (1) 将 i 累加到和 sum 中; (2) 将 i 取值为下一个数,即 i+。 最后,输出 ans 的值。,例1、求 1+2+3+100 的值。,5,/p4-1-1 #include using namespace std; int main() int i = 1,sum = 0; while(i = 100) sum += i+; cout sum endl; return 0; ,6,例2、阅读程序,写出程序的运行结果。,/p4-1-2 #include using namespace std; int main() int i = 100,x = 0,y = 0; while(i 0) i-; x = i % 8; if(x = 1) y+; cout y endl; return 0; ,7,【问题分析】 一般采用列表观察、找规律的方法,阅读和理解程序。对于本题而言,循环条件为“i 0”,用到 i、x 和 y 这 3 个变量,列表如表 4.1-1。,通过找规律发现,每次 i 是 8*x+1 时,y 的值会加1,也就是97、89、81、9、1,一 共99/8+1=13。所以,程序最后输出 y 的值为 13。,8,例3、统计正数,【问题描述】 输入若干整数,以 0 结尾,统计其中有多少个正整数。 【输入格式】 一行若干整数,最后一个为 0。 【输出格式】 一行一个整数,表示输入的数据中正整数的个数。 【样例输入】 3 6 -3 2 0 【样例输出】 3,9,【问题分析】 对于本题来说,首先要输入一个整数,当它不为 0 时,需要反复执行: (1) 判断该数是否为正数,如果是,则答案累加 1; (2) 输入下一个数,再返回去判断是否为 0。,/p4-1-3 #include using namespace std; int main() int x,s = 0; cin x; while(x != 0)/ 也可以简写成 while(x) if(x 0) s+; cin x; cout s endl; return 0; ,10,例4、投资收益,【问题描述】 小华在去年赚了一大笔钱。他想把这些钱用于投资,并对自己能得到多少收益感到好奇。 已知投资的年利率为 r(020 之间的整数),小华现有 m 元钱。他想知道投资多少年后,他的钱将会超过 y 元。 【输入格式】 一行三个整数 r、m 和 y,相邻两个整数之间用一个空格隔开。m 为 1001000000 之间的整数。 【输出格式】 一行一个整数,即要投资的年数。保证答案的范围在 1400 之间。 【样例输入】 5 5000 6077 【样例输出】 4,【样例说明】 第一年后:1.05 * 5000 = 5250; 第二年后:1.05 * 5250 = 5512.5; 第三年后:1.05 * 5512.5 = 5788.125; 第四年后:1.05 * 5788.125 = 6077.53125。,11,【问题分析】 小华手里有 m 元钱,目标是超过 y 元钱,k 表示答案(初始化为 0)。所以,当条件“m = y”成立时,要反复执行: (1) 修改 m 的值,即 m = m *(1 + r%); (2) 修改 k 的值,即 k+。 循环结束后,k 的值即为所求的答案。,/p4-1-4 #include using namespace std; int main() double r,m,y; int k = 0; cin r m y; while(m = y) m = m * (1 + r / 100); k = k + 1; cout k endl; return 0; ,12,实践巩固,13,第 2 课 do-while 语句,学习目标 1. 熟练掌握 do-while 语句的格式和功能。 2. 体会 do-while 语句与 while 语句的区别。 3. 熟练运用 do-while 语句解决一些实际问题。,14,do-while 语句,do-while 语句是 C+ 中用于解决至少执行一次重复操作(循环体)的循环语句。,15,1. do-while 语句的含义,do-while 语句的格式如下: do 循环体 while(表达式);,其含义为:先执行一次循环体,然后判断表达式是否成立,如果成立,则返回继续执行循环体,直到表达式不成立,才退出循环。一般称之为“直到型循环”。,16,例1、用 do-while 语句实现输出一行 10 个“”。,/p4-2-1 #include using namespace std; int main() int i = 1; do printf( “ ” ); i+; while(i = 10); return 0; ,17,例2、统计正数,【问题描述】 用 do-while 语句实现:输入若干整数,以 0 结尾,统计其中有多少个正整数。 【输入格式】 一行若干整数,最后一个为 0。 【输出格式】 一行一个整数,表示输入的数据中正整数的个数。 【样例输入】 3 6 -3 2 0 【样例输出】 3,18,/p4-2-2 #include using namespace std; int main() int x,s = 0; do cin x; if(x 0) s+; while(x != 0); cout s endl; return 0; ,19,例3、投资收益,【问题描述】 小华在去年赚了一大笔钱!他想把这些钱用于投资,并对自己能得到多少收益感到好奇。 已知投资的年利率为 r(020 之间的整数),小华现有 m 元钱。他想知道投资多少年后,他的钱将会超过 y 元。要求用 do-while 语句实现。 【输入格式】 一行三个整数r、m和y,相邻两个整数之间用一个空格隔开。m为1001000000之间的整数。 【输出格式】 一行一个整数,即要投资的年数。保证答案的范围在 1400 之间。,20,【样例输入】 5 5000 6077 【样例输出】 4,/p4-2-3 #include using namespace std; int main() double r,m,y; int k = 0; cin r m y; do m = m * (1 + r / 100); k = k + 1; while(m = y) cout k endl; return 0; ,21,例4、数字和,【问题描述】 输入一个正整数,输出它的各位数字之和。 【输入格式】 一行一个正整数,int 范围以内。 【输出格式】 一行一个正整数,表示答案。 【样例输入】 258 【样例输出】 15,22,【问题分析】 求一个正整数的各位数字之和,需要“分解”出它的每一位数字,每次进行累加。定义累加器 s,初始化为 0。对于正整数 n,分解的过程就是从低位到高位,不断求余累加(s += n % 10)和整除(n = n / 10),直到 n 等于 0。,23,/p4-2-4 #include using namespace std; int main() int n,s = 0; scanf( “ %d ” , ,24,实践巩固,25,第 3 课 for 语句,学习目标 1. 熟练掌握 for 语句的格式、功能和应用场合。 2. 学会用 for 语句改写 while 和 do-while 语句。 3. 熟练应用 for 语句解决一些实际问题。,26,for 语句,如果重复执行的操作(循环体)次数是固定的、已知的,则一般使用 for 语句。,for 语句的格式如下: for( 表达式 1; 表达式 2; 表达式 3) 循环体 ,27,例1、用 for 语句实现:输出一行 10 个“”。,/p4-3-1a #include using namespace std; int main() for(int i = 1; i = 10; i+) printf( “ ” ); printf( “ n ” ); return 0; ,28,for 语句写法灵活,上述程序也可以写成:,/p4-3-1b #include using namespace std; int main() int i = 1; for(; i = 10; i+) printf( “ ” ); printf( “ n ” ); return 0; ,29,还可以写成:,/p4-3-1c #include using namespace std; int main() int i = 1; for(; i = 10; ) printf( “ n ” ); i+; printf( “ n ” ); return 0; ,30,例2、斐波那契数列,【问题描述】 斐波那契数列是指这样的数列:第一个数和第二个数都为 1,接下来每个数都等于前面两个数之和。编程输入一个正整数 k,输出斐波那契数列第 k 个数。 【输入格式】 一行一个正整数 k,1k46。 【输出格式】 一行一个正整数,表示斐波那契数列第 k 个数的大小。 【样例输入】 19 【样例输出】 4181 【问题分析】,31,/p4-3-2 #include using namespace std; int main() int k; cin k; int k1 = 1,k2 = 1,k3 = 1; for(int i = 3; i = k; i+) k3 = k1 + k2; k1 = k2; / 迭代法 k2 = k3; cout k3 endl; return 0; ,32,例3、求平均年龄,【问题描述】 给出一个班级里每名学生的年龄(正整数),求所有学生的平均年龄,保留到小数点后两位。 【输入格式】 一行一个正整数 n,表示学生的人数,1n100。 后面 n 行,每行一个正整数,表示学生的年龄,15年龄25。 【输出格式】 一行一个浮点数,保留到小数点后两位。 【样例输入】 2 18 17 【样例输出】 17.50,33,/p4-3-3 #include using namespace std; int main() int n; float s; scanf( “ %d ” , ,34,例4、整数的个数,【问题描述】 给定 k 个正整数,每个数都是大于或等于 1,且小于或等于 10。编程统计其中 1、5 和 10 出现的次数。 【输入格式】 第一行一个正整数 k; 第二行包含 k 个正整数,每两个正整数之间用一个空格隔开。 【输出格式】 第一行为 1 出现的次数,第二行为 5 出现的次数,第三行为 10 出现的次数。 【样例输入】 5 1 5 8 10 5 【样例输出】 1 2 1,35,/p4-3-4 #include using namespace std; int main() int n; int s1 = 0,s2 = 0,s3 = 0; scanf (“%d“, ,36,实践巩固,37,第 4 课 循环嵌套,学习目标 1. 理解循环嵌套的含义。 2. 熟练应用循环语句及其嵌套解决一些实际问题。,38,循环结构的嵌套,循环结构与分支结构的嵌套类似,也可以在一个循环语句的循环体里出现另一个循环语句,不管是 while 语句、do-while 语句还是 for 语句。这样的循环结构称为“循环嵌套”。,39,例1、输出矩形,【问题描述】 输入 n 和 m,输出一个 n 行 m 列的“*”矩形图案。 【输入格式】 一行两个正整数 n 和 m,中间用一个空格隔开,1n、m100。 【输出格式】 输出一个 n 行 m 列的“*”矩形图案。 【样例输入】 3 4 【样例输出】 * * *,40,/p4-4-1 #include using namespace std; int main() int n,m; scanf (“%d %d“, ,【问题分析】 要输出 n 行,所以可以编写一个外层循环,穷举行。然后,在循环体里,还要输出 m 个“*”,所以再嵌套一个内层循环,穷举每一行的“*”个数。,41,例2、数字三角形,【问题描述】 输入一个正整数 n,输出 n 行的数字三角形。其中,第 1 行为数字 1,第 2 行为数字 23,第 3行为数字 456,第 4 行为数字 7890,第 5 行为数字 12345, 【输入格式】 一行一个正整数 n,1n100。 【输出格式】 n 行的数字三角形。 【样例输入】 4 【样例输出】 1 23 456 7890,42,/p4-4-2 #include using namespace std; int main() int n,t = 1; scanf (“%d“, ,43,例3、与 7 无关的数,【问题描述】 一个正整数,如果它能被 7 整除,或者它的某一位上的数字为 7,则称其为“与 7 相关”的数。 现在,请编程求出所有小于或等于 n 的“与 7 无关”的正整数个数。 【输入格式】 一行一个正整数 n,n106。 【输出格式】 一行一个整数,表示答案。 【样例输入】 21 【样例输出】 17,44,/p4-4-3 #include using namespace std; int main() int n,ans = 0; cin n; for(int i = 1; i = n; i+) int flag1 = 1, flag2 = 1; if(i % 7 = 0) flag1 = 0; int x = i; while(x ,45,实践巩固,46,第 5 课 break 和 continue 语句,学习目标 1. 理解 break 语句和 continue 语句的作用。 2. 学会使用 break 语句和 continue 语句。,47,break 和 continue 语句,在循环结构中,有时需要提前跳出循环体,或者忽略本次循环的后续语句而去执行下一次循环。为此,C+ 提供了 break 语句和 continue 语句。,48,1. break 语句,在循环体中遇到 break 语句,就会立刻跳出循环体,执行循环结构后面的语句。,例 1、与 7 无关的数。 【问题描述】 一个正整数,如果它能被 7 整除,或者它的某一位上的数字为 7,则称其为“与 7 相关”的数。现在,请编程求出所有小于或等于 n 的“与 7 无关”的正整数个数。 【输入格式】 一行一个正整数 n,n106 。 【输出格式】 一行一个整数,表示答案。 【样例输入】 21 【样例输出】 17,49,【问题分析】 判断 x 中是否有数字 7 的时候,一旦出现“x % 10 = 7”,则说明 x 是与 7 相关的数,就可以用 break 语句立刻退出当前的 while 循环,这样可以提高程序的效率。,50,/p4-5-1 #include using namespace std; int main() int n,ans = 0; cin n; for(int i = 1; i = n; i+) int flag1 = 1,flag2 = 1; if(i % 7 = 0) flag1 = 0; int x = i; while(x) if(x % 10 = 7) flag2 = 0; break; x = x / 10; if(flag1 ,51,2. continue 语句,在循环体中遇到 continue 语句,就会忽略本次循环的后续语句而去执行下一次循环。,例 2、与 7 无关的数。 【问题描述】 一个正整数,如果它能被 7 整除,或者它的某一位上的数字为 7,则称其为“与 7 相关”的数。 请编程求出所有小于或等于 n 的“与 7 无关”的正整数个数。 【输入格式】 一行一个正整数 n,n106 。 【输出格式】 一行一个整数,表示答案。,52,【问题分析】 当 i 是 7 的倍数,即“i % 7 = 0”时,说明 i 已经是与 7 相关的数了,此时,就不再需要判断 i的某一位是否是 7 了。所以,可以用 continue 忽略本次循环的后续语句,而去执行下一次循环,判断下一个数了。这样做同样可以提高程序的效率。,【样例输入】 21 【样例输出】 17,53,/p4-5-2 #include using namespace std; int main() int n,ans = 0; cin n; for(int i = 1; i = n; i+) int flag = 1; if(i % 7 = 0) continue; int x = i; while(x) if(x % 10 = 7) flag = 0; break; x = x / 10; if(flag) ans+; cout ans endl; return 0; ,54,3. break 语句和 continue 语句的应用举例,例3、素数的判定 【问题描述】 输入一个正整数,判断其是否为素数。如果是,则输出“prime”;否则,输出“not prime”。 【输入格式】 一行一个正整数 n,2n107 。 【输出格式】 一行一个字符串。 【样例输入】 8 【样例输出】 not prime,55,/p4-5-3 #include #include using namespace std; int main() int x; cin x; for(int i = 2; i = sqrt(x); i+)/ 或者 i*i =x if(x % i = 0) cout “ not “ ; break; cout “ prime ” endl; return 0; ,56,例4、素数的统计,【问题描述】 输入两个正整数 m 和 n,判断 m 和 n 之间(含 m 和 n)一共有多少个素数。 【输入格式】 一行两个正整数 m 和 n,2mn104 。 【输出格式】 一行一个整数,表示素数的个数。 【样例输入】 5 10 【样例输出】 2,57,/p4-5-4 #include include using namespace std; int main() int m,n,i,j,ans = 0; cin m n; for(i = m; i = n; i+) for(j = 2; j sqrt(i); j+) if(i % j = 0) break; if(j sqrt(i) continue; ans+; cout ans endl; return 0

温馨提示

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

评论

0/150

提交评论