第二讲循环结构

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二讲 循环结构
5-2 while语句
• while语句用来实现“当型”循环结构。其 一般形式如下: while(表达式)语句
– 其流程图见图5-1。 执行时先判断表达式, 若表达式为非0值,执 行循环体语句,然后再 判断表达式,直到表达
式为0(“假”)结束循环。
假 表 达 式 真
语句
退 出 循 环
while语句: • 循环变量的初始化; • while(循环条件) • { • 循环体; • 改变循环变量; • } do…while语句 • 循环变量的初始化; • do • { • 循环体; • 改变循环变量; • }
• while(循环条件);
for语句: for(循环变量的初始化; 循环条件; 改变循环变量 ) {循环体;}
5-3 do-while语句
• 对同一个问题可以用while语句处理,也可 以用do-while语句处理。do-while语句结构 可以转换成while结构。 • 结论:当while后面的表达式的第一次的值 为“真”时,两种循环得到的结果相同。 否则,二者结果不相同(指二者具有相同的 循环体的情况)。
5-3 do-while语句
• 【例5-7】用do-while语句求: • main() • { int k,sum=0; • k=1; • do • { surn=sum+k; • k++; • } • while(k<=100); • printf("%d",sum); • }
k
k 1
100
• • • • • • • • • •
#include<stdio.h> main() { int month,day,n=0; for(month=1;month<=12;month++) { for(day=1;day<=30;day++) {n=n+3;} } printf(“每年吃饭次数是%d\n”,n); }
– (3)循环体内一定要有改变循环继续条件的语句, 使得循环趋向于结束,否则循环将无休止的进 行下去,即形成“死循环”。 – (4)为使循环能够正确开始运行,还要做好循环 前的准备工作,分别给循环控制变量和累乘积 单元进行初始化,一般用于存放累乘积的单元 通常初始值为1,而用于存放累加和的单元通 常初始值为0。
图5-1“当型”循环流程图
5-2 while语句
• 【例5-2】求 k k 1 • main() • { int k,sum=0; • k=1; • while (k<=100) • { sum=sum+k; • k++; • } • printf("%d\n",sum); • }
100
5-2 while语句
5-6 循环嵌套
• 使用循环的嵌套结构要注意以几点:
– (1)外层循环应“完全包含”内层循环,不能 发生交叉。 – (2)嵌套的循环控制变量一般不应同名,以免 造成混乱。 – (3)嵌套的循环要注意正确使用缩进式书写格 式来明确嵌套循环的层次关系,以增加程序的 可读性。
5-7 break语句
• break语句还可以用来从循环体内跳出循环 体,即提前结束循环,接着执行循环下面 的语句。break语句的一般形式为: break; • break语句不能用于循环语句和switch语句 之外的任何其他语句中。
练习
• 1.每行输出5个”*”,共输出4行; • 2.第一行输出1个”*”,第二行输出2个”*”, 第5行输出5个”*”,共输出5行。
嵌套的实质
• 每层的“语句”里面可以包含其他结构
5-6 循环嵌套
• • • • 【例5-13】编程输出以下形式的乘法九九表。 1*1=1 1*2=2 1*3=3 1*4=4 … 1*8=8 1*9=9 2*1=2 2*2=4 … 2*9=18 3*1=3 3*2=6 … 3*9=27
5-4 for语句
• 说明: – (6)表达式1可以是设置循环变量初值 的赋值表达式,也可以是与循环变量 无关的其他表达式。 – (7)表达式一般是关系表达式(如 i<=100)或逻辑表达式(如a<b&&x<y), 但也可以是数值表达式或字符表达式, 只要其值为非零,就执行循环体。
三种循环控制语句
输出 sum=253
5-4 for语句
• 【例5-11】求非波那契数列。菲波那契数 列可以按如下定义: • a0=0 • a1=1 • a2=a0+a1 • a3=a1+a2 • … • an=an-2+an-1
5-4 for语句
• • • • • • • • • • • • • • #include<stdio.h> main() { int a0,a1,a2,k; a0=0; a1=1; printf("%6d%6d",a0,a1); for(k=2;k<=20;k++) { a2=a0+a1; printf("%6d",a2); a0=a1; 运行: 0 1 1 2 a1=a2; 5 8 13 21 } 55 89 144 233 } 610 987 1597 2584
5-6 循环嵌套
• 一个循环体内又包含另一个完整的循环结 构,称为循环的嵌套。 • 内嵌的循环中还可以嵌套循环,这就是多 层循环。 • 三种循环(while循环、do-while循环和for循 环)可以互相嵌套。 • 各种语言中关于循环的嵌套的概念都是一 样的。
实例
• 一日三餐,一个月按30日计算,一年按12 个月计算,问1年吃多少餐
求和
• • • • 1+2+3+…+ n 1+1/2+1/3+…+ 1/n 1+1/(1+2)+1/(1+2+3)+… +1/(1+2+3+…n) 1+2!+3!+… +n!
注意
• 通项:要用C的合法表达式正确的描述代数 表达式 • 求和终止条件: • 数据类型 • 累加和要初始化为0
小结
• 分析C语言的执行流程,要具有很好的逻辑 分析、推理能力 • 一要记忆理解语法,二要会分析运用 • 算法要遇到一个题型,掌握一种算法,心 态要好,慢慢学,逐步积累
5-8 continue语句
• 【例5-15】把100~200之间的不能被3整除的数 输出。 • main() • { int n; • for(n=100;n<=200;n++) • { if(n%3==0) • continue; • printf("%4d",n); • } • }
5-4 for语句
5-3 do-while语句
• do-while语句的特点是先执行循环体,然后 判断循环条件是否成立。其一般形式为: do { 语句 } while(表达式);
– 它是这样执行的:先执行一次指定的循环体语 句,然后判别表达式,当表达式的值为非零 (“真”)时,返回重新执行循环体语句,如此反 复,直到表达式的值等于0为止,此时循环结 束。
6765
3 34 377 4181
算法分析
• 除了第一项和第二项外,每项都是前2项之 和,那么就可以定义3个变量a0,a1,a2 • 第一次:a0=0 a1=1, a2=a1+a0 • 第二次:不需要a0的值,只需要a1和a2的 值,那么可以让a0保存a1,用a1保存a2,可 以计算第4项的值,并保存在a2中 a0=a1; a1=a2; a2=a1+a0;
for 语句的下一条语句
5-4 for语句
• 它的执行过程如下:
– – (1)先求解表达式l。 (2)求解表达式2,若其值为真(值为非0),则 执行for语句中指定的内嵌语句,然后执行下面 第(3)步。若为假 (值为0),则结束循环,转到 第(5)步。 – (3)求解表达式3。 – (4)转回上面第(2)步骤继续执行。 – (5)循环结束,执行for语句下面的一个语句。
求最大公约数
• 辗转相除法:g(a,b) = g(b,a%b) • 即a和b的最大公约数与b和a除以b的余数的 最大公约数相等。
算法分析
• • • • • • • 定义3个整型变量,m,n,r 用m存被除数,用n存储除数,用r存储余数 如果r==0,最大公约数就是n 如果r!=0, 则: m=n; n=r; r=m%n;
• 【例5-10】输入10个数求这10个数的和。 main() • { int sum,x,i; • sum=0; • for(i=1;i<=10;i++) • { scanf("%d",&x); • sum=sum+x; } • printf("sum=%d\n",sum); • } 运行时输入1 5 7 8 9 67 56 45 34 21<回车>
• 9*1=9 9*2=18 9*3=27

