资源描述
第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤第 六 章 循 环 控 制 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤6.1循 环 结 构程 序 经 常 会 重 复 执 行 某 些 相 同 的 操 作 , 如 :求 : s=1+2+3+4+100算 法 描 述 : s=0;i=1; s+=i;i+; 判 断 i是 否 小 于 等 于 100 如 果 i 小 于 等 于 100, 重 复 ; 否 则 , 结 束 。 此 类 根 据 某 个 条 件 重 复 执 行 相 同 算 法 的 结 构 , 称 为 循 环 。初 始 化 部 分 。循 环 体 。 含 有 时 条 件 趋假 的 语 句 。 循 环 的 条 件 。循 环 应 在 有 限 次 完成 。 C语 言 提 供 了 三 类 实 现 循 环 的 语 句 :while, dowhile, for 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 while循 环 ( 当 型 循 环 )格 式 :while(expression)statement; 表 达 式 : 值 非 0, 表示 满 足 条 件 ; 值 为 0代 表 不 满 足 条 件 。语 句 ( 复 合 语 句 ) , 重 复执 行 部 分 ( 循 环 体 ) 。流 程 : e?yesstatement;no 含 有 使 条 件趋 假 的 语 句 。举 例 :求 s=1+2+3+4+100#includevoidmain(void)ints=0,i=1;while(i=100)s=s+i;/*s+=i;*/i+;printf(“s=%dn”,s); 初 始 化 部 分循 环 体条 件 测 试使 条 件 趋 假 语 句 chp3ex5 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 dowhile循 环 ( 直 到 型 循 环 )格 式 :dostatement; while(expression);流 程 :statement;e?yes no 含 有 使 条 件 趋 假 的 语 句 。while循 环 与 do-while循 环 的 区 别 :vwhile循 环 先 判 条 件 , 后 执 行 循 环 体 ;vdowhile循 环 先 执 行 循 环 体 , 后 判 条 件 。举 例 : 求 : 30!#includevoidmain(void)floats=1.0;inti=1;dos*=i;i+;while(i=30);printf(“30!=%f”,s); 初 始 化 。循 环 体 。测 试 条 件 。使 条 件 趋 假 。 chp3ex6思 考 题 :用 -while实 现 s=1+2+100。 用 while实 现 30! 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 for循 环格 式 : for(e1;e2;e3)statement;流 程 : e1e2?yesstatement;e3 no 举 例 :求 : s=1+2+3+100#includevoidmain(void)ints,i;for(s=0,i=1;i=100;i+)s=s+i;printf(“s=%d”,s);使 e2趋 假 。在 for循 环 中 , e1、 e2、 e3都 可 以 省 略 !e1省 略 s=0,i=1; e3省 略i+;初 值 表 达 式 。测 试 表 达 式 。增 值 表 达 式 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 循 环 应 用 的 几 个 问 题 循 环 的 嵌 套 概 念 : 在 一 个 循 环 的 循 环 体 内 又 包 含 一 个 完 整 的 循 环 称 为 循 环的 嵌 套 。 打 印 99乘 法 表 。#includevoidmain(void)inti,j;for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%4d“,i*j);printf(“n“);外层循环 内层循环说 明 : 内 外 层 循 环 采 用 缩 进 形 式 。 while和 do-while和 for可 以相 互 嵌 套 。 执 行 次 数 为 内 层 次 数 和 外 存 次 数 的 乘 积 。 chp3ex7 如 何 打 印乘 法 表 的一 半 ? 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 循 环 的 中 断 (break)和 继 续 (continue) 循 环 的 中 断 : break语 句概 念 : 循 环 体 中 可 以 加 分 支 , 判 断 是 否 继 续 执 行 循 环 , break语 句 可 以 提 前 结 束 循 环 。举 例 : 求 : r=110的 圆 的 面 积 , 如 圆 面 积 大 于 100则 中 断 。 for(r=1;r100)break;printf(“n%f“,area);满 足 条 件 , 则 退 出 循 环 。 继 续 循 环 : continue语 句continue语 句 的 作 用 是 跳 过 本 次 循 环 剩 余 的 循 环 体 内 容 , 执 行下 次 循 环 。 举 例 : 求 1100内 的 偶 数 和 。s=0;for(n=1;n=100;n+)if(n%2!=0)continue;s+=n; 满 足 条 件 , 跳 过 循环 体 , 继 续 循 环 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 无 限 循 环 和 空 循 环 条 件 为 恒 真 的 循 环 无 限 循 环while(1)dowhile(1);for(;) 靠 条 件 控 制 的 break语 句 退 出 循 环 。例 : 程 序 等 待 直 到 输 入 字 母 A。for(;)ch=getchar();if(ch=A)break; 循 环 体 为 空 语 句 的 循 环 空 循 环for(i=1;i=MAX;t+);作 用 : 程 序 延 时 。 空 语 句 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 goto语 句格 式 :gotoLabel/*Label:同 一 函 数 内 语 句 前 的 标 号 。 */作 用 : 转 移 到 标 号 对 应 的 语 句 上 继 续 执 行 。loop:if(i=100)sum=sum+i;i+;gotoloop; 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤循 环 和 分 支 相 互 嵌 套输 入 10个 自 然 数 统 计 其 中 偶 数 的 个 数 及 偶 数 值 和 。算 法 框 图 :start定 义 变 量初 始 化循 环 ?yes输 入偶 数 ?yes统 计 累 加 nono输 出 结 果end #includevoidmain(void)inti,ix,iCount=0,iSum=0;for(i=1;i=10;i+)scanf(“%dn”,if(ix%2=0)iSum+=ix;iCount+;printf(“Num=%dnSum=%d”,iCount,iSum); 循环结构分支结构输 入 负 数 ?doif(ix=0)printf(“dateerror”);while(ix=0); 算 法 的 健 壮 性注 意 : 结 构 应 完 整 的 包 含 和 被 包 含 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤举 例 : 求 100到 200之 间 的 所 有 素 数 ( 只 能 被 1和 自 身 整 除 的 数 ) 。对 于 自 然 数 n, 判 断 其 是 否 为 素 数 有 以 下 三 种 方 法 : 判 断 n是 否 能 被 从 2到 n-1范 围 内 的 数 整 除 ; 判 断 n是 否 能 被 从 2到 (int)(n/2)范 围 的 数 整 除 ; 判 断 n是 否 能 被 从 2到 (int)sqrt(n)范 围 的 数 整 除 ;程 序 设 计 中 标 志 技 术 的 使 用在 程 序 设 计 中 , 经 常 要 记 录 一 些 状 态 , 作 为 判 断 的 条 件 。 因 此需 要 在 程 序 中 设 置 一 些 标 志 , 通 常 标 志 是 整 型 变 量 。如 : 设 置 变 量 iFlag用 于 记 录 是 否 是 素 数 ,iFlag=1是 素 数 ;iFlag=0不 是 素 数 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤判 断 某 自 然 数 n是 否 是 素 数 的 算 法s=sqrt(n);iFlag=1;i 从2 循环到s n%i=0 yesiFlag=0;break;no继 续 循 环直 到 退 出iFlag=0? 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤程 序 如 下 :#include#includevoidmain(void)intn,j,s,iFlag;for(n=101;n200;n+=2)s=sqrt(n);iFlag=1;for(j=2;j=s;j+)if(n%j=0)iFlag=0;break;if(iFlag)printf(“n%d”,n); 0不 是 素 数 ; 1是 素 数 。 枚举所有数 构造,测试条件假 定 n是 素 数 。 如 果 n能 被 2到 s的 任意 数 整 除 , 设 标 志 退 出 循环 。如 果 n是 素 数 , 输 出 n。 chp3ex8 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 求 水 仙 花 数 ( 条 件 : 三 位 数 的 个 、 十 、 百 位 的 方 和 等 于 该数 。 153=13+53+33) 。n为 枚 举 变 量 , 枚 举 初 值 100, 枚 举 终 值 999。构 造 条 件 : 取 出 n的 个 、 十 、 百 位 数 。测 试 是 否 满 足 条 件 , 满 足 条 件 输 出 n。#includevoidmain(void)intn,a,b,c;for(n=100;n=999;n+)a=n/100;b=n%100/10;c=n%10;if(a*a*a+b*b*b+c*c*c=n)printf(“n%d”,n);枚举所有三位数 构造条件 测 试 条 件取 n的 百 位 a、 十 位 b、 个 位 c。chp3ex9 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤思 考 题 : 36人 一 次 搬 36块 砖 , 男 搬 4, 女 搬 2, 两 个 小 孩 抬 一 块 。 要 一次 搬 完 。 问 : 男 、 女 、 小 孩 要 多 少 ? “百 鸡 百 钱 ” 问 题 : “ 鸡 翁 一 , 值 钱 五 ; 鸡 母 一 , 值 钱 三 ; 鸡雏 三 , 值 钱 一 。 百 钱 买 百 鸡 , 问 鸡 翁 、 母 、 雏 各 几 何 ? 找 出 1000以 内 的 完 数 , 所 谓 完 数 是 指 该 数 的 各 因 子 之 和 等 于该 数 , 如 6=1+2+3。 证 明 6到 200以 内 的 数 , 符 合 哥 德 巴 赫 猜 想 ( 一 个 大 于 6的 偶数 , 可 以 分 解 成 两 个 质 数 之 和 ) 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤举 例 求 ex=1+x+x2/2!+xn/n!前 n+1项 之 和 。迭 代 次 数 i012n迭 代 公 式 t=t*x/i迭 代 初 值 exp=1,t=1,(i=1n)#includevoidmain(void)floatexp,x,t;inti,n;scanf(“%f,%d”,t=1.0;exp=1.0;for(i=1;i=n;i+)t*=x/i;exp+=t;printf(“n%f15.6”,exp) 迭 代 初 值 。迭 代 公 式 。迭代过程 附 加 条 件 :当 |t|10-5,结 束 运 算 。if(fabs(t)1e-5)break; chp3exa 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 用 梯 形 法 求 定 积 分 41 2 )412( dxxx(0,0)y xf(x)a b 面 积 hx 将 a, b分 为 n等 份 , h=(b-a)/n; 求 n个 梯 形 面 积 之 和 , 第 i小 面 积x=x+hf1=f(x)下 底s=s+(f0+f1)*h/2f0=f1迭 代 x初 值 为 as初 值 为 0f0初 值 为 f(a)次 数 为 n迭 代 求 积 分 的 方 法 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤程 序 如 下 : #includevoidmain(void)floata,b,f0,f1,h,x,s=0.0;intn,i;scanf(“%f,%f,%d”,h=(b-a)/h;x=a;f0=x*x+12.0*x+4.0;for(i=0;in;i+)x=x+h;f1=x*x+12.0*x+4.0;s=s+(f0+f1)*h/2.0;f0=f1;printf(“%f”,s); chp3exb迭 代 初 值 。迭代循环 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤 求 s=a+aa+aaa+aaaa。 0a10共 n项 , 最 后 一 项 有n个 a。如 求 s=2+22+222+2222+222222n、 a从 键 盘 输 入 。迭 代 次 数 : i=1n 迭 代 初 值 : s=0.0,t=a 迭 代 公 式 : t=t*10+a#includevoidmain(void)floats,t;inti,a,n;doscanf(“%d,%d”,if(a9)printf(“nDataInputError!nInputagain:”);while(a9);for(s=0.0,t=a,i=1;i=n;i+)s+=t;t=t*10+a;printf(“ns=%f”,s); 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤xy f(x)x1 f1=f(x1)x2f2=f(x2)算 法 分 析 : 输 入 x1、 x2, 并 求 出 f1、 f2。如 果 f1*f2大 于 0, 有 可 能 在 此区 间 内 没 有 根 , 重 新 输 入 。 否 则 , 将 区 间 二 分x=(x1+x2)/2计 算 出 f=f(x) xf 判 断 f与 f1是 否 同 号如 果 同 号 : x1=x, f1=f否 则 : x2=x, f2=f 11f1 f2 判 断 fabs(x1-x2)是 否 小 于 某 个 规 定 的 精 度 (如 10-6):如 果 小 于 精 度 : 求 出 根 , 退 出 到 。否 则 : 继 续 。 输 出 根 。 二 分 法 求 方 程 f(x)=x3-6x-1=0, 在 0, 5区 间 的 根 。 第 六 章 循 环 控 制WudaixianWudaixianWudaixian 主讲人:吴代贤二 分 法 求 方 程 根 程 序#include#includevoidmain(void)floatx1,x2,x,f1,f2,f;scanf(“%f,%f”,f1=x1*x1*x1-6.0*x1-1;f2=x2*x2*x2-6.0*x2-1;dox=(x1+x2)/2;f=x*x*x-6.0*x-1;if(f*f1=0)f1=f;x1=x;elsef2=f;x2=x;while(fabs(x1-x2)=1e-6);printf(“Rootis:%f”,(x1+x2)/2); chp3exd迭 代 初 值 。二分迭代循环 迭 代 条 件 。
展开阅读全文