已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教学大纲 5 13种循环语句 5 1 1循环的引入 引入循环的目的 简化程序 例5 1P75 例求 n n为1 10 并将结果打印出来 程序一 include stdio h main intsum 0 sum 1 2 3 4 5 6 7 8 9 10 printf d n sum 程序二 include stdio h main inti 1 sum 0 while i 10 sum sum i i printf d n sum 通用性差 四种循环结构 whiledo whileforif goto 三种循环方式 当型循环 直到型循环 步长型循环 循环结构术语 循环条件 结构中的测试表达式循环体 每个循环周期均要执行的语句序列循环控制变量 控制条件真 假值的变量 对循环控制变量应做如下处理 赋初值 将其代入正确的循环条件 更新 调整 循环能实现重复执行的目的 主要包含以下几个要素 一个初始值 循环控制条件 什么情况下重复执行 被重复执行的语句 即循环体 s 1 1 2 2 3 3 循环结构的应用场合 1 1 2 2 3 3 s 1 1 2 2 100 100 1 1 2 2 99 99 100 100 for I 1 s 0 I 100 I s I I 5 1 2while语句 结构形式 while 表达式 语句块1 语句块2 工作过程 只要表达式的值为非0 就重复执行语句块1 直到表达式值为0时为止 开始执行语句块2特点 先判断 后执行 工作过程 Main inti 1 while i 100 printf d i i 2 printf n 例5 1 1 利用while循环输出100以内的奇数 注意 循环体如果包含多个语句 应用 括起 否则while的范围仅到它之后第一个分号处 循环体中一定要有与条件表达式相对应的量 并且要对其值进行修改 while构成的是 当型 循环 例5 1 2求n main longFACT intn FACT 1 scanf d 思考 为什么要将FACT定义为long型 例5 1 3求 n n为1 20 并将结果打印出来 include stdio h main intn 0 doublefact 1 0 sum 0 0 while n 20 n fact n sum fact printf d e n n sum 考虑为什么要定义为double类型 5 1 3do while语句 工作过程 执行语句 语句组 判断表达式值 当表达式为非0值时 重复执行语句 语句组 直到表达式的值为0时循环结束 特点 先执行 后判断 do 循环体语句组1 while 表达式 语句组2 结构形式 工作过程 例5 1 4求n main longFACT intn FACT 1 scanf d 例5 1 5统计输入整数的个数 并求出输入的整数的和 输入 1时结束 1不计在内 算法分析 输入一个整数统计计数器加1计入累加和 循环条件 输入的整数不为 1 查看源程序 通常情况下while do while两种结构可以互换 比较结果 当i10时 两程序运行结果不同 main intsum 0 i scanf d 例 比较下面程序段 1 main intsum 0 i scanf d 2 5 1 4for语句 for循环又称为步长型或计数器型循环 主要用于以下两种情况 循环次数已经确定 循环次数虽不确定 但给出了循环继续的条件 1 for语句的一般格式 for 表达式1 表达式2 表达式3 循环体语句组 其中的各表达式说明如下 表达式1 作为循环变量的初始值表达式2 为关系表达式 用于将循环变量与某一值比较 决定是否退出循环表达式3 用来描述循环变量的变化 常用自增或自减运算 3个表达式均可省略 但 不能省略 也不能多于两个 2 执行过程 相当于 for 表达式1 表达式2 表达式3 语句 表达式1 while 表达式2 语句块 表达式3 例如 for i 1 i 100 i sum sum i i 1 While i 100 sum sum i i for while循环可以互换 相比之下for循环简单 灵活 3 for语句的使用 for语句的使用说明如下 当循环体语句组仅由一条语句构成时 可以不使用复合语句形式 例如 for i 1 i 100 i psum i 表达式1和表达式3可为逗号表达式 因此可以对多个变量赋初值及修改例如 for i 1 j 10 i j i j k i j 表达式2的值是一个逻辑量 除一般的关系 或逻辑 表达式外 也可以是数值 或字符 表达式 例如 intx 100 for x x printf d x 3个表达式都可以是逗号表达式 即每个表达式都可以由多个表达式组成 3个表达式都是任选项 都可以省略 但是表达式间的分号不能省略 表达式1省略 应在for之前对循环变量赋初值 表达式2省略 则不判断条件 循环无终止进行下去 原则上表达式2不可省略 若省略需要在循环体中用其它手段 break goto等 结束循环 表达式3省略 则应另设法保证循环的结束此功能一定在循环体中完成例 for i 1 i 5 printf d n i i for循环体可以是一条空语句 实现延时功能 例 for i 0 i 10000 i 注意 在for和while语句之后一般没有分号 有分号表示循环体就是分号之前的内容 即循环体不存在例 while i 100 i 例 for i 0 i 100 i printf d i 选择三种循环的一般思路 如果循环次数已知 用for如果循环次数未知 用while如果循环体至少要执行一次 用do while只是思路 不是定律 死循环 永远不会退出的循环为死循环for while 1 do while 1 除非确实需要死循环 否则不要使用这样的形式 它们使循环的中止条件变得不明朗一般情况下 要极力避免死循环绝大多数程序不需要死循环 如果出现 往往都是bug时间过长的循环会造成 假死 现象 也要考虑解决 例5 1 7打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数字本身 例如 153 1 3 5 3 3 3 includemain intl1 l2 l3 l4 for l4 100 l4 999 l4 l1 l4 100 l2 l4 100 10 l3 I4 10 if l4 l1 l1 l1 l2 l2 l2 l3 l3 l3 printf Daffodil snumberis d n l4 程序代码 菲波那契数列 例5 1 8某数列前两项是1 1 从第三项开始 每一项是其前两项之和 试打印该数列的前40项 如1 1 2 3 5 8 13 21 算法思想一 递推法 1 按数列定义 f3 f1 f2 但不能无限使用f4 f2 f3 f5 f3 f4 2 求出f3后 若能使f2 f1 f3 f2 f4项又可写成f1 f2 3 反复执行 1 2 直到条件满足为止 1123581321 f1 f2 f3 f1f2 查看源程序 每次打印一个数列项 算法思想一 迭代法 1 打印f1 f2 2 用新值来替换原来的f1和f2 即f1 f1 f2 f2 f2 f1 3 反复执行 1 2 直到条件满足为止 1123581321 f1f2 f2f1 f1f2 查看源程序 每次打印一个数列项 若要打印出小于1000的菲波那契数列呢 f1 f1 f2 f2 f2 f1 5 1 5goto语句和语句标号 循环结构也可以用if语句和goto语句的组合来实现 goto语句也称为无条件转移语句 结构形式 语句标号 if 表达式 语句 语句组goto语句标号 kk if a b a a 2 gotokk 此结构构成的是 当型 循环 说明 goto语句能够改变程序流向 转向执行语句标号所标识的语句 语句号是按标识符规定书写的符号 放在某一语句行的前面 标号后加冒号 语句标号标识语句的作用 与goto语句配合使用 例 intn 0 printf Inputastringplease n loop if getchar n n gotoloop 现代观点认为 混乱根源不在goto 而在标号任何程序都可以不用goto就实现其功能但在某些情况下 使用goto可以让程序更清晰 关于goto 糟糕的goto START LOOP if fStatusOk if fDataAvaiable i 10 gotoMID LOOP else gotoEND LOOP else for i 0 i 100 i MID LOOP lotsofcodehere gotoSTART LOOP END LOOP 5 2break语句与continue语句 转移控制语句 goto语句 break和continue语句 break语句的作用 结束整个循环 即跳出当前层的循环 去执行循环语句后面的程序 continue语句的作用 结束本次循环 即不执行循环体中continue语句之后的语句 而转入下一次循环条件的判断与执行 而其并不跳出循环 例5 2 1 include definePI3 14main intr floatarea for r 1 r50 0 break printf 面积等于 f n area 1 printf 现在r d n r 2 注意 area 50时 执行 1 否则执行 2 include definePI3 14main intr floatarea for r 1 r 10 r area PI r r if area 50 0 continue printf 面积等于 f n area 1 注意 area 50时 执行 1 例5 2 2 说明 1 break语句可用于switch语句结构中也可用于循环中 2 continue语句只可用于循环中 3 在循环嵌套中break与continue都只影响包含它的那层循环 5 3循环的嵌套 在一个循环的循环体中 还包含着另一个循环 称为循环嵌套 for while do while语句不但可以进行自嵌套 还可以相互嵌套 main inti j m for i 1 i 17 i 4 for j 3 j 19 j 4 m printf d n m 当外循环变量取一个特定值时 内循环变量从初值到终值循环一次 循环嵌套 循环中再套循环 各种形式的循环均可以相互套用常用于矩阵运算 报表打印类问题 使用多层循环应注意 1 内层循环必须完全包含在外层循环中 不得交叉 2 并列循环可以使用相同的循环变量 而嵌套时内 外循环不能使用相同的循环变量 如图 for i 0 for i 0 for i 0 for i 0 百钱买百鸡 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 问鸡翁 鸡母 鸡雏各几何 x y z 1005x 3y z 3 100 百钱买百鸡 1 includemain intx y z m n for x 0 x 100 x for y 0 y 100 y for z 0 z 100 z m x y z n 5 x 3 y z 3 if m 100 02575418788118112484 百钱买百鸡 2 includemain intx y z m n for x 0 x 20 x for y 0 y 33 y z 100 x y n 5 x 3 y z 3 if n 100 printf 5d 5d 5d n x y z 02575418788118112484 九 九乘法表 1 1 11 2 22 2 41 3 32 3 63 3 91 4 42 4 83 4 124 4 161 5 52 5 103 5 154 5 205 5 251 6 62 6 123 6 184 6 245 6 306 6 361 7 72 7 143 7 214 7 285 7 356 7 427 7 491 8 82 8 163 8 244 8 325 8 406 8 487 8 568 8 641 9 92 9 183 9 274 9 365 9 456 9 547 9 638 9 729 9 81 九 九表框图和程序 includemain inti j printf 打印输出九 九乘法表 n n for i 1 i 9 i for j 1 j i j printf d d d j i i j printf n 思考题 如何实现以下格式的九 九乘法表输出 打印输出九 九乘法表 1 9 92 9 183 9 274 9 365 9 456 9 547 9 638 9 729 9 811 8 82 8 163 8 244 8 325 8 406 8 487 8 568 8 641 7 72 7 143 7 214 7 285 7 356 7 427 7 491 6 62 6 123 6 184 6 245 6 306 6 361 5 52 5 103 5 154 5 205 5 251 4 42 4 83 4 124 4 161 3 32 3 63 3 91 2 22 2 41 1 1 例对以下程序修改 完成各种图案的打印 图案打印问题 main intm n i j scanf d d 源代码 例输出以下图案 includemain inti j k for i 0 i 3 i for j 0 j 2 i j printf for k 0 k 2 i k printf printf n for i 0 i 2 i for j 0 j i j printf for k 0 k 4 2 i k printf printf n 5 4数组与字符串的使用 对数组的操作 实际是对数组元素进行操作赋值和运算 在设计程序时 用循环语句来遍历数组元素比较方便 例5 4 1一维数组的输入与输出 编程思路 数组元素的输出均用循环来处理 设数组有元素N个 N用符号常量来表示 输入数组a 共5个整数 6239945652数组a各元素为 a 0 6a 1 23a 2 99a 3 456a 4 52 源代码 运行结果 例5 4 2输入10个任意的整数 计算其中正整数的平均值 include defineN10voidmain floati t 0 sum 0 floata N printf 输入数组a 共 d个整数 n N for i 0 i0 sum sum a i t printf 输出正数的平均值为 f n sum t 例5 4 3编一程序 将两个字符串连接起来 不要用strcat函数 运行结果 请输入两个字符串 welcometoAHXDwelcometoAHXD includevoidmain inti 0 j 0 chars1 50 chars2 50 printf 请输入两个字符串 n gets s1 gets s2 while s1 i 0 i while s2 j 0 s1 j i s2 j j s1 j i 0 printf s n s1 5 5指针的使用 二 5 5 1指针与数组指针与数组关系密切 可通过指针来引用数组元素 设有N个元素的整型数组data N 数组data即指向其第一个元素的首地址 因此有下图所示 地址 存储空间 数组元素 data data 1 data i data 0 data 1 data i 显然 如下表达式是成立的 data i data i 两边同时做取内容的运算 得 data i data i 即 data i data i 或data i data i 由此可见 引用一个数组元素可用下标法 如data i 也可用指针法 如 data i 从以上两个式子 可得出指针与数组的两个重要恒等式 data i data i data i data i 设 inta 10 p p a 则p指向数组a的0号元素 下列语句是等效的 均是将10赋予a 1 a 1 10 p 1 10 a 1 10 p 10 即 p 1 a 1 p a 1 虽然a和p都指向数组的首地址 但数组名a是常量地址 不能随意改变 指针变量p可作为赋值对象增减 指向数组中任意元素 注意 即 p或p 正确 但 a或a 错误 p 1与p 的异同 p 1与p 都指向当前指针所指单元的下一个元素p 1并不改变当前指针的指向 即p的值并未改变 而p 相当于p p 1 即使指针p向下移动一个元素位置 3 在对指针进行加 减运算中 数字1不再代表十进制中的整数1 即 p 1 p 1 sizeof 基类型 inta 5 2 4 23 6 78 int p p a 若是 p 1 若是 p 基类型是int p 1相当于加上2个字节 例5 5 1 用指针处理数组 includemain inta 5 2 4 8 16 32 int ptr for ptr a ptr a ptr 按逆序输出数组元素 printf 3d ptr printf n 运行结果 24816323216842 includemain inta 10 i min int p p a for i 0 i p i min p i printf min d n min 例5 5 2 输入10个整数 找出最小值 利用指向数组的指针实现 注意 保证运算结果仍指向数组的一个有效元素 运行结果 12345678910min 1 5 5 2指针与字符串 字符串 数组和指针的关系数组 一组连续存放的数据 数组名为数组的起始地址指针 用来指向其它变量地址的变量字符串 以 0作为结束符的字符型数组 库函数 1 字符指针与字符串 一般来说 字符串可以用字符数组处理 也可用字符指针来处理 即可用字符指针处理字符串 charch ABCDEFGH char p1 p2 1234567 p1 THISISASTRING printf s n p2 printf s n ch 字符数组 长度为9 指针p2指向字符串的首址 字符串的输出 2 字符指针的初始化 实际指针的初始化 有两种方法 在定义时进行初始化如 char ptr Thisisastring 先定义后进行初始化如 char prt ptr Thisisastring include stdio h main charstr 20 charsource THISISASTRING char p source inti 0 while p i 0 str i p i i str i 0 字符串的结束标志 printf s n str 例5 5 3将字符串 THISISASTRING 复制到字符数组str中 无需调用自定义的字符串复制函数 运行结果 THISISASTRING include stdio h include string h voidmain charch asdfgtrewq char s ch inti j chartemp for i 0 j strlen s 1 i j i j temp s i s i s j s j temp printf s n s 例5 5 4定义一个函数 将字符串中各元素位置颠倒过来 运行结果 qwertgfdsa 5 5 3指针数组 数组指针 二级指针与二维数组 1 指针数组如果一个数组的元素值为指针 则此数组就是指针数组 如 int pa 3 2 数组指针在C语言中 还有一种变量 即数组指针变量 如 int p 3 表示一个指向二维数组的指针变量 可理解为指向一个行数未定而每行有3列的二维数组 3 二级指针如 int p 表示p是一个指针变量 它指向一个指向整型数据的指针变量 5 6排序 排序 把一组无序的数据元素按照关键字值递增 或递减 地重新排列 排序在处理数列时常用到 程序设计中用到的排序方法较多 如冒泡法 选择法 插入法和二分法等 5 6 1冒泡排序法指导思想 如果要对一列数进行升序排列 则将相邻的两个数进行比较 目的将大数下沉 小数上移从而实现升序排列 例如 对任意给定的5个整数进行升序排列 其过程如下 其中带下画线的数据项表示当前参与比较并已完成交换的数据项 中的数据表示已排好序 元素下标 01234 初始数据 43612 第一轮 第1步 34612第2步 34612第3步 34162第4步 3412 6 第一轮将所有数据中的最大值6排到了最后的位置 第二轮应该将剩下的4个数中的最大者移到6的前面 第二轮 第1步 3412 6 第2步 3142 6 第3步 312 4 6 第二轮比第一轮少了一步 找出了所剩元素的最大值4 第三轮再将剩下的3个数中的最大者移到4的前面 第三轮 第1步 132 4 6 第2步 12 3 4 6 第三轮结束后 只剩下最后两个元素 只要进行一次比较就呆将其中的大者移到后面 第四轮 第1步 1 2 3 4 6 至此 经过4轮后 已将5个任意排列的数据按升序排好 从排序的过程可以看出 对N个数进行冒泡排序 要经过N 1轮 第一轮要比较N 1次 后面每一轮的比较次数都比前一轮少一次 而每次比较后都可能要进行交换操作 例5 6 1用冒泡法对10个数排序 由小到大 includemain inta 10 inti j t printf input10numbers n for i 0 i 10 i scanf d for j 0 ja i 1 t a i a i a i 1 a i 1 t printf thesortednumbers n for i 0 i 10 i printf d a i 运行结果 input10numbers 1023967584thesortednumbers 0123456789 P111页例题 5 6 2选择排序法 指导思想 如果要对一个有N个数的数列 用数组a N 来表示 进行升序排列 共要进行N 1轮 在每一轮中都找出待排序数中最小数的位置 元素下标 k 扫描完一轮之后 再把参与这一轮排序的第一个数与a k 进行交换 每一轮参与排序的数据均比上一轮少一个 另外 在每一轮中要找出本轮n个数中的最小数 并进行n 1次比较 例如 任意给定的5个整数进行升序排列 其排序过程如下 4612 元素下标 01234 初始数据 34612 3 1 4 3 k j 3 第一轮 a 0 a 3 1 4632 4 3 1 k j 3 3 3 2 k j 4 第二轮 a 1 a 4 1 2 634 6 6 4 k j 4 第三轮 a 2 a 3 3 1 2 3 64 6 第四轮 a 3 a 4 6 3 k j 3 1 2 3 4 6 结果 例5 6 1用选择法将从键盘输入的10个学生的数学成绩按升序排列 include stdio h main inta 10 i j k temp printf enterthearray n for i 0 i 10 i scanf d 运行结果 enterthearray 0351249687thesortedarray 0123456789 printf thesortedarray n for i 0 i 10 i printf d a i printf n 5 6 3直接插入排序法 指导思想 采用直接插入排序法对一个数组进行排序时 首先将第一个元素 下标为0 作为已经排好的数据 然后从下标为1的元素开始 依次把后面的每一个元素按大小插入到前面的元素中间 直到将全部元素插完为止 从而完成排序功能 例如 要把下列数据按升序排列 用直接插入排序过程可表示如下 其中括号 中的数表示已排好序 元素下标 01234 初始数据 5 3412 第1步插入 35 412 第2步插入 345 12 第3步插入 1345 2 第4步插入 12345 由排序过程可见 每一步均对一个元素进行操作 而且每次必须先找出要插入的位置 再进行插入操作 例用插入法将从键盘输入的10个学生姓名按降序排列 include stdio h include string h defineSTD NUM10 defineNAME LENGTH30m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东佛山市博物馆招聘易考易错模拟试题(共500题)试卷后附参考答案
- 养猪扶贫项目协议书
- 山东轻工业协会事业单位招考人员易考易错模拟试题(共500题)试卷后附参考答案
- 分包工程劳务协议书
- 三坐标检测合同范本
- 核酸采样劳务协议书
- ktv股份合同范本
- 国网英大国际控股集团限公司2025年下半年度应届高校毕业生招聘易考易错模拟试题(共500题)试卷后附参考答案
- 校企合作终止协议书
- 档案安全使用协议书
- 学堂在线 人工智能 章节测试答案
- 彼得·蒂尔:硅谷教父的叛逆人生
- 高危药品外渗预防及处理
- bz-门式轻钢结构厂房施工组织设计投标方案230
- 钢结构焊接工艺评定
- 校园安全教育安排表
- 转炉维修安全培训课件
- 汽车悬架课件
- 浙江省2025年初中学业水平考试英语试卷(含答案)
- 计算机组装与维护试题库附带答案(总结全面)
- 急性上呼吸道感染
评论
0/150
提交评论