第5章 循环结构程序设计(第7,8,9次课)_第1页
第5章 循环结构程序设计(第7,8,9次课)_第2页
第5章 循环结构程序设计(第7,8,9次课)_第3页
第5章 循环结构程序设计(第7,8,9次课)_第4页
第5章 循环结构程序设计(第7,8,9次课)_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

第5章循环结构程序设计5.1为什么需要循环控制5.2用while语句实现循环5.3用do…while语句实现循环5.4用for语句实现循环5.5循环的嵌套5.6几种循环的比较5.7break语句和continue语句5.8程序举例【例】

求1+2+3+4+5。最直观的方法:步骤1:先求1+2,得到结果3。步骤2:将步骤1得到的和3加上3,得到结果6。步骤3:将6再加上4,得10。步骤4:将10再加上5,得15。——简单算法举例这样的算法虽然正确,但太繁,数目太大时也不现实,无法用程序实现。5.1概述【观察】

求1+2+3+4+5。被加数加数初始值:1以后:上一次的和初始值:有规律地递增,即+12以后:规律:pip=p+i;i++;【例】

求1+2+3+4+5S1:使p=1S2:使i=2S3:

使p+i,和仍然放在在变量p中,即:p=p+iS4:

使i的值+1,即i=i+1或i++S5:

判断i≤5,若成立,返回重新执行步骤S3以及其后的S4和S5(循环操作);若不成立,算法结束。此时的p值为值。改进的方法:5.2用while语句实现循环一般形式:while(表达式){

循环体语句组;

}执行流程:表达式循环体语句组假(0)真(非0)#include<stdio.h>intmain(){int

i,s;i=1;s=0;

while(i<=5){s=s+i;i++;}

printf("result=%d",s);return0;}【例】用while结构实现求1+2+3+4+5/*循环变量初始化值*//*循环条件*//*循环体语句组*/#include<stdio.h>intmain(){int

i,p;i=2;p=1;

while(i<=5)

{p=p*i;i=i+1;}

printf("result=%d",p);return0;}【练习】仿照上例写出求1×2×…5的值马上巩固例5.1

用while循环求1~100的和练习一下例5.1

用while循环求1~100的和#include<stdio.h>intmain(){

int

i,sum;

printf("sum=%d,i=%d\n",sum,i);return0;}程序运行结果:sum=,i=sum=0;i=;

while(){sum+=i;i++;}1i<=100sum=5050,i=101思考:(1)循环次数?(2)若i=0,会不会影响最后的运行结果?100次不会求阶乘n!求1~n的累加和求p=1×2×3×4×……×n(n≤10)即:s=1+2+3+4+……+n初始值:p=1;i=1;s=s+i;i++;p=p*i;i++;初始值:s=0;i=1;思考即:s=1+3+5+……+n求1~n的奇数累加和s=s+i;i=i+2;s=0;i=1;初始值:思考即:s=2+4+6+……+n求1~n的偶数累加和s=s+i;i=i+2;s=0;i=2;初始值:思考求1~n的阶乘的和即:s=1!+2!+…n!(1)做法1:s=1!+2!+…n!=1!+1!*2+2!*3+…(n-1)!*n初始值:s=0;i=1;每一项=上一项*i(i=2~n)#include<stdio.h>voidmain(){

inti=1,s=0,p=1;

while(i<=5)//求1!+2!+3!+4!+5!{}

printf("sum=%d,i=%d\n",sum,i);}p=p*i;s=s+p;i++;思考求1~n的阶乘的和即:s=1!+2!+…n!(1)做法2:——双重循环s=1!+2!+…n!=1!+1!*2+2!*3+…(n-1)!*n初始值:s=0;i=1;每一项=上一项*i(i=2~n)#include<stdio.h>voidmain(){

inti=1,s=0,p,j;

while(i<=5)//求1!+2!+3!+4!+5!{j=1;p=1;

while(j<=i)//求i!{p=p*j;j++;}s=s+p;}

