第五章循环结构程序设计_第1页
第五章循环结构程序设计_第2页
第五章循环结构程序设计_第3页
第五章循环结构程序设计_第4页
第五章循环结构程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第五章循环结构程序设计概述while语句

do-while语句

for语句

几种循环结构的比较

循环的嵌套

循环控制语句

算法及其表示方法简介

循环算法的设计与实现

小结

循环结构:按照某测试条件,对某一操作序列进行重复性操作的一种计算结构。其中:“测试条件”称为循环条件,重复的操作序列称为循环体。

C语言中循环语句,具有实现这种重复性的功能。循环程序设计

按照循环结构思想进行程序设计的方法。本章主要介绍:用if语句和goto语句构成循环;用while语句构成循环;用do-while语句构成循环;用for语句构成循环;循环的嵌套;循环控制语句;(break语句、continue语句)循环算法的设计和实现;简要介绍算法及其表示方法。循环语句概述C语言可实现循环的语句:用goto

和if构成循环while语句do~while语句for语句goto语句及用goto构成循环goto语句一般格式:

goto

语句标号;

….…..标号:语句;5.2

goto语句与循环goto语句(无条件转移语句)goto语句为无条件控制转向语句,它会导致程序执行流程的一个无条件的跳转,从而控制程序执行直接跳转到一个带有标号语句的位置。带有标号的语句的一般形式为:标号:语句(用标识符来定义标号)例5.1用if语句和goto语句构成循环,求5!(图5.1为程序流程图)main(){inti,result;

i=5;

result=1;

loop:if(i>=1)

{result*=i;

i--;

gotoloop;}

printf("5!=%d\n",result);}goto功能:无条件转移语句说明:不能用整数作标号;标号只能出现在goto所在函数内,且唯一;标号只能加在可执行语句前面限制使用goto语句/*ch5_1.c*/#include<stdio.h>main(){inti,sum=0;i=1;loop:

if(i<=100){sum+=i; i++;

gotoloop;

}

printf("%d",sum);}sum0+1=1第1次sum1+2=3第2次sum3+3=6第3次sum6+4=10第4次……sum4950+100=5050第100次循环初值循环终值循环变量增值循环条件循环体例:用if和goto语句构成循环体会程序设计思想累加器:用于累加求和计数器:用于提供加数一般形式:while(表达式)

语句;执行流程:expr循环体假(0)真(非0)while5.3

while语句

循环体(复合语句)循环控制条件特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)

循环体;While语句特点和说明用while循环求/*ch5_2.c*/#include<stdio.h>main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}

printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体例:/*ch5_21.c*/#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例:

显示1~10的平方一般形式:do

语句;

while(表达式);执行流程:do循环体expr假(0)真(非0)while5.4

do_while语句循环体(复合语句)循环控制条件特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体While循环do~while语句特点和说明例5.3

用do-while语句实现n!的求解#include<stdio.h>voidmain(){

int

n,i;doublep;

printf(“n!,n=?");

scanf("%d",&n);i=1;p=1;do{p=p*i;i++;}

while(i<=n);

printf("%d!=%lf\n",n,p);}一般形式:for([expr1];[expr2];[expr3])

语句;执行流程:expr2循环体假(0)真(非0)forexpr1expr35.5for语句循环体(复合语句):for(循环变量赋初值;循环条件;循环变量增值){

语句;}说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)for语句可以转换成while结构expr1;while(expr2){

循环体语句;

expr3;}for语句一般应用形式例:#include<stdio.h>main(){inti=0;for(i=0;i<10;i++)

putchar(‘a’+i);}运行结果:abcdefghij例:#include<stdio.h>main(){inti=0;

for(;i<10;i++)

putchar(‘a’+i);}例:#include<stdio.h>main(){inti=0;

for(;i<10;)

putchar(‘a’+(i++));}例:#include<stdio.h>main(){inti=0;

for(;i<10;putchar(‘a’+i),i++)

;}例子0yxaa+ha+iha+(i+1)hbf(x)例(for)梯形法求数值积分5.6

几种循环结构的比较(1)结构化程序设计,不提倡用if语句和goto语句构成循环。(2)用while语句和do-while语句组成循环结构时,循环变量初始化应在while语句和do-while语句之前。在while后指定循环继续的条件;循环体语句中应包含使循环趋于结束的语句。(3)循环次数无法确定,但循环条件可以确定时,用while语句和do-while语句组成循环结构。循环次数可以确定时,用for语句组成循环结构。(4)在while语句、dowhile语句和for语句的循环体中,都可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见5.8节)。而在if语句和goto语句构成的循环体中不能用“循环控制语句”。三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转5.7

循环的嵌套i<10printf假(0)真(非0)i=1j++j=1j<10真(非0)假(0)i++for(i=1;i<10;i++)

for(j=1;j<10;j++)

printf((j==9)?"%4d\n":"%4d",i*j);外循环内循环循环的嵌套(图解)

5.8

循环控制语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出break所在层的结构break不能用于循环语句和switch语句之外的任何其它语句之中。循环语句里,break只可出现在循环体中。循环控制语句(图解1)expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)whileexpr2……break;…...假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase

循环控制语句(图解2)例5.6从键盘上输入一整数,如果该整数是素数,则输出1,否则输出零。#include<stdio.h>#include<math.h>voidmain(){

int

num,k,i,flag;

printf("请输入一整型数:");

scanf("%d",&num);k=sqrt(num);/*此处也可为num/2*/