9*9=81
算法分析源自文库
• 共9行 ,可以设计一个循环,输出9行 • 每行有9列,可以设计一个循环,输出9列 • 每列输出格式 • 行号*列号=行*列之积
main() { int i,j; for(i=1;i<=9;i++) /*i作为外循环控制变量控制被乘数 变化*/ { printf("\n"); for(j=1;j<=9;j++) /*j作为内循环控制变量控制乘数变 化*/ printf("%1d*%1d=%2d ",i,j,i*j); } }
5-4 for语句
• C语言中的for语句使用最为灵活, 不仅可以用于循环次数已经确定 的情况,而且可以用于循环次数 不确定而只给出循环结束条件的 情况,它完全可以代替while语句。 for语句的一般形式为: • for(表达式1;表达式2;表达式3)语 句
求解表达式1
表达式
2


语句
求解表达式3
5-4 for语句
• 说明: – (1)for语句的一般形式中的“表达式l”可以 省略,此时应在for语句之前给循环变量 赋初值。注意省略表达式1时,其后的分 号不能省略。 – (2)如果表达式2省略,即不判断循环条件, 循环无终止地进行下去。也就是认为表 达式2始终为真。
5-4 for语句
• 说明: – (3)表达式3也可以省略,但此时程序设 计者应另外设法保证循环能正常结束。 – (4)可以省略表达式1和表达式3,只有表 达式2,即只给循环条件。 – (5)三个表达式都可省略,如:for(;;)
5-2 while语句
• 【例5-5】输入两个数m,n求m,n的最大公约数。 • main() • { int m,n,r; • scanf("%d,%d",&m,&n); • r=m%n; • while(r!=0) • { m=n;n=r;r=m%n;} • printf("%d\n",n); • } 运行时输入24,16<回车> 输出8
• 使用while循环结构应注意以下几点:
– (1)while循环结构的特点是“先判断后执 行”,如果表达式的值一开始就为“假”,循 环体一次也不执行。 – (2)循环体中,如果包含一个以上的语句,则 应用花括号括起来,以复合语句的形式出现。
5-2 while语句
• 使用while循环结构应注意以下几点:
5-8 continue语句
• 一般形式为: continue; • 其作用为结束本次循环,即跳过循环体中 下面尚未执行的语句,接着进行下一次是 否执行循环的判定。 • continue语句和break语句的区别是: continue语句只结束本次循环,而不是终止 整个循环的执行。而break语句则是结束整 个循环过程,不再判断执行循环的条件是 否成立。
5-3 do-while语句
• 【例5-8】 while和do-while循环的比较。 • (1)main() (2)main() • {int sum=0,k; {int sum=0,k; • scanf("%d",&k); scanf("%d",&k); • while(k<=10) do • { sum=sum+k; { sum=sum+k; • k++; k++; 运行情况如下: 运行情况如下: • } } while(k<=10); 1<回车> 1<回车> • printf("sum=%d",sum); printf("sum=%d",sum); sum=55 sum=55 • } } 再运行一次: 再运行一次: 11<回车> 11<回车> sum=0 sum=11
相关文档
最新文档