程序设计基础(C语言)教程 课件 第5章 循环结构_第1页
程序设计基础(C语言)教程 课件 第5章 循环结构_第2页
程序设计基础(C语言)教程 课件 第5章 循环结构_第3页
程序设计基础(C语言)教程 课件 第5章 循环结构_第4页
程序设计基础(C语言)教程 课件 第5章 循环结构_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5

循环结构5

循环结构while语句dowhile语句for语句break和continue语句循环的嵌套(难点)

每一种语句的格式和使用都是重点

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件判断继续执行某个功能还是退出循环。循环结构也是结构化程序设计的基本结构之一,它的功能是完成某些需要反复执行的任务,它和顺序、选择结构共同作为各种复杂程序的基本构造单元。循环结构包含三个要素:循环变量、循环体和循环终止条件。其中循环体就是反复执行的程序段,而循环变量与循环终止条件则一同决定了循环体可执行的具体次数。

在C语言中,有三种类型的循环语句:for语句、while语句和doWhile语句,循环语句由循环体及循环的判定条件两部分组成。常用的三种循环结构学习的重点在于掌握它们相同与不同之处,以便选择适当的语句解决不同的问题。5

循环结构

scanf("%f",&a);s=s+a;scanf("%f",&a);s=s+a;………….

这样重复一百次,然后输出s的值。这样写显然非常麻烦。我们注意到程序中的

scanf("%f",&a);s=s+a;两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。现有这样的一个要求:从键盘输入一百个学生的成绩,求总成绩。从前面所学,有两种解决方法。1.设一百个变量,分别输入学生的成绩,然后求和。这种方法浪费内存空间,显然不实际。2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:

while循环的一般形式为:

while(表达式)

{

语句块

}5.1

while语句while后面括号中的表达式称为循环条件,可以是任意的表达式,当循环条件的值为逻辑真则执行循环体语句,当表达式的值为逻辑假则直接跳出循环结构;语句块称为循环体,一般是需要多次重复执行的语句。while语句的意思是:先计算表达式的值,当值为真(非0)时,执行循环体语句;执行完循环体语句,再次计算表达式的值,如果为真,继续执行循环体,……,这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行后面的语句。其执行过程如下图5-1表示。5.1

while语句1、While循环又称当型循环,用于循环次数不确定,但控制条件可知的场合。2、循环体语句可以是一条,也可以是多条,多条的时候应用复合语句{}将多条语句括起来。3、循环体有可能一次也不执行。例如:while(0)i++;上例中作为循环条件的值为0,循环体i++一次也不会执行。4、当循环条件不成立时退出循环,除此之外,当遇到break也会退出循环,后续会具体讲解break的用法。5.1

while语句【例5-1】编写程序,计算累加和1+2+3+…+100的值。

[分析]:考虑到计算过程中需要两个变量,一个sum用于存放总和,一个变量i用于存放要加的数。解题步骤如下:

1)初始化总和的变量sum为0

2)初始化加数i为1

3)利用sum=sum+i累加加数

4)利用i=i+1变化加数

5)若i≤100,返回3);否则,执行6)。

6)输出sum,算法结束。

我们可以看出,用这种方法表示的算法具有通用性、灵活性。3)到5)组成一个循环,在实现算法时,要反复多次执行3)、4)、5)等步骤,直到某一时刻,执行5)步骤时经过判断,变量i已超过规定的数值而不返回3)步骤为止。此时算法结束,变量sum的值就是所求结果。【例】编写程序,计算累加和1+2+3+…+100的值。#include<stdio.h>voidmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i=i+1;}printf("sum=%d\n",sum);}运行结果:sum=5050若i≤100初始化加数i=1

sum=sum+ii=i+1

输出sum的值初始化总和变量sum=0

【说明】:(1)While循环语句首先对条件进行判断,若条件为真则执行循环体,若条件为假,则直接跳出循环结构,即循环体一次也不会执行。(2)While语句中的表达式一般是关系表达或逻辑表达式,只要表达式的逻辑为真,即可继续循环。表达式也可以一般的数值型表达式,以0值表示假,非0值为真。(3)进入循环前,应为循环控制变量赋值,以使循环条件为真。(4)While循环语句本身不能修改循环条件,所以必须在循环体内设置相应的语句,使整个循环趋于结束,以避免造成死循环。(5)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。【例】编写程序,计算阶乘100!的值。

