循环结构与数组PPT课件_第1页
循环结构与数组PPT课件_第2页
循环结构与数组PPT课件_第3页
循环结构与数组PPT课件_第4页
循环结构与数组PPT课件_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

循环结构与数组 循环结构 循环控制结构为计算机程序描述重复计算提供控制手段 一个循环控制结构需指明以下三件事情中的两件 被循环执行的语句 是否循环的条件 详细指明循环方式 在PASCAL语言 用while repeat和for三种语句描述循环控制结构 例 求S 1 2 3 100的值 分析 用S统计所有的和 如果每次加一个数值 需要做100次赋值 从上面的语句可以看出 上述这100个赋值语句有一个共同的特点 都可以抽象成S S i的形式 其中i从1变化到100 为了简化程序设计 因此有必要采用可以用来重复运行某些语句段的程序结构 这就是循环结构 计数循环 For语句 For语句有两种形式 它们的格式分别是 1 递增循环 for控制变量 todo 2 递减循环 for控制变量 downtodo For循环语句使用说明 1 我们一般把表达式1称为记数循环的初值 表达式2称为记数循环的终值 2 for语句中的初值 终值 控制变量的数据都必须是顺序类型 且类型赋值相容 3 当初值和终值确定后 循环的次数就确定不变了 并且在重复语句内不能对控制变量施加任何赋值操作 4 Do后面的语句可以是任何一种语句 我们一般称其为循环体 例 求S 1 2 3 100的值 程序代码段 Vari s integer beginS 0 Fori 1to100dos s i Writeln s s End 分析 用S统计所有的和 如果每次加一个数值 需要做100次赋值 从上面的语句可以看出 上述这100个赋值语句有一个共同的特点 都可以抽象成S S i的形式 其中i从1变化到100 为了简化程序设计 因此有必要采用可以用来重复运行某些语句段的程序结构 这就是循环结构 例 按正 反两种顺序输出26个大写英文字母 varch char beginforch A to Z dowrite ch writeln forch Z downto A dowrite ch end 例 Nocomachns定理 任何一个n3一定可以表示成n个连续的奇数和 输入n n 100 输出n3对应的表达式 vari n a longint 循环变量 连续的奇数个数 当前项 类型为长整型 beginreadln n 输入连续的奇数个数 a n n 1 1 计算最小奇数 fori 1ton 1do 输出表达式的前n 1项 beginwrite a a a 2 end writeln a 输出第n项 readln end main 例 百鸡问题 一只公鸡值5钱 一只母鸡值3钱 而1钱可买3只小鸡 现有100钱 想买100只鸡 问可买公鸡 母鸡 小鸡各几只 我们通过两重for循环枚举出公鸡和母鸡的所有可能只数 在确定当前公鸡只数为i 母鸡只数为j的情况下 计算小鸡只数k 100 i j 然后通过下述布尔表达式i 5 j 3 k 3 100判断当前100只鸡的总价值是否为100钱 如果是 则输出i j和k vari j k integer beginfori 1to20doforj 1to33dobegink 100 i j ifi 5 j 3 k 3 100thenwriteln i 5 j 5 k 5 end for readln end main FOR循环上机练习题 1 求N 1 2 3 N N 7 2 找出100以内所有被2 3 5除余数均为1的数3 求100 999之间的所有水仙花数 所谓水仙花数 是该数等于它各位数字的立方和 例如 153 13 53 33 习题一参考程序vari n integer sum integer beginwrite inputn readln n sum 1 fori 1tondosum sum i writeln n sum end 习题2参考程序vari n s integer beginfori 1to100doif imod2 1 and imod3 1 and imod5 1 thenwriteln i end varm a b c integer beginform 100to999dobegina mdiv100 b m a 100 div10 c mmod10 ifa a a b b b c c c mthenwriteln m endend 条件循环 For循环语句适用于已知次数的循环结构 但有时我们判断是否结束循环的依据是某个条件是否满足 比如 当 时就做 或者是 一直做到 时为止 这种循环我们称之为条件循环 在Pascal中条件循环语句有两种 分别是While循环语句和Repeat循环语句 接下来我们就分别介绍这两种语句的使用方法 while语句 while语句用于 当满足某一条件时进行循环 的情况 因此它也被称为 当型循环 while语句的语法格式如下 whiledowhile循环语句的执行流程如图 While语句使用说明 1 当布尔表达式为true则执行循环体 若为false 则根本不进入循环体 2 如果一开始布尔表达式的值就为假时 while循环就会一次循环体都不执行 3 相反的 如果布尔表达式永远是真的 那么循环就无法结束 从而成为 死循环 为了避免这种情况的发生 在循环体中就一定要有能改变布尔表达式结果的操作 repeat语句 Repeat语句用于 重复执行循环体 一直到指定的条件为真时为止 的循环结构 它又被称为 直到型循环 Repeat语句的语法格式为 repeat循环体语句until布尔表达式repeat循环语句的执行流程见图 Repeat语句使用说明 1 先执行循环体 然后判断当布尔表达式的值 为false 则继续循环 为true则终止循环 2 为了能使repeat循环重复能终止 与while循环一样 循环体中一定要有影响布尔表达式的操作 否则该循就是一个死循环 3 与while循环不一样的是 repeat循环不管布尔表达式是否成立 都会至少执行一次循环体 另外需要说明的是 由于while循环与repeat语句都属于条件循环语句 因此一般可以将这两种语句互相转换 而具体使用哪条语句时要看实际情况决定 例 求某年后的第n n 1 个闰年 输入y和n输出y年后第n个闰年的年号 题解若y能被4整除但不能被100整除或y能被400整除 则y是闰年 由此得出判断y是闰年的布尔表达式 ymod4 0 and ymod1000 or rmod400 0 开始时逐年判断 一旦确定y年为闰年的话 则下一个闰年为y 4 s s 1 即每相隔4年后才可能有一个闰年 因此设步长变量s 初值为1 当找到第一个闰年后 s改为4 vary n s integer 年号 间隔的闰年数 布长值 beginwrite beginingyearandnumbers readln y n 输入年号和间隔的闰年数 s 1 步长值初始化 repeatif ymod4 0 and ymod1000 or ymod400 0 thenbegin 若y是闰年 则输出年号 writeln y year s 4 步长值设为4 end then Until end main vary n s integer beginwrite beginingyearandnumbers readln y n s 1 whilen 0dobeginif ymod4 0 and ymod1000 or ymod400 0 thenbeginwriteln y year n n 1 s 4 end then y y s endEnd n n 1 间隔的闰年数 1 y y s 移至s年后 n 0 直至输出了n个闰年为止 例 计算Sum 1 3 5 n n为大于1的奇数 求当Sum 10000时 n的最大值 Varn sum integer beginwrite inputaodddata sum 0 n 1 writeln sum end whilesum 10000dobeginsum sum n n n 2end repeatsum sum n n n 2untilsum 10000 拓展 若求当SUM M时 n的最大取值呢 输入设定的M 讲循环条件中的固定值10000 更改成M 循环使用的一些说明 循环的强制终止一般来说 只要循环的条件及循环体描述得当 循环都能顺利结束 不会产生死循环的 有时在程序运行中会有一些特殊的情况 需要终止当前循环的执行 如果将这个条件写到循环体外有不太方便 这时可以使用break来强制终止当前循环的执行 While与Repeat语句对比while和repeat语句一般情况下可以相互替换 它们的主要区别是 while是先判断后执行 而repeat是先执行后判断 因此while语句的循环体有可能一次也不执行 而repeat语句至少执行一次 前者是当条件满足时执行 而后者是当条件不满足时执行 前者的循环体是复合语句时要用begin end 而后者却不一定要用 条件控制循环练习 1 输入一串字符 以 结束 输出其中小写字母个数与数字个数 2 从2开始 输出50个素数3 利用泰勒公式求e的值 直到最后一项小于10 7为止 泰勒公式如下e 1 1 1 1 2 1 3 1 n varch char n1 n2 integer beginn1 0 n2 0 read ch whilech dobeginif ch a and ch 0 and ch 9 thenn2 n2 1 read ch end writeln numberofletter n1 writeln numberofdigit n2 end Varn I j integer flag boolean Beginn 2 i 1 whilei 50dobeginflag false j 2 whilej trunc sqrt n dobeginend ifnmodj 0thenbeginflag true break j j 1 end ifflag falsethenbeginwrite n 4 if Imod10 0 thenwriteln i i 1 end n n 1 end End vare p real i integer begine 1 p 1 i 1 repeatp p i e e p i i 1untilp 1e 7 writeln e e end 利用循环输出各种规则图形 任意输入一个大写的英文字母 按菱形的方式输出 图为输入D时的显示结果 AABAABCBAABCDCBAABCBAABAA varpos integer ch chi chj char beginwriteln Pleaseinputaletter read ch pos 26 forchi A tochdobeginwrite pos forchj A tochidowrite chj forchj pred chi downto A dowrite chj pos pos 1 writeln end pos pos 1 forchi pred ch downto A dobeginpos pos 1 write pos forchj A tochidowrite chj forchj pred chi downto A dowrite chj writeln endend 利用循环输出各种规则图形 对于平面规则图案的输出 一般用一个两重循环来实现 在实现时我们主要从以下几个方面来考虑 有多少行 一般用外循环来控制 1 每一行的起始位置跟行有什么关系 通常是用write 有关行的表达式 的形式来控制输出的空格数 2 每一行有多少个输出项 列 用内循环来控制输出 3 具体一个输出项跟行 列有什么关系 直接输出相关输出项有关行和列的表达式 数组 在代数上我们常常这样写 a1 a2 ai a100 0 i 101 通过i来指明具体的ai 如i 10时代表a10 在pascal语言里我们也希望能够类似地描述 从前面的变量名里我们已经知道 a1 a2 ai彼此之间是相互独立的 并没有必然的联系 如要象代数上那样 可以使用数组 数组其实是一组相同值类型的变量的集合 这些变量共用一个名 彼此之间通过下标来区别 如定义了数组a 它的下标可以从1到100 那么就可以直接通过a i 来指明第i个量 如i 10 a i 指的是a 10 数组的说明可以先通过type标识符 array 下标范围 of值类型 然后再在变量说明里引用 如 typearray1 array 1 100 ofinteger vara b array1 也可以直接在变量说明里说明 变量名 array 下标范围 of值类型 如 vara b array 1 100 ofinteger 描述下标范围一般通过离散 有序 类型 如从一个整数到另一个整数 或者从一个字符到另一个字符等 如 vara array 5 5 ofinteger c array 1 20 ofchar d array a z ofinteger 数组元素值类型本身也可以是复杂的自定义类型 如子界类型 数组类型 记录等 例 用筛法求100以内的素数 分析 素数是除了1和它本身以外没有其它约数的数 用筛法求素数的方法是 用质数筛去合数 从第一个素数2开始 把它的倍数去掉 这样2以后的第一个非0数就一定也是素数 把它的倍数也删了 重复这个删数过程 直到在所找到的素数后再也找不到一个非0数 把所有非0数输出 vara array 1 100 ofinteger i j k integer beginfori 1to100doa i i a 1 0 i 2 whilei 100dobegink i whilek 100do begink k i a k 0 end 上面将所有a i 的倍数清0 i i 1 whilea i 0doi i 1 查找接下来的第一个非0数 end fori 1to100doifa i 0thenwrite a i end 例 计算灯的开关状态 有N个灯放在一排 从1到N依次顺序编号 有N个人也从1到N依次编号 1号将灯全部关闭 2将凡是2的倍数的灯打开 3号将凡是3的倍数的灯作相反处理 该灯如为打开的 则将它关闭 如关闭的 则将它打开 以后的人都和3号一样 将凡是自己编号倍数的灯作相反处理 试计算第N个操作后 哪几盏灯是点亮的 0 表示灯打开 1 表示灯关闭 题解设布尔数组a为n盏灯的状态 初始时 所有的灯打开 即a数组的每一个元素设为false 然后依次将每盏灯序号的倍数作取反处理 由此得出的a数组元素的序数值即为最后的灯状态 vark n i j integer a array 1 100 ofboolean N盏灯的状态 beginreadln n 读入灯的数目 fori 1tondoa i false 初始时所有灯打开 fori 1tondo 依次进行n次操作 beginj i 从第i号队员出发进行第i次操作 whilej n

温馨提示

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

评论

0/150

提交评论