第四节 控制结构-循环控制
知识要点
4.1 while语句
4.2 do-while语句
4.3 for语句
4.4 break和continue语句
4.5 循环结构的嵌套
4.6 goto语句
结构化程序设计的三种结构
顺序结构:是按照书写顺序依次执行的。
选择结构:是对给定的条件进行判断,再根据判断的结果决定决定执行哪一个分支
循环结构:是在给定条件成立时反复执行某段程序。
§4.1 while语句
while语句的一般形式:
while (条件) 语句;
流程图:
while语句的执行过程是:当条件成立时执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立结束循环。while语句的特点是:当一开始条件就不成立时,一次也不执行循环语句。
例4.1 求1+2+… …+100的结果。
第一步, 计算 0+1;
第二步, 计算 (0+1)+2;
第 n 步, 计算 (0+1+…+n-1)+n;
第100步,计算 (0+1+…+99)+100;
所以只要定义一个变量s,初值为0,则第
1次循环加1,第n次循环加n,直到第100
次循环加100即可
伪代码算法:
定义s、n存放累计的和以及循环次数
累计和清零s=0; 循环变量赋初值n=1;
while (n<=100)
{s=s+n;
n=n+1; }
输出结果s
#include <stdio.h>
void main()
{
int s,n;
s=0;
n=1;
while (n<=100)
{s=s+n;
n=n+1; }
printf("1+2+3+… ...+100=%d\n",s);
}
上例程序5~10行也可以改写如下两种常见形式:
形式一:s=1;n=2;形式二:s=1;n=1;
while (n<=100) while (n<100)
{s=s+n; {n=n+1;
n=n+1;} s=s+n;}
通过以上三种形式的比较,我们可以看到在循环结构中,初值
(包括循环变量初值和计算结果初值等)与循环条件是相互影
响的,所以为了避免出错,可以通过验算循环结构开始和结束
的运行状态,如上例中代入n=1、n=2以及n=99、n=100,
进一步判断是否符合要求。习惯上,累计求和初值为0、累计求
积初值为1,所以我们推荐例4.1的形式。
在循环结构的设计中,特别需要注意的是:避免死循环。循环
体中必须有改变条件的语句,并且可以使程序执行到某一时刻
不满足这个条件而结束循环。
举一反三:从键盘输入n,求1+2+… …+n的结果并输出。
§4.2 do-while语句
do-while语句的一般形式:
do
循环体语句
while (条件) ;
流程图:
do-while语句的执行过程:执行循环体中的语句,然后判断条件,条件成立再执行循环体;重复上述过程,直到条件不成立时结束循环
do-while语句的特点是:当一开始条件就不成立时,已经执行了一次循环语句。
此外特别注意while(条件)后面的分号不要省。
例4.2 求1+2+… …+100的结果。
算法分析同例4.1。
伪代码算法:
定义s、n存放累计的和以及循环次数
累计和清零s=0; 循环变量赋初值n=1;
do
{s=s+n;
n=n+1;
}
while (n<=100);
输出结果s;
#include <stdio.h>
void main()
{
int s,n;
s=0;
n=1;
do
{s=s+n;
n=n+1;
}
while (n<=100);
printf("1+2+3+… ...+100=%d\n",s);
}
#include <stdio.h>
void main()
{
int s,n;
s=0;
n=1;
do
{s=s+n;
n=n+1;
}
while (n<=100);
printf("1+2+3+…
...+100=%d\n",s);
}
#include <stdio.h>
void main()
{
int s,n;
s=0;
n=1;
while (n<=100)
{s=s+n;
n=n+1; }
printf("1+2+3+… ...+100=%d\n",s);
}
通过例4.1和4.2可以看到用while语句可以转换为do-while语句,二者唯一不同的是:当一开始条件就不成立时,while语句不执行循环体,而do-while语句执行一次循环体。
程序一:void main() 程序二:void main()
{int s=0,n=101; {int s=0,n=101;
while (n<=100) do
{s=s+n;n=n+1;} {s=s+n;n=n+1;}
printf (“n=%d,s=%d”,n,s); while (n<=100);
} printf (“n=%d,s=%d”,n,s); }
执行结果: 执行结果:
n=101,s=0 n=102,s=101
举一反三:求2+4+… …+100的结果并输出
§4.3 for语句
for语句的一般形式:
for (表达式1;条件;表达式2)
语句
for语句的执行过程是:第一步执行表达式1,第二步判断条件,第三步当条件成立时执行循环体中的语句和表达式2;然后重复第二、三步直到条件不成立结束循环。
for语句可以改写成while语句形式:
表达式1;
while (条件)
{ 语句
表达式2;
}
§4.3 for语句
例4.3 求1+2+… …+100的结果
算法分析同例4.1。
伪代码算法:
定义s、n存放累计的和以及循环次数;
for (s=0,n=1;n<=100;n=n+1)
s=s+n;
输出结果s;
§4.3 for语句
#include <stdio.h>
void main()
{
int s,n;
for(s=0,n=1;n<=100;n=n+1)
s=s+n;
printf("1+2+3+… ...+100=%d\n",s);
}
for 语句中的表达式1,一般用于给循环前的某些变量赋初值的(超过一个语句用逗号间隔),如果在循环语句前已经赋过初值,表达式1可以省略,但是其后的分号不能省略。所以上例for语句可以改写如下:
s=0;n=1;
for ( ; n<=100; n=n+1)
s=s+n;
表达式2可以是用于修改循环一次后循环变量,确保循环在某一时刻可以结束,如果循环体语句中已经包含控制循环次数的内容,表达式2可以省略,但是表达式2前面的分号不能省略。上例for语句可以变换如下:
for (s=0,n=1; n<=100 ; )
{s=s+n;
n=n+1;}
表达式1和表达式2也可以是与循环无关的量,甚至条件也可
以省略(如果条件省略,循环体中需要有跳出循环的语句,这
部分内容我们将在下一节中介绍)。但是一般来说,for语句写
成如下形式方便阅读和理解:
for (循环变量赋初值;循环条件;循环变量增值)
循环体语句
以上我们介绍了C语言常用的循环语句while语句、do-while语句和for语句。一般情况下三种循环语句可以互相替换,只有当一开始条件就不成立时,while语句和for语句不执行循环体,而do-while语句执行一次循环体。这三种循环语句中for语句最灵活,不仅循环变量的初始化可以放在表达式1中,而且循环变量的增值甚至整个循环体都可以放入表达式2中,所以在C语言中for语句最为常用。
举一反三:求100+99+… … +1的结果并输出。
猴子吃桃
猴子吃桃:有一天,一只猴子摘了一些桃子。它吃掉了一半,又吃了一个, 第二天也是这样,吃了所有桃子的一半,又多吃了一个... 到了 第十天,小猴子一看,只有1个桃子了。 求最早的时候,小猴子摘了几个桃子?
1534个桃子
§4.4 break和continue语句
break语句除了可以用在switch语句中,还可以用在循环体中。在循环体中遇见break语句,立即结束循环,跳到循环体外,执行循环结构后面的语句。一般形式为:
break;
在循环体中break语句常与if语句搭配使用,并且break语句只能用在switch语句和循环语句中。
例4.4 判断一个数n是否是素数。如果n不能被2到n-1中的任何一个数整除n为素数,所以循环让n除以i,i分别等于2到n-1,如果n不是素数,则2到n-1中至少存在一个数可以整除n,当i等于第一个这种数时,除法运算的余数为0,则提前结束循环,此时i小于n。如果n是素数,则经过2到n-1之间的除法运算,没有余数
为0的情况,循环由于不满足条件i小于等于n而结束。
#include <stdio.h>
void main()
{
int n,i;
scanf("%d",&n);
for (i=2;i<=n-1;i=i+1)
if (n%i==0) break;
if (i<n) printf("%d不是素数\n",n);
else printf("%d是素数\n",n);
}
写出下列两段循环语句的输出结果:
for (k=1;k<5;k=k+1) for (k=1;k<5;k=k+1)
printf(“******\n”); {if (k==3) break;
printf(“******\n”);}
在循环体中break语句常与if语句搭配使用,并且break语句只能用在switch语句和循环语句中。
continue语句用于结束本次循环,即在循环体中遇见continue语句,则循环体中continue语句后面的语句不执行,接着进行下一次循环的判定。它的一般形式为:
continue;
continue语句只用于循环结构的内部,一般同if配合使用。
例4.5 统计1~20之间不能被3整除的数的个数并输出这些数。
算法分析:
当n=1时,输出1,计数加1;
当n=2时,输出2,计数加1;;
当n=3时,结束本次循环,
转到第4次循环;
当n=4时,输出4,计数加1;;
伪代码算法:
定义n、s;
for (n=1,s=0;n<=20;n=n+1)
{ if (n%3= = 0) continue;
printf(“%d\t”,n);
s=s+1;}
输出统计数s;
#include <stdio.h>
void main()
{
int n,s;
for (n=1,s=0;n<=20;n=n+1)
{ if (n%3==0) continue;
printf("%d\t",n);
s=s+1;
}
printf("\ntotal:%d\n",s);
}
continue语句和break语句用在循环体中的作用是不同的。continue语句只取消本次循环的continue语句后面的内容,而break语句终止了整个循环过程。
如例4.5中如果continue换成break,则输出结果为:
1 2
total:2
§4.5 循环的嵌套
一个循环语句的循环体内包含另一个完整的循环语句,称为循环的嵌套。While语句、do-while语句和for语句都可以互相嵌套,甚至可以多层嵌套。
例4.6 输出下列图形:
1
1 2
1 23
1 23 4
1 23 4 5
1 23 4 5 6
1 23 4 5 6 7
1 23 4 5 6 7 8
1 23 4 5 6 7 8 9
算法分析:
输出共9行,行号变量为n,从1到9,为外循环;
内循环输出1行中各个元素
我们知道:
第一行执行输出1次,输出1
第二行执行输出2次,第1次输出1,第二次输出2;
第n行执行输出n次,第1次输出1,第二次输出2,… … ,第n次输出n。
所以内循环变量m,执行输出操作从1到n次,
每次输出结果是内循环变量m的值
伪代码算法:
定义m、n;
for (n=1;n<=9;n=n+1)
{for (m=1;m<=n;m=m+1)
printf(“%4d”,m);
printf(“\n”); }
#include <stdio.h>
void main()
{
int m,n;
for (n=1;n<=9;n=n+1)
{ for(m=1;m<=n;m=m+1)
printf("%-4d",m);
printf("\n"); }
}
伪代码算法:
定义m、n;
for (n=1;n<=9;n=n+1)
{for (m=1;m<=n;m=m+1)
printf(“%4d”,m);
printf(“\n”); }
循环嵌套时注意内循环变量的初始化问题。此外,break只能跳出一层循环(或者一层switch语句结构)。例如:
例4.7 输出3~100的所有素数。
伪代码算法:
定义n、i;
for (n=3;n<=100;n=n+1)
{ for (i=2;i<n;i=i+1)
if (n%i= =0) break;
if (i>=n) 输出n;
}
§4.6 goto语句
goto语句为无条件转移语句,它的一般形式为
goto 语句标号;
语句标号的命名需要符合C语言对标识符的命名规则,即语句标号由字母、数字和下划线组成,其中第一个字符不能是数字。
标号必须加在某个语句的前面,并且在标号后面使用冒号。当程序执行到goto语句后,程序转移到标号指定的语句继续执行。
标号只对goto语句有意义,当其它场合下遇见语句标号,则直接执行语句而忽视标号的存在。
§4.6 goto语句
例4.8 求1+2+… …+100的结果。
#include <stdio.h>
void main()
{
int n=1,s=0;
loop: if (n<=100)
{ s=s+n;
n=n+1;
goto loop ;
}
printf("1+2+3+… ...+100=%d\n",s);
}
上机练习与课后作业
1.用十进制、八进值、十六进制、字符形式输出ASCII码表33~126中的代码。
2.计算1!+2!+… …+10!的值
3.用循环的嵌套输出右方图形:
*
***
*****
*******
*********
***********
4.要求输出右方菜单
如果选择1,则显示“请输入”;选择2,则显示“请输入查找学生学号”;选择3,显示“正在输出”;选择0,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。
用循环语句实现用户的重复输入,直到输入选择为“0”时,结束循环
主菜单
================
- 输入学生成绩
- 查询学生成绩
- 打印输出成绩
0. 退出系统
================
请选择 (1~4):
ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。