printf("sum=%d,i=%d\n",sum,i);}j=1;p=1;

while(j<=i){p=p*j;j++;}#include<stdio.h>voidmain(){

inti=1,s=0,p,j;

while(i<=5)//求1!+2!+3!+4!+5!{j=1;p=1;

while(j<=i)//求i!{p=p*j;j++;}s=s+p;i++;}

printf("sum=%d,i=%d\n",sum,i);}5.3用do…while语句实现循环一般形式:do{

循环体语句组;

}while(表达式);

执行流程:循环体语句组;表达式假(0)真(非0)有分号例5.2

用do…while循环求1~100的和#include<stdio.h>voidmain(){

int

i,sum;i=1;sum=0;

do{sum=sum+i;i++;}while(i<=100)

printf("sum=%d,i=%d",sum,i);}程序运行结果:sum=,i=;sum=5050,i=101例

用do…while循环求1~5的乘积练习一下【例】用do…while结构实现求1×2×3×4×5/*循环变量初始化值*/#include<stdio.h>voidmain(){int

i,p;i=2;p=1;

while(i<=5)

{p=p*i;i=i+1;}

printf("result=%d",p);}//while结构/*循环条件*//*循环体语句组*/#include<stdio.h>voidmain(){int

i,p;i=2;p=1;

do{p=p*i;i=i+1;}while(i<=5)

printf("result=%d",p);}//do…while结构;while和do~while比较#include<stdio.h>voidmain(){inti,sum=0;

i=1;

do{sum+=i; i++;}while(i<=100);

printf("%d",sum);}#include<stdio.h>voidmain(){int

i,sum=0;

i=1;

while(i<=100){sum+=i; i++;}

printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;

scanf("%d",&i);

do{sum+=i; i++;}while(i<=10);

printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;

scanf("%d",&i);

while(i<=10){sum+=i; i++;}

printf("%d",sum);}继续比较转下页两个程序先后两次分别输入1和11,查看结果。第一次运行:1↙再运行一次:11↙sum=55sum=11第一次运行:1↙再运行一次:11↙sum=55sum=0While结构运行情况:do~while结构运行情况:上一页结论:while和do…while结构何时相同?何时不同?P119

循环结构的三个基本要素循环变量初始化,如:i=1;s=0;循环条件,如:i<=100循环趋向结束语句,如:i++;一般形式:5.4用for语句实现循环for(expr1;expr2;expr3){

循环体语句组;

}//endoffor假(0)expr2循环体语句组;真(非0)expr1expr3expr1:在循环体外先执行(作用:循环变量赋初值,只执行1次)expr2:作为循环条件表达式expr3:作为整个循环过程的最后一条语句自动运行。(作用:修改循环变量的值)执行流程:for(expr1;expr2;expr3){

循环体语句组;

}图6-6while(){

循环体语句;

}for(expr1;

expr2;expr3){

循环体语句;

}do{

循环体语句;

}while();expr1;expr2expr3;expr1;expr2expr3;#include<stdio.h>voidmain(){inti,sum=0;i=1;

while(i<=100){sum+=i; i++;}

printf("%d",sum);}已知用while结构求“1~100的和”请改为for结构实现tostudent#include<stdio.h>voidmain(){int

i,s=0;

printf("%d\n",s);}#include<stdio.h>voidmain(){int

i,s=0;i=1;

while(i<=100){s+=i; i++;}

printf("%d\n",s);}对比用while结构和for结构求“1~100的和”for(;;){}i=1i<=100i++s+=i;#include<stdio.h>voidmain(){int

i,s=0;

printf("%d\n",s);}#include<stdio.h>voidmain(){int

i,s=0;i=1;

while(i<=100){s+=i; i++;}

printf("%d\n",s);}对比用while结构和for结构求“1~100的和”for(;;)

i=1i<=100i++s+=i;练习:for循环求表达式的值f=1+1/3+1/5+…1/9tostudent练习:for循环求表达式的值f=1+1/3+1/5+…1/9#include<stdio.h>voidmain()//for循环{inti;floatf=0;

