《程序结构设计(下).ppt》由会员分享,可在线阅读,更多相关《程序结构设计(下).ppt(60页珍藏版)》请在三一办公上搜索。
1、第三讲:C语言语句与程序的三种基本结构(下)(参考教材的第7章),主要内容,循环程序设计:3种循环控制语句应用举例,3.4 循环程序设计-基本概念,3.4 循环程序设计,循环语句用来解决现实生活中的循环问题。C语言中提供了三种循环语句:(1)while语句(2)do-while语句(3)for 语句,3.4.1 while 语句,while语句的一般格式为:while()循环体语句 while语句的执行流程如图所示:(图3.7),分析:如果n不是很大,例如n=3,则如何编程?如果n很大,或者不知道n多大,则如何编程?若使用循环,循环条件和循环体如何构造?计数器和累加器的概念。,例:从键盘输入n
2、(n0)个数,求其和。,假设n=3,则采用如下程序即可。main()int a,b,c;printf(“please input a,b,c:”);scanf(“%d,%d,%d”,图 求n个数的和,main()int i,n,k,sum;i=1;sum=0;printf(Input n:);scanf(%d,运行结果:Input n:612 34 2 11 9 5sum is:73,例 2 从键盘连续输入字符,直到输入“回车”符为止,统计输入的字符个数。,图2 统计输入字符的个数,include main()char ch;int len=0;puts(Type in a sentence,
3、then press n);while(ch=getchar()!=n)/*ch=getch()!=r*/len+;printf(n Sentence is%d characters long.n,len);运行结果:Type in a sentence,then press this is a sentence.Sentence is 19 characters long.,3.4.1 while 语句,while语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。说明:(1)在循环体中如果包含一个以上的语句时,则应该用花括号括起,构成复合语句。(2)在循环体语句
4、中,一定要有改变循环条件的语句,使循环能够终止。,3.4.1 while 语句,例:用while语句来实现100个6相加。程序如下:main()int i=1,sum=0;while(i=100)sum=sum+6;printf(The sum is:%d,sum);是否正确?,3.4.2 do-while 语句,do-while语句的一般格式为:do 循环体语句 while();do-while语句的执行流程如图所示:(图3.8),3.4.2 do-while 语句,例 用do-while语句来实现100个6相加。程序如下:main()int i=1,sum=0;do sum+=6;i+;w
5、hile(i=100);printf(The sum is:%d,sum);,3.4.2 do-while 语句,do-while语句与while语句的区别:do-while语句是在判断条件是否成立之前,先执行循环体语句一次;while语句则是先判断条件是否成立,如果条件成立才执行循环体;因此,while语句的循环体可能一次都不执行;而do-while语句的循环体至少被执行一次,这是while语句和do-while语句的根本区别。当型循环和直到型循环(?)。,例 利用dowhile语句重做:从键盘输入n(n0)个数,求其和,图 5.5 求n个数的和,main()int i,n,k,sum;i=
6、1;sum=0;printf(Input n:);scanf(%d,运行结果:Input n:6/0(?)12 3 7 11 23 34 sum is:90,编程技巧-关于吃回车问题P133,main()int i=0;char c;while(i6)scanf(“%c”,main()int i=0;char c;scanf(“%d”,编程技巧,方法1:scanf(“%c”,/吃掉buffer中的所有字符,3.4.3 for 语句,for 循环用于循环次数已知的情况。其一般格式为:for(;)循环体语句 for循环的执行流程如图所示:(图3.8),3.4.3 for 语句,例:用for循环语句
7、编写计算100个6相加的程序main()int i,sum=0;for(i=1;i=100;i+)sum=sum+6;printf(The sum is:%d,sum);,main()int i=1,sum=0;while(i=100)sum=sum+6;i+;printf(The sum is:%d,sum);,3.4.3 for语句,for语句的功能可用while语句描述如下:表达式1;while(表达式2)语句;表达式3;for语句最简单的应用形式,也是最容易理解的形式:for(循环变量赋初值;循环条件;循环变量增值)语句例如,for(i=1;i=50;i+)sum=sum+i;,3.4
8、.3 for 语句,说明:(1)在for语句中,、和 都可以缺省。(2)缺省,系统会认为此处的值永远为1,将形成死循环。因此,在循环体中要有退出循环体的语句。因为一个空表达式的值是非0。(3)for语句的三个表达式可以是任何类型的表达式,最常用的是逗号表达式,这样,可以同时对多个变量赋初值。如何理解这些说明呢?下面举例说明:,3.4.3 for 语句,1.缺省的情况;int i,sum=0;i=1;for(;i 的情况;int i,sum=0;i=1;for(;i=100;)sum=sum+6;i+;,3.4.3 for 语句,3.缺省的情况;int i,sum=0;for(i=1;i+)if
9、(i100)break;sum=sum+6;4.都 缺省的情况;int i=1,sum=0;for(;)if(i100)break;sum=sum+6;i=i+1;,3.4.3 for 语句,例1、for(sum=0;i=100;i+)sum=sum+i;例2、for(sum=0,i=1;i=100;i+)sum=sum+i;例3、for(i=0,j=100;i=j;i+,j-)k=i+j;例4、for(i=0;(c=getchar()!=n;i+=c);,例 计算1至50中是7的倍数的数值之和。,main()int i,sum=0;for(i=1;i=50;i+)if(i%7=0)sum+=
10、i;printf(sum=%dn,sum);运行结果:sum=196,循环编程实例,【例1】输入任意一个大于2的整数,判断该数是否素数并输出相应结果。分析:根据定义,一个大于2的整数n,如果除1和n外不能被任何数整除(即n不含1和n以外的任何因子),则n是素数;并规定2是最小素数。为了确定n是否含有因子,只需用2到n(也可以用2至n-1或2至sqrt(n)作除数,如果均不能整除n,则n是素数,否则n不要素数。算法:(1)输入n。(2)如果n等于2,则输出“2是一个素数”;否则,如果n2则找n是否有因子;i从2开始,用i除n,若余数非0且in,则用下一个i重复该过程。当余数为0或i大于等于n时,
11、结束找因子的过程(结束循环)。(3)如果结束循环时余数为0,则输出n“不是一个素数“,否则输出n”是一个素数“。,程序.1:#include#includevoid main(void)int n,i,k,r;printf(input n:n);scanf(%d,【例2】求n!,n从终端输入。分析:根据阶乘的定义,n为0的整数,n!=1*2*3*n。考虑到n较大是n!是一个相当大的数,为避免溢出,应将存放结果的变量说明为long或double。算法:(1)输入 n(2)计算n!:(2)-1 将累乘器fac置 初值1。(2)-2 i从至n,对每一个I,计算fac=fac*i.(3)输出fac.,
12、程序.2#includevoid main(void)int n,i;long fac;printf(input n:);scanf(%d,%n);fac=1;for(i=1;i=n;i+)fac*=i;printf(%d!=%ldn,n,fac);输入 9输出 9!=362880,【例3】输入一批整数,以0为结束,输出其中最大值。分析:从若干数中找出最大的一个数最简单方法是“打擂台“的方法。即两两相比,大者留下,当所有数比完时留下的那个数为最大。程序中用一个变量max保存(留下)每两个数相比中大的一个数。算法:(1)输入一个数x。(2)置最大数max初值为x。(3)检查x是否等于0,如果x不
13、等于0,则(3)-1输入下一个数x。(3)-2如果maxx,则将max修改为x。(3)-3转步骤(3)(循环)。如果x等于0,则结束循环,转步骤(4)。(4)输出max。,程序.3:#includevoid main(void)int x,max;printf(input numbers,lastoneis 0:n);scanf(%d,执行输出input numbers,last one is 0:输入 56 34 791 0输出 max=791,例4:输入一串字符,将其转换为一个十进制整数(模拟scanf(“%d,&i)所实现的功能)。分析:当用scanf(“%d”,&i),i为int型,从
14、终端输入一个数时,实际上键入是组成该整数各数字的一个字符串,scanf接收到的每个字符都是一个值为该字符的字符码的整数;并按相应的数位拼成一个十进制整数,最后赋予变量i.例如,输入123时实际键入的是字符1、2、3。转换原理如:字符转换成对应的一位整数d:d=c-0,例如 3=3-0=51-48拼数:123=(1-0)*102+(2-0)*101+(3-0)*100为了用循环结构实现拼数,可将上述转换过程简化为下面转换公式:result=result*10+c-0,其中result初值为0,c为一个数字字符。,算法:(1)跳过前导空白字符:重复地读字符,直到读入的字符是非空白字符为止。(2)处
15、理正负号:检查第一个非空白是否,如果是,将符号sing置为-1,否则置为1。(3)跳过符号位:如果第一个非空白字符是或+,则读入下一个字符。(4)拼数:(4)-1 置result初值为0。(4)-2 检查读入的字符是否一个数字,如果是数字,则计算 result=result*10+(c 0)然后读入下一个字符,重复步骤(4)-2(循环)。如果读入的字符不是数字,则转步骤(5)(结束循环)(5)用符号sing乘result,得到最后的结果result。(6)输出result。,程序.4:#include#includemain()int c,sign,result;printf(input a
16、stringdigits:n);for(c=getchar();isspace(c);c=getchar();sign=(c=-)?-1:1;if(c=+|c=-)c=getchar();/*skip sign*/for(result=0;isdigit(c);c=getchar()result=10*result+c-0;result*=sign;printf(result=%dn,result);,输入7025输出result=7025isdigit(c)和isspace(c)是标准函数调用,相应的头文件为。isdigit(c)测试字符c是否一个数字,如果c是数字则函数返回值非0,否则返回
17、值0,等价于表达式:c=0&c=9(参考P332)isspace(c)测试c是否空白字符,如果c是空白字符则返回值非0,否则返回值0,等价于表达式:c=|c=n|c=t|c=r|c=f.程序中第一个for语句用于跳过字符串前面的空白字符,其中表达式1和表达式3都是“c=getchar()”,表达式1给循环变量c赋初值;表达式3改变c的值,它既起着修改循环变量值的作用,又起着循环体的作用,此时循环体为空语句,仅由一个分号表示。空语句仅起语法作用而不执行任何操作。如果将表达3放到循环体中则语句。,3.4.4 循环嵌套,在循环体语句中又包含另一个循环语句时,我们称为循环嵌套。在多重循环中,处于内部的
18、循环称为内循环,处于外部的循环称为外循环。C语言规定,内循环必须完全嵌套与内循环中,内外循环不能交叉,并且内外循环的循环控制变量不能重名。,3.4.4 循环嵌套,例1:计算sin(x)=x-x3/3!+x5/5!-x7/7!+直到最后一项的绝对值小于10-7时,停止计算。x由键盘输入。基本思想:设自变量为x,和为sum,每一项为 temp定义常量为eps 其值为:10-7由计算公式可知,第N项为(-1)N+1*x2N-1/2N-1)!第N-1项为:(-1)N*x 2N-3/(2N-3)!两相之间相差一个因子:-x2/(2N-2)*(2N-3),3.4.4 循环嵌套,程序如下:,3.4.4 循环
19、嵌套,例.2 利用多重循环打印九九乘法表。程序如下:,3.4.4 循环嵌套,例.3程序运行结果如下:1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 92 2 4 6 8 10 12 14 16 183 3 6 9 12 15 18 21 24 274 4 8 12 16 20 24 28 32 365 5 10 15 20 25 30 35 40 456 6 12 18 24 30 36 42 48 547 7 14 21 28 35 42 49 56 638 8 16 24 32 40 48 56 64 729 9 18 27 36 45 54 63 72 81,3.
20、4.5 continue 语句,有时在程序中需要提前结束本次循环,进入下一次循环,这是就需要continue 语句。continue 语句的一般格式是:continue;它的作用是结束本次循环.continue 语句不造成强制性的中断循环,而是强行执行下一次循环。continue 语句要与三个循环语句连用,通常不单独使用。下面举例说明,3.4.5 continue 语句,例.4 关于continue语句的例子。程序要求实现输入整数,且只输出正数,输入100则终止。程序如下:main()int x;do scanf(”%d”,while(x!=100);printf(”n The program
21、 endn);,3.4.6 break语句的进一步说明,break语句也可用于循环语句。用于强制性中断循环,从循环语句跳出,从而结束循环,转移到循环语句后的语句去执行。例.5 main()int t;for(t=0;t100;t+)printf(“%3d”,t);if(t=10)break;程序运行结果:0 1 2 3 4 5 6 7 8 9 10,3.4.6 break语句的进一步说明,main()int t=0;while(printf(*)t+;if(t3)break;printf(“%d”,t);,结果,提问:程序中while(printf(*)有问题吗?,3.4.7 循环程序设计,用
22、循环语句构成的程序称为循环程序,设计循环程序的过程称为循环程序设计。例6:拼数。模拟编译程序,将以字符形式读入的数字序列转换成对应的实数。例如,由键盘输入1、2、3、.、4、5,转换成对应的实数123.45。解题的基本思想:输入字符1,转换成对应数字1的公式是:result=1-0再输入字符2,转换成对应的数字为:result=result*10+2-0;依次类推.遇到小数点后,开始计小数部分的位数,仍按整数处理,即按12345处理,最后除以小数部分的最高幂,本例中是除以102,相当于小数点向前移动两位,即12345/100=123.45。,3.4.7 循环程序设计,main()char ch
23、;float result,scale;result=0.0;scanf(%c,&ch);do result=result*10+ch-0;scanf(%c,&ch);while(ch=0)&(ch=0)&(ch=9);result=result/scale;printf(result=%f n,result);,3.4.7 循环程序设计,例.7 求Fibonacci数列:1,1,2,3,5,8,.的前40个数,即:F1=1(n=1)F2=1(n=2).Fn=Fn-1+Fn-2(n3)算法:,3.4.7 循环程序设计,main()long int f1,f2;/*长整型数*/int i;f1=
24、1;f2=1;/*已知数列的前两个初值*/for(i=1;i=20;i+)printf(%12ld%12ld,f1,f2);/*输出长整型数*/if(i%2=0)printf(n);/*控制输出格式*/f1=f2+f1;f2=f1+f2;,3.4.7 循环程序设计,例.8 求100200间的全部素数。#include math.hmain()int m,k,i,n=0;/*n用于累计素数的个数*/for(m=101;m=k+1)printf(%d,m);n=n+1;,3.4.7 循环程序设计,例9:译密码。为使报文保密,往往按一定规律将其转换为密码,收报人再按约定的规律将其译为原文。设加密规律
25、为:将字母变成其后的第四个字母,如,A变为E,a变为e。输入一行字符,要求将其变为密码。算法如下:1、当输入字符不是“回车”时,执行密码转换。2、仅转换AZ、az。3、转换规则:c=c+4,当c=ZZ+4范围,或cz时,c=c-26。,3.4.7 循环程序设计,#include stdio.hmain()char c;while(c=getchar()!=n)if(c=a,3.5 综合应用举例,在解决实际问题时,所编写的程序中程序设计的三种结构,即顺序结构,分支结构和循环结构,并不是相互独立存在的,它们总是有机的结合在一起,共同完成一个任务。例.1:求10到200之间的孪生素数对。孪生素数对指
26、两个素数的值相差2的一对素数,如11与13,17与19,等等。,3.5 综合应用举例,程序如下:#include#define first 10#define max 200 main()int i,j,k,t;int prime1,prime2;j=0;for(i=first;i=max;i+)k=2;while(i%k!=0)&(k=(int)(sprt(i)k=k+1;if(i%k!=0)prime1=1;else prime1=0;,3.5 综合应用举例,t=i+2;k=2;while(t%k!=0)&(k=(int)(sprt(t)k=k+1;if(t%k!=0)prime2=1;e
27、lse prime2=0;if(prime1&prime2)j=j+1;if(j%5!=0)printf(%4d,%4d;,i,i+2)else printf(n n);/*一行打印五对孪生素数*/*if(prime1&prime2)结束*/*for 循环结束*/*main()结束*/,重点内容,1.掌握循环3种控制语句2.理解Continue 和Break的区别3.重点关注P131例题7-5中的输入例外处理问题,以及如何吃回车问题;4.关注P138例题7-7和P144,学习如何采用列举法来解题.5.关注P146例题7-12,学习如何采用试探法来解题6.关注P139例题7-8,学习如何判断素数的算法,以及如何设置标记变量.,下次课内容,I/O函数预编译参考教材第3章,4.6节和第6章,