for(i=2;i<=k;i++)

if(num%i==0)break;/*若num被某i整除,则num不是素数,退出循环*/

if(i==k+1)/*for循环若正常结束,说明所有的i不满足num%i==0*/flag=1;/*若num不被2~k整除,则num是素数,退出循环*/elseflag=0;

printf("%d----->%d\n",num,flag);} 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中expr……continue;……假(0)真(非0)while真(非0)do……continue;…...expr假(0)whileexpr2……continue;…...假(0)真(非0)forexpr1expr3continue语句例5.7输出1~100之间不能被3或5或7整除的数,且每行输出5个#include<stdio.h>voidmain(){

int

num,n; n=0;

for(num=1;num<=100;num++) { if(num%3==0||num%5==0||num%7==0)continue;/*若num能被3、5、7中的任一个数整除,结束本次循环,继续下一个数的测试*/ n++;/*n为计数器变量,用于累计满足条件数的个数*/ printf("%10d",num); if(n%5==0)printf("\n");/*若每行输出5个数,则产生换行*/ }

printf("\n");}5.9

算法及其表示方法简介

一个程序应包括两个方面内容:对数据的描述。即在程序中要指定加工(运算)对象的数据类型和组织形式,也就是数据结构。数据结构实质上解决的是加工对象(数据)在内存中的物理结构(存储形式)与逻辑结构(组织形式),它属于复杂的研究课题。在高级语言中将这一复杂的课题转换为简单、易为人们所接受的形式,即数据类型。

对操作的描述。即解决问题的方法、步骤的描述,即算法。算法是设计程序进行问题求解的关键

数据:加工(运算)的对象;

算法(操作):对数据进行加工处理,以得到期望的结果。

程序设计:“数据结构”和“操作步骤(即算法)”是设计程序的关键。数据结构与算法相互影响:同一问题所设计的数据结构不同,可能会导致不同的算法,将对程序的执行效率产生深远影响。因此,著名计算机科学家沃思(NikiklausWirth)提出一个公式:

数据结构+算法=程序算法——设计程序的关键程序=算法+数据结构+程序设计方法+语言工具和环境算法:设计程序的关键,解决“做什么”和“怎么做”的问题。数据结构(数据类型):解决加工对象在内存的存储形式、组织形式;程序设计方法:以操作语句对算法进行具体描述的方法;

语言:描述算法的工具,编程需要采用合适的语言。5.9.1算法及其特性一个算法应该具有以下特点:(1)有穷性:一个算法应该包含有限的操作步骤,而不是无限的。如循环语句中必须有使循环趋于结束的语句,不能出现无限循环(2)确定性:算法中的每一个步骤都应当是确定的,而不应产生歧义(3)有零个或多个输入:一个算法在执行时需要从外部获取必要的信息,这个过程是通过输入实现的。一个算法也可以没有输入。(4)有一个或多个输出:算法的目的就是为了解决问题,“解”就是输出。算法的输出不一定就是计算机的屏幕输出或打印输出,算法得到的结果就是算法的输出。没有输出的算法是没有意义的。(5)有效性:算法中的每一个步骤都应当能有效的执行,并能得到确定的结果。例如,若a、b为实型数据类型,则a%b就不能有效执行。5.9.2

算法表示方法用自然语言描述用流程图表示算法用N-S流程图描述算法用程序设计语言实现算法流程图、N-S图描述算法求2000-2500年中的闰年流程图和N-S图非0y=y+1y>2500结束00非0非0非000y是闰年y%400==0y%4==0y%100!=0开始y=2000y不是闰年y是闰年y不是闰年Y不是闰年Y是闰年Y=2000

y%4==00非0直到y>2500y=y+1

y%100!=0非00y%400!=0

0非0算法:(1)能被4整除,但不能被100整除的年份。

(2)能被100整除,又能被400整除的年份5.9.3用程序设计语言实现算法例5.11

用C语言实现例5.9中求闰年的算法。#include<stdio.h>voidmain(){

inty;y=2000;do{if(y%4==0)if(y%100!=0)

printf("%d

是闰年!\n",y);elseif(y%400==0)

printf("%d

是闰年!\n",y);elseprintf("%d

非闰年!\n",y);elseprintf("%d

非闰年!\n",y);y=y+1;}while(y<=2500);}非0y=y+1y>2500结束00非0非0非000y是闰年y%400==0y%4==0y%100!=0开始y=2000y不是闰年5.10

循环算法的设计与实现

穷举算法

对求解问题的所有可能性的解,逐个用解的条件进行测试,若一组解满足测试条件,就找到一组答案。重复该过程,直到所有的可能性测试完毕。穷举算法也称“试凑法”。迭代算法

由已知解(初值),依据递推规律,不断得到新解的过程。迭代算法涉及到两个关键要素:迭代初值和迭代公式(规律)。例5.13找100以内的素数。#include<stdio.h>#include<math.h>voidmain(){

int

i,j,isprime,n=0;

for(i=3;i<100;i+=2)/*由于偶数不可能是素数,所以从3开始,每步长加2*/ {

isprime=1;/*isprime为标志变量,先假定i为素数*/

for(j=2;j<i;j++)/*本循环用于穷举j是否为i的因子,穷举范围:2~i-1*/

if(i%j==0)/*如果j是i的因子,将标志变量置零,说明i不是素数*/ {

isprime=0; break;}

温馨提示

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

评论

0/150

提交评论