




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一份耕耘 一份收获 高级语言程序设计 主讲教师 贾彩燕计算机与信息技术学院计算机科学与技术系cyjia 循环程序设计循环与递归基本输入输出控制结构和控制语句程序设计实例程序测试和排错 主要内容 基本程序设计技术 4 3基本输入输出 深入 Input Output I O通过标准库进行常用函数scanfprintfgetcharputchar需要 include 缓冲式输入若程序要求从标准输入取得信息 如执行scanf 由键盘输入 在按Enter键后程序才能得到输入数据原因是 操作系统通常采用 缓冲式 输入方式 把来自键盘的输入临时保存在 输入缓冲区 操作系统管理下的一块内存区域 里 直至人按了Enter键 才把缓冲区里的数据送给程序 这时scanf等输入函数才能读到数据 程序经常需要输入一批数据 如何解决循环输入中的控制问题 1 格式输入函数scanf 通过计数器控制输入循环如果事先知道需要输入的数据项数 就可以用计数器控制输入循环 includeintmain doublex sum intn for sum 0 n 0 n 12 n printf Enternextdata scanf lf 例 由各月降雨量统计一年总量 假定写程序时不清楚需要输入的数据的确切项数 就无法采用计数循环的简单方法 一种方式是用一个特殊 结束标志 控制循环 该 结束标志 应是一个特殊输入值 具有与输入数据同样的类型 但又不是正常输入数据 让程序在循环中不断检测得到的数据 一旦看到这个特殊数据 就知道用户要求结束了 用特殊结束值控制输入循环 例 计算货物总值 每次输入单价和数量 可考虑用特殊值通知程序数据已输入完 例如用单价为0 includeintmain doubleprice 1 0 amount sum 0 0 while price 0 printf Nextdata priceamount scanf lf lf 循环次数由输入数据决定 用scanf函数的返回值控制输入循环例 假定现在要写程序 求一批输入数据的平均值 如果选0作为 结束标志 而实际数据里有0 这个程序就不能正确处理了 深入理解scanfscanf的返回值是int 它顺序处理格式串根据格式串要求完成输入 转换和对变量的赋值工作正常结束时返回所完成的数据转换项数如果一开始就遇到文件结束 就返回一个特殊符号常量EOF 是一个int值 后面再介绍 如果没处理完整个格式串就失败时 返回已完成的数据转换项数 scanf要求三方面一致 格式串中转换描述 对应参数的类型 运行中提供的数据形式 下面函数调用可能产生三种返回值 scanf lf x 返回1表示成功读入一项数据 并存入了x返回0表示读入数据失败返回EOF值表示遇到文件结束 从文件读或从键盘输入 可通过这种性质控制循环 例 读入一些圆盘半径 算出各圆盘的面积并输出 不知圆盘数 可利用scanf的返回值控制循环结束 includevoidpc area double intmain doublex while scanf lf 可输入Ctrl Z 循环结束 或输入非法数据 如m 遇到文件结束或错误数据时scanf不返回1 如果上面程序遇到输入字母m 转换失败就会导致循环结束 更好的方式是利用标准库定义的符号常量EOF EOF是什么 一般的C系统把EOF定义为 1 它一定不是正数 不会与scanf的其他返回值混淆 默认情况下 标准输入从键盘得到数据 许多系统里可以用Ctrl Z或Ctrl D组合键送入文件结束信息 前面程序运行时 如果按了这种组合键 scanf就会返回EOF并导致循环结束 如果把标准输入定向到某个文件 在读完文件里所有数据后scanf就会返回EOF值 从系统中的命名文件读入 设源程序是count c 编译结果是count exe 用命令行方式启动程序 将标准输入定向到文件 设被统计文件是input txt countoutput txt D countoutput txt 标准输入与文件OS允许标准输入重新定向 将标准输入定向到文件可使文件成为getchar或scanf的输入源 程序里不必区分实际输入来自键盘还是实际文件 处理连续输入时 这两者没有本质差别 在后面的讨论和例子里 将直接说程序从文件读入等 而实际写的是从标准输入 标准输入文件 读入 对于标准输出也类似 有时需要由特定的命名文件输入 或者向特定命名文件输出 第八章讨论文件处理 例 统计一批输入数据的个数和最小值 最大值 平均值 循环读入数据 并完成统计工作 两个变量记录已知的最小 最大值 读数据中考虑更新 使其保存已读数据的最小最大值 一个变量记录数据个数 一个变量记录读入数据之和 问题 如何得到最大值和最小值的变量的初始值 下面程序假定最少有一个输入数据 用读入的第一个数据作为最大和最小变量的初始值 例 统计一批输入数据的个数和最小值 最大值 平均值 includeintmain doublesum 0 0 biggest smallest x intcount 1 scanf lf 关于输入循环的总结要输入一批数据时 可根据情况采用不同方式控制循环 主要有三种控制方式 1 程序内部自主控制 根据程序内部情况决定循环继续或终止 是否继续读入 缺点是难以处理事先不清楚项数的输入数据 2 从输入数据类型里选一个特殊值作为结束标志值 程序使用者可用它通知程序输入结束 缺点是有时难以找到合适的结束标志值 3 通过输入函数的返回值 控制循环的继续或结束 for sum 0 n 0 n 12 n printf Enternextdata scanf lf while price 0 printf Nextdata priceamount scanf lf lf while scanf lf 课后作业1 学生成绩管理系统 输入计科0905班 利用scanf的返回值控制输入的学生人数 高级语言程序设计的学生成绩 并统计该门课的平均分 最高分 最低分和不及格的人数 考虑用简单菜单方式管理程序 并设计函数实现相关功能模块学生成绩可来自标准输入 键盘 学生成绩来自成绩文件score txt score txt中存放所有学生成绩 getchar无参函数 从标准输入 键盘 读一个字符 返回字符的编码值 getchar的类型特征 intgetchar void 典型使用 输入的字符赋给变量c c getchar 没有输入数据时getchar等待 直到人输入字符 并换行 2 字符I O函数getchar和putchar 注意getchar的返回值类型是int 例 写程序把由输入的一个字符输出并换行 includeintmain intc charc c getchar putchar c putchar n return0 putchar把一字符送到标准输出 putchar O putchar K 两字符送到标准输出 使字符显示在屏幕上 输入一系列字符假设要由标准输入得到的多个字符送到标准输出 需要反复读入 输出字符 如何处理 while c getchar putchar c 怎样描述循环条件 首先要问的是 希望在什么条件下结束循环 两种可能 1 程序内部确定 与实际输入无关 例如用计数器 读入若干个字符后结束 includeintmain 读10个字符 输出各个字符的编码 intc n for n 0 n 10 n c getchar printf d n c return0 2 根据实际输入决定 循环条件与输入有关 得到满足条件的输入时结束循环 例 输入读一行 输出各字符的编码 includeintmain intc while 1 循环执行多少次由输入行包含多少字符确定 c getchar if c n break printf d c return0 也可要求遇到其他字符结束 何时结束是一种约定 处理任意的输入字符 标准库定义了符号常量EOF EndOfFile 文件结束 getchar遇文件结束返回EOF 由键盘输入文件结束 用Ctrl Z送文件结束信息 如果标准输入定向到文件 getchar就会从文件读 文件读完时返回值EOF EOF是什么 一般系统定义为 1 具体值并不重要 程序里只需判断输入函数的返回值是否与EOF值相同 while c getchar EOF 对输入的实际处理 注意 赋值操作有值 注意加括号 EOF的值不能与任何字符编码相同 getchar返回int若getchar返回给char变量 可能无法给出EOF值 如果用char变量 值超出char范围时结果无定义charch EOF 1 while ch getchar EOF 总结 正常情况下getchar返回读入的字符 遇文件结束返回EOF值 应该用int变量接收getchar的返回值 以保证正确判断输入结束 例 统计 由标准输入得到的 文件中的字符个数 includeintmain intc longn 0 while c getchar EOF n printf ld n n return0 标准输入默认连接到键盘 程序执行到getchar等待输入 得到输入后处理 用Ctrl Z发信息可使循环结束 输入函数的返回值程序可分为两类 一类自主运行 产生结果后结束 另一类不断与外界交流 交互式程序 交互式程序时应设法处理各种可能情况 特别需要获得有关输入情况的信息 以便恰当处理 标准输入函数用返回值说明执行情况 如scanf返回int值 指明完成转换项数 遇文件结束返回EOF 若程序要求输入三个整数 一种写法 while scanf d d d 吃掉一行字符 printf Pleaseenteraninteger scanf d i 如果n输入错误导致for循环没有保证 printf Pleaseenteraninteger while scanf d i 解决的办法 for i 0 i 5 if i 5 处理输入不正确的情况 intiread intn 0 scanf d 定义三个无参数输入函数 使用 doubles dread 不能处理输入不正确的情况 例 若把上面程序中循环的条件部分改为 while scanf lf x EOF 如果执行时输入字母m 程序进入无穷循环 为什么 考虑函数scanf的返回值 include 求圆盘面积 voidpc area doubler 定义略 intmain doublex while scanf lf 什么情况下循环结束 课后作业2 输入若干字符 ctrl Z结束输入 分别统计出英文字母 空格 数字和其它字符的个数 循环程序设计循环程序的问题循环与递归基本输入输出控制结构和控制语句程序设计实例程序测试和排错 主要内容 基本程序设计技术 4 4其它控制结构和控制语句 goto语句goto语句 转移语句 转跳语句最老的控制语句 现在已很少用 许多语言仍提供 goto语句与标号配合 实现函数体内的任意控制转移 标号可写在任何语句前面作为goto的目标 形式是 标号名 语句标号名是标识符 goto语句的形式 goto标号名 作用 语义 使控制转到标号处继续执行 break continue是受限的goto 实现固定方式的控制转移 循环和分支也是goto的包装 FORTRAN就有goto语句 无节制地用goto写程序 费解 常带有难发现的错误 1968年荷兰计算机科学家Dijkstra 迪杰斯特拉 撰文 goto是有害的 六年大辩论的结果是结构程序设计革命 语言都引进 标准 控制结构 教育和实践中提倡结构化程序设计 对goto的认识 不用或尽量少用 大部分goto实际上是为构造条件或循环 1 向前转跳 循环 2 向后转跳 条件 label gotolabel gotolabel label 用循环或条件重写的程序更清晰易读 不容易有错 随便使用goto是不良编程习惯 不合理的goto表明对问题欠分析 没做好流程分解 函数抽象等 写的是不成熟的程序 合理的使用情况之一 从多重循环的内部直接退出 循环程序设计循环程序的问题循环与递归基本输入输出控制结构和控制语句程序设计实例程序测试和排错 主要内容 基本程序设计技术 4 5程序设计实例 例1 简单交互式计算器 假定它可以输入并计算 128 365254 143810313 524输入一行算一个结果 直至用户要求结束 基本思想 while 还有输入 取得数据计算并输出 用scanf读数据 用文件结束或非数字表示输入结束 includeintmain intleft right printf Smallcalculator n printf Anyno digitcharactertostop n while scanf d 例2 单词计数问题正文文件可看成字符序列 空白字符 空格 制表符 t 换行符 n 把序列分隔为一个个 单词 要求写程序统计文件中的单词个数 需要一个计数器 遇到一个词将计数器加一 考虑用函数getchar读字符 程序主要部分的框架 while 文件未结束 遇到一个词时计数器加一 打印统计信息 用getchar输入 很容易判断文件结束 问题是如何确定 遇到了一个词 若读的字符是单词首字符 则计数器加一 读入字符过程中需要区分是否空白 问题 非空白字符未必是词的开始 是否新词要看前一字符是否空白 前后关系分两种情况 1 读到空白 随后遇非空白字符就是新词 2 读到非空白 随后不会遇到新词 两种状态 1 读在词外 遇到非空白是新词 2 读在词内 在读入字符的过程中读入状态也不断转换 典型 可以用有限状态转换系统 自动机 描述 IN OUT 词里 词外 表示两种读入状态 在从OUT转换到IN时 遇到新词 计数 用变量state记录状态 令其值为IN OUT 只要求这两个值不同 不会同时处在两种状态 一个字符 假设存在变量c 的处理可描述为 if c c t c n if state IN state OUT else state为OUT state OUT else 不是空格 if state IN state IN else state为OUT state IN count 许多地方可以简化 常量 是标识符形式 在程序里代表同一常数的东西 用enum定义 枚举 可方便地定义一组符号常量 enum NUM 10 LEN 20 定义枚举常量 例 includeenum START 0 END 300 STEP 20 intmain void intc for c START c END c STEP printf C d F f n c c 5 0 9 0 32 0 return0 这样的程序更容易修改 另一种形式 defineSTART0 defineEND300 defineSTEP20 符号形式表示能帮人理解程序意义 程序里两个0可能代表不同意义 数值形式没有任何区分 采用符号常量可提高可读性 将所需常数定义为符号常量 在程序中统一使用是很好的方法 使程序更容易修改 修改时不必浏览整个程序 对大程序的作用更明显 第五章继续介绍其他常量定义方式 enum的详细讨论在第九章 目前作为一种定义符号整型常量的机制 说明 includeenum IN 1 OUT 0 intmain void intc count 0 state OUT while c getchar EOF if c c t c n state OUT elseif state OUT state IN count printf wordcount d n count return0 完全可能用其他方式实现这个自动机模型 例如 includeintmain intc count 0 while c EOF while c getchar EOF 循环程序设计循环与递归基本输入输出控制结构和控制语句程序设计实例程序测试和排错 主要内容 基本程序设计技术 4 6程序的调试与排错 写好一个程序后 需要 通过加工 编译和连接 产生可执行程序运行它 提供数据进行试验 确认它确实满足要求试验中常常会发现错误 需要设法排除 测试 testing 在完成一个程序或一部分程序 通过编译后试验性运行 仔细检查运行效果 设法确认该程序确实完成了所期望的工作 反过来说 测试就是设法用一些特别选出的数据去挖掘出程序里的错误排错 debugging 在发现程序有错时 设法确认产生错误的根源 修改程序 排除这些错误的工作过程 测试的基本方法测试时考虑的基本问题是提供什么样的数据 才可能最大限度地把程序中的缺陷和错误挖出来 有两类确定测试数据的基本方式 根据程序结构确定测试数据 这相当于把程序打开 根据其内部结构考虑如何检查它 设法发现其中的问题 这种方式称为白箱测试根据程序所解决的问题去确定测试过程和数据 不考虑程序内部如何解决问题 这相当于把程序看作解决问题的 黑箱 因此称为黑箱测试 白箱测试考察程序内部结构及由此产生的执行流 选择数据使程序在试验运行中能通过 所有 可能出现的执行流程 复合结构只有一条执行流 if 条件 语句1else语句2 有两条可能执行流 条件成立时执行语句1 不成立时执行语句2 应设法提供测试数据 检验程序在这两种情况下都能正确工作从本质上说 while 条件 循环体 可能产生无穷多条执行流 循环体不执行 执行1次 执行2次 无法穷尽检查 常用方法是选择测试数据 检查循环的一些典型情况 包括循环体执行0次 1次 2次的情况 以及一些其他情况其他结构可类似分析 要考虑程序中结构嵌套产生的组合流程 黑箱测试考虑的不是程序内部结构 可能是别人的程序 结构不可知 即使可知也可能极其复杂 无法理解其所有的执行流 只考虑程序所解决问题的情况例如 如果某函数只有一个int参数 可检查参数为0时结果是否正确 参数为1和 1时 2和 2怎么样等等如果对函数有所了解 还应考查已知结果的明显情况 例如对求立方根函数 应先检查参数为0 1 1 8 27等的情况 因为知道应该得到什么结果 确认这些情况都能正确工作后 再去检查一些一般性情况
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发展新质生产力的时代价值
- 医患关系论文精要2000字
- 青年在新质生产力发展中的行动路径
- 劳模工匠讲新质生产力
- 2025年输血学ABO血型配型技术应用模拟测试卷答案及解析
- 2025年耳鼻喉科常见耳疾诊治知识竞赛试卷答案及解析
- 2025年眼科常见疾病的诊断与治疗综合测试卷答案及解析
- 2025年康复医学评估工具运用考试答案及解析
- 乏燃料后处理新质生产力
- 关于感恩节的幼儿园主题活动方案
- 房屋归属权协议书范本(标准版)
- 鼻腔冲洗护理技术团体标准解读
- GB/T 41130-2021展览场馆安全管理基本要求
- 湘美版美术一年级上册全册课件
- 环境经济学(张)课件
- 人才管理-人才选用育留课件
- 成功八步课件
- 玉石床垫讲稿课件
- 初中音乐七年级上册第一单元 红岩魂走进歌乐山
- 栈桥修复方案(全文)
- 某五星级酒店单项工程经济指标
评论
0/150
提交评论