for(;;);

printf("%f\n",f);}i=1i<=9i=i+2f=f+1.0/i练习:用for循环在屏幕上输出显示一行星号。**********...*通过调试判断:一行屏幕可以输出多少个星号*?tostudent关于for循环的说明:P121(1)expr1可以省略,但是其后的分号不能省略。如:for(i=1;i<=100;i++)sum+=i;i=1;for(;i<=100;i++)sum+=i;等价于关于for循环的说明:(2)若expr2省略,会导致死循环。如:for(i=1;;i++)sum+=i;等价于i=1;while(1){sum+=i;i++;}所以,从功能上讲:expr2不能省略(3)expr3可以省略,但是其前的分号不能省略。如:for(i=1;i<=100;){sum+=i;

i++;}关于for循环的说明:for(i=1;i<=100;i++)sum+=i;等价于(4)

可以同时省略expr1和expr3。如:求1~100的和i=1;for(;i<=100;){sum+=i;

i++;}关于for循环的说明:for(i=1;i<=100;i++)sum+=i;等价于(4)

可以同时省略expr1,expr2和expr3。如:while(1)printf(“%d\n”,i);关于for循环的说明:for(;;)

printf(“%d\n”,i);等价于(5)expr1,expr2,expr3也可以包含其他功能的表达式。关于for循环的说明://求1~100的和s=0;for(i=1;i<=100;i++)s=s+i;//求1~100的和for(s=0,i=1;i<=100;s=s+i,i++);(6)expr1和expr3可以是一个简单的表达式,也可以是逗号表达式。(7)

C99允许在for语句的expr1中定义变量并赋初值。关于for循环的说明://求1~100的和s=0;for(inti=1;i<=100;i++)s=s+i;expr2一般是循环条件表达式,也可以包含其他功能的表达式。#include<stdio.h>voidmain(){char

ch;

printf("输入一串字符,回车键结束:");

ch=getchar();

for(;ch!='\n';){printf("%c\n",ch);

ch=getchar();}}在获取值的同时进行判断for(;(ch=getchar())!='\n';)

printf("%c\n",ch);while的循环条件中也可以包含其他表达式#include<stdio.h>voidmain(){char

ch;

printf("输入一串字符,回车键结束:");

for(;(ch=getchar())!='\n';)

printf("%c\n",ch);}在获取值的同时进行判断while((ch=getchar())!='\n')#include<stdio.h>//4.6——elseif结构voidmain(){floatscore;

printf("输入学生成绩:");

scanf("%f",&score);while(score>100||score<0){printf("输入有误,重新输入:");

scanf("%f",&score);}

if(score>=90)printf("A\n");

elseif(score>=80)printf("B\n");

elseif(score>=70)printf("C\n");

elseif(score>=60)printf("D\n");

elseprintf("E\n");}#include<stdio.h>//5.6——elseif结构voidmain(){floatscore;

printf("输入学生成绩:");

while(scanf("%f",&score),score>100||score<0)

printf("输入有误,重新输入:");

if(score>=90)printf("A\n");

elseif(score>=80)printf("B\n");

elseif(score>=70)printf("C\n");

elseif(score>=60)printf("D\n");

elseprintf("E\n");}while(){

循环体语句;

}for(expr1;

expr2;expr3){

循环体语句;

}do{

循环体语句;

}while();expr1;expr2expr3;expr1;expr2expr3;三种循环结构三要素:循环变量初始化;循环条件;循环变量修改语句;程序填空:用for循环求“1~100的和”#include<stdio.h>voidmain(){int

i,sum;

for(;i<=100;i++)

sum+=i;

printf("%d\n",sum);}sum=0i=1,——for循环格式的灵活运用#include<stdio.h>voidmain(){

int

i,sum;

for(sum=0,i=1;i<=100;)

