1、5.1 while语句5.2 do-while语句5.3 for 语句5.4 循环的嵌套5.5 break、continue和goto语句5.6 程序举例,第5讲 循环结构程序设计,2,C语言有while 、 do - while 、for三种循环结构语句。 前两个称为条件循环,即根据条件来决定是否继续循环; 后一个称为计数循环,即根据设定的执行次数来执行循环。,5.1 while 语句及其循环结构,while 语句和格式及执行过程:格式: while (表达式) 语句执行过程: 先计算表达式之值,若为非0(即条件成立),执行后面的语句(称之为循环体)之后,再计算表达式之值进行判断,如此多次重
2、复执行循环体;若表达式之值为0(即条件不成立),跳出循环体语句,继续向下执行。,while 语句的流程图,表达式,语句(循环体),Y(非0),N(0),while(表达式)语句,例1 求1100之间所有整数的和,i=100,sum+=i; /* 累加 */i+=1; /* 计数器加1 */,Y(非0),N(0),i=1; sum=0;,printf(i=%d,sum=%dn,i,sum);,求1100之间整数和的程序,main( ) int i=1,sum=0; while( i=100) sum+=i; i+=1; printf(i=%d,sum=%dn,i,sum);,这是一个while语
3、句,想一想,语句sum+=i;和语句i+=1;能否改变位置?为什么?,想一想,如果在while语句之前对变量sum赋初值为1,是否可以?程序的哪些地方应作相应的改动?,求1100之间整数和的程序运行过程,main( ) int i=1,sum=0; while( i=100 ) sum+=i; i+=1; printf(i=%d,sum=%dn,i,sum);,这是一个while语句,程序执行的过程和结果如下:,i=101,sum=5050,注意:循环结束后,变量i 的值一定大于100。,想想这样的一段循环语句的执行结果:i=1;while (i=100) putchar(*);i+;,这个循
4、环永远不会结束,因为循环控制变量i没有在循环体内被改变,i+; 不属于循环体。,应该改为:,i=1;while (i=100) putchar(*); i+;,循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环。,5.2 do-while 语句及其循环结构,dowhile 语句和格式及执行过程:格式:do 语句 while (表达式) ;执行过程: 先执行语句(称之为循环体),然后计算表达式之值,若为非0(即条件成立),再执行语句(循环体)后计算表达式之值,如此多次重复执行循环体并判断条件;若表达式之值为0(即条件不成立),结束循环,继续向下执行。,dowhile 语句
5、的流程图,表达式,语句(循环体),Y(非0),N(0),注意:while循环语句与do-while循环语句的区别。,用do-while语句求100以内正整数的和,main( ) int i=1,sum=0; do sum+=i; i+=1; while( i=100 ); printf(i=%d,sum=%dn,i,sum);,i=101,sum=5050,从键盘上输入10个整数,求总和及平均值,main( ) int x,sum=0,i=1; float aver; while(i=10) scanf(%d,从键盘上输入若干个整数,求总和及平均值,输入-1结束,main( ) int x,s
6、um=0,i=1; float aver; while( ) sum+=x; i+; scanf(%d,scanf(%d,x!=-1,求若干个整数的总和,要求总和不大于1000,main( ) int x,sum=0; while(sum=1000) scanf(%d,-x,5.3 for 语句,格式: for(表达式1;表达式2;表达式3) 语句执行: (1) 先求解表达式1的值。 (2) 再求解表达式2的值,若值为非0(条件成立),则执行语句(循环体)后执行下面的(3);若表达式2的值为0(条件不成立),则转向(5)。 (3) 求解表达式3的值。 (4) 转回执行(2)。 (5) 执行fo
7、r语句后面的语句。,for 语句执行流程图,表达式2,语句(循环体),Y(非0),N(0),表达式1,表达式3,for(表达式1;表达式2;表达式3) 语句,求1100之间的整数之和(for语句),main( ) int i,sum; for( i=1,sum=0; i=100; i+ ) sum+=i; printf(i=%d,sum=%dn,i,sum);,i=101,sum=5050,求1100之间的整数之和(for语句),main( ) int i,sum; for( ; i=100; i+ ) sum+=i; printf(i=%d,sum=%dn,i,sum);,i=101,sum
8、=5050,表达式1可缺省,放在循环之前,但for语句中的第一个分号不能省略,i=1;sum=0;,求1100之间的整数之和(for语句),main( ) int i,sum; for( ; i=100; ) sum+=i; printf(i=%d,sum=%dn,i,sum);,i=101,sum=5050,表达式3可缺省,放在循环体之中,但for语句中的第二个分号不能省略,i=1;sum=0;,i+;,求1100之间的整数之和(for语句),main( ) int i,sum; for(i=1,sum=0 ; ij时结束循环(即i=j时继续循环)。最后输出s。,#includemain(
9、) int i,j; float s=0; for( i=1,j=100 ; i0,执行第4步,否则执行第7步4. i=a%105. t=t*10+i6. a=a/10,并返回第3步7. 输出t,程序:,#includemain( ) long a,i,t=0; scanf(“%ld”,1、下列叙述中正确的是A) break语句只能用于switch语句B) 在switch语句中必须使用defaultC) break语句必须与switch语句中的case配对使用D) 在switch语句中,不一定使用break语句2、有以下程序main( )int k=5; while(- -k)printf(%
10、d,k-=3;); printf(n);执行后的输出结果是A) 1 B) 2 C) 4 D) 死循环,2006-9,2006-9,3、有以下程序main( )int i; for(i=1; i0 程序运行后的输出结果是A) 235 B) 0235 C) 02356 D) 2356,2007-4,6、以下程序的功能是:将输入的正整数按逆序输出。例如:若输入135则输出531。请填空。main( )int n, s; scanf(%d,2006-9n=n/10,7、当执行以下程序时,输入1234567890,则其中while循环体将执行_次。#include main( )char ch; whi
11、le( ch=getchar( ) =0) printf(#);答案:因为上边的没有字符,getchar是输入单个字符用的,2007-40,8、若变量已正确定义,有以下程序段i=0; 答案;因为do后边的没有用大括号括起来,所以没有形成while循环,只执行一次就结束了doprintf(%d,i); while(i+);printf(%dn,i);其输出结果是A)0,0B)0,1C)1,1D)程序进入无限循环9、有以下程序#includemain()inty=9;for( ; y0; y- -) if(y%3=0)printf(%d,-y);程序的运行结果是A)741B)963C)852D)8
12、75421,2007-9,2007-9,10、以下程序的输出结果是( )#includemain() intn=12345, d; while(n!=0)d=n%10;printf(%d,d);n/=10;11、有以下程序段,且变量已正确定义和赋值for(s=1.0,k=1;k=n;k+)s=s+1.0/(k*(k+1);printf(s=%fnn,s);请填空,使下面程序段的功能与之完全相同s=1.0;k=1;while(_)s=s+1.0/(k*(k+1);_;printf(s=%fnn,s);,2007-954321,2007-9k=nk+,12、以下程序的输出结果是( )#includ
13、emain()inti; for(i=a;i0; x-)if(x%3) printf(%d, , x-);continue; printf(%d.,-x); 程序运行的结果是 A)7,4,2,B)8,7,5,2,C)9,7,6,4,D)8,5,4,2,2008-4,14、以下不构成无限循环的语句或语句组是A)n=0;B)n=0;do+n;while(n=0);while(1)n+;C)n=10; D)for(n=0,i=1; ;i+)n+=i;while(n);n-;15、若有定义:intk;,以下程序段的输出结果是( #2#4 )for(k=2;k6;k+,k+)printf(#%d,k);
14、,2008-4,16、有以下程序#includemain()inti=5;doif(i%3=1) if(i%5=2) printf(*%d,i);break; i+;while(i!=0);printf(n);程序的运行结果是A)*7B)*3*5C)*5D)*2*6,2008-9,5.4 循环嵌套,一个循环体中又包含了另一个完整的循环结构,叫做循环的嵌套。三种循环结构可以互相嵌套。循环嵌套的执行过程是:外循环执行一次,内循环执行一个全过程。,循环嵌套举例:输出一个图形,main( ) int i, j; for( i=1 ; i=4 ; i+ ) for( j=1; j=3 ; j+ ) pr
15、intf(*); printf(n); ,*,/*外循环控制输出图形的行数*/,/*内循环控制每行输出的数量*/,循环嵌套语句,第一个语句是循环语句,实现输出3个*号,第二个语句是简单语句,输出一个换行符,main( ) printf(*n); printf(*n); printf(*n); printf(*n);,main( ) int i,j; for( i=1;i=4;i+) printf(*n);,循环嵌套举例:输出一个图形,main( ) int i, j; for( i=1 ; i=4 ; i+ ) for( j=1; j10 或者 area 100。,continue语句的使用,
16、输出 17 之间所有不能被3整除的整数。,main( ) int n; for( n=1 ; n=,/* 分母加2 */,pi= 3.141594,/* pi存放和, t 存放项值 */,/* 计算下一个项值 */,掌握在循环体中实现正负相间的技巧,判断整数m是否为素数,素数即为质数,如果一个整数只能被1或者它本身整除,这个数就称为是素数。判断素数的算法是:让m被2m-1之间所有的整数整除,如果m能被2m-1之中的任何一个整数整除,则提前结束循环,此时m一定不是素数;如果在2m-1之间不存在能被m整除的整数,则终止循环,此时循环变量的值一定大于或者等于m。,判断整数m是否为素数算法流程图,定义
17、变量m(被判断数),i(循环变量)输入m的值,N,i=m,输出m是素数,Y,N,输出m不是素数,break;,i+;,for循环,不是素数,是素数,判断整数m是否为素数程序,main( ) int m,i; scanf(%d,for ( i=2 ; i=m ) printf(n%d是素数n,m); else printf(n%d不是素数n,m); ,判断整数m是否为素数程序2,#include main( ) int m,i,k; scanf(%d,for ( i=2 ; ik ) printf(n%d是素数n,m); else printf(n%d不是素数n,m); ,判断整数m是否为素数程
18、序3,main( ) int m,i,k,flag; scanf(%d,for ( i=2 ; i=k ; i+ ) if (m%i=0) flag=0; break;,if ( !(flag=0) ) printf(n%d是素数n,m); else printf(n%d不是素数n,m); ,/* 定义变量flag作为标志变量 */,/* 变量 flag 赋初值1 */,/* 如果m是素数,flag 赋0 */,例:求3150中所有素数的和。,算法分析: 1. 用变量a从3到150循环,每次值增加1 2. 用变量i从2到a-1循环,每次值增加1 3. 若a%i=0 ,结束i的循环,执行第4步
19、4. 若i=a,把a累加到s上。 5. 输出s的值,注意:此题中执行第4步时有两种情况。第一种:在第3步中发现了满足a%i=0的情况,直接跳出了i的循环,此时的i一定是在2到a-1中间的一个值,而且a不是素数。第二种:一直没有发现满足a%i=0的i,在i=a时,不再满足i循环的执行条件,i循环结束,此时的a是素数!,程序:,#includemain( ) int a,s=0,i; for(a=3;a=a) s=s+a; printf(“n%d”,s),1、有以下程序,若运行时从键盘输入:18, 11,则输出结果_main( )int a, b; scanf(%d,%d, ,2006-91 1,
20、2、有以下程序#includemain()inti, j, m=55;for(i=1;i=3;i+) for(j=3;j=1;i-)for(j=1;j=1; i-)sum=0; for(j=1; j=i; j+)sum+=i*j;printf(%dn, sum);,2008-9,1,题库练习,while循环累和问题:1-1(题目显示的第1项分子应为3)、32-1 (题目显示的公式不对,以书为准) 、 48-2、57-1、58-2、69-1累积问题:47-2、74-2累和累积:2-3 计算: 37-2 、45-2 (题目显示的公式不对,以书为准) 最大公约数:4-2 素数:31-2/及%应用:2
21、6-1、44-1、 5-1及 51-1(取各位为偶数的数字形成新数)注意:蓝色字体的题目,评分死板,题库练习,do while循环累和及累积问题:57-3/及%应用:10-2迭代法求方程根:18-3求一元二次方程根:100-1Fibonacci数列:48-3,题库练习,for循环累和问题:2-1、13-2、21-3、33-2、56-2、59-2、63-3、68-3、 70-3、 73-2、 88-3、89-3累积问题:58-3、67-1、累和累和及累积累积问题:40-3、67-3、68-1、70-1、77-3、84-3、85-3,题库练习,多重循环素数: 18-2、65-1、73-3、91-2其它: 83-2,