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

下载本文档

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

文档简介

高级语言程序设计 第4章迭代与重复 循环程序设计 2 要解决的问题 3 简单的学生成绩管理4 计算2的算术平方根 问题3 简单的学生成绩管理 问题描述 设有一教师承担了一个班的某门课程的教学工作 在一次测试或考试之后 教师通常要计算他所教的班级的学生该课程的平均成绩值 试给教师写一个统计平均成绩的程序 要求 样例输入1 656565 1样例输出1 65 0样例输入2 100100100100 1样例输出2 100 0 极端的样例 样例输入3 1样例输出3 无 分析 写程序的时候知道将来老师教的班级有多少学生吗 可以在程序运行时询问老师有多少学生教师首先输入学生人数然后再输入每个学生的成绩也可以不询问学生数 任凭他输入 一直到输入完为止 但是用户要通过一个特别的值 1或Ctrl z告诉计算机已经输入完毕教师不需要输入人数 只需输入每个学生的成绩学生数通过统计获得两种方式 具体算法不同 算法设计 1 在程序运行时询问老师有多少学生 0 1 输入学生数n2 循环输入n个学生的成绩 累加求和3 求平均值4 输出结果 算法 1 的实现 大家自己写出代码 算法 2 不询问学生数 任凭输入 一直到输入 1为止 希望能统计任意多的学生成绩 在用户需要停止的时候 通过输入一种特别的信息 1告诉程序 已经没有数据了这个特殊的信息是什么呢 对于成绩数据来说 用 1即可 把它称之为标记 或哨兵 算法设计 2 1 求和变量和计数变量初始化为02 输入学生成绩或标记3 如果没输入标记 执行 4 否则 5 4 统计人数 累加成绩 返回到 2 5 如果人数不为0 计算平均值6 输出结果 算法 2 的实现 includeintmain void inttotal 0 intnumber 0 intgrade floataverage scanf d 标记控制的while循环 用户输入信息while 用户输入的不是标记 重复执行一些语句用户输入信息 其它语句 用户输入信息有两处 一个在循环外 一个在循环内如果第一次就输入了标记 这时一次循环都不会做 如果第一次输入的不是标记 进入循环 在循环体内如果某一次输入了标记 就不再执行循环了 否则就继续循环 用户输入的成绩是非数字字符时怎么处理 intflag scanf d 但是如果用户输入的小数如76 5 grade会从缓冲区中读出76 返回状态值为1 如果我们接收这个输入的话 缓冲区中剩余的 5还会被下一次scanf读出 还会出错 为了避免这个现象 用fflush stdin 语句清除输入缓冲区 也称刷新缓冲区 具有一定容错能力的输入语句 输入标记 哨兵值可以终止循环输入特殊的字符也可以终止循环CTRL Z 算法设计 3 1 求和变量和计数变量初始化为02 输入学生成绩或CTRL Z3 如果没输入CTRL Z 执行 4 否则 5 4 统计人数 累加成绩 返回到 2 5 如果人数不为0 计算平均值6 输出结果 算法 3 的实现 includeintmain void inttotal 0 intnumber 0 intgrade intflag floataverage flag scanf d 输入CTRL Z回车函数scanf d grade 返回EOFEOF代表文件输入结束 它是一个符号常量 它的值就是 1 但它是当用户输入CTRL Z回车时scanf函数的返回值 不是grade变量的值注意标记值和scanf函数返回值的区别 算法设计 3 的另一个版本 1 求和变量和计数变量初始化为02 输入学生成绩或文件结束符ctrl z3 如果没输入ctrl z 执行 4 否则 5 4 统计人数 累加成绩 返回到 2 5 如果人数不为0 计算平均值6 输出结果 算法 3 的实现 includeintmain void inttotal 0 intnumber 0 intgrade floataverage while scanf d 数据输入 输出的扩展 当数据很多时怎么输入 输入一次需要比较多的时间 你希望多次重复的输入吗 当输出结果数据比较多而且需要多次使用时 你希望多次运行吗 怎么样才能一次输入多次使用呢 一次输出多次使用呢 把数据事先存储到文件中 输出结果也保存到一个文件中 输入输出重定向 命令行 标准输入 stdin 和标准输出 stdout 默认的是键盘和屏幕可以重定向到普通的数据文件例如平均成绩统计程序scoreAverage exe运行时默认是从键盘stdin读成绩数据可以重定向到从文件test dat读数据 即scoreAverage exe test dat scoreAverage运行结果输出到屏幕也可以重定向到文件result dat即scoreAverage exe result dat把两步合在一起 scoreAverage exeresult dat先从文件test dat获得输入再把输出结果写到文件result dat中 演示 首先准备输入数据文件test dat在命令窗口输入 scoreAverage exeresult dat 输入输出重定向 程序行 在程序中通过freopen data in r stdin 把标准输入stdin重定向到文件data in通过freopen data out w stdout 把标准输出stdout重定向到文件data out 例 includeintmain void inttotal 0 intnumber 0 intgrade doubleaverage freopen data in r stdin freopen data out w stdout scanf d 问题4 计算2的算术平方根 问题描述 计算2的平方根的近似值 一般只求正平方根 要求精确到第3位小数 样例输入 无样例输出 1 414 分析 问题可以转换为求方程x2 2的一个正根 即求方程x2 2 0的根 若令f x x2 2 那么方程的根就是满足函数f x 0的x 怎么求得满足f x 0的x呢 从图中可以看到x就是曲线与x轴的交点 牛顿迭代法 切线法 给一个初始值xn 求出曲线f x 在点 xn f xn 处的切线 切线与x轴的交点作为根x的一个近似值xn 1即 是曲线f x 在点 xn f xn 处的切线斜率 注意 f x x2 2在xn处的斜率为2xn 设初值x0 则x x0 2 x0 2x0 x 重复上述迭代过程 设x0 10 代人迭代公式计算x x0 2 x0 2 1得x 5 1 令x0 x 再代入迭代公式x x0 2 x0 2 2得x 2 746 令x0 x 再代入迭代公式x x0 2 x0 2 3得x 1 737 令x0 x 再代入迭代公式x x0 2 x0 2 4得x 1 444 令x0 x 再代入迭代公式x x0 2 x0 2 5得x 1 414 令x0 x 再代入迭代公式x x0 2 x0 2 6得x 1 414 这个迭代计算应当重复到什么时候呢 迭代条件 x x0 0 001 eps 0 001 算法设计 1 x0初始化2 用迭代公式x x0 2 x0 2计算出x3 如果fabs x x0 eps 执行 4 否则 5 4 x0 x 新x0 返回到 2 5 输出结果 算法实现 include includeintmain void doublex0 10 doublex constdoubleeps 0 001 intk 1 x x0 2 x0 2 while fabs x x0 eps x0 x x x0 2 x0 2 k printf 3f n x return0 误差精度控制的while循环 x0初始化用迭代公式计算xwhile fabs x x0 eps x0 x 新x0用迭代公式计算x const常量定义说明符例如定义PI为圆周率 intr 10 ints constdoublePI 3 1415926 S PI r r 误差的绝对值 fabs x x0 epseps是一个常量fabs是求一个数的绝对值函数 求e

温馨提示

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

评论

0/150

提交评论