printf("%d\n",sum);}程序填空:用for循环求“1~100的和”;屏幕输出结果:sum+=i,i++——for循环格式的灵活运用#include<stdio.h>voidmain(){

int

i,sum;

for(sum=0,i=1;i<=100;)

printf("%d\n",sum);}i++程序填空:用for循环求“1~100的和”;sum+=i,

屏幕输出结果:——for循环格式的灵活运用5.5循环的嵌套定义:一个循环体内又包含另一个完整的循环结构。一般形式:…while(条件表达式){

循环体语句组;

}……do{

循环体语句组;

}while(条件表达式);…外层内层…for(expr1;expr2;expr3){

循环体语句组;

}……while(条件表达式){

循环体语句组;

}…执行过程:执行一次外层循环时:内层循环要执行到条件不满足时(内层循环是多个小循环,外层循环是一个大循环)基本原则:1、外层循环的“变量初始化”在外层循环之前;2、内层循环的“变量初始化”在外层循环之内(适当位置)——内层循环之前;内层循环可以尽量使用for结构外层:for循环内层:while循环用双重循环编程实现:求1~10的阶乘和。#include<stdio.h>voidmain(){int

i,j;longs,p;//s存放和值,p存放阶乘

//i外层循环变量,j内层循环变量

for(s=0,i=1;i<=10;i++)

{

j=1;p=1;

while(j<=i){p=p*j;j++;}

s=s+p;

}

printf("result=%ld",s);}tostudent#include<stdio.h>voidmain(){int

i,j;longs,p;//s存放和值,p存放阶乘

//i外层循环变量,j内层循环变量

for(s=0,i=1;i<=10;i++)

{

for(j=1,p=1;j<=i;j++)p=p*j;

s=s+p;

}

printf("result=%ld",s);}tostudent练习:输出以下内容用双重循环输出10行星号,每行20个星号****************************************......********************tostudent#include<stdio.h>voidmain(){

int

i,j;//i外层循环控制行数;j内层循环控制个数

for(;;)for(;;)

printf("*");

}//外层i循环结束}//该语句的位置i=1i<=10i++j=1j<=20j++printf("\n");——外层循环{练习:输出以下内容***************tostudent#include<stdio.h>voidmain(){

int

i,j;//i外层循环控制行数;j内层循环控制个数

for(;;)

{

for(;;)

printf("*");

}//外层i循环结束}//该语句的位置i=1i<=5i++j=1j<=ij++printf("\n");——外层循环练习:百钱买百鸡问题。百钱百鸡问题中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?假设:鸡翁:cocks鸡母:hens鸡雏:chicks0~20=100-cocks-hens0~33#include<stdio.h>voidmain(){int

cocks,hens,chicks;

for(cocks=0;cocks<=20;cocks++)

for(hens=0;hens<=33;hens++){chicks=100-cocks-hens;

if(5.0*cocks+3.0*hens+chicks/3.0==100.0)

printf("%d%d%d\n",cocks,hens,chicks);}}进入下一个环节的学习break;continue;5.7

break语句和continue语句作用:从循环体内跳出循环体外,强制性提前结束循环。break语句一般形式:break;特点:①通常与if语句搭配使用;②只能用于循环结构和switch结构。不能用于其他语句中while(循环条件表达式){……

if(表达式x)

break;

……}break执行示意for(表达式1;表达式2;表达式3){……

if(表达式x)

break;

……}作用:提前结束本次循环,再判断<循环条件表达式>是否成立。continue语句一般形式:continue;特点:①通常与if语句搭配使用;②与break的区别:不是终止整个循环的执行,只是提前结束本次循环;while(循环条件表达式){……

if(表达式y)

continue;

……}continue执行示意for(表达式1;表达式2;表达式3){……

if(表达式y)

continue;

……}m%i输入一个任意整数m,判断m是否素数#include<stdio.h>voidmain(){int

m,i;

printf("输入一个任意整数:");scanf("%d",&m);

if()printf("%disaprimenumber\n",m);

else

