已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章控制结构 C语言的控制语句条件语句if语句switch语句 循环语句while语句for语句dowhile语句循环控制语句break语句continue语句 目的 更方便地进行算法描述 5 1switch的使用 include definePR a b c d printf f c f f n a b c d main floatx y charop scanf f c f 带参数的宏代换 多路选择 结束case分支 程序读解 新的语言现象switch语句 按照条件表达式求值结果 决定转向哪个case的执行case分支 当条件式的值等于开关值 必须是常量 时 执行default分支 在所有case不匹配时 执行 可缺省 break语句 用于结束case分支的执行 转向switch后续语句的执行 switch语句 switch e 条件式 casec1 常量 stmt1 casecnstmtn default stmt0 语句组 语句组中常使用break 注意 switch语句的每一个case判断 都只负责指明流程分支的入口点 而不负责指定分支的出口点 出口点由编程人员用相应的跳转语句来表明 break是流程跳转语句 宏代换预处理命令 前缀 在程序编译之前进行 同include 功能 完成参数代换后 将定义复制到引用处 程序读解 思考 defineS x x x 有问题 S 3 S i S 3 4 正确写法 defineS x x x 例5 2 求16进制数的数值 基本思路逐个输入16进制数的字符c 计算相应的数值n每次计算n n 16 c代表的值 数据对象n保存数值 已计算出的数值 c保持当前字符算法0 n读入一个字符c如果c是数字字符 则n 16 c的值 n如果c是a f等字母 则n 16 10 15 n否则 输出n 结束重复2 5 程序实现 includemain charc longn 0 while 1 scanf c 长整型 结束main 字符的ASCII值 长整型输出 无限循环 实现技巧 循环条件难以描述采用无限循环while 1 return语句函数出口 结束当前函数的运行 可以用于结束循环字符处理利用ASCII值实现C语言的特点 弱类型语言 整数 字符 逻辑值的混合运算 5 2循环语句 常见算法描述1迭代过程经常存在循环控制变量C语言提供for语句 简化描述 增加可读性常见算法描述2循环条件判断在循环处理之后C语言提供dowhile语句常见算法描述3循环出口在处理之中C语言提供break语句 for语句 语法for e1 e2 e3 stmte1初始化e2循环条件e3改变量处理stmt循环体 流程图 例5 3 构造华氏温度和摄氏温度对照表 要求华氏温度0度到300度每20度为一项 输出对照表 计算公式 C F 32 5 9程序实现 includemain intf 华氏温度 floatc 摄氏温度 for f 0 f 300 f 20 c f 32 5 9 0 printf F d C f n f c 程序读解 针对问题 设置循环变量利用华氏温度利用for语句设置控制变量初值 终止条件 增量控制简洁 易懂混合运算的规律不同精度的数据进行运算时 结果为精度高的数据 精度高的数据占用内存空间大 如 f 32 5 9 0的结果为浮点数 赋值与类型转换 精度比较char int unsigned long float doubledouble类型 16bit阶码 48bit尾数赋值将右侧数据变换成左侧数据类型后 完成赋值高精度的数据变换成低精度数据时 被剪断低精度的数据变换成高精度数据时 被补零或符号位有符号数据和无符号数据相互变换时 可能带来值的变化必要时 采用强制类型转换 do while语句 语法dostmtwhile e stmt循环体e循环条件 计算公式 在n趋向无穷的过程中累加项值趋向于0 而累加值趋向函数值 x3x5x7x2n 1 x 3 5 7 2n 1 例5 4 求sinx的近似值 sin 如何利用迭代方法完成累加累加项 t 的递推公式 循环结束条件 用t的绝对值小于10 6为结束条件 数据对象考虑累加值sum参数值x累加项t迭代次数n 算法设计问题 初始化sum t n do2 累加t2 2n n 1 2 3求下一累加项t 直到 t 10 6 输出循环的初始值 sum 0 0 n 0 t x 算法描述 include includemain doublesum 0 0 t x intn 0 scanf f 求绝对值 指数形式 程序实现 C语言中的常数 整数十进制80八进制 前缀0 0120十六进制 前缀0 x 0 x50字符常数 a n t 0 020 字符串常数 string 0 结尾 不能作为case条件 长整数80l80L浮点常数 双精度 0 1231 23e3123E 5 5 3循环控制语句 break语句出现在循环体中 用于终止循环 最内层 出现在switch语句中 用于终止多路选择 continue语句出现在循环体中 用于终止循环体的本次执行 最内层 goto语句gotolabel 转向执行label指定的语句label 定义在某个语句前 破坏程序的结构化 不推荐使用 例5 5 求出21世纪的所有闰年 includemain 阅读该程序 inty for y 2001 y 2100 y 枚举每年 if 0 y 4 continue 不能整除4 if 0 y 400 printf d n y 能整除400 elseif 0 y 100 printf d n y 不能整除100 判断闰年的方法是 若该年份能被400整除或能被4整除而不能被100整除则为闰年 否则为平年 主要用途 简化程序结构 提高程序可读性减少程序的嵌套层次 复合语句 控制转移的其他解决方案引入专用变量 表示处理状态对程序可读性的影响较大避免多重循环结构的嵌套算法中循环深度较大时 应引入新的函数 负责内层循环的计算 例5 6 复数四则运算 输入一个复数运算表达式格式 实部虚部i 例 23 4i 4 7i 输出计算结果仅考虑加法和乘法例 120 177i 算法描述 读复数 r1 i1读运算符 op读复数 r2 i2若op 则计算r0 r1 r2 i0 i1 i2若op 则计算r0 r1 r2 i1 i2 i0 r1 i2 r2 i1输出 r0 r1i 程序实现的考虑 难点正确地识别出复数的实部 虚部和运算符考虑空格的存在 正负号的存在 i的存在设置3个函数chargetSymbol 读取一个符号后 返回intgetNum 读取一个整数 包括正负号 后 返回voidgetComp intx 读取一个复数 包括括弧 后 存入数组返回 主程序的实现 include includechargetSymbol void intgetNum void voidgetComp intx main inta 2 b 2 r0 i0 charop getComp a op getSymbol getComp b switch op case r0 a 0 b 0 i0 a 1 b 1 break case r0 a 0 a 1 b 0 b 1 i0 a 0 b 1 a 1 b 0 break if i0 0 printf d d r0 i0 elseprintf d d r0 i0 读一个整数 包括正负号 的算法 跳过空格0 n读入字符ch若ch是 1 sign跳过空格若ch是 1 sign跳过空格若ch是数字 ch n读入字符ch若ch是数字n 10 ch n重复7 8返回n sign 变量设置n结果ch当前字符sign符号 getNum 的实现 intgetNum intch sign 1 n 0 doch getchar while ch switch ch case sign 1 case doch getchar while ch default if isdigit ch n ch 0 while isdigit ch n n 10 ch 0 ch getchar returnn 程序说明 字符检验 使用头文件ctype hisdigit是数字字符 isalpha是字母 isalnum是字母或数字字符 输入函数格式化输入scanf低级字符输入getchar最好不混合使用 函数的实现 chargetSymbol 跳过空格 得到字符 intch doch getchar while ch returnch voidgetComp intx 读取一个复数 a bi if getSymbol x 0 getNum 实部 x 1 getNum 虚部 if i getSymbol 函数设置的考虑 程序可维护性简化主函数的实现隐蔽数字输入的细节处理局部化设计要点简明的输入和输出 功能明确相对独立 不使用全局变量可参考信息功能独立的子任务数据粒度 信息隐蔽的层次 5 4几个特殊功能 const说明不允许赋值的变量如 intgetLength constchararr 二进制运算 按位与 按位或条件表达式e1 e2 e3的值 如果e求值 0 则取e2的值 否则取e3的值逗号表达式e1 e2的值 完成e1 e2的求值后 取e2的值 求值顺序问题 函数调用多个参数表达式 实在参数 的计算顺序不定应避免使用 类似fun x x 1 的求值双目运算 算术 关系 两个操作表达式的计算顺序不定应避免使用 类似 x x 1 的求值各个编译系统可能采用不同的求值顺序逻辑运算前左后右 函数类型检查 函数定义的类型说明getNum arr 旧版本C语言 intarr 引用处charbuf 64 getNum buf 编译时不检查错 第五章作业 阅读教科书第四章自我测验4 34 4程序设计练习6 154 84 144 194 264 284 34上机作业实验4 1实验4 2实验4 3 第六章结构和模块化设计6 1结构 复合数据对象的需求描述由不同类型的数据元素组成的数据对象例如 教学管理系统中的学生数据包括 姓名 性别 学号 班级语言支持C语言中的结构Pascal语言中的记录C Java语言中的类 结构定义和变量说明 语法结构struct结构名 类型成员变量 学生信息的结构 structStudent charname 32 charsex intno charclass 8 结构变量说明structStudentchen 或直接说明struct charname 32 charsex intno charclass 8 chen 结构变量及相关运算 结构变量占用的内存空间大于等于各个元素占用内存空间之和结构变量的运算初始化如 structStudentchen chen F 24 9707 赋值函数参数结构分量的运算引用 chen namechen sex运算取决于分量的类型 例6 1 洗牌和发牌模拟 任务 考虑扑克牌的4个花色和52张 完成洗牌过程 通过输出完成发牌过程基本思路设置数据对象保存52张牌 4个花色和牌名信息产生随机数来控制牌的交换 模拟洗牌过程按照4个一组的顺序 输出所有牌 模拟发牌过程 算法设计 数据对象设计52张牌cards 52 4个花色suit 4 13个牌号face 13 算法初始化52张牌洗牌过程发排过程 初始化依次设置每张牌的花色和牌号洗牌过程依次处理每张牌 第i张 产生一个随机数 0 51 j将第j张和第i张牌交换 程序结构设计 数据结构采用struct描述扑克牌的信息 花色 牌号 采用整数数组表示牌号1 2 3 13采用字符数组表示花色H D C S程序结构设置3个函数fillDeck shuffle deal分别负责初始化 洗牌和发牌的完成 程序实现 1 3 include include includestructcard intface charsuit 10 typedefstructcardCard voidfillDeck Carddeck intface charsuit inti 顺序排列52张牌 for i 0 i 52 i deck i face face i 13 deck i suit suit i 4 通用函数头文件 时间函数头文件 类型定义 结构分量的引用 程序实现 2 3 voidshuffle Carddeck inti j 洗牌过程 Cardtemp for i 0 i 52 i j rand 52 temp deck i deck i deck j deck j temp voiddeal Carddeck inti 发牌过程 for i 0 i 52 i printf dof c c deck i face deck i suit i 1 4 t n 条件表达式 制表符 随机数生成 程序实现 3 3 main Carddeck 52 intface 1 2 3 4 5 6 7 8 9 10 11 12 13 charsuit H D C S srand time NULL fillDesk deck face suit shuffle deck deal deck 数组初始化 获得当前时间 初始化随机数函数 几点程序说明 类型定义typedefintINTARRAY 80 可定义任何类型 用于简化程序描述数组初始化可利用初值个数设置数组大小随机数的产生intrand 返回随机数voidsrand unsignedseed 初始化随机数生成time 获得当前时间 单位 秒 需要通用函数和时间函数头文件stdlib h time h 虚拟机的概念 抽象的计算机接受一组指令 按照给定的指令序列执行虚拟机概念在程序设计中的应用使得一个程序模块 按照类似的方式工作 以一组函数实现虚拟机的指令系统以函数调用表示指令的执行例如 上例中 扑克牌数组以及相关的3个函数组成一个虚拟机 3个函数实现了该虚拟机的3个指令 使用者 main函数 仅负责向虚拟机发送指令 函数调用 不必关系其内部实现细节 抽象方法与信息隐蔽 抽象方法的运用通过3个函数的设置 fillDeck shuffle deal 完全隐蔽了扑克牌相关处理的内部计算逻辑 虚拟机使用者的视点仅了解3个函数的使用方法 好象它们是系统提供的标准函数对软件工程的支持虚拟机的使用者和实现者可以是不同的开发组分别实现大型软件的不同组成部分软件模块接口就是一组函数原型及其说明 6 2模块化程序设计 软件模块数据对象及其相关处理算法程序模块 数据结构及其相关函数例6 1中的模块主控模块 main函数扑克牌模块 数组deck以及3个函数信息隐蔽模块的使用者无须连接数据对象的细节如 main函数编制时 无须了解数组deck的详细定义 数据内容和结构组织 例6 2 简易学生管理系统 任务 分别输入须生学生的户籍信息和学籍信息 打印出学生基本信息表 假设学生人数 250人 户籍信息 姓名 身份证号码 出生年月日 住址 学籍信息 学号 身份证号码 所属学院 专业 班级学生基本信息表 学号 姓名 年龄 所属学院 班级 数据对象学生户籍数据 学生学籍数据学生基本信息表可以直接输出 不保存 算法设计 输入户籍数据 每行输入一个学生的数据 空格分割各个项目 输入学籍数据 每行输入一个学生的数据 空格分割各个项目 构造并输出学生基本信息表 提取户籍和学籍数据 构造并输出学生信息表 算法的逐步求精 1 2步仅涉及输入输出 忽略算法描述3构造学生基本信息表3 1依次从户籍数据中驱除取出一个学生的信息3 2根据其身份证号码 找出该生的学籍信息3 3综合该生的户籍信息和学籍信息 构造基本信息记录 填入学生基本信息表3 4重复3 1 3 3的处理 直至处理完所有学生的数据 程序结构设计 数据对象户籍数据 学籍数据 学生基本信息表尽可能符合信息的原始结构 采用struct采用3个结构数组来保存数据模块与函数的设计围绕户籍数据 提供输入 依次提取的函数围绕学籍数据 提供输入 查找的函数为学生基本信息 提供构造并输出的函数形成3个程序模块 户籍处理模块的设计 include includetypedefstruct 户籍数据结构 charname 16 姓名 longno 身份证号 struct intyear mon day 作为分量的结构 birthday 生日 charaddr 128 地址 InfoAddr intInputAddr InfoAddrinfo 输入数据到数组info 返回学生数量 学籍处理模块的设计 typedefstruct 户籍数据结构 charstudent 20 学号 longno 身份证号 charcollege 32 学院 charclass 10 班级 InfoStudent intInputStudent InfoStudentinfo 输入数据到数组info 返回学生数量 InfoStudentGetStudent longno InfoStudentinfo intn 获得身份证号为no的学生的学籍数据 n是学生数量 主控模块的设计 voidOutput intn InfoAddraddr InfoStudentinfo 构造学生基本信息 按表格输出 n是学生人数 main staticInfoAddraddr 256 staticInfoStudentstu 256 intnum 人数 num InputAddr addr 输入户籍数据 if num InputStudent stu 输出学籍数据 return Output num addr stu 输出基本信息表 设计说明 函数原型设计考虑函数内部功能的实现中 需要用到的所有输入输出信息 将输入信息作为参数 输出结果作为返回值 或通过参数返回 确保信息处理的局部化实现技术细节对于复杂结构 利用结构 结构分量的结构对于大的数据对象 结构数组 采用静态变量 学生基本信息表的构造和输出 voidOutput intn InfoAddraddr InfoStudentinfo inti age InfoAddra InfoStudents for i 0 i n i a addr i 取户籍数据 age 2004 a birthday year 计算年龄 s GetStudent a no info n 取学籍数据 printf 8d 16s 2d 32s 10s n a no a name age s college s class 户籍信息的输入 intInputAddr InfoAddrinfo 输入数据到数组info 返回学生数量 inti charbuf 256 InfoAddra for i 0 gets buf i 读入一行 sscanf buf s ld d d d 128s a name 学籍数据的输入 intInputStudent InfoStudentinfo 输入数据到数组info 返回学生数量 inti r charbuf 256 InfoStudents for i 0 i 读入一行 r scanf buf s ld s s s student 查找学籍数据的实现 InfoStudentGetStudent longno InfoStudentinfo intn 获得身份证号为no的学生的学籍数据 inti for i 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年自考学前教育(本科)《学前儿童语言教育》模拟卷及答案
- 耐火炉窑装窑工复试能力考核试卷含答案
- 宴会定制服务师保密知识考核试卷含答案
- 《GBT 23934-2015 热卷圆柱螺旋压缩弹簧 技术条件》专题研究报告
- 潜水救生员岗前设备维护考核试卷含答案
- 活性炭干燥工岗位工艺技术规程
- 工业设计工艺师岗前班组评比考核试卷含答案
- 排土机司机安全强化测试考核试卷含答案
- 旅游咨询员现场作业技术规程
- 公司家用电冰箱维修工岗位职业健康技术规程
- 轻资产运营模式下“海澜之家”财务绩效评价研究
- 人教版高中英语选择性必修一词汇表默写
- 第一单元 写作《热爱写作学会观察》讲义-2025-2026学年统编版七年级语文上册
- 联通生态伙伴管理办法
- 《通过感官来发现》课件
- 绿色施工节能措施和建筑垃圾减量策略
- 7.1 水果店(教案)北师大版数学三年级上册
- 丁苯酞指南讲解
- 生成式AI时代的智能翻译创新与实践
- 临床合理用药课件
- 【MOOC答案】《3D工程图学应用与提高》(华中科技大学)章节作业慕课答案
评论
0/150
提交评论