1、 在解决实际问题的过程中,常常会遇到一些需要重复处理的问题。循环结构可用来处理需要重复处理的问题,所以,循环结构又称为重复结构。第1页,共78页。4.1 循环的概念 4.2 语句4.3 循环 4.4 循环 4.5 语句和语句4.6 多重循环4.7 程序举例 4.8 三种循环语句的比较 第4章 循环结构程序设计 第2页,共78页。循环结构,又称为重复结构,是结构化程序设计的三种基本结构之一,在数值计算和很多问题的处理中都需要用到循环控制。例如,用迭代法求方程的根,计算全班同学的平均分等。几乎所有的应用程序都包含循环,它和顺序结构、选择结构共同作为各种复杂结构程序的基本构造单元。因此熟练地掌握选择
2、结构和循环结构的概念及使用,是程序设计最基本的要求。第3页,共78页。4.1 循环的概念 例如,计算1100的累计和。根据已有的知识,可以用1+2+3+100来计算,但显然很繁琐。现在换个思路来考虑:首先设置一个累加器,其初值为0,利用来计算(i依次取1、2、100),只要解决以下3个问题即可:将i的初值置为1;每执行1次后,i值增1,其过程如下所示:0;1;重复执 行部分 ;1;当i增到101时,停止计算。此时,的值就是1100的累计和。第4页,共78页。4.1 循环的概念第5页,共78页。第6页,共78页。4.2 语句用来实现“当型”循环,其一般形式为:(循环条件表达式)循环体语句 在执行
3、语句时,先对循环条件表达式进行计算,若其值为非0(真),则反复执行循环体语句,直到循环条件表达式的值为0(假)时,循环结束,程序控制转至循环语句的下一条语句。其执行过程如图4-1所示。图4-1 语句的执行过程第7页,共78页。使用语句时,应注意以下几个问题:循环体语句可以是一个空语句、一个语句或一组语句。当循环体是一组语句时,则必须用花括号括起来,组成复合语句。图4-2 计算1100累计和的流程图和图描述 4.2 语句第8页,共78页。();/*定义整型变量*/0;/*将的初值置为0*/1;/*将i的初值置为1*/(i=100)/*若i=100则执行循环体*/;/*将i进行累加*/1;/*i的
4、值加1*/(n);/*输出的值*/程序运行结果:50504.2 语句第9页,共78页。语句中的循环条件表达式可以是任何类型的表达式。循环体内一定要有使表达式的值变为0(假)的操作,否则 循环将无限进行,即形成死循环。语句的特点是“先判断,后执行”,如果循环条件表达 式的值一开始就为0,则循环体语句一次也不执行。例如,对于下面的语句:()();如果变量i赋值0时,则一次也不执行循环体语句;如果变量 i赋值4时,则其运行结果为:3210。4.2 语句第10页,共78页。例4.1 利用公式求的近似值,直到最后一项的绝对值小于 为止。分析:本题仍为求累加和问题,因此,循环体中有这样的求累加和表达式。为
5、公式中的某一项,其特点是,分母为奇数,且相邻项符号相反,当 时,停止求累加和。的近似值可以表示为4。91715131144104104.2 语句第11页,共78页。(b)图描述图4-3 例4.1的流程图和图描述(a)流程图描述 4.2 语句第12页,共78页。()1;110;()=14)/*当满足条件时结束*/;/*计算通项并进行累加*/2;/*i值加2得到下一个奇数*/;/*相邻项符号取反*/;/*求公式中的某一项*/4*;(8.6fn);/*输出的值*/程序运行结果:3.1413974.2 语句第13页,共78页。(a)流程图描述(b)图描述 例 4.2 从键盘上连续输入字符,直到输入“回
6、车”符为止,统计 输入的字符中数字字符的个数。4.2 语句第14页,共78页。();0;(n);()n)/*按回车键时结束*/(=0=9)/*只对数字字符的个数进行统计*/();/*输出数字字符*/1;/*对数字字符的个数进行累加统计*/(n);/*输出数字字符的个数*/程序运行结果:5667566744.2 语句第15页,共78页。4.3 循环 第16页,共78页。4.3 循环 用来实现“直到型”循环,其一般形式为:循环体语句 (循环条件表达式);执行过程是,先执行循环体语句,然后对循环条件表达式进行计算,若其值为真(非0),则重复上述过程,直到循环条件表达式的值为假(0)时,循环结束,程序
7、控制转至该结构的下一条语句。其执行过程如图4-5所示。第17页,共78页。使用语句时,应注意以下几个问题:当循环体是一组语句时,则必须用花括号括起来,组 成复合语句。循环体内一定要有使表达式的值变为0(假)的操作,否则循环将无限进行。循环是先执行,后判断,因此循环体至少执 行一次。和都是关键字,配合起来使用,()后面的 “;”不可缺少。4.3 循环 第18页,共78页。例4.3 用循环编写计算1+2+3+100的程序。(a)流程图描述(b)图描述4.3 循环 第19页,共78页。()01;/*开始执行循环*/;/*计算累加和*/;/*i自加1*/(i=100);/*如果i=100,则循环继续执
8、行*/(n);/*输出累加和*/程序运行结果:5050例4.3 用循环编写计算1+2+3+100的程序。4.3 循环 第20页,共78页。例4.4 输入若干名学生的某门课程的成绩,以负数作为结束输入的标志,计算该门课程的平均成绩。首先输入一个成绩,若输入负数,直接结束;否则使用循环结构计算总成绩,同时统计学生人数1,最后计算平均成绩。4.3 循环 第21页,共78页。()0;0;(:n);();(=0);/*若输入负数,则结束循环*/;/*计算平均成绩*/(6.2fn);/*输出平均成绩*/程序运行结果::8067-173.504.3 循环 第22页,共78页。4.4 循环 C 语言的 循环使
9、用最为灵活,功能很强。不仅可以用于计数型循环,而且可以用于条件型循环。完全可以代替 和 循环。第23页,共78页。4.4 循环 循环语句的一般形式为:(表达式1;表达式2;表达式3)循环体语句 其中,是C语言的关键字,其后圆括号通常有3个表达式。表达式之间用分号隔开,表达式可以是C语言中任何合法的表达式。表达式1给循环变量赋初值;表达式2是循环条件;表达式3修改循环变量值。后面的语句为循环体。循环体多于一条语句时,要用复合语句表示。第24页,共78页。循环语句的作用:首先求解表达式1的值,然后求解表达式2的值,若表达式的值非0(真)时,就执行循环体,执行一次循环体后求解表达式3的值,再求解表达
10、式2的值,若表达式2仍不为0再执行循环体,再求解表达式3的值。如此反复直到表达式2的值为0时,整个循环结束。其执行过程如图所示。4.4 循环 第25页,共78页。语句最简单的应用形式,也就是最易理解的形式:(循环变量赋初值;循环条件;循环变量增值)循环体语句 4.4 循环 第26页,共78页。执行执行for循环之后的语句执行执行表达式1循环初始条件循环控制条件循环体第27页,共78页。例4.5 用循环编写计算1+2+3+100的程序。4.4 循环 第28页,共78页。()0;/*定义整型变量并对赋初值*/(1=100);/*通过循环对i进行累加*/(“n”);/*输出累加和*/4.4 循环 第
11、29页,共78页。使用 循环时,语句中的表达式可以部分或全部省略,但两个“;”不可省略。省略表达式1,这时没有了给循环变量赋初值的操作,则应 该在语句之前给循环变量赋初值。例如:1;/*对循环变量i赋初值*/(=100)/*省略了表达式1*/;省略表达式2,相当于缺少条件判断,循环将无限进行,因 此如果缺少表达式2,可以认为表达式2始终为真。4.4 循环 第30页,共78页。省略表达式3,则可以把循环变量的修改部分放到循环体 中进行。例如:(1=100;)/*省略了表达式3*/;/*在循环体内改变循环变量i的值*/省略表达式1和表达式3,相当于在循环中只有表达式2,即只给出循环结束的条件。这时
12、可以采用上述和中的 方法,保证循环正常结束。三个表达式全部省略,(;)相当于(1)。4.4 循环 第31页,共78页。例4.6 用循环编写计算n!的程序。由于是个连乘的重复过程,每次循环完成一次乘法,共循环次。在前面我们对计算累加和采用了“第i项”的循环算式,类似对于连乘可以采用“*第i项”的循环算式,其中第i项就是循环变量i。4.4 循环 第32页,共78页。()1;/*定义整型变量,并对阶乘t赋初值1*/(n:);/*输出提示信息*/();/*从键盘输入n的值*/(1)*i;/*循环重复n次,计算n!*/(n);/*输出n的阶乘*/程序运行结果:n:51204.4 循环 例4.7第33页,
13、共78页。4.4 循环 第34页,共78页。()i;();/*将输入的第一个学生的成绩赋给*/;/*将输入的第一个学生的成绩赋给*/(2)/*输入的成绩大于,将输入的成绩值赋给*/;()/*输入的成绩小于,则将输入的成绩值赋给*/;(6.2f 6.2fn);程序运行结果:75 89 66 48 98 100 79 85 90 68100.00 48.004.4 循环 第35页,共78页。4.5 语句和语句 为了使循环控制更加灵活,C 语言允许在特定条件成立时,使用 语句强行结束循环,或使用 语句跳过循环体其余语句,转向循环条件的判定语句。第36页,共78页。4.5 语句和语句 4.5.1 语句
14、 语句的一般形式为:;语句有两个作用:用于 语句时,退出 语句,程序转至 语句下面的语句;用于循环语句时,退出包含它的循环体,程序转至循环体下面的语句。第37页,共78页。例4.8 找出在100以内的自然数中,能被9整除的第一个数。4.5 语句和语句 第38页,共78页。();(n:);();(=100)(90)/*判别i能否被9整除*/(.n);/*i能被9整除,则输出i的值*/;/*提前退出循环*/程序运行结果:n:1 9.n:65 72.4.5 语句和语句 第39页,共78页。4.5.2 语句 语句的一般形式为:;语句作用是:结束本次循环,跳过循环体中尚未执行的语句,接着进行下一次是否执
15、行循环的判断。在和语句中,语句把程序控制转到后面的表达式处,在语句中,语句把程序控制转到表达式3处。4.5 语句和语句 第40页,共78页。例4.9 找出在100以内的自然数中,能被9整除的所有数。4.5 语句和语句 第41页,共78页。();/*定义整型变量*/(n:);/*输出提示信息*/();/*从键盘输入n的值*/(:);(=100)(90)/*判别i能否被9整除*/(%4d);/*i能被9整除,则输出i的值*/;/*结束本次循环,转至处*/程序运行结果:n:65 :728190994.5 语句和语句 第42页,共78页。例4.10 分析下面程序的执行结果。()1;(15)/*若b10
16、,则结束整个循环*/;(21)/*若2=1,则3并结束本次循环*/3;/*转至处*/;程序运行结果:1,12,43,34,64.5 语句和语句 第43页,共78页。注意:语句和 语句的区别:语句只结束本次循环,而不是终止整个循环的执行;语句则是结束循环,不再进行条件判断。4.5 语句和语句 第44页,共78页。4.6 多重循环 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。、和三种循环语句可以互相嵌套,内嵌的循环体内还可以嵌套循环,这就是多重循环。第45页,共78页。4.6 多重循环例4.11 以下面形式输出九九乘法表。11=121=2 22=431=3 32=6 33=941=4
17、42=8 43=12 44=1651=5 52=10 53=15 55=2571=7 72=14 73=21 77=4981=8 82=16 83=24 88=6491=9 92=18 93=27 99=81第46页,共78页。分析:求积可以用两层循环结构实现:(1=9)/*i表示被乘数*/(1)/*j表示乘数*/*j;第一个语句,称为外循环,i表示被乘数。第二个语句,称为内循环,j表示乘数。嵌套重复循环结构总是先完整地执行内循环一次,外循环再执行一次。4.6 多重循环第47页,共78页。据上述分析,算法可以用如图所示的流程图和图描述。4.6 多重循环第48页,共78页。();/*定义整型变量
18、*/(1=9)/*外循环用于控制行数*/(1)/*内循环用于控制列数*/*j;/*计算i*j,并赋值给变量t*/(%3d*2d);/*输出t,即i*j的值*/(n);/*输出1行后换行*/4.6 多重循环第49页,共78页。例4.12 用嵌套循环计算 的值。!3!2!1n4.6 多重循环第50页,共78页。();0;(n:);();(1)/*外层循环重复n次,求累加和*/1;/*置t的初值为1,以保证每次求阶乘都从1开始连乘*/(1)/*内层循环重复i次,计算!*/*j;/*把i!累加到中*/(n);程序运行结果:n:4334.6 多重循环第51页,共78页。例4.13 输出一个任意行的等腰三
19、角形图形。*分析:把三角形顶点放在屏幕第40列的位置,每行的输出开始位置比上一行提前一列,每行输出星号的个数是行数的2倍减去1。输入n的值来确定所需要的行数。程序的外循环控制输出的行数,内循环是两个并列的循环,前面一个循环输出每行前面的空格,后面一个循环输出该行的星号,星号输出结束后换行,接着输出下一行。4.6 多重循环第52页,共78页。();();();/*从键盘上输入等腰三角形所占的行数*/(1;k;)/*此循环用于控制行数*/(140)/*此循环用于控制星号前的空格*/();(1=2*1)/*此循环用于控制一行内打印星号的个数*/(*);(n);/*输出一行后换行*/*4.6 多重循环
20、第53页,共78页。4.7 程 序 举 例第54页,共78页。4.7 程序举例 例4.14 编写程序求斐波纳契()数列的前20项,要求每行输出5个斐波纳契数。斐波纳契数列源自一个有趣的问题:一对小兔,一个月后长成中兔,第3个月长成大兔,长成大兔以后每个月生一对小兔。问第20个月有多少对兔子?斐波纳契数列的规律是:每个数等于前两个数之和。其可以用数学上的递推公式来表示:2211121nffnnfnnn第55页,共78页。4.7 程序举例第56页,共78页。()f123;k;f1=12=1;/*斐波纳契数列的头两个数*/(%101012);/*输出斐波纳契数列的头两个数*/(3=20)/*循环18
21、次求斐波纳契数列的后18项*/f312;/*新的斐波纳契数的一个数等于前两个数之和*/(%103);f12;/*迭代,用新的数覆盖旧的数*/f23;(50)(n);/*每输出5个斐波纳契数换行*/4.7 程序举例第57页,共78页。程序运行结果:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 67654.7 程序举例第58页,共78页。例4.15 利用下面级数求正弦函数的值(要求算到最后一项的绝对值小于 为止)。这是一个多项式累加和,每一项的符号和分子、分母都是有规律性地变化:符号依此作正负变化;分子是x的奇数次幂;分母则是
22、从1开始的奇数阶乘。可以用循环结构实现,当循环计算到某一项 时循环结束,输出(x)的值。!9!7!5!3sin9753xxxxxx-610-6104.7 程序举例第59页,共78页。4.7 程序举例第60页,共78页。3.14159()1;1;();/*输出提示信息*/(1);/*从键盘输入角度x1的值*/1*180;/*将角度x1换算成弧度*/;/*把级数的第一项x作为累加和的初值*/;/*将x赋值给*/4.7 程序举例第61页,共78页。(3()=162)/*当前项=,执行循环*/1;1;(1)*j;/*通过循环计算当前项的阶乘t*/*x;/*通过循环计算当前项的分子*/;/*将值的符号取
23、反*/*;/*计算新的当前项值*/;/*对进行累加*/(%.2f)n1);程序运行结果:2(2.0)=0.034899-6104.7 程序举例第62页,共78页。例4.16 从键盘上输入一个大于2的整数,判断m是否为素数。所谓素数是指除了1和它本身以外,再不能被任何整数整除的数。根据这一定义,判断一个整数是否素数,只需把被2到m-1之间的每一个整数去除,如果都不能被整除,则m就是一个素数。例如:判断19是否素数,将19被2,3,18除,都不能整除19,则19就是一个素数。实际上,除数只要为2 的全部整数即可。让m被2除,如果m能被2之中任何一个整数整除,则说明m不是素数,否则m一定是素数。mm
24、4.7 程序举例第63页,共78页。4.7 程序举例第64页,共78页。();1;/*将素数标志设置为1*/(a:);/*输出提示信息*/();/*从键盘输入变量m的值*/(m=2);/*若m=2,则结束循环*/()(m);/*将(m)取整后赋值给变量k*/(2)(0)/*若m不是素数,则将素数标志置为0并结束循环*/0;()/*若素数标志1,则输出该数是素数*/(a .n);/*若素数标志0,则输出该数不是素数*/(a .n);4.7 程序举例第65页,共78页。程序运行结果:a:3535 a .a:1919 a .4.7 程序举例第66页,共78页。例4.17 把一元钱换成5分,2分,1分
25、的零钱,统计共有多少种换法。用a、b、c分别表示换的5分、2分、1分的张数,则a、b、c的值应该满足:5*2*100。4.7 程序举例第67页,共78页。()0;(0=20)/*本循环表示5分的有多少种换法*/(0=50)/*本循环表示2分的有多少种换法*/(0=100)/*本循环表示1分的有多少种换法*/(5*2*100);/*经过三重循环后,统计出有多少种换法*/(n);/*输出结果*/程序运行结果:5414.7 程序举例第68页,共78页。例4.18 计算用户输入的两个正整数之间的所有整数中0,1,2,9数码的个数。例如,101104之间总共包含四个整数101,102,103,104,其
26、中0的个数为4,1的个数为5,2、3、4的个数为1,其余数码没有出现都为0。要计算某整数中包含的各个数码的个数,必须对该整数进行分解,求得所包含的各个数码,其方法可以通过每次除以10取余数得到,然后再对商进行同样的处理,直到商为0时为止。对所得到的数码进行计数,可采用语句来实现。4.7 程序举例第69页,共78页。()12;0=01=02=03=04=0;5=06=07=08=09=0;/*循环用于从键盘上输入两个正整数*/(:);(12);(1022);/*若10或22,则退出循环*/(12)/*循环用于控制整数在12之间*/;10;/*s对10取余数后赋值给r*/4.7 程序举例第70页,
27、共78页。(r)/*用r匹配后的语句*/0:0;1:1;2:2;3:3;4:4;5:5;6:6;7:7;8:8;9:9;10;/*s对10整除后赋值给s*/(0);/*若0,则结束循环*/(0 5d 1 5d 2 5d 3 5d 4 5dn01234);(5 5d 6 5d 7 5d 8 5d 9 5dn56789);4.7 程序举例第71页,共78页。程序运行结果::101 1040 4 1 5 2 1 3 1 4 15 0 6 0 7 0 8 0 9 04.7 程序举例第72页,共78页。第73页,共78页。4.8 三种循环语句的比较 C语言提供的、以及三种循环结构各有其特点,应根据不同的
28、情况选择不同的循环,以便更好地实现程序的功能。现对三种循环结构加以比较如下。1三种循环都可以用来处理同一个重复的问题,一般情况可以互相代替。2和循环,都在后面指定循环条件,在循环体中还应包含修改循环条件,使循环趋于结束的语句如)。而循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此,循环的功能更强,凡用循环能完成的,用循环都能实现。第74页,共78页。3在和循环中,循环变量赋初值的操放在循环语句之前。而循环可以在表达式1中实现循环变 量赋初值,也可 以 省 略 表 达 式 1,在 循 环 语 句 之 前 完 成4三种循环都可以用语句结束循环,用语句开
29、始下一次循环。5三种循环之间的不同之处是、循环是先判断表达式的值,后执行循环体语句,而循环则是先执行一次循环体语句,后判断表达式的值。4.8 三种循环语句的比较 第75页,共78页。本 章 小 结 C语言提供了重复操作的、以及三种循环语句,这三种语句一般情况下可以互相代替。要重点掌握这3种循环语句的一般形式,了解它们开始和终止的条件,尤其要注意语句和语句的异同。注意多重循环时循环的嵌套,内外循环必须层次分明。注意和语句的区别。第76页,共78页。人有了知识,就会具备各种分析能力,明辨是非的能力。所以我们要勤恳读书,广泛阅读,古人说“书中自有黄金屋。”通过阅读科技书籍,我们能丰富知识,培养逻辑思维能力;通过阅读文学作品,我们能提高文学鉴赏水平,培养文学情趣;通过阅读报刊,我们能增长见识,扩大自己的知识面。有许多书籍还能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进。第77页,共78页。第78页,共78页。