[分析]10!=9*8*…*2*1计算机在计算阶乘时,是从1开始一个一个乘到10为止,即n!=n*(n-1)!。用i代表循环变量,s代表n!的结果值,则循环计算表达式:s=s*i,即可求得10!。若i≤10初始化加数i=1

s=s*ii=i+1

输出s的值初始化总和变量s=1

#include<stdio.h>main(){ inti=1; longs=1; while(i<=10) { s=s*i; i++; } printf("10!=%ld\n",s);}运行结果:10!=36288005.2do-while语句

do...while循环的一般形式为:

do

{

循环体语句;

}while(表达式);

do...while循环的执行过程为先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。5.2do-while语句

do...while循环是while循环的变体,两者可以互相转化。do...while循环执行时,在检查while()条件是否为真之前,首先会执行一次do{}之内的语句,然后在while()内检查条件是否为真,如果条件为真的话,就会重复do...while这个循环,直至while()为假。【说明】:do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。也因此do...while循环也称为直到型循环。例如,以下两段循环程序输出结果不同:程序段1:while(0){printf(“hello!”)}//循环体不执行,无输出程序段2:do{printf(“hello!”)}while(0);//循环体执行一次,输出“hello!”【例】用do-while语句求累加和1+2+3+…+100的值。

[分析]:和while语句的不同的是,do-while语句会先执行一遍循环体,在进行条件判断。#include<stdio.h>voidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;} while(i<=100);printf("%d\n",sum);}运行结果:5050若i≤100初始化加数i=1

sum=sum+ii=i+1

输出sum的值初始化总和变量sum=0

sum=sum+ii=i+1

5.3for语句for循环的一般形式为:for(表达式1;表达式2;表达式3)语句;相对while循环、do-while循环,for循环的结构更复杂,但它可以很好地体现了正确表达循环结构应注意的三个问题:循环控制变量的初始化、循环的条件、循环控制变量的更新。【说明】:(1)for循环本质上也为当型循环结构,它十分适用于事先可以确定循环次数的问题。(2)for语句一般应用形式为:for(循环变量赋初值;循环条件;循环变量增量)语句即:表达式1一般为赋值表达式,给控制变量赋初值;表达式2为关系表达式循环控制条件;表达式3一般为赋值表达式或逻辑表达式,给控制变量增量或减量。for(i=初值;i<=终值;i=i+步长)循环体语句;for(i=初值;i>=终值;i=i-步长)循环体语句;(3)当循环体有多条语句时,必须使用复合语句,也就是大括号括起来,否则程序只默认第一个分号“;”前的语句为循环体。(4)while循环、do-while循环和for循环可以相互转换。例如:

for(i=1;i<=100;i++)sum=sum+i;先给i赋初值1,判断i是否小于等于100,若是则执行语句,之后值增加1。再重新判断,直到条件为假,即i>100时,结束循环。相当于:i=1;while(i<=100){sum=sum+i;i++;}也就是对于for循环中语句的一般形式,可转化为如下的while循环形式:表达式1;while(表达式2){语句表达式3;}(5)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但“;”不能缺省。①省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。②省略了“表达式2(循环条件)”,则不做其它处理时便成为死循环。例如:for(i=1;;i++)sum=sum+i;相当于: i=1;

while(1)

{sum=sum+i;

i++;

}③省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。例如:

for(i=1;i<=100;){ sum=sum+i;

i++;

}④省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。例如:for(;i<=100;){ sum=sum+i; i++;}相当于: while(i<=100) { sum=sum+i; i++;}⑤3个表达式都可以省略。例如:for(;;)语句相当于:while(1)语句(6)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”可以是其他表达式。①表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。例如:for(sum=0;i<=100;i++)sum=sum+i;②表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。例如:for(sum=0,i=1;i<=100;i++)sum=sum+i;或: for(i=0,j=100;i<=100;i++,j--)k=i+j;③表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。例如: for(i=0;(c=getchar())!=’\n’;i+=c);又如: for(;(c=getchar())!=’\n’;) printf(“%c”,c);【例】:有2、3、4、5个数字,能组成多少个互不相同且无重复数字的三位数?编写for循环程序将其一一列举出来。