printf("%disnotaprimenumber\n",m);}for(i=2;i<=m-1;i++)i>m-1

if(m%i==0)break;for循环结束有两种可能:(1)i>m-1(2)m%i==0(i<=m-1)输入一个任意整数m,判断m是否素数#include<stdio.h>voidmain(){int

m,i;

printf("输入一个任意整数:");scanf("%d",&m);

if()printf("%disaprimenumber\n",m);

else

printf("%disnotaprimenumber\n",m);}for(i=2;i<=sqrt(m);i++)

if(m%i==0)break;i>sqrt(m)#include<math.h>break举例(例5.6)输入一个任意整数m,判断m是否素数#include<stdio.h>voidmain(){int

m,i;

printf("输入一个任意整数:");scanf("%d",&m);

if()printf("%disaprimenumber\n",m);

else

printf("%disnotaprimenumber\n",m);}for(i=2;i<=sqrt(m);i++)

if(m%i!=0)i>sqrt(m)#include<math.h>break;continue;{}本节内容:break语句和continue语句双重循环学习与循环有关的算法掌握循环程序的编写和应用5.8

循环程序举例例5.7

求的近似值:#include<stdio.h>#include<math.h>voidmain(){ints;

//s代表每项的符号

float

n,t,pi;//t:每一项的值;pi累加;n每项分母

t=1;pi=0;n=1.0;s=1;

while(fabs(t)>1e-6){pi=pi+t;n=n+2;//求下一项的分母

s=-s;//求下一项的符号

t=s/n;}//求下一项pi=pi*4;printf("pi=%10.6f\n",pi);}/4=1-1/3+1/5-1/7+……直到某一项的绝对值小于10-6为止。例5.8

求Fibonacci数列的前40个数。该数列有如下特点:第1、2两个数为1、1。从第3个数开始,该数是其前面两个数之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n>=3)古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月兔子总数为多少对?#include<stdio.h>voidmain(){long

intf1,f2,f3;//f1和f2存放数列两项的值

inti;//i是循环控制变量

f1=1;f2=1;printf("%12ld%12ld",f1,f2);

for(i=1;i<=40;i++){f3=f1+f2;printf("%12ld",f3);f1=f2;f2=f3;}}另解#include<stdio.h>voidmain(){long

intf1,f2;//f1和f2存放数列两项的值

inti;//i是循环控制变量

f1=1;f2=1;

for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);

if(i%2==0)printf("\n");//每行输出4项

f1=f1+f2;f2=f2+f1;}}例5.9求100~200之间的所有素数。#include<stdio.h>#include<math.h>voidmain(){int

m,k,i,n=0;

//n是计数器;m和i分别是外、内层循环控制变量

for(m=101;m<=200;m=m+2){k=sqrt(m);

for(i=2;i<=k;i++)//for循环—判定当前m是否素数

if(m%i==0)break;

if(i>=k+1){printf("%d",m); n=n+1;if(n%10==0)printf("\n");}//换行

}printf("\n");}例5.10

译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,本题按以下规律将电文变成密码:(1)将字母A变成字母E,a变成e,即:变成其后的第4个字母;(2)W变成A,X变成B,Y变成C,Z变成D;(3)w变成a,x变成b,y变成c,z变成d;(4)电文中若出现非字母字符则不变。假设:c=getchar();if((c>='a'&&c<='v')||(c>='A'&&c<='V'))c=c+4;if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))c=c-22;putchar(c);#include<stdio.h>voidmain(){charc;

while((c=getchar())!='\n')

//循环输入一串字符,回车符结束

{if((c>='a'&&c<='v')||(c>='A'&&c<='V'))c=c+4;

if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))c=c-22;

printf("%c",c);//或putchar(c);}

printf("\n");}#include<stdio.h>voidmain(){charc;

while((c=getchar())!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c+4;

if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;}

printf("%c",c);}

printf("\n");}c<='Z'+4why?

温馨提示

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

评论

0/150

提交评论