




已阅读5页,还剩123页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 3 15 1 第4章程序的控制结构 2020 3 15 2 第4章程序的控制结构 本章主要教学内容 算法的描述方法基本控制结构及基本控制语句常用算法程序的基本版式结构化程序设计的基本思想程序测试与改错 2020 3 15 3 4 1算法的概念及其描述 数据结构 算法 程序算法 为解决一个具体问题而采取的确定的有限的操作步骤 算法特性 有穷性确定性有效性没有输入或有多个输入有一个或多个输出 2020 3 15 4 算法的特性有穷性在合理的时间内完成确定性 无歧义如果x 0 则输出Yes 如果x 0 则输出No有效性能有效执行负数开平方没有输入或有多个输入有一个或多个输出 算法的概念及其描述方法 2020 3 15 5 算法的描述方法自然语言描述传统流程图 Flowchart N S结构化流程图伪码 Pseudocode 表示 算法的概念及其描述方法 2020 3 15 6 流程图 Flowchart 2020 3 15 7 构成程序的三种基本结构 顺序结构选择结构 分支结构 循环结构已经证明 任何程序均可只用这三种结构综合描述只用这三种结构编制的程序 叫结构化程序程序必须符合结构化规则 2020 3 15 8 结构化程序设计的核心思想 采用顺序 选择和循环三种基本结构作为程序设计的基本单元只有一个入口 只有一个出口 无死语句 即不存在永远都执行不到的语句 无死循环 即不存在永远都执行不完的循环 采用 自顶向下 逐步求精 和模块化的方法进行结构化程序设计 2020 3 15 9 计算机中的问题求解过程 Example 买苹果 计算价钱 quantitypricePerkg price price quantity pricePerkg Input Process Output Firstidentifytheinputandoutputoftheproblem 2020 3 15 10 4 2顺序结构 B A NS图 传统流程图 B A 2020 3 15 11 顺序结构 给变量赋值赋值表达式语句 赋值表达式 price quantity pricePerkg 输入输出数据标准库函数调用语句scanf d 2020 3 15 12 顺序结构 应用举例 1 例 设半径为1 5 求圆周长及面积 解 1 问题分析 算法 step1 给出圆的半径r 1 5 step2 求圆的周长及面积 step3 输出结果 公式 2020 3 15 13 2 画出流程图 2020 3 15 14 include definePI3 14main floatr l s r 1 5 l 2 PI r s PI r r printf nl f s f l s 3 根据流程图编程 2020 3 15 15 顺序结构 应用举例 2 例4 1设银行存款利率rate为2 25 存款期为n年 本金为captial元 编程计算n年后的本利之和deposit 解 1 问题分析 算法 step2 给出年n 本金captial 键盘输入 step3 n年后本利之和deposit step4 输出结果 公式 deposit captial 1 rate n step1 给出存款利率rate 2020 3 15 16 2 画出流程图 2020 3 15 17 3 根据流程图编程 include includemain intn doublerate 0 0225 doublecapital deposit printf pleaseenteryear capital scanf d lf 2020 3 15 18 以 开始的编译预处理命令main 局部变量说明语句 执行语句 简单的C程序结构框架 2020 3 15 19 编译预处理命令 文件包含编译预处理命令 include指示编译系统将一个源文件嵌入到含有 include指令的源文件中该指令所在的位置处 使用形式 注意 以 开头 每条一行 不是C语句 2020 3 15 20 查询情况 编译预处理命令 1 用将头文件名括起 则在include子目录中查询 2 用 将头文件名括起 则先在当前目录中查找若无继续搜索C子目录 2020 3 15 21 常用函数对应的头文件 2020 3 15 22 4 3选择结构 作用 根据条件控制程序流向 条件的组成 问题的提出 各种类型的常量 变量 表达式 常用 关系 逻辑表达式 注意各种表达式的用法 2020 3 15 23 关系运算符与关系表达式 优先于 2020 3 15 24 例 设a 3 b 2 c 1 计算下列表达式的值 1 a b 2 d a b 3 a b c 4 a b c 1 1 1 0 注意 和 比较下列程序段 关系运算符与关系表达式 2020 3 15 25 简单分支选择 单分支 结构 yes no 语句A 格式 2020 3 15 26 includemain inta b max printf Inputa b scanf d d Inputa b 20 15max 20 例 计算两整数的最大值 2020 3 15 27 双分支选择结构 yes no 程序段A 程序段B 格式 If 表达式 语句1 语句组1 else语句2 语句组2 2020 3 15 28 Syntax if expression statement1 elsestatement2 orif expression statement1 statement3 else statement2 statement4 双分支选择结构 格式 if 表达式 语句1 语句组1 else语句2 语句组2 2020 3 15 29 例 计算两整数的最大值 Inputaandb Outputmax a b max b max a Start End 2020 3 15 30 例 计算两整数的最大值 scanf d d if a b max a elsemax b printf max d n max 2020 3 15 31 includemain inta b max printf Inputa b scanf d d if a b max a if a b max b 例 计算两整数的最大值 2020 3 15 32 includemain inta b max printf Inputa b scanf d d max a b a b 条件运算符和条件表达式 例 2020 3 15 33 多分支选择结构 2020 3 15 34 多分支选择结构 if 表达式 语句1 elseif 表达式2 语句2 elseif 表达式m 语句m else语句n 一般形式 2020 3 15 35 使用if语句需注意事项 1 条件判断表达式一定用圆括号括起 2 复合语句必须用 引起 3 每一个else必须与一个if项匹配 4 else总是与离它最近的if相匹配 2020 3 15 36 体型判断 按 体指数 对肥胖程度进行划分 体指数t 体重w 身高h 2 w单位为公斤 h单位为米 当t 27时 为肥胖 编程从键盘输入你的身高h和体重w 根据给定公式计算体指数t 然后判断你的体重属于何种类型 用3种方法编程 算法1 用不带else子句的if语句编程 ex45 1 算法2 用在if子句中嵌入if语句的形式编程 ex45 2 算法3 用在else子句中嵌入if语句的形式编程 ex45 3 例4 5 2020 3 15 37 includemain floatx y printf inputx scanf f 2020 3 15 38 用于多路选择的switch语句 switch expression casevalue1 statement1 break casevalue2 statement2 break default statementX break 2020 3 15 39 switch expression casevalue1 statement1 break casevalue2 statement2 break default statementX break 用于多路选择的switch语句 2020 3 15 40 编程设计一个简单的计算器程序 要求用户从键盘输入如下形式的表达式 操作数1运算符op操作数2计算并输出表达式的值指定的运算符为加 减 乘 除 例 计算器程序ex48 2020 3 15 41 思考题 语句if 0 data2 的必要性 避免 除零错误 1998年11月 科学美国人 杂志描述了美国导弹巡洋舰约克敦号上的一起事故 除零错导致军舰推进系统的关闭为什么不用if data2 0 如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符 那么程序如何修改 2020 3 15 42 思考题 如果要求对浮点数进行运算 那么程序如何修改 修改上例程序 使其能进行浮点数的算术运算 同时允许使用字符 x与X作为乘号 并且允许输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符 2020 3 15 43 main floatdata1 data2 charop printf Pleaseentertheexpression scanf f c f 例 2020 3 15 44 使用switch语句应注意 1 各常量表达式的值不可相同 2 case后可有多个语句 不用 括起 3 常量表达式仅是一个语句标号 4 各case及default子句的顺序可随意 5 每个分支执行后 利用break语句跳出 2020 3 15 45 逻辑运算符和逻辑表达式 逻辑运算也被称为布尔 Boolean 运算 与运算 a b b c a大于b 并且b大于c 或运算 a b b c a大于b 或者b大于c 求反 a 如果a是0 结果非0 如果a是非0 结果是0并不改变a的值 2020 3 15 46 ch是英文大写字母 ch A ch Z 判断某一年year是否是闰年的条件是满足下列两个条件之一 能被4整除 但不能被100整除 能被400整除 year 4 0 year 100 0 year 400 0优先级 year 4 0 year 100 0 year 400 0 逻辑运算符和逻辑表达式举例 2020 3 15 47 Example a 1 b 5 0 1 b 5 0 b 5 0 复合表达式的值 尽量使用最少的操作数来确定表达式的值 这就意味着表达式中的某些操作数可能不会被计算 2020 3 15 48 扩充内容 测试的主要方式给定特定的输入 运行被测软件检查软件的输出是否与预期结果一致测试用例的选取方法尽量覆盖所有分支 减少重复覆盖测试的目的通过运行测试用例找出软件中的Bug成功的测试在于发现迄今为止尚未发现的Bug测试人员的主要任务是站在使用者的角度 通过不断使用和攻击 尽可能多地找出Bug 2020 3 15 49 采用测试用例 通过运行程序查找程序错误的方法实质是一种抽样检查 彻底的测试是不可能的彻底的测试不现实 要考虑时间 费用等限制 不允许无休止的测试测试只能证明程序有错 不能证明程序无错 E W Dijkstra测试能提高软件质量 但提高软件质量不能依赖于测试 扩充内容 2020 3 15 50 软件测试方法的分类 白盒测试 结构测试 在完全了解程序的结构和处理过程的情况下 按照程序内部的逻辑测试程序 检验程序中的每条逻辑路径是否都能按预定要求正确工作黑盒测试 功能测试 把系统看成一个黑盒子 不考虑程序内部的逻辑结构和处理过程 只根据需求规格说明书的要求 设计测试用例 检查程序的功能是否符合它的功能说明主要用于测试的后期 2020 3 15 51 include includemain floata b c printf Inputthethreeedgelength scanf f f f 错在哪里 例 判断三角形的类型 2020 3 15 52 有交叉关系的用并列的if非此即彼的用if else 注意 例 判断三角形的类型 一般三角形 不是三角形 等边 等腰 直角 等腰直角 一般三角形 2020 3 15 53 main floata b c intflag 1 if a b c 2020 3 15 54 main if a b c 错在哪里 2020 3 15 55 main if a b c 2020 3 15 56 main if a b c 等腰在先等边在后是否可以 2020 3 15 57 Example 如何确定程序的输入和输出呢 Drawaflowchartforthefollowingproblem 读入5个整数 计算并显示它们的和 Input 5个整数n1 n2 n3 n4 n5Output n1 n2 n3 n4 n5的和Inputexample 23456Outputexample 20 问题的提出 2020 3 15 58 Inputn1 Inputn2 Inputn3 inputn4 inputn5 outputsum sum n1 n2 n3 n4 n5 Assumeinputexample 23456 end 使用了6个不同的变量 start 问题的提出 2020 3 15 59 4 4循环结构 引入循环的目的 简化程序 提高编程效率 三种循环方式 当型循环 直到型循环 步长型循环 2020 3 15 60 如何对循环进行控制呢 循环控制结构与循环语句 2020 3 15 61 循环结构的流程图 条件P A 当型循环 直到循环 真 假 假 条件P A 假 真 假 条件P 条件P A 假 2020 3 15 62 counter 1 sum 0 counter 6 sum sum n false true counter outputsum inputn 1 counter sum 0 1 6true 2 n 0 2 2 2 2 6true 3 2 3 5 3 3 6true 4 5 4 9 4 4 6true 5 9 5 14 5 5 6true 6 14 6 20 6 6 6false counter controlled 计数器每次增1 使用了3个变量 Assumeinputexample 23456 end 2020 3 15 63 循环语句 while 一般形式 while 表达式 语句 只要表达式的值为非0 就重复执行语句 直到表达式值为0时止先判断 后执行 2020 3 15 64 循环语句 do while 一般形式 do 语句 while 表达式 首先执行语句 然后判断表达式的值 如果表达式为0 继续向下执行 否则 再次执行语句 再次判断表达式的值语句会被至少执行一次 2020 3 15 65 例 计算并输出1 2 3 n的值 循环条件第一次就为假 如输入 1 时会怎样 2020 3 15 66 A 当型循环 真 假 假 条件P 假 条件P TestingConditionFirst 例 计算并输出1 2 3 n的值 2020 3 15 67 例 计算并输出1 2 3 n的值 条件P 直到型循环 A 假 真 条件P A 假 Testingconditionlast 2020 3 15 68 例 输出100以内的奇数 includemain intI 1 while I 100 printf d I I 2 注意 1 while构成的是 当型 循环 2 循环体中一定有对于循环控制变量的操作 2020 3 15 69 includemain intI 1 do printf d I I 2 while I 100 例 输出100以内的奇数 includemain intI 1 while I 100 printf d I I 2 2020 3 15 70 循环语句 for 一般形式 for 表达式1 表达式2 表达式3 语句 跳出循环 T F 工作过程 2020 3 15 71 循环次数已知 计数控制的循环 例 计算并输出1 2 3 n的值 2020 3 15 72 例 计算并输出1 2 3 n的值 2020 3 15 73 例 计算并输出1 2 3 n的值 2020 3 15 74 有关for的说明 for 表达式1 表达式2 表达式3 语句 相当于 表达式1 while 表达式2 语句 表达式3 2020 3 15 75 在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容 空语句 表示循环体内什么都不做while i 100 i 死循环for i 0 i 100 i printf d i 用于延时 注意 2020 3 15 76 for语句中的表达式1 表达式3可为逗号表达式 如 for i 0 j 1 j ni j 表达式1和表达式3可以没有或者是用逗号分隔的多个表达式的组合 如 for i 5 有关for的说明 3 2020 3 15 77 逗号运算符 多数情况下 并不使用整个逗号表达式的值 更常见的情况是要分别得到各表达式的值主要用在循环语句中 同时对多个变量赋初值for i 1 j 100 i j i j 2020 3 15 78 如何减少循环的次数 例 计算并输出1 2 3 n的值 2020 3 15 79 例 计算并输出1 2 3 n的值 当n为奇数 2020 3 15 80 例 计算并输出1 2 3 n 2020 3 15 81 例 输入两个整型数 计算并输出两个整数的最大值 2020 3 15 82 若用户不慎输入了非法字符 那么先清除输入缓冲区中的内容 然后提示用户重新输入数据直到输入正确为止 例 输入两个整型数 计算并输出两个整数的最大值 2020 3 15 83 循环次数未知 标记控制的循环 标记值 例 输入数据 显示每次累加的结果直到输入0时为止 2020 3 15 84 循环次数未知 标记控制的循环 例 输入数据 显示每次累加的结果直到输入0时为止 2020 3 15 85 选择三种循环的一般原则 如果循环次数已知 用for如果循环次数未知 用while如果循环体至少要执行一次 用do while这只是 一般 原则 不是 原则 2020 3 15 86 永远不会退出的循环为死循环for while 1 do while 1 一般情况下 要极力避免死循环绝大多数程序不需要死循环 如果出现 往往都是bug时间过长的循环会造成 假死 效果 也要考虑解决 死循环 2020 3 15 87 例 猜数游戏 想一个1 100之间的数 猜对 right 猜错 wrong 并提示大小 2020 3 15 88 分析 Step1 计算机想一个数 Step2 人猜一个数 Step3 判断三种情况并给出相应结果 解决问题的关键 例 猜数游戏 2020 3 15 89 猜数游戏用到的库函数 1 随机函数rand includeRAND MAX在stdlib h中定义 不大于双字节整数的最大值32767产生 0 RAND MAX 之间的随机数magic rand 产生 0 b 1 之间的随机数magic rand b 产生 a a b 1 之间的随机数magic rand b a 2020 3 15 90 include includemain intmagic 计算机 想 的数 intguess 人猜的数 magic rand 100 1 想 一个 1 100 之间的数magic printf Pleaseguessamagicnumber scanf d 例 ex46 只猜一次 2020 3 15 91 由计算机 想 一个1到100之间的数请人猜 如果人猜对了 则结束游戏 否则计算机给出提示 告诉人所猜的数是太大还是太小 直到人猜对为止 计算机记录人猜的次数 以此来反映猜数者 猜 的水平 ex49 运行程序发现问题每次运行程序 机器所想的数都是一样的 用函数rand所产生的随机数只是伪随机数 例 猜数游戏 程序 2020 3 15 92 include includemain intmagic intguess intcounter 记录人猜次数的计数器变量 magic rand 100 1 counter 0 计数器变量count初始化为0 do printf Pleaseguessamagicnumber scanf d 例 返回 2020 3 15 93 猜数游戏用到的库函数 2 随机函数srand为函数rand 设置随机数种子来实现对函数rand所产生的伪随机数的 随机化 通过键入随机数种子 产生 1 100 之间的随机数scanf u 改进上例 ex49 1 2020 3 15 94 猜数游戏用到的库函数 3 随机函数srand 为函数rand 设置随机数种子来实现对其产生的伪随机数的 随机化 使用计算机读取其时钟值并把该值自动设置为随机数种子 产生 1 100 之间的随机数函数time 返回以秒计算的当前时间值 该值被转换为无符号整数并用作随机数发生器的种子 includesrand time NULL magic rand 100 1 再改进上例 ex49 2 2020 3 15 95 相传国际象棋是古印度舍罕王的宰相达依尔发明的 舍罕王十分喜欢象棋 决定让宰相自己选择何种赏赐 位聪明的宰相指着8 8共64格的象棋盘说 陛下 请您赏给我一些麦子吧 就在棋盘的第一个格子中放1粒 第2格中放2粒 第3格放4粒 以后每一格都比前一格增加一倍 依此放完棋盘上的64个格子 我就感恩不尽了国王能兑现他的许诺吗 试编程计算舍罕王共要多少麦子赏赐他的宰相 这些麦子合多少立方米 已知 1立方米麦子约1 42e8粒 总粒数为 sum 1 2 22 23 263 例 国王许诺 2020 3 15 96 defineCONST1 42e8 include includemain intn doubleterm sum 0 累加求和变量赋初值 for n 1 n 64 n term pow 2 n 1 根据累加项的规律计算累加项 sum sum term 作累加运算 printf sum e n sum 打印总麦粒数 printf volum e n sum CONST 打印折合的总麦粒体积数 方法1 2020 3 15 97 defineCONST1 42e8 定义符号常量CONST值为1 42e8 includemain intn doubleterm 1 sum 1 累乘求积 累加求和变量赋初值 for n 2 n 64 n term term 2 根据后项总是前项的2倍计算累加项 sum sum term 作累加运算 printf sum e n sum 打印总麦粒数 printf volum e n sum CONST 打印折合的总麦粒体积数 方法2 2020 3 15 98 循环嵌套 结构形式 for while do while 2020 3 15 99 使用嵌套的循环时 应注意的问题 在嵌套的各层循环体中 使用复合语句 即用一对大花括号将循环体语句括起来 保证逻辑上的正确性内层和外层循环控制变量不应同名 以免造成混乱嵌套的循环最好采用右缩进格式书写 以保证层次的清晰性循环嵌套不能交叉 即在一个循环体内必须完整的包含着另一个循环 2020 3 15 100 合法的嵌套循环 2020 3 15 101 例 编程输出如下形式的九九表 2020 3 15 102 includemain intm n for m 1 m 10 m printf 4d m 打印表头 printf n for m 1 m 10 m printf printf n for m 1 m 10 m for n 1 n 10 n printf 4d m n printf n 例 2020 3 15 103 例 编程输出下三角形式的九九表 2020 3 15 104 includemain intm n for m 1 m 10 m printf 4d m 打印表头 printf n for m 1 m 10 m printf printf n for m 1 m 10 m for n 1 n m n printf 4d m n printf n 例 2020 3 15 105 有30个人 其中有男人 女人和小孩 在一家饭馆里吃饭共花了50先令 每个男人各花3先令 每个女人各花2先令 每个小孩各花1先令 问男人 女人和小孩各有几人 解方程组穷举法 例 马克思手稿中的趣味数学题 2020 3 15 106 方法1 穷举x y z的所有组合 includemain intx y z printf Man tWomen tChildern n for x 0 x 30 x for y 0 y 30 y for z 0 z 30 z if x y z 30 2020 3 15 107 includemain intx y z printf Man tWomen tChildern n for x 0 x 16 x for y 0 y 25 y z 30 x y if 3 x 2 y z 50 printf 3d t 5d t 8d n x y z 方法2 改进算法 2020 3 15 108 do magic rand 100 1 counter 0 do printf Pleaseguessamagicnumber scanf d 例猜数游戏 2020 3 15 109 do magic rand 100 1 counter 0 do printf Pleaseguessamagicnumber scanf d 例 2020 3 15 110 例 输入n值 计算并输出1 2 3 n 每次单独计算累加项 2020 3 15 111 利用前项计算后项 例 输入n值 计算并输出1 2 3 n 2020 3 15 112 流程的转移控制 goto语句break语句continue语句return语句标准库函数exit 2020 3 15 113 goto语句 一般形式goto语句标号 语句标号 或语句标号 goto语句标号 功能 无条件转去执行语句标号所指语句行 2020 3 15 114 1 语句标号用标识符表示 2 语句标号一定为函数段中存在的 3 该语句不可滥用 使用goto语句要注意 标号举例error goto举例gotoerror 不能用整数作语句标号 2020 3 15 115 使用goto语句的原则 主张少用 慎用 而不是禁用使用之后 程序仍然是单入口 单出口不要使用一个以上的标号不要用goto语句往回跳 要向下跳不要让goto语句制造出永远不会被执行的代码 2020 3 15 116 流程的转移控制 break语句和cont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 对赌协议书迪丽热巴
- 供水设备购销合同5篇
- 2025年传染病学科艾滋病患者护理技能综合评估模拟卷答案及解析
- 智能安防设备基地创新创业项目商业计划书
- 林果采摘体验园创新创业项目商业计划书
- 小龙虾真空包装食品创新创业项目商业计划书
- 城市绿化研究机构创新创业项目商业计划书
- 2025年中药药材功效与应用综合考察试卷答案及解析
- 2025买卖合同诉状范本
- 起重机械安全培训题库及答案解析
- 高三运动会课件
- 法语幼儿教学课件1
- 钩针课件教学课件
- 淮阳豆门乡消防安全培训课件
- 海上风电场安全培训课件
- 2025版CSCO非小细胞肺癌诊疗指南解读
- 红星照耀中国第九章课件
- GB/T 13090-2025饲料中六六六、滴滴涕的测定
- 《统计分析与SPSS的应用(第7版)》课件全套 第1-12章 SPSS统计分析软件概述
- 青少年毒品预防教育-初中版
- 整改技术服务报价单
评论
0/150
提交评论