[分析]:2、3、4、5都可填在百位、十位、个位上。先得到所有的排列,之后再去掉不满足条件的排列,只将满足所有条件的列举出来。for(i=2;i<6;i++)for(j=2;j<6;j++)for(k=2;k<6;k++)输出满足条件三位数的个数初始化变量

i!=k&&i!=j&&j!=kTF输出三位数计数n++#include<stdio.h>#include<math.h>voidmain(){ inti,j,k,n=0; for(i=2;i<6;i++)//以下为三重循环 for(j=2;j<6;j++) for(k=2;k<6;k++) { if(i!=k&&i!=j&&j!=k)/*确保i、j、k三位互不相同*/ { printf("%d%d%d\n",i,j,k); n++; } } printf("共有%d个满足条件的三位数。\n",n);}5.4break和continue语句虽然循环结构有循环控制语句用于控制循环次数并跳出循环,但实际应用中,我们发现,有些情况我们并不需要循环跑完,即需要提前跳出循环;有些情况需要跳过循环体中剩下的语句直接进入下一轮循环。这些情况就会用到break和continue语句。break语句在之前开关语句switch中已经接触过,它可使程序跳出switch而执行switch以后的语句,它在循环结构中也有类似的应用。而continue语句并不会跳出循环结构,只会结束本次循环进入下一次循环。5.4.1

break语句当break语句用于do-while、for、while循环语句中时,可使程序终止循环,而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。比如在while循环语句中,break的一般格式为:while(表达式1){ 语句块1;if(表达式2)break;语句块2;}【例】利用break语句编写程序,判断某个数是否为素数。

[分析]:素数又称质数。所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2-16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2至m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。#include<stdio.h>#include<math.h>voidmain(){intm;//输入的整数inti;//循环次数printf("输入一个整数:");scanf("%d",&m);for(i=2;i<=m-1;i++)if(m%i==0)break;//如果完成所有循环,那么m为素数if(i>=m)printf("%d是素数。\n",m);elseprintf("%d不是素数。\n",m);}注意,若是素数,则会进行到最后一次循环,且最后会执行i++,此时i=m,所以最判断素数的条件是i大于等于m。5.4.2

continue语句

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。

以下是while循环语句中包含continue语句的一般格式:while(表达式1){

语句块1;

if(表达式2)continue;

语句块2;}【例】编写程序,输出在50~100中不能被3整除的数。

[分析]:对任意正整数n,若n%3≠0,则输出该数n;如果n%3=0,则不输出该数n。#include<stdio.h>voidmain(){ intn=50; for(;n<=100;n++) { if(n%3==0) { printf("\n",n); continue; } else printf("%d\t",n);}}总结:(1)continue语句只结束本次循环,而不是终止整个循环的执行。(2)break语句则是结束整个循环过程,不再判断执行循环的条件是否成立5.5

三种循环结构的比较

三种循环都可以用来处理同一个问题,一般可以互相代替。此外还有一种goto型循环,但并不提倡使用,这里不再赘述。

while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。

用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。

同一个问题,往往既可以用while语句解决,也可以用do...while或者for语句来解决,但在实际应用中,应根据具体情况来选用不同的循环语句。5.5

三种循环结构的比较

选用的一般原则是:

如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是由循环体的执行情况确定的,一般用while语句或者do...while语句。当循环体至少执行一次时,用do...while语句,反之,如果循环体可能一次也不执行选用while语句。这只是一般原则,并非绝对原则。5.6

循环的嵌套

循环体内又出现循环结构称为循环嵌套或多重循环,用于较复杂的循环问题。前面介绍的几种基本循环结构都可以相互嵌套。计算多重循环的次数为每一重循环次数的乘积。

这种嵌套过程可以有很多重。一个循环外面仅包围一层循环叫二重循环;一个循环外面包围两层循环叫三重循环;一个循环外面包围多层循环叫多重循环。

三种循环语句for、while、do...while可以互相嵌套自由组合。但要注意的是,各循环必须完整,相互之间绝不允许交叉。【例】打印九九乘法表。

