4迭代与重复-循环程序设计4-2.ppt_第1页
4迭代与重复-循环程序设计4-2.ppt_第2页
4迭代与重复-循环程序设计4-2.ppt_第3页
4迭代与重复-循环程序设计4-2.ppt_第4页
4迭代与重复-循环程序设计4-2.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、高级语言程序设计,第4章 迭代与重复循环程序设计(4),今天讨论的题目,判断一个数是否是素数 再次讨论学生成绩统计问题 猜数游戏模拟,目标,break/continue 自顶向下逐步求精的分析设计方法 随机数的产生,随机现象的模拟仿真,问题1 :判断一个数是否是素数,问题描述:从键盘输入一个自然数,判断它是否是素数,是素数输出1,否则输出0. 样例输入1: 2 样例输出1: 1,样例输入2: 1 样例输出2: 0 样例输入3: 4 样例输出3: 0,如果是这样的测试用例?,样例输入: 2 1 4 0 样例输出: 1 0 0,分析,什么是素数?素数也称质数,是只有1和自身两个因数的自然数. 1不

2、是素数,2是最小的素数 怎么判断自然数m是否是素数呢? 方法1:依次用2到m-1的数作为除数,判断它是否能整除m。 方法2:依次用2到sqrt(m)的数为除数,判断它是否能整除m。,怎么控制循环?,对于方法1: im, (其中i是循环控制的计数器,循环控制变量,m是要判断的数)i初始化为2 对于方法2: i=k,(其中k是要判断的数m 的算术平方根) (下面只考虑这种情况),i初始化为2,算法设计(关于方法2),1 循环控制变量i初始化2 2 输入一个自然数m,并求它的算术平方根k 3 如果 m=1 则输出0 执行(7) 4 如果 ik 输出1 否则输出0 7 结束,流程图,循环有两个出口:

3、1) 对所有的i 都不能整除m,m一定是素数; 2)如果某个i=k能整除m,m必然不是素数。,break语句,如果先不考虑用户输入1的情况,实现代码为,再次讨论成绩统计问题,问题描述:循环接收用户键盘输入的有效学生成绩并累加求和,如果输入的数据超出了0到100的范围,则忽略它,如果输入一个非数值型数据则结束输入,打印求和结果和平均结果。 输入样例 60 60 60 -1 60 110 a 输出样例 ok ok ok err ok err average of 4 scores is 60.0,算法设计,流程图,能够读到数据就是正确的,scanf函数返回0没读到,继续做下一次循环,continu

4、e语句,算法实现,continue0.c,思考题:输入CTRL-Z结果怎样?能结束吗?输入-1又怎样?,思考题:break/continue破坏了程序的单入口单出口的结构化特征,不用break/continue是否 可以实现同样的效果?,break语句只适用于标准的循环和多分支选择结构,continue也只能用于标准的循环结构中 ,它们一般都是有条件的,无条件转移语句goto,一般形式 goto 语句标号; 语句标号: 语句标号:可以在goto语句的前面,判断素数问题用goto取代break,见代码 goto0.c,更多的goto,见代码 goto.c,问题3:随机数游戏模拟,问题描述: 计算

5、机“想”好一个1到100之间的数,你来猜,如果没猜中给出提示,是大了还是小了。如果猜中输出祝贺信息!问是否继续猜? 假设计算机“想”的数是55(这个数是随机的),输入样例: 50 60 55 输出样例: too low too high Congradulation! you are right! 继续否?,再如:碰运气游戏,游戏者每次投掷两个骰子,把两个朝上的点数相加。第一次投掷时如果得到的和为7或11,游戏者就赢了;如果得到的和为2、3或12游戏者就输了(即计算机这个“东家”就赢了);如果得到的和为4、5、6、8、9或10,那么这个和就作为游戏者的点数,要想赢必须再次投掷,一直到取得自己的

6、点数为止,如果投掷出7点,游戏者就输了。,分析,自顶向下,逐步求精:从抽象到具体,逐步明晰的过程。开始先勾划出求解方案的一个比较粗糙的轮廓,确定一个比较抽象地概念,然后再逐步细化,把抽象的东西逐渐细化到可以实现的具体步骤,算法设计(顶层1),1.1 计算机“想”一个1到100之间的数 1.2 猜数 1.3 是否继续猜?是回到1.1,否结束,计算机怎么想那个数把1.1细化,1.1 使用随机函数rand() 产生一个1100之间的数number rand( )是包含在stdlib库中的一个函数,它能返回一个0到RAND_MAX之间的一个整数,ANSI标准规定RAND_MAX不得小于32767,从s

7、tdlib.h中可以查到它的值就是32767。,怎么猜 把1.2 细化,1.2.1 读用户猜的数guess 1.2.2 判断是否猜中,如果没中,返回到 (1.2.1) 继续猜,否则到(1.2.3) 1.2.3 输出猜中祝贺信息,经过一次求精之后算法细化为:,1.1 使用 rand() 随机产生一个1100之间的数number 1.2.1 读用户猜的数guess 1.2.2 判断是否猜中,如果没中,返回到(1.2.1)继续猜,否则到(1.2.3) 1.2.3 输出祝贺信息 1.3 是否继续猜?是回到1.1,否结束,对1.2.2 判断是否猜中再求精一次,1.2.2.1 如果guessnumber

8、提示 too high 返回到(1.2.1) 1.2.2.2 如果 guessnumber 提示 too low 返回到(1.2.1) 1.2.2.3 如果猜中到1.2.3,最后得到比较精细的算法,1.1 使用 rand() 产生一个1100之间的数 number 1.2.1 读用户猜的数guess 1.2.2.1 如果guessnumber 提示 too high 返回到1.2.1 1.2.2.2 如果 guessnumber 提示 too low 返回到1.2.1 1.2.2.3 如果猜中,转到1.2.3 1.2.3 输出祝贺信息 1.3 是否继续猜?是回到1.1,否结束,用rand()模

9、拟随机现象,int coin,dice; 掷硬币模拟 coin = rand( )%2; 模拟投掷骰子 (dice,读作tou zi) dice = rand( )%6 + 1;,4.7.2 随机数的产生,随机数不随机:伪随机数,如果再运行还会得到相同的结果,怎么才能模拟真正的随机数呢?,想象很多很多真正的随机数已存在,构成了一个随机序列,但是它需要一个种子seed去激活,不同的种子激活不同范围的随机数,只要种子不同,产生的随机数就不同,这样就模拟了真正的随机数。 这个激活过程称为随机化(randomizing),它是用标准库函数srand(unsigned int seed)实现的,它的参数是一个无符号整数,让srand需要的种子自动变化,获得系统时间的

温馨提示

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

评论

0/150

提交评论