版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、5.1 5.2 5.3 5.4 概述概述 while语句语句 do-while语句语句 for语句语句 第第5章章 循环结构程序设计循环结构程序设计 5.5break语句和语句和continue语句语句 5.6 5.7 循环的嵌套循环的嵌套 循环结构程序设计举例循环结构程序设计举例 第第5章章 循环结构程序设计循环结构程序设计 问题:实际生活生产中,经常需要重复进行某些问题:实际生活生产中,经常需要重复进行某些 动作,即循环,动作,即循环,C C中允许吗?中允许吗? 使用语句对程序的执行情况进行循环控制。使用语句对程序的执行情况进行循环控制。 n小学生的作业经常是要求小学生的作业经常是要求 一
2、个字重复写多少遍一个字重复写多少遍 n连锁店也是一种复制连锁店也是一种复制 n机械化生产机械化生产 n流水线生产流水线生产 这些事件的特点是:这些事件的特点是: 满足一定条件时,对某一动作进满足一定条件时,对某一动作进 行重复。行重复。 C C语言在进行程序设计的时候,语言在进行程序设计的时候, 也提供了同样的结构供用户使用:循也提供了同样的结构供用户使用:循 环结构。环结构。 本章要点本章要点 本章难点本章难点 n while语句构成的循环结构 n do-while语句构成的循环结构 n for语句构成的循环结构 n break语句和continue语句 n 多重循环结构的实现 教学目的和基
3、本要求:教学目的和基本要求: 要求学生了解循环结构程序设计,要求学生了解循环结构程序设计, 掌握各种循环语句应用的特点及异同点,掌握各种循环语句应用的特点及异同点, 掌握循环嵌套及复合结构。掌握循环嵌套及复合结构。 教学重点:教学重点: 各种循环语句应用的特点及异同点。各种循环语句应用的特点及异同点。 5-1 概述概述 在许多实际问题中,经常会遇到有规律的重复运在许多实际问题中,经常会遇到有规律的重复运 算。例如:计算全班学生的平均成绩;统计满足一定算。例如:计算全班学生的平均成绩;统计满足一定 条件的实验数据等。利用计算机程序处理这类问题时,条件的实验数据等。利用计算机程序处理这类问题时,
4、就需要反复执行指定的语句序列来达到预定的目的。就需要反复执行指定的语句序列来达到预定的目的。 程序中的这种结构称为循环结构,被反复执行的语句程序中的这种结构称为循环结构,被反复执行的语句 序列称为循环体。循环结构是结构化程序的三种基本序列称为循环体。循环结构是结构化程序的三种基本 结构之一,它与顺序结构、选择结构共同作为各种复结构之一,它与顺序结构、选择结构共同作为各种复 杂程序的基本构造单元。因此熟练掌握选择结构和循杂程序的基本构造单元。因此熟练掌握选择结构和循 环结构的概念及使用是程序设计的最基本的要求。环结构的概念及使用是程序设计的最基本的要求。 首先我们通过两个示例来了解有关循环的概念
5、。首先我们通过两个示例来了解有关循环的概念。 示例一示例一:试设计一个程序,计算并输出:试设计一个程序,计算并输出110的平方的平方 根。根。 下面我们分别用顺序结构和循环结构来编程,通下面我们分别用顺序结构和循环结构来编程,通 过比较来加以说明。过比较来加以说明。 程序程序1:用顺序结构设计程序。:用顺序结构设计程序。 #include #include void main( ) int x=1; printf(x=%d,y=%fn,x+,sqrt(x); printf(x=%d,y=%fn,x+,sqrt(x); printf(x=%d,y=%fn,x+,sqrt(x); printf(x
6、=%d,y=%fn,x+,sqrt(x); 分析上述程序执行过程。分析上述程序执行过程。 程序程序2:用循环结构设计程序。:用循环结构设计程序。 #include #include void main( ) int x; for(x=1;x=10;x+) printf(x=%d,y=%fn,x,sqrt(x); 若需计算并输出若需计算并输出11000的平方根,只需修改的平方根,只需修改for语语 句中的句中的x=1000。 示例二示例二:求求1100的累加和。的累加和。 根据已有的知识,可以设变量根据已有的知识,可以设变量s存储累加和存储累加和,其初值为其初值为0, 变量变量n的值由的值由1变
7、化到变化到100, 将将n的每一个值累加到的每一个值累加到s变量,变量, 则可以实现上述算法。程序为:则可以实现上述算法。程序为: #include void main( ) int s=0,n=0; n=n+1; s=s+n; n=n+1; s=s+n; printf(%dn,s); 显然上述程序很繁琐,显然上述程序很繁琐,n=n+1; 和和 s=s+n;两语句在程序两语句在程序 中反复出现了中反复出现了100次。现在换个思路来考虑,改用循环结次。现在换个思路来考虑,改用循环结 构来重新设计程序:构来重新设计程序: 首先设置一个累计器首先设置一个累计器sum,其初值为其初值为0,利用,利用s
8、um += n来来 计算(计算(n依次取依次取1、2、100),只要解决以下),只要解决以下3个问个问 题即可:题即可: (1)将)将n的初值置为的初值置为1; (2)每执行)每执行1次次sum += n后,后,n增增1; (3)当)当n增到增到101时,停止计算。此时,时,停止计算。此时,sum的值就是的值就是 1100的累计和。的累计和。 /*程序功能:求程序功能:求1100的累计和的累计和*/ #include void main( ) int i,sum=0; /*将累加器将累加器sum初始化为初始化为0*/ for(i=1; i=100; i+) sum += i; /*实现累加实现
9、累加*/ printf(sum=%dn,sum); 程序运行结果:程序运行结果: sum=5050 从上述示例可以看出,循环即重复地执行某一部从上述示例可以看出,循环即重复地执行某一部 分的操作,而循环结构即被反复执行的语句序列。分的操作,而循环结构即被反复执行的语句序列。 在语言中,可用以下语句实现循环:在语言中,可用以下语句实现循环: (1)用)用while语句。语句。 (2)用)用do-while语句。语句。 (3)用)用for语句。语句。 (4)用)用goto语句和语句和if语句构成循环。语句构成循环。 在在C语言中由语言中由while 或或 do while语句构成的语句构成的 循环
10、结构称为条件循环,即根据条件来决定是否继循环结构称为条件循环,即根据条件来决定是否继 续循环;续循环; 而由而由for语句构成的循环结构称为计数循环,语句构成的循环结构称为计数循环, 即根据设定的执行次数来执行循环。即根据设定的执行次数来执行循环。 gotogoto 语句标号;语句标号; 标号:语句;标号:语句; goto语句及用语句及用goto构成循环构成循环 goto语句一般格式:语句一般格式: 功能:无条件转移语句功能:无条件转移语句 说明:说明: 不能用整数作标号不能用整数作标号 只能出现在只能出现在goto所在函数内所在函数内,且唯一且唯一 只能加在可执行语句前面只能加在可执行语句前
11、面 限制使用限制使用goto语句语句 goto语句构成的循环结构语句构成的循环结构 1. goto语句称为无条件转向语句,其一般形式为:语句称为无条件转向语句,其一般形式为: goto 语句标号;语句标号; 其中:语句标号用标识符表示,它的命名规则其中:语句标号用标识符表示,它的命名规则 与变量名的命名规则相同,即由字母、数字和下与变量名的命名规则相同,即由字母、数字和下 划线组成,第一个字符必须为字母或下划线。划线组成,第一个字符必须为字母或下划线。C 语言允许任何语句前加语句标号。语言允许任何语句前加语句标号。 2. 语句功能:使程序执行流程无条件转向本函数语句功能:使程序执行流程无条件转
12、向本函数 内以内以goto语句后面的标识符为标号的语句。常与语句后面的标识符为标号的语句。常与if 语句构成循环结构。语句构成循环结构。 #include main() int i=1,sum=0; loop: sum= sum+i; i+; if(i=100) goto loop; printf(the sum of 1 to 100 is:%dn,sum); sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050 循环初值循环初值 循环终值循环终值 循环变量增值循环变量增值 循环条件循环条件 3. 应用举例:应用举例: 用用goto语句构
13、成循环,求语句构成循环,求1到到100的的 整数和。整数和。 循环体循环体 运行结果运行结果:the sum of 1to 100 is:5050 4. 注意:注意: 语句标号是语句标号是goto语句转向目标的标志,因此,语句转向目标的标志,因此, goto语句后的标号必须与作为转向目标的语句标语句后的标号必须与作为转向目标的语句标 号完全相同。号完全相同。 语句标号不能用整数来作为标号。语句标号不能用整数来作为标号。 结构化程序设计方法,主张限制使用结构化程序设计方法,主张限制使用goto语句。语句。 因为滥用因为滥用goto语句,将会导致程序结构无规律、语句,将会导致程序结构无规律、 可读
14、性差,但也不是绝对禁止使用可读性差,但也不是绝对禁止使用goto语句,一语句,一 般来说,可以有两种用途:般来说,可以有两种用途: 与与if语句构成循环结构;语句构成循环结构; 从循环体中跳转到循环体外(主要是从内层循从循环体中跳转到循环体外(主要是从内层循 环跳转到外层循环)环跳转到外层循环)。 5-2 while语句语句 while语句是条件循环语句,它用来实现语句是条件循环语句,它用来实现当型当型 循环结构,即先判断条件,后执行循环体。循环结构,即先判断条件,后执行循环体。 一、一、while语句的一般格式语句的一般格式 1. 格式:格式: while(表达式表达式) 循环体语句组;循环
15、体语句组; 2. 语句功能语句功能: 当表达式的值为非当表达式的值为非0时,重复执行循环体时,重复执行循环体 中所包含的语句;当表达式的值为中所包含的语句;当表达式的值为0时,退出循环。时,退出循环。 3. 语句特点:语句特点:先判断表达式,后执行循环体中语句。先判断表达式,后执行循环体中语句。 二、二、 while语句的执行过程语句的执行过程 执行过程如右图所示。执行过程如右图所示。 1. 求解表达式的值。如果其值为非求解表达式的值。如果其值为非0, 转执行循环体内语句组,然后转执行循环体内语句组,然后 返回,重新计算表达式;否则返回,重新计算表达式;否则 转,即如果表达式的值为零,转,即如
16、果表达式的值为零, 则结束循环。则结束循环。 2. 执行循环体语句组,然后转。执行循环体语句组,然后转。 3. 执行执行while语句的下一条语句。语句的下一条语句。 显然,在显然,在while循环结构中,如循环结构中,如 果表达式的值一开始就为果表达式的值一开始就为0,则循,则循 环体中语句一次也不会被执行。环体中语句一次也不会被执行。 表达式 循环体 While语句的 下一语句 为为0 非非0 1 2 3 三、说明三、说明 1. while是是C语言的关键字;语言的关键字; 2. while后一对园括号中的表达式可以是后一对园括号中的表达式可以是C语言中任意合语言中任意合 法的表达式,由它
17、来控制循环体是否执行;法的表达式,由它来控制循环体是否执行; 3. 在语法上,要求循环体可以是一条简单可执行语句;在语法上,要求循环体可以是一条简单可执行语句; 若循环体内需要多个语句,应该用大括号括起来,组若循环体内需要多个语句,应该用大括号括起来,组 成复合语句。如果不加大括号,则成复合语句。如果不加大括号,则while语句的范围语句的范围 只到只到while后面的第一个分号处。后面的第一个分号处。 4. 在循环体中必须有使循环趋于结束的语句,否则将在循环体中必须有使循环趋于结束的语句,否则将 出现出现死循环死循环。 while(表达式) 循环体语句; 表达式 循环体 假(0) 真(非0)
18、 while n一般形式: n执行过程: 任意合法的表达式(关系或逻辑表达式),任意合法的表达式(关系或逻辑表达式), 只要表达式的值为只要表达式的值为真真( (非非0)0)就继续循环。就继续循环。 n特点:先判断表达先判断表达 式,再执行循环体式,再执行循环体 while语句语句 #include main() int n=0; printf(input a string:n); while(getchar()!=n) n+; printf(%d,n); 循环条件循环条件 变量初值变量初值 循环体循环体 四、应用举例举例四、应用举例举例1: 教材教材P68页例页例5-2。 统计从键盘输入一行
19、字符的个数。统计从键盘输入一行字符的个数。 注意: while(i=0,执行第执行第4步,否则执行第步,否则执行第7步步 4. n+ 5. s=s+score 6. 录入下一个录入下一个score,并返回第并返回第3步步 7. 如果如果n0,输出输出s/n,否则输出没有学生成绩,否则输出没有学生成绩 #include void main( ) int n=0 ; float s=0,score; scanf( %f , while (score = 0 ) n+; s=s+score; scanf( %f , if(n0) printf ( n %f, s/n); else printf(no
20、 student score!); 程序:程序: 例例5-1 用用while语句求语句求1100的累加和。的累加和。 /*程序功能:求程序功能:求1100的累计和的累计和*/ #include void main( ) int i=1,sum=0; /*初始化循环控制变量初始化循环控制变量i和累计器和累计器sum*/ while( i=100 ) sum += i; /*实现累加实现累加*/ i+; /*循环控制变量循环控制变量i增增1*/ printf(sum=%dn,sum); 程序运行情况如下:程序运行情况如下: sum=5050 若将程序中的部分语句改为若将程序中的部分语句改为: in
21、t i=0,sum=0; while(i=100) i+; sum+=i; 则运行结果是否会发生改变?则运行结果是否会发生改变? 例例5-2 输入任意两个正整数输入任意两个正整数m和和n,求其最大公约数和最小求其最大公约数和最小 公倍数。公倍数。 求最大公约数:求最大公约数: 概念:两个整数的最大公约数就是能整除这两个整数的概念:两个整数的最大公约数就是能整除这两个整数的 最大整数。最大整数。 例如:例如:12和和8的最大公约数为的最大公约数为4;10和和15的最大公约数的最大公约数 为为5;3和和7的最大公约数为的最大公约数为1等。等。 计算方法:计算方法:辗转相除的算法。辗转相除的算法。
22、求最小公倍数:求最小公倍数: 概念:两个整数的最小公倍数即为两个整数的最小公共概念:两个整数的最小公倍数即为两个整数的最小公共 倍数。倍数。 例如:例如:12和和8的最小公倍数为的最小公倍数为24;而;而10和和15的最小公倍的最小公倍 数为数为30;3和和7的最小公倍数为的最小公倍数为21等。等。 计算方法:计算方法:将两个整数相乘的乘积除以最大公约数将两个整数相乘的乘积除以最大公约数。 程序:程序: #include void main( ) int x,y,t,a,b,n,u; scanf(%d,%d, if(xy) n=x; x=y; y=n; a=x;b=y; while(y!=0)
23、 t=x%y; x=y; y=t; u=x; n=(a*b)/u; printf(最大公约数为最大公约数为%dn,u); printf(最小公倍数为最小公倍数为%dn,n); 5-3 dowhile语句语句 dowhile语句是用来实现语句是用来实现直到型直到型循环结构循环结构 的另一种循环语句,该语句的特点是:先执行循的另一种循环语句,该语句的特点是:先执行循 环体中的语句,再通过判断表达式的值来决定是环体中的语句,再通过判断表达式的值来决定是 否继续循环。否继续循环。 一、一、dowhile语句的一般格式语句的一般格式 do 循环体语句组循环体语句组; while(表达式表达式) ; 当循
24、环体语句组仅由一条语句构成时,可以当循环体语句组仅由一条语句构成时,可以 不使用复合语句形式。不使用复合语句形式。 注意:注意: 分号不能丢分号不能丢 二、二、dodowhilewhile 语句的语句的 执行过程执行过程 执行过程如右图所示。执行过程如右图所示。 先执行一次循环体语句。先执行一次循环体语句。 计算表达式值。如果表达式的值计算表达式值。如果表达式的值 为非为非 0(真),则转向(真),则转向 继续执行;继续执行; 否则,转向否则,转向 。 执行执行while语句的下一条语句。语句的下一条语句。 dowhile循环语句的特点是:循环语句的特点是: 无条件地先执行一次循环体内语句无条
25、件地先执行一次循环体内语句 组(无论表达式的值是否为组(无论表达式的值是否为0或非或非 0),然后再判断循环条件,所以),然后再判断循环条件,所以 称为称为直到型循环直到型循环。 循环体语句 表达式 为为0 非非0 do-while语句 的下一语句 1 2 3 三、说明三、说明 1. do是是C语言的关键字,必须和语言的关键字,必须和while联合使用;联合使用; 2. dowhile循环由循环由do开始,用开始,用while结束;必须注意结束;必须注意 的是:在的是:在while(表达式表达式) 后的后的;不可丢,它表示不可丢,它表示 dowhile语句的结束;语句的结束; 3. while
26、后一对园括号中的表达式可以是后一对园括号中的表达式可以是C语言中任意语言中任意 合法的表达式,由它来控制循环体是否执行;合法的表达式,由它来控制循环体是否执行; 4. 在语法上,要求循环体可以是一条简单可执行语在语法上,要求循环体可以是一条简单可执行语 句;若循环体内需要多个语句,应该用大括号括起句;若循环体内需要多个语句,应该用大括号括起 来,组成复合语句。来,组成复合语句。 5. 在循环体中必须有使循环趋于结束的语句,否则将在循环体中必须有使循环趋于结束的语句,否则将 出现出现死循环死循环。 四、应用举例四、应用举例 用用do-while语句重新编写前面举例语句重新编写前面举例2统计学生平
27、均成绩统计学生平均成绩 的程序:的程序: #include void main( ) int n=0 ; float s=0,score; do scanf( %f , n+; s=s+score; while(score=0); if(n1) printf ( n %f ,(s-score)/(n-1); else printf(no student score!); 由于由于do-while语句至语句至 少要被执行一次,特少要被执行一次,特 别要注意别要注意n和和s的取值的取值 问题!问题! 想想这样的一段循环语句的执行结果想想这样的一段循环语句的执行结果: i=1; while (i=1
28、00) putchar(*); i+; 这个循环永远不会结束这个循环永远不会结束,因因 为循环控制变量为循环控制变量i没有在循没有在循 环体内被改变,环体内被改变,i+; 不属不属 于循环体。于循环体。 循环语句中一定要注循环语句中一定要注 意表达式的值是否能在意表达式的值是否能在 循环执行过程中被改变,循环执行过程中被改变, 以免造成死循环。以免造成死循环。 例例5-3 用用dowhile语句求解语句求解1100的累计和。的累计和。 #include void main( ) int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器定义并初始化循环控制变量,以及累计器*/ d
29、o sum += i; /*累加累加*/ i+; while(i=100);/*循环继续条件:循环继续条件:i=100*/ printf(sum=%dn,sum); dowhile语句比较适用于处理:不论条件是语句比较适用于处理:不论条件是 否成立,先执行否成立,先执行1次循环体语句组的情况。除此之次循环体语句组的情况。除此之 外,外,dowhile语句能实现的,语句能实现的,for语句也能实现,语句也能实现, 而且更简洁。而且更简洁。 do 循环体语句;循环体语句; while(表达式表达式); do-while语句 n一般形式: n执行过程: do 循环体循环体 表达式表达式 假假(0)
30、真真(非非0) while n特点:先执行循环先执行循环 体,再判断表达式体,再判断表达式 至少执行一次循环至少执行一次循环 体体 n教材P70页例5.3 求整数i,它满足条件: 1+2+(i-1)100且1+2+ + i 100。 #include main() int i=0,sum=0; do i+; sum=sum+i; while(sum100); printf(the integer is:%dn,i); do sum =sum+i sum100 假(0) 真(非0) while 运行结果:运行结果:the integer is:14 n教材教材P70页例页例5.4 任意输入一个正
31、整数任意输入一个正整数,将该数各位颠将该数各位颠 倒顺序输出。倒顺序输出。 如,输入如,输入1234,输出为,输出为4321。 算法分析:算法分析:根据题目要求,可以采用除根据题目要求,可以采用除1010取余的方法取余的方法, ,依次从依次从 输入数的右边截取各位数字输出。输入数的右边截取各位数字输出。 #include main() int n,d; printf(input a integer:); scanf(%d, while(n!=0) d=n%10; printf(%d,d); n=n/10; do d=n%10; printf(%d,d); n=n/10; while(n!=0)
32、; 运行结果:运行结果: input a integer:1234 4321 n注意:注意: (1) do-while循环由循环由do开始,一直到开始,一直到while结结 束。束。do-while语句的表达式后面则必须语句的表达式后面则必须加分加分 号号,表示,表示do-while循环的结束。循环的结束。 (2) 在在do和和while之间的循环体由多个语句组之间的循环体由多个语句组 成时,必须用花括弧成时,必须用花括弧括起来组成一个复合括起来组成一个复合 语句。语句。 (3) do-while和和while语句相互替换时,要注意语句相互替换时,要注意 修改循环控制条件。修改循环控制条件。
33、对于循环体至少要执行一遍的这类问题,对于循环体至少要执行一遍的这类问题, 编程时就应该尽量使用编程时就应该尽量使用do-whiledo-while语句。语句。 (4) 程序中要有使循环条件从真变成假的语句,程序中要有使循环条件从真变成假的语句, 否则就会造成死循环。否则就会造成死循环。 5-4 for循环语句循环语句 在循环语句中,在循环语句中,for语句是最有特色的循环语句,语句是最有特色的循环语句, 使用最为灵活,不仅可用于循环次数已经确定的情使用最为灵活,不仅可用于循环次数已经确定的情 况,也可用于循环次数虽不确定、但给出了循环继况,也可用于循环次数虽不确定、但给出了循环继 续条件的情况
34、,在实际应用中最为广泛。续条件的情况,在实际应用中最为广泛。 一、一、for语句的一般格式语句的一般格式 for语句的一般格式:语句的一般格式: for(表达式表达式1;表达式;表达式2;表达式;表达式3) 循环体;循环体; 例如:例如:for(i=0; i10; i+) printf(*); for(for(表达式表达式1;1;表达式表达式2;2;表达表达3)3) 语句;语句; for语句语句 n一般形式一般形式: n执行过程执行过程: 表达式表达式2 2 循环体循环体 假假(0)(0) 真真( (非非0)0) forfor 表达式表达式1 1 表达式表达式3 3 表达式表达式1:循环前赋值
35、:循环前赋值 表达式表达式2:循环条件:循环条件 表达式表达式3: 修改循环控制变量的值修改循环控制变量的值 注意:注意: p这三个表达式都可以是任意合法的表达式,甚至这三个表达式都可以是任意合法的表达式,甚至 是逗号表达式,即每个表达式都可由多个表达式是逗号表达式,即每个表达式都可由多个表达式 组成。组成。 l三个表达式都是任选项,都可以省略,但分号间隔符三个表达式都是任选项,都可以省略,但分号间隔符 不能省。不能省。 p循环体语句如果由多条语句组成,一定要用花括循环体语句如果由多条语句组成,一定要用花括 弧弧括起来。括起来。 l循环体可以是一个分号,即空语句。循环体可以是一个分号,即空语句
36、。 l循环体不为空语句时,绝不能在表达式的括号后加分循环体不为空语句时,绝不能在表达式的括号后加分 号,否则会被认为循环体是空语句而不能反复执行真号,否则会被认为循环体是空语句而不能反复执行真 正的循环体。正的循环体。 二、二、for语句中的各表达式的含义语句中的各表达式的含义 1. for是是C语言的关键字,其后的一对园括号中通常语言的关键字,其后的一对园括号中通常 含有三个表达式,各表达式之间用分号含有三个表达式,各表达式之间用分号;间隔。间隔。 2. 表达式表达式1可以是赋值表达式、逗号表达式或函数调可以是赋值表达式、逗号表达式或函数调 用表达式,它是循环控制的初始化部分,为循环用表达式
37、,它是循环控制的初始化部分,为循环 中所使用的变量赋初值,即为循环做准备;中所使用的变量赋初值,即为循环做准备; 3. 表达式表达式2通常是关系表达式或逻辑表达式,它是循通常是关系表达式或逻辑表达式,它是循 环控制的条件,循环体反复执行多次,必须在循环控制的条件,循环体反复执行多次,必须在循 环条件满足的情况下(即表达式环条件满足的情况下(即表达式2的值为非的值为非0)才)才 能进行,否则循环终止;能进行,否则循环终止; 4. 表达式表达式3是赋值表达式或是算术表达式,它使循环是赋值表达式或是算术表达式,它使循环 变量的值或循环控制条件得到修改,使循环只能变量的值或循环控制条件得到修改,使循环
38、只能 执行有限次;循环体是循环结构中被反复执行的执行有限次;循环体是循环结构中被反复执行的 语句序列。语句序列。 三、三、for语句的执行过程语句的执行过程 执行过程如右图所示。执行过程如右图所示。 (1)计算表达式)计算表达式1; (2)计算表达式)计算表达式2,如果其值,如果其值 非非0,则执行第,则执行第(3)步;若步;若 其值为其值为0,则终止循环,则终止循环, 转至第转至第(5)步执行;步执行; (3)执行循环体中语句(或语)执行循环体中语句(或语 句组);句组); (4)计算表达式)计算表达式3,然后转向,然后转向 第第(2)步继续执行;步继续执行; (5)执行)执行for语句的下
39、一条语句。语句的下一条语句。 计算表达式计算表达式1 计算表达式计算表达式2 循环体循环体 计算表达式计算表达式3 for语句的下一语句语句的下一语句 5 4 3 2 1 非非0 为为0 通过分析例通过分析例: 求求 1+2 +99的程序,的程序, 进一步了解进一步了解for语句的执行过程。语句的执行过程。 #include void main( ) int i,s=0; for(i=1;i=99;i+) s=s+i; printf(s=%d,s); 分析:用变量分析:用变量i i从从1 1到到9999循环,循环, 把把i i的值累加到变量的值累加到变量s s中,最中,最 后输出后输出s s的
40、值。的值。 程序如下:程序如下: i=1 i=99 s=s+i i+ 假假 真真 从上面的程序我们看到,从上面的程序我们看到,for语句中:语句中: 表达式表达式1:通常是给循环变量赋初值。通常是给循环变量赋初值。 表达式表达式2:循环是否继续执行的判别表达式,这个循环是否继续执行的判别表达式,这个 表达式通常与某一个(或多个)变量的值有关,表达式通常与某一个(或多个)变量的值有关, 随着这个(些)变量的值的改变,表达式的结果随着这个(些)变量的值的改变,表达式的结果 发生变化,这个(些)变量被称为循环控制变量。发生变化,这个(些)变量被称为循环控制变量。 表达式表达式3:通常用于改变循环控制
41、变量的值。通常用于改变循环控制变量的值。 在某些情况下,在某些情况下,for语句中的表达式语句中的表达式1、2、3都都 可以省略,而改用其他的方式来实现这些功能。可以省略,而改用其他的方式来实现这些功能。 我们还用上面的例子说明我们还用上面的例子说明for语句省略表达式的语句省略表达式的 情形。情形。 1.省略表达式:省略表达式: #include void main( ) int i=1,s=0; for( ; i=99; i+) s=s+i; printf(s=%d,s); 2.省略表达式省略表达式3: #include void void main( ) int i,s=0; for(i
42、=1;i=99 ; ) s=s+i;i+; printf(s=%d,s); 3. 同时省略表达式同时省略表达式1、3 #include void main( ) int i=1,s=0; for( ; i=99 ; ) s=s+i;i+; printf(s=%d,s); 表达式表达式2也可以省略也可以省略 但在循环体中要借助但在循环体中要借助 break;语句来实现循语句来实现循 环的结束,我们将在环的结束,我们将在 后面介绍。后面介绍。 注意:表达注意:表达 式省略,分式省略,分 号不省略。号不省略。 for语句中的表达式可以是一切形式的表达式,语句中的表达式可以是一切形式的表达式, 逗号运
43、算符参与的表达式也可以运用在逗号运算符参与的表达式也可以运用在for语句中,语句中, 通常运用于表达式通常运用于表达式1和表达式和表达式3。 如上面的例子可以改写为:如上面的例子可以改写为: #include void main( ) int i,s; for(s=0,i=1;i=99;s=s+i,i+) ; printf(s=%d,s); 注意此处注意此处 的分号。的分号。 此处,表达式此处,表达式1用逗号表达式的形式,给多个用逗号表达式的形式,给多个 变量赋初值。表达式变量赋初值。表达式3用逗号表达式把循环体也用逗号表达式把循环体也 写入其中。注意表达式写入其中。注意表达式3书写顺序不能交
44、换。书写顺序不能交换。 四、四、for语句的说明语句的说明 1. 在在for语句中的三个表达式可缺省,甚至全部缺省,但其语句中的三个表达式可缺省,甚至全部缺省,但其 间的分号不能省略。另外,要注意各表达式缺省时的不间的分号不能省略。另外,要注意各表达式缺省时的不 同处理方式。同处理方式。 2. 当循环体语句组仅由一条语句构成时,可以不使用复合当循环体语句组仅由一条语句构成时,可以不使用复合 语句形式,如教材语句形式,如教材P72页例页例5-5所示。所示。 3. 表达式表达式1为为循环变量赋初值循环变量赋初值表达式,既可以是给循环变表达式,既可以是给循环变 量赋初值的赋值表达式,也可以是与此无关
45、的其它表达量赋初值的赋值表达式,也可以是与此无关的其它表达 式(如逗号表达式)。式(如逗号表达式)。 例如,例如,i=1; for(sum=0;i=100;i+) sum += i; for(sum=0,i=1;i=100;i+) sum += i; 4. 表达式表达式2部分表示部分表示循环继续条件循环继续条件,其值是一个逻辑量,其值是一个逻辑量, 除一般的关系(或逻辑)表达式外,也允许是数值(或除一般的关系(或逻辑)表达式外,也允许是数值(或 字符)表达式。字符)表达式。 五、应用举例五、应用举例 例例5-4 求求n的阶乘的阶乘n!(n!=1*2*n)。)。 /*程序功能求程序功能求n! *
46、/ #include void main( ) int i, n; long fact=1; printf(input n: ); scanf(%d, for(i=1; i=n; i+) fact *= i; printf(%d ! = %ldn, n, fact); 程序运行情况如下:程序运行情况如下: input n: 5 5 ! = 120 设设fact=1 输入输入n值值 循环变量循环变量i赋初值赋初值1 当当i=n fact=fact*i 输出输出n的阶乘值的阶乘值fact 程序的程序的N-SN-S结构图结构图 将累乘器将累乘器fact 初始化为初始化为1 实现累乘实现累乘 例例5-
47、5 求求200300之间能同时被之间能同时被3和和7整除的数的个数,并整除的数的个数,并 统计其和。统计其和。 根据题目要求,分析如下:根据题目要求,分析如下: 设数为设数为i; 满足条件的数的个数为满足条件的数的个数为t,则则t=t+1,初始值初始值t=0; 其累加和为其累加和为sum,则则sum=sum+i,初始值初始值sum=0; 判断数判断数i能否同时被能否同时被3和和7整除,其方法是判下列表达式是整除,其方法是判下列表达式是 否为真(非否为真(非0);); i%3=0 for(i=200; i=300; i+) if(i%3=0sum=sum+i; printf(t=%d,sum=%
48、dn,t,sum); 例例5-6 编程计算编程计算1-1/2+1/3-1/4+ +1/99-1/100 难点:如何解决多项式中的符号问题。难点:如何解决多项式中的符号问题。 设用设用n表示数表示数1、2、3、 、100 则多项式中的每一项为则多项式中的每一项为 t=(-1)n+1 *1/n 而累加和而累加和s为:为:s=s+t, 且且s的初值为的初值为0 根据上述分析,利用循环根据上述分析,利用循环for语句实现累加,编制程语句实现累加,编制程 序如下:序如下: 程序程序1: #include #include void main( ) int n=0; double t,s=0; for(n
49、=1;n=100;n+) t=pow(-1),(n+1)*(1.0/n); /* pow(x,y)为乘方函数,其功能是求为乘方函数,其功能是求xy */ s=s+t; printf(s=%lfn,s); 运行结果:运行结果: s=0.688172 程序程序2: #include void main( ) int n=0, t=1; float s=0; for(n=1;nj时结束循环(即时结束循环(即i=j时继续循环)。最后输出时继续循环)。最后输出s。 程序如下:程序如下: #include void main( ) int i,j; float s=0; for( i=1,j=100 ;
50、i=j ; i+,j-) s=s+(float)i/j; printf(ns=%f,s); 例例5-8 有一分数序列:有一分数序列: 2/1 .3/2 .5/3 .8/5 . 13/8 .21/13 求出这个数列的前求出这个数列的前20项之和。项之和。 分析:在这个数列中,设第一项分子为分析:在这个数列中,设第一项分子为a=2,分母为分母为b=1, 则以后的每一项分子为前一项的分子与分母之和则以后的每一项分子为前一项的分子与分母之和(即即a+b), 而分母则为前一项的分子。而分母则为前一项的分子。 程序:程序: #include void main( ) int n; float a=2,b=
51、1,s=0,t; for(n=1;n=3),),即从第即从第3个数开始,个数开始, 每个数等于前每个数等于前2个数之和。个数之和。 源程序如下:源程序如下: #include void main( ) long int f1=1,f2=1; /*定义并初始化数列的头定义并初始化数列的头2个数个数*/ int i=1; /*定义并初始化循环控制变量定义并初始化循环控制变量i*/ for( ; i=20; i+ ) /*1组组2个,个,20组组40个数个数*/ printf(%15ld%15ld, f1, f2); /*输出当前的输出当前的2个数个数*/ if(i%2=0) printf(n);
52、/*输出输出2次次(4个数个数),换行换行*/ f1 += f2; f2 += f1; /*计算下计算下2个数个数*/ 六、六、for、while、do-while的比较的比较 所有需要用到循环结构的程序,都可以用所有需要用到循环结构的程序,都可以用forfor、 whilewhile、do-whiledo-while中的任何一个来实现,区别只在于中的任何一个来实现,区别只在于 某些问题用哪种语句更方便。某些问题用哪种语句更方便。 比如求比如求1+2+99的问题我们也可以分别用的问题我们也可以分别用while与与 do-while语句编写如下:语句编写如下: 用用while: #include
53、 void main( ) int i=1,s=0; while(i=99) s=s+i; i+; printf(ns=%d,s); 用用do-while: #include void main( ) int i=1,s=0; dos=s+i; i+; while(i0,执行第执行第4步,否则执行第步,否则执行第7步步 4. i=a%10 5. t=t*10+i 6. a=a/10,并返回第并返回第3步步 7. 输出输出t 程序:程序: #include void main( ) long a,i,t=0; scanf(%ld, while(a0) i=a%10; t=t*10+i; a=a/
54、10; printf(n%ld,t); 在这里由于在这里由于a的值可能的值可能 很大所以用到了很大所以用到了long型定型定 义变量义变量a,如果希望取到的如果希望取到的 值更大,可以用值更大,可以用unsigned long型。型。 问:如果问:如果a用用double型,并型,并 把把i=a%10改为改为i=(long)a% 10;把把a=a/10改为改为a=(long)a /10 可以吗?可以吗? 答:不可以!答:不可以! 思考:如何把结尾的思考:如何把结尾的0也反序输出?也反序输出? 例例5-11 有数列有数列2/3、4/5、6/9、10/15求此数列前求此数列前30项的项的 和。和。
55、1. 初值初值i=2,j=3,s=0; 2. 用用n从从1到到30循环循环 3. s=s+ i/j; 4. c=i; i=j+1; j=c+j; 5.输出输出s; 算法分析:算法分析: 对于数列的题,首先要找出通项公式,或前后项的计对于数列的题,首先要找出通项公式,或前后项的计 算关系公式,根据公式求所需。由于数列的题一般执行次算关系公式,根据公式求所需。由于数列的题一般执行次 数能确定,用数能确定,用for语句来编写比较方便。语句来编写比较方便。 此题,前后项的关系是:后一项的分子是前一项的分此题,前后项的关系是:后一项的分子是前一项的分 母加母加1,后一项的分母是前一项的分子加分母。解题思
56、路是,后一项的分母是前一项的分子加分母。解题思路是 用循环语句求各项,并把值累加,因为是求前用循环语句求各项,并把值累加,因为是求前30项的和,项的和, 循环执行循环执行30次。次。 程序:程序: #include void main( ) int i=2,j=3,n,c; float s=0; for(n=1;n=30;n+) s=s+(float)i/j; c=i; i=j+1; j=c+j; printf(n%f,s); 此题中的此题中的n与循与循 环体中的执行语句环体中的执行语句 没有数值上的联系没有数值上的联系 ,仅仅用做决定循,仅仅用做决定循 环执行的次数。环执行的次数。 5-5
57、break语句和语句和continue语句语句 在执行某些循环的循环体的过程中,有时需要在执行某些循环的循环体的过程中,有时需要 提前(即非正常结束循环)退出循环;有时需要提前(即非正常结束循环)退出循环;有时需要 跳过循环体中的某些语句,提前结束本次循环,跳过循环体中的某些语句,提前结束本次循环, 然后开始新的下一轮循环,在然后开始新的下一轮循环,在C语言中,提供了语言中,提供了 break语句和语句和continue语句,它使得循环控制更加语句,它使得循环控制更加 灵活。灵活。 一、一、break语句语句 1一般格式:一般格式: break; 2功能:功能: 强行结束循环,转向执行循环语句
58、的下强行结束循环,转向执行循环语句的下 一条一条 语句。语句。 3. 说明:说明: break语句一般是与语句一般是与if语句连用;语句连用;在满足一定条在满足一定条 件时,提前退出本层循环,而不管循环控制条件件时,提前退出本层循环,而不管循环控制条件 是否成立。是否成立。 break语句不能用于循环语句和语句不能用于循环语句和switch语句之外语句之外 的任何其它语句中。在的任何其它语句中。在switch分支结构中,使用分支结构中,使用 break语句可以使流程跳出语句可以使流程跳出switch分支结构。分支结构。 同样同样 的,在循环结构中,使用的,在循环结构中,使用break语句使流程
59、跳出当语句使流程跳出当 前的循环层,转向执行该循环结构后面的语句。前的循环层,转向执行该循环结构后面的语句。 循环嵌套时,循环嵌套时,break只影响包含它们的最内层只影响包含它们的最内层 循环,与外层循环无关。循环,与外层循环无关。 4. 应用举例应用举例 例例5-12 在一批数中查找第一个大于在一批数中查找第一个大于500的数(设此批数中的数(设此批数中 至少有一个大于至少有一个大于500的数)。的数)。 #include void main( ) int n ,m; float x; printf(input to m=); scanf(%d, for(n=1; n500.0) brea
60、k; printf(max=%fn, x); 思考思考:若需要查若需要查 找最后一个大于找最后一个大于 500的数,怎样设的数,怎样设 计程序计程序? 程序填空:程序填空: 1. 求出求出100以内的整数中最大的可被以内的整数中最大的可被13整除的数是整除的数是 哪一个。哪一个。 #include void main( ) int i ; for( ; ; i- ) if( ) break; printf(%dn, i); 2. 把把411分成两个数的和,并使其中一个加数分成两个数的和,并使其中一个加数 能被能被13整除,而另一能被整除,而另一能被17整除,试编程序求整除,试编程序求 这两个数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广州城市职业学院单招职业适应性测试题库附参考答案详解(满分必刷)
- 道路施工方案
- 2026年广州体育职业技术学院单招职业倾向性测试题库带答案详解(考试直接用)
- 2025年飞行器通信模块热设计方案
- 2026年小学英语词汇积累与考试及答案试题
- 生猪全产业链建设项目可行性研究报告
- 柑橘产业园抗旱供水工程可行性研究报告
- 老旧厂区改造项目申请报告
- 产后头部护理技巧
- 特种玻璃膜材生产线项目投标书
- 留园完整版本
- 三年级语文下册基础知识默写单(含答案)
- 建设工程工程量清单计价标准(2024版)
- 果林合股协议书
- 2025新热处理工程师考试试卷及答案
- 硬笔书法全册教案共20课时
- 《数智时代下的供应链管理:理论与实践》课件 第1-7章 理解供应链- 供应链经典的生产计划
- 知情同意告知培训
- 中药饮片培训课件
- 施工单位商务经理培训
- 病房规范化管理
评论
0/150
提交评论