[分析]:九九乘法表有九行九列构成,我们可以首先考虑一行怎么打,一个口决怎么打,这样的话就把复杂问题简单化了。我们可以用printf("%d*%d=%-3d",i,j,i*j)这条语句输出一条口决,那么一行,就是这条语句重复执行九次,而九行就是把一行的打印的九次重复,只是在运行时行和列的值在不断变化。我们把打印一行的那个循环称之为内循环,把完成九行的循环称之为外循环。#include<stdio.h>#include<conio.h>voidmain(){inti,j,result;printf("\n");for(i=1;i<10;i++)/*共打印九行*/{for(j=1;j<10;j++)/*用于打印一行中的九列*/{result=i*j;printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/}printf("\n");/*每一行后换行*/}getchar();}5.7

程序举例

采用循环控制语句编程,既可以简化程序,又能提高效率。使用时,必须遵守“先检查,后执行”的原则,解决好循环三要素:进入循环的条件、循环体的算法、结束循环的条件。

下面我们将通过几个典型程序来掌握循环结构中的常用算法。

1.累计求加、阶乘等数值循环运算问题

2.有规律图案打印3.不定方程的整数解4.字符串处理1.累计求加、阶乘等数值循环运算问题

【例】求累加和s=1+(1+2)+…+(1+2+3+…+n)的值,其中n由键盘输入。

分析:累加是在原有和的基础上一次一次地每次加一个数。#include<stdio.h>voidmain(){ints=0,i,n,a=0,b=0;scanf("%d",&n);if(n<1)printf("Error!");else{

for(i=0;i<n;i++)

{

++a;

b+=a;

s+=b;

}

printf("%d",s);}}运行结果:10220【例】编写程序,显示出所有水仙花数。

分析:所谓水仙花数,是指一个3位数,其各位数字立方和等于该数字本身。

例如,153是水仙花数,因为:153=13+53+33。#include<stdio.h>#include<conio.h>voidmain(){inti,j,k,n;printf("'waterflower'numberis:");for(n=100;n<1000;n++){i=n/100;/*分解出百位*/j=n/10%10;/*分解出十位*/k=n%10;/*分解出个位*/

if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)printf("%-5d",n);}getchar();}2.有规律图案打印

【例】打印空心三角形,如下图所示

*

**

**

**

*********

[分析]:在第一行和最后一行正常输出,其余行只输出首和尾。#include<stdio.h>voidmain(){ inti,j; for(i=0;i<5;i++){ for(j=5;j>i;j--) { printf(""); } for(j=0;j<2*i+1;j++){ if(j==0||j==2*i||i==0||i==4)

printf("*"); else

printf(""); } printf("\n"); }}3.不定方程的整数解

【例】一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(注:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。)

[分析]:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足完全平方数的要求,则输出结果。变量初始化for(i=1;i<100000;i++)x=sqrt(i+100);y=sqrt(i+268);x2==i+100&&y2==i+268TFprintf("%ld\n",i);#include<math.h>main(){ longinti,x,y,z; for(i=1;i<100000;i++) { x=sqrt(i+100);

/*x为加上100后开方后的结果*/ y=sqrt(i+268);

/*y为再加上168后开方后的结果*/ if(x*x==i+100&&y*y==i+268)

//如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/ printf("%ld\n",i);

}}4.多数据、字符串处理

【例】用循环结构找出一系列整数中的最小值。

分析:先输入数据的个数n,之后依次输入n个整数,用循环结构找到最小值。#include<stdio.h>intmain(){

intn,i,a,b;

printf("即将输入整数个数为:n=");

scanf("%d",&n);

printf("依次输入n个整数:");

scanf("%d",&a);

for(i=1;i<n;i++){

scanf("%d",&b);

if(a>b)a=b;

}

printf("min=%d\n",a);}【例】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

[分析]:本例程序中的循环条件为getchar()!='\n',其意义是,只要从键盘输入的字符不是回车就继续循环。循环体中的char、space、digit、others分别代表英文字母、空格、数字和其它字符的个数,char++、space++、digit++、others++完成对输入的字符英文字母、空格、数字和其它字符个数计数。从而程序实现了对输入一行字符的所有数据的计数。#include"stdio.h"#include"conio.h"voidmain(){charc;intletters=0,space=0,digit=0,others=0;printf("pleaseinputsomecharacters\n");while((c=getchar())!='\n'){if(c>='a'&&c<='z'||c>='A'&&c<='Z')letters++;elseif(c=='')space++;elseif(c>='0'&&c<='9')digit++;elseothers++;}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论