《第4章 循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章 循环结构程序设计.ppt(52页珍藏版)》请在三一文库上搜索。
1、第4章 循环结构程序设计,主要内容,提出问题,求整数1到5的连加,怎么编程?,求整数1到100的连加,怎么编程?,main() int sum=0; sum=sum+1; sum=sum+2; sum=sum+3; sum=sum+4; sum=sum+5; printf(“sum=%d“,sum); ,main() int sum=0; sum=sum+1; sum=sum+2; sum=sum+3; sum=sum+100; printf(“sum=%d“,sum); ,分析:让我们找出问题的规律 sum=sum+i (i=1,2,3,100) sum=sum+i被重复执行 变量i有规律的
2、变化 解决这类问题可以采用,循环结构,结束,开始,i=1, sum=0,i=100,Y,N,i=i+1,sum=sum+i,输出sum,i=1,i=2,i=2,i=3,提出问题,循环: 反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。,对于有规律的事物, 一般都可以用循环来组织。,i=101,i=100,i=101,第4章 循环结构程序设计,主要内容 goto 和 if 语句构成循环 while 语句 dowhile 语句 for 语句 辅助控制语句:continue,break,N-S流程图 省略了流程图中的流程线,适于结构化程序设计,算法的表示,自然语言 通俗易懂,容易产生歧义
3、 流程图 标准符号 结构化程序设计的三种基本控制结构(顺序、选择、循环),伪代码 介于自然语言和计算机语言之间,混合使用文字和符号,while 语句,while 语句的一般形式: while (exp) statement;,特点: 先判断表达式, 后执行循环体,while语句,用while语句求:,#include void main() int i=1, sum=0; while ( i=100 ) sum=sum+i; i+; printf(“%d“,sum); ,循环体,while语句,用while语句求:,#inlcude void main(void) int i=1, sum=0
4、; while ( i=100 ) sum=sum+i; i+; printf(“%d“,sum); ,死循环,运行时用 ctrl+break 可跳出当前运行,#include void main() int i=1, sum=0; while ( i=100 ) sum=sum+i; i+; printf(“%d“,sum); ,while 语句,while 语句的两个要素:,while 语句,循环体可为任意类型语句 循环体应当为一个单独的语句,或一个复合语句 循环体中一定要有能够使循环趋向于结束的语句, 避免出现“死循环”,while 语句的两个要素:,dowhile 语句,dowhile
5、 语句的一般形式: do statement; while (exp);,特点: 先执行循环体, 后判断表达式,dowhile 语句至少会执行一遍循环体 while 语句不一定,dowhile 语句,dowhile 语句的一般形式:,do statement; while (exp);,statement; while (exp) statement;,dowhile 语句可以转化为while 语句,dowhile语句,用do while语句求:,#include void main() int i=1, sum=0; do sum=sum+i; i+; while ( i=100 ); pr
6、intf(“%d“,sum); ,循环体,dowhile 语句,dowhile 语句的两个要素:,循环体可为任意类型语句 循环体应当为一个单独的语句,或一个复合语句 循环体中一定要有能够使循环趋向于结束的语句, 避免出现“死循环”,dowhile 语句,while语句 和 dowhile 语句比较:,#include void main() int i, sum=0; scanf(“%d“, ,#include void main() int i, sum=0; scanf(“%d“, ,1 ,5050,1 ,5050,101 ,0,101 ,101,while语句先判断表达式,后执行语句 d
7、owhile语句先执行循环体,后判断表达式 while语句循环体执行次数0 dowhile语句循环体执行次数1,for 语句,for 语句的一般形式: for (exp1; exp2; exp3) statement;,for语句中exp1,exp2,exp3类型任意,都可省略, 但分号不可省略 无限循环: for( ; ; ) 相当于 while(1) for语句可以转换成while结构,for 语句,for 语句的一般形式: for (exp1; exp2; exp3) statement; for 语句一般应用形式: for (循环变量赋初值;循环条件;循环变量增值) 循环体; 例如:f
8、or(i=1; i=100; i+) sum=sum+i;,相当于: i=1; while (i=100) sum=sum+i; i+; ,for 语句,for 语句的一般形式: for (exp1; exp2; exp3) statement; exp1 和 exp2 可以是逗号表达式: 例如:for(sum=0, i=1; i=100; sum+=i, i+);,相当于: sum =0; for(i=1; i=100; i+) sum+=i;,for 语句,用 for 语句求:,#inlcude void main() int i, sum=0; for(i=1; i=100; i+) s
9、um=sum+i; printf(“%d“,sum); ,i=1; for(; i=100; i+) sum=sum+i;,i=1; for(; i=100; ) sum=sum+i; i+; ,for( i=1; i=100 ; sum+=i, i+ );,循环的嵌套,循环的嵌套是指: 一个循环体内又包含另一个完整的循环结构 三种循环结构可以相互嵌套,层数不限,(1) while() while() . ,(2) do do while( ); . while( );,(3) while() do while( ); . ,(4) for( ; ; ) do while(); while()
10、 . ,for( ; ;) do while() while(); . ,O,break 语句,break 语句 break; 功能 在循环语句中,跳出并终止循环体 在switch语句中,跳出并终止分支语句体 说明 break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中体,break 语句,break 语句 break;,break 语句,用 for 语句求:,#include void main() int i, sum=0; for( i=1; ; i+ ) if (i100) break; sum=sum+i; printf(“%d“,
11、sum); ,i=1; for(; ;) if (i100) break; sum=sum+(i+); ,continue 语句,continue 语句 continue; 功能 结束本次循环,跳过循环体中尚未执行的语句, 进行下一次是否执行循环体的判断 说明 continue只能用于循环体中,continue 语句,continue 语句 continue;,continue 语句,输出100200之间不能被3整除的数:,#include void main() int n; for(n=100; n=200; n+) if (n%3=0) continue; printf(“%5d“, n
12、); ,几个典型程序及常用的循环程序设计方法,【例4-3】猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子。程序分析:,4.2.2 猴子吃桃子问题,程序分析: (1)这是一个递推问题,猴子第一天摘下桃子个数是一个未知数,但我们知道第10天剩下的桃子数,每天吃掉桃子的方法相同,即每天都吃掉前一天剩下的桃子的一半零一个。 (2)设x1表示前一天的桃子数,x2表示后一天的桃子数,则x1 = (x2 + 1)*2,
13、我们知道第10天只剩一个桃子设x2=1,由此我们得到第9天的桃子数x1=(1+1)*2=4。我们再由第9天的桃子数,推出第8天的桃子数,即x2=x1,继续求x1。 (3)该过程重复9次,即从第10天开始往前递推了9天,即求得了第一天猴子摘下的桃子数。,4.2.2 猴子吃桃子问题,循环程序设计的三要素: (1)循环体。 (2)循环的结束条件 (3)循环的初值 (1)循环体:利用两个变量x1,x2, x2代表当天的桃子数,x1代表前一天的桃子数。x2为已知值,通过x1 = (x2 + 1)*2求得x1。 我们可以看到x1,x2这两个变量是交替变化、反复使用,这正是循环程序设计的关键,要正确的设计循
14、环体就是要找到这样的数学关系。,x1 x2 ? ?,x2,x1,4.2.2 猴子吃桃子问题,(2)循环的结束条件: 在结构化程序设计中,任何循环都必须是有限的循环,绝不允许出现死循环。设计过程中要把握好以下两个方面: 设变量day代表前一天的天数,程序开始我们首先求的第9天的桃子数,直到求得第1天的桃子数,因此循环控制条件为为day 0。 通常我们将day称为循环控制变量,因为它的值的大小将决定循环是否继续执行。,4.2.2 猴子吃桃子问题,(2)循环的结束条件: 另外我们还要注意在循环体中要有修改循环控制变量的值的语句(使循环趋于结束)。 在该程序中day- 即为修改循环控制变量的语句。,4
15、.2.2 猴子吃桃子问题,(3)循环的初值:要保证循环能得到一个正确的结果,我们要给循环一个正确的开始。 这一点也很重要,如果循环的初值错误,结果必然错误。在本程序中初始条件涉及到两个变量x2和day,其初始化语句为day=9;x2=1;这两条语句即定义了循环的初值。,4.2.2 猴子吃桃子问题,#include void main() int day,x1,x2; day = 9; x2 = 1; while(day 0) x1 = (x2 + 1)*2; x2 = x1; day-; printf(“The total is %dn“,x1); ,编写程序利用公式:求ex的近似值。,#in
16、clude #include void main() int i; float a,e,x; printf(“请输入x的值:“); scanf(“%d“, ,(“%f”,e=1;,i=1;,输入两个正整数m和n,求其最大公约数最小公倍数,最大公约数:可以被两个数整除的最大数 6和15最大公约数为? 最小公倍数:可以同时整除两个数的最小数 4和6最小公倍数为?,先用小的一个数除大的一个数,得第一个余数; 再用第一个余数除小的一个数,得第二个余数; 又用第二个余数除第一个余数,得第三个余数; 这样逐次用后一个数去除前一个余数,直到余数是0为止。 那么,最后一个除数就是所求的最大公约数(如果最后的除
17、数是1,那么原来的两个数是互质数)。 例: 第一次:用600除1515,商2余315; 第二次:用315除600,商1余285; 第三次:用285除315,商1余30; 第四次:用30除285,商9余15; 第五次:用15除30,商2余0。 1515和600的最大公约数是15。,用辗转相除法求最大公约数,用辗转相除法求最大公约数,具体步骤:,设有a、b两数,若b为0,a就为最大公约数,否则,辗转相除,(1)b整除a,并取余数,赋给变量t; (2)把b赋给a; (3)把t赋给b; (4)直到b为0;,除数作为新的被除数,余数作为新的除数,除数为0,考虑用什么结构?,需定义几个变量?,4.2.3
18、求两个数的最大公约数,#include void main() int m,n,r; printf(“请输入2个数: “); scanf(“%d,%d“, ,请输入2个数:32 12 最大公约数:4 Press any key to continue,例 判断m是否素数,分析:什么叫素数? 判断一个素数n(n=3)是否素数: 将n作为被除数,将2到(n-1)各个整数轮流作为除数,如果都不能被整除,则n为素数 实际上,n被2到 之间的整数除即可。,1、实现功能的主体结构应该是什么结构? 2、循环结构注意的问题 3、如果m能被2到 之中任何一个整数整除, 则?还需要往下除么? 4、怎么样知道这个数
19、除完了所有2 之间的所有的数,而且还都没有被整除?(即是素数),循环语句举例,判断m是否为素数: 用2到m的平方根之间 的所有整数去除m 若m可以被其中的一个 整数除尽 则说明m不是素数 否则说明m是素数,#inlclude #include void main() int m, i, k; scanf(“%d“, ,若m能被从2到sqrt(m)的之间的数整除,则m不是素数 循环提前结束,i必定小于等于k 否则,m是素数,并且经过最后一次循环后,i=k+1,#include #include void main() int m, i, k; scanf(“%d“, ,i=2; while (i
20、=k) if( m%i=0 ) break; i +; ,i=2; do if( m%i=0 ) break; i +; while (i=k);,#include #include void main() int m, i, k; scanf(“%d“, ,无法判断:1、2、3这三个数!,循环语句举例,输出乘法九九表:,变量i表示行:(1i9) 变量j表示列:每行输出几列? (1ji) 值: j列 * i行 = i*j的值,循环语句举例,输出乘法九九表:,变量 i 表示行: (1i9) 变量 j 表示列: (1ji) 项 j列 i行 = ij的值,#include void main(voi
21、d) int i, j; for(i=1; i10; i+) for(j=1; j=i; j+) printf(“%d*%d=%dt“, j, i, i*j); printf(“n“); ,自己尝试用其他的循环语句的嵌套改写该程序,求Fibonacci斐波纳契数列 的前40个数,求前40个数用什么结构来实现? 循环结构要考虑哪几个问题? 循环体是什么?即每次执行的相同的部分是什么? fn=fn-2+fn-1 需要设计几个变量?,循环体的最初始(第一次时)是什么样? 还需要什么变量? 循环的次数?,特点:第1、2两个数为1、1,从第三个数开始,该数是其前面两个数之和,f1 f2 ? ?,f2,f
22、1,求Fibonacci 数列的前40个数: F1 = 1 (n=1) F2 = 1 (n=2) Fn = Fn-1+Fn-2 (n3),循环语句举例,f1 f2 ? ? ?,#include main() long f1=1, f2=1; int i; for(i=1; i=20; i+) printf(“%12ld %12ld“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; ,i=1; while (i=20) printf(“%12ld %12ld“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2;
23、f2=f2+f1; i +; ,i=1; do printf(“%12ld %12ld“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; i +; while (i=20);,#include main() long f1=1, f2=1; int i; for(i=1; i=20; i+) printf(“%12ld %12ld“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; ,课外作业: P82 一、单选题 P84 二、填空题 编程题目:(写在作业本上 ) P88 三、编程:2、3
24、、6、7、8、11、,作业,Thank You !,循环语句举例,输出100200间的全部素数:,#include #include void main() int m, i, k, n=0; for (m=101; mk) printf(“%5d“, m); n=n+1; if (n%10=0) printf(“n“); ,自己尝试用 while 和 dowhile 语句改写该程序,循环语句举例,输入一个正整数,要求逆序输出该数: 例如:输入12345,输出54321,#include main() int n; printf (“Input the number:“); scanf (“%
25、d“, /* number缩小10倍 */ ,算法举例,例2.1 求5! 5! = 1 * 2 * 3 * 4 * 5 Step1: 计算 1 * 2 = 2 Step2: 计算 2 * 3 = 6 Step3: 计算 6 * 4 = 24 Step4: 计算 24 * 5 = 120,= 求n!,= n! = 1*2*(n-1)*n,1 = t,t * 2 = t,t = t,t * 3 = t,t = t,t * n = t,t = t,算法举例,计算 n! 的算法 Step1: 输入n Step2: 使 t = 1 Step3: 使 i = 2 Step4: 求 t * i ,将其结果继续赋值给变量 t Step5: 使 i 的值加1,即 i + 1 = i Step6: 若 i 的值不大于n,返回 Step4 继续执行 Step7: 输出 t(所求的n!)的值,算法结束,初始化,循环,习题:4.7求 (即求:1!+2!+3+20!) n!=(n-1)!* n 1+2!+3!+n!=(1+2!+3!+(n-1)!)+n!,#include main() int n, s=0, t=1; for (n=1; n=20; n+) t=t*n; s=s+t; printf(“1!+2!+20!=%e n“ ,s); ,
链接地址:https://www.31doc.com/p-4333573.html