第六章循环结构_第1页
第六章循环结构_第2页
第六章循环结构_第3页
第六章循环结构_第4页
第六章循环结构_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

第六章循环结构第一页,共四十八页,编辑于2023年,星期五6.1概述在实际问题中,我们常常遇到需要重复处理的工作例如:求1—100的和,或求一个班英语成绩的平均分一般来说循环控制方法分两种:(1)条件循环(while循环和do–while循环)

条件满足时执行循环,条件不满足时结束循环(2)计数循环(for循环)

先确定循环次数,然后执行循环,完成循环次数后结束第二页,共四十八页,编辑于2023年,星期五6.3while语句2.执行过程:(先判断后执行)先计算表达式的值,

值为真(非零)时执行循环体,

值为假时结束循环格式:while(表达式)

循环体语句3.注意:(1)表达式必须用()括起来(2)循环体语句为多条语句时,必须用{}把它们括起来(3)循环体语句中必须有使循环趋向结束的语句

A当P成立AP成立不成立第三页,共四十八页,编辑于2023年,星期五例:在屏幕上打印7行星花

(此问题是简单重复7次格式输出操作)main({inti;i=1;

whlie(i<=7){printf(“\n********”);i++;}}运行结果为:********************************************************第四页,共四十八页,编辑于2023年,星期五例:求1—100的和1+2+3+…+99+100=∑i(1<=i<=100)#include<stdio.h>voidmain(){inti,sum;sum=0;i=1;

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

i++;}printf(“sum=%d\n”,sum);}分析:需要几个变量?

输入,输出分别是什么?

程序大体可分为几个步骤?sum=0i=1i<=100?sum=sum+ii=i+1输出sum的值第五页,共四十八页,编辑于2023年,星期五例:求1—n的和,n为任意正整数∑i(1<=i<=n)sum=0i=1i<=n?sum=sum+ii=i+1输出sum的值输入n#include<stdio.h>voidmain(){inti,sum,n;sum=0;i=1;

scanf(“%d”,&n);

while(i<=n){sum=sum+i;

i++;}printf(“sum=%d\n”,sum);}第六页,共四十八页,编辑于2023年,星期五例:计算x=1+3+5+7+9…+n#include<stdio.h>main(){ints;intn,i,x;scanf(“%d”,&n);i=1;x=0;while(i<=n){x=x+i;i=i+2;}printf(“x=%d\n”,x);}分析:题目是累加求和,只不过其累加项为等差递增的奇数序列。第七页,共四十八页,编辑于2023年,星期五例:求某个班英语成绩的平均分,该班学生人数和每个学生的成绩由键盘输入sum=0i=1i<=n?sum=sum+si=i+1输出ave的值输入n(n表示学生人数)输入s(s表示成绩)ave=sum/n#include<stdio.h>voidmain(){inti,n;

floats,sum,ave;

sum=0;i=1;scanf(“%d”,&n);while(i<=n){scanf(“%f”,&s);sum=sum+s;i++;}

ave=sum/n;

printf(“ave=%6.2f\n”,ave);}思路:先求所有学生的总成绩,再除以学生个数n,得学生的平均成绩。第八页,共四十八页,编辑于2023年,星期五例:计算x=1+1/3+1/5+1/7+1/9…当相加项的绝对值小于0.000001(即10–6)时停止计算#include<stdio.h>main(){ints;floatn,t,x;n=1;t=1;x=0;while(t>=1e-6){x=x+t;n=n+2;t=1/n;}printf(“x=%10.6f\n”,x);}分析:题目仍可以看成是累加求和,只不过其累加项为分母等差递增的分数。第九页,共四十八页,编辑于2023年,星期五例:编程求π的近似值,公式π/4≈1-1/3+1/5-1/7+1/9-…分析:题目仍可以看成是累加求和不同的是,相加的每一项正负相间,公式是无穷的,所以我们规定当相加项的绝对值小于0.000001(即10–6)时停止计算#include<stdio.h>#include<math.h>voidmain(){ints;floatn,t,pi;s=1;n=1;t=1;pi=0;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}

pi=4*pi;

printf(“pi=%10.6f\n”,pi);}tpins11-13-1/31010.671/551第十页,共四十八页,编辑于2023年,星期五6.4do-while语句不成立AP成立

当P成立

A1.格式:do

循环体语句

while(表达式);2.执行过程:(先执行后判断)先执行循环体,然后计算表达式的值,若值为真则重复执行循环体,若值为假则结束循环3.注意:(1)表达式必须用()括起来(2)循环体语句为多条语句时,必须用{}把它们括起来(3)循环体语句中必须有使循环趋向结束的语句第十一页,共四十八页,编辑于2023年,星期五例:求1—100的和#include<stdio.h>voidmain(){inti,sum;sum=0;i=1;

do{sum=sum+i;i++;}while(i<=100);printf(“sum=%d\n”,sum);}sum=0i=1i<=100?sum=sum+ii=i+1输出sum的值第十二页,共四十八页,编辑于2023年,星期五4.while循环和do-while循环的比较

whiledo-while(1)先判断条件再执行循环体先执行循环体再判断条件(2)循环体可能一次也不执行至少执行一次循环体#include<stdio.h>voidmian(){int

sum=0,i;

scanf(“%d”,&i);

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

printf(”%d\n”,sum);}#include<stdio.h>voidmian(){int

sum=0,i;

scanf(“%d”,&i);

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

printf(”%d\n”,sum);}若输入的i小于等于10,则两种循环的次数和结果一样。若输入的i大于10,则第一种情况一次循环也不执行,但是第二种情况会执行一次循环。第十三页,共四十八页,编辑于2023年,星期五6.5for语句1.格式:for(表达式1;表达式2;表达式3)循环体语句2.执行过程:(1)计算表达式1(2)计算表达式2,若值为真则执行循环体,

再执行第(3)步;若值为假则结束循环

(3)计算表达式3,再重复执行第(2)步sum=0;i=1;while(i<=100){sum=sum+i;

i++;}sum=0;for(

i=1;i<=100;i++)

sum=sum+i;例:将1—100求和的while循环转换为用for循环实现第十四页,共四十八页,编辑于2023年,星期五3.说明(1)可以省略表达式1

sum=0;

for(i=1;i<=100;i++)sum=sum+i;i=1;(2)可以省略表达式3

sum=0;for(i=1;i<=100;i++)sum=sum+i;i++;{}(3)同时省略表达式1和表达式3sum=0;

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

{sum=sum+i;

i++;

}第十五页,共四十八页,编辑于2023年,星期五(4)表达式1,表达式3还可以是逗号表达式

for(sum=0,i=1;i<=100;sum=sum+i,i++);(5)表达式1,表达式3可以是与循环控制无关的其他表达式

i=1;for(sum=0;i<=100;sum=sum+i)i++;空语句(6)表达式2一般不会省略,若省略表达式2循环将不能停止,产生死循环。sum=0;for(i=1;;i++)

sum=sum+i;sum=0;i=1;for(;;){sum=sum+i;

i++;}i=1;while(1){sum=sum+i;i++;}第十六页,共四十八页,编辑于2023年,星期五例:求某个班英语成绩的平均分#include<stdio.h>voidmain(){inti,n;floats,sum,ave;sum=0;

i=1;scanf(“%d”,&n);while(i<=n){scanf(“%d”,&s);sum=sum+s;

i++;

}ave=sum/n;printf(“%6.2f\n”,ave);}#include<stdio.h>voidmain(){inti,n;floats,sum,ave;sum=0;scanf(“%d”,&n);

for(i=1;i<=n;i++){scanf(“%d”,&s);sum=sum+s;}ave=sum/n;printf(“%6.2f\n”,ave);}第十七页,共四十八页,编辑于2023年,星期五例:设有一对新生的兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子?人们发现每月的兔子数形成如下数列:

1,1,2,3,5,8,13,21,34,……并称其为Fibonacci数列。观察一下Fibonacci数列可以发现这样一个规律:从第3个数开始,每一个数都是其前面两个相邻数之和。这是因为,在没有兔子死亡的情况下,每个月的兔子数由两部分组成:上个月的兔子数+这个月新生的兔子数。上个月的兔子数=其前一个数;这个月新生的兔子数=上上月的兔子数,即上上个数。因为上个月的兔子中还有一部分到这个月还不能生小兔子,只有上上月已有的兔子才能每对生一对小兔子。第十八页,共四十八页,编辑于2023年,星期五上面问题的算法描述为:

fib1=fib2=1fibn=fibn-1+fibn-2 (n>=3) 迭代公式用C语言来描述为:

fib1=fib2=1;/*初始化fib1,fib2的值*/

i=3;fib

=fib1+fib2

;/*当3<=i<=12时循环执行*/fib1=fib2

fib2=fib;i++;第十九页,共四十八页,编辑于2023年,星期五例:求Fibonacci数列的前12个数

Fibonacci数列:1,1,2,3,5,8,13……#include<stdio.h>voidmain(){inti,f1,f2,f3;

f1=1;f2=1;printf(“%8d%8d”,f1,f2);

for(i=3;i<=12;i++){f3=f1+f2;f1=f2;f2=f3;printf(“%8d”,f3);if(i%4==0)putchar(‘\n’);}

}分析数列的规律:从第3个数开始,每个数是其前两个数之和f1f2f3112231235+第二十页,共四十八页,编辑于2023年,星期五6.6循环的嵌套1.循环的嵌套:一个循环体内包含另一个完整的循环结构2.按循环嵌套的层数分别称为二重循环,三重循环…3.C语言中while,do—while,for循环可以互相嵌套例:输出由*组成的如图所示的矩形************#include<stdio.h>voidmain(){printf(“***\n”);printf(“***\n”);printf(“***\n”);printf(“***\n”);}第二十一页,共四十八页,编辑于2023年,星期五#include<stdio.h>voidmain(){inti,j;i=1;while(i<=4){j=1;

while(j<=3){putchar(‘*’);j++;}putchar(‘\n’);i++;}}#include<stdio.h>voidmain(){inti,j;i=1;while(i<=4){for(j=1;j<=3;j++)putchar(‘*’);putchar(‘\n’);i++;}}注意:内外层循环的控制变量不能重名,

但并列循环的控制变量无此限制第二十二页,共四十八页,编辑于2023年,星期五#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=3;j++)putchar(‘*’);putchar(‘\n’);}}例:输出如图所示的直角三角形**********特点:第i行有i个星号(左对齐)#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=i;j++)putchar(‘*’);putchar(‘\n’);}}第二十三页,共四十八页,编辑于2023年,星期五例:输出如图所示的直角三角形**********特点:第i行有5-i个星号(左对齐)#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=5-i;j++)putchar(‘*’);putchar(‘\n’);}}第二十四页,共四十八页,编辑于2023年,星期五例:输出如图所示的直角三角形**********

特点:第i行有i个星号(右对齐)#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++){ for(j=1;j<=4-i;j++)putchar(‘’);

for(j=1;j<=i;j++)putchar(‘*’);putchar(‘\n’);}}第二十五页,共四十八页,编辑于2023年,星期五例:输出如图所示的直角三角形**********特点:第i行有5-i个星号(右对齐)#include<stdio.h>voidmain(){inti,j;for(i=1;i<=4;i++){ for(j=1;j<=i-1;j++)putchar(‘’);

for(j=1;j<=5-i;j++)putchar(‘*’);putchar(‘\n’);}}第二十六页,共四十八页,编辑于2023年,星期五例:输出如图所示的等腰三角形

特点:第i行有2*i-1个星号#include<stdio.h>voidmain(){inti,j,k;for(i=1;i<=4;i++){ for(j=1;j<=i-1;j++)putchar(‘’);

for(k=1;k<=5-i;k++)putchar(‘*’);putchar(‘\n’);}}****************第二十七页,共四十八页,编辑于2023年,星期五例:输出如图所示的菱形

*************************分析:将图形分为上下两个部分分别输出上半部分(前4行)每行的星号个数是1,3,5,7,每行的空格个数是3,2,1,0下半部分(后四行))每行的星号个数是5,3,1每行的空格个数是1,2,3#include<stdio.h>voidmain(){inti,j,k;for(i=1;i<=4;i++){for(j=1;j<=4-i;j++)putchar(‘’);

for(k=1;k<=2*i-1;k++)putchar(‘*’);putchar(‘\n’);}for(i=3;i>=1;i--){for(j=1;j<=4-i;j++)putchar(‘’);

for(k=1;k<=2*i-1;k++)putchar(‘*’);putchar(‘\n’);}}第二十八页,共四十八页,编辑于2023年,星期五例:白钱买白鸡一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱。问一百钱买一百只鸡,其中公鸡、母鸡以及小鸡各多少只?定义变量公鸡为cocks,母鸡为hens,小鸡为chicks,有下面公式成立:cocks+hens+chicks=100;5*cocks+3*hens+chicks/3=100由于100只鸡共花去100钱,所以公鸡的个数不会超过19只,母鸡的个数不会超过33只,小鸡的个数不会超过100只。第二十九页,共四十八页,编辑于2023年,星期五main(){intcocks,hens,chicks;

cocks=0;while(cocks<=19){hens=0;while(hens<=33){chicks=100–cocks–hens;if(5.0*cocks+3.0*hens+chicks/3==100.0)printf(“%d%d%d\n”,cocks,hens,chicks);

hens++;}

cocks++;}}第三十页,共四十八页,编辑于2023年,星期五main(){intcocks,hens,chicks;for(cocks=0;cocks<=19;cocks++){for(hens=0;hens<=33;hens++){chicks=100–cocks–hens;if(5.0*cocks+3.0*hens+chicks/3==100.0)printf(“%d%d%d\n”,cocks,hens,chicks);}}}第三十一页,共四十八页,编辑于2023年,星期五例:判断一个数m是否为素数。解题思路:让m被2到√m之间的任一整数除,如果m能被2~√m之中的任何一个整数整除,则m不是素数,提前结束循环,此时i必然小于或等于√m;如果m不能被2~√m之间的任一整数整除,则完成最后一次循环,此时i=√m+1。在循环之后判别i的值是否大于或等于√m+1,若是,则表明未曾被2~√m之间的任一整数整除过,因此是素数,输出结果。例如m=17,让i=2开始,被m除,若能整除,则m一定不是素数;否则i加1,再被m除,若能整除,则m一定不是素数;否则再i加1,直到i=√17=4为止,若都不能被m整除,则m是素数,否则m不是素数。第三十二页,共四十八页,编辑于2023年,星期五#include<math.h>/*程序实现*/main(){intm,i,k;printf("\ninputanumber:");scanf("%d",&m);k=sqrt(m);

i=2;while((i<=k)&&(m%i!=0))i++;if(i>=k+1)printf("%disaprimenumber",m);elseprintf("%disnotaprimenumber",m);}第三十三页,共四十八页,编辑于2023年,星期五例:求100~200之间的全部素数。在上面例题的基础上,加一个for循环即可。#include<math.h>main(){intm,i,k,n=0;

for(m=100;m<=200;m++){k=sqrt(m);i=2;while((i<=k)&&(m%i!=0)) i++;

第三十四页,共四十八页,编辑于2023年,星期五if(i>=k+1) {printf("%d",m); n++; } if(n%10==0)/*输出十个数换行*/ printf("\n");}}第三十五页,共四十八页,编辑于2023年,星期五6.8break语句和continue语句1.break语句:中止循环或switch结构2.continue语句:结束本次循环,然后再根据是否满足条件来决定是否执行下次循环P1真假语句1语句2P2真break;假P1真假语句1语句2P2真continue;假第三十六页,共四十八页,编辑于2023年,星期五for(r=1;r<=10;r++){s=3.14*r*r;if(s>100&&s<200)

break;printf(“s=%6.2f\n”,s);}

for(r=1;r<=10;r++){s=3.14*r*r;if(s>100&&s<200)

continue;printf(“s=%6.2f\n”,s);}s=3.14s=12.56s=28.26s=50.24s=78.50输出:s=3.14s=12.56s=28.26s=50.24s=78.50s=200.96s=254.34s=314.00输出:例:求半径r从1到10的圆的面积,但不显示面积值在100~200之间的数。第三十七页,共四十八页,编辑于2023年,星期五#include<math.h>/*循环中用break语句判断m是否是素数*/main(){intm,i,k;printf(“\ninputanumber:”);scanf(“%d”,&m);

k=sqrt(m);

for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)printf(“%disaprimenumber”,m);elseprintf(“%disnotaprimenumber”,m);}第三十八页,共四十八页,编辑于2023年,星期五作业:P120习题6.46.66.86.10思考题:1、若一头小母牛,从第四个年头开始每年生一头母牛。按此规律,第n年时总共有多少头母牛?2、有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大、中、小马各多少匹?第三十九页,共四十八页,编辑于2023年,星期五思考题1:人们发现每年牛的个数形成如下数列:1,1,1,2,3,4,6,9,13,19,28,42,……观察一下数列可以发现这样一个规律:从第4个数开始,每一个数都是其上个数和上上上个数之和。1+1=2;1+2=3;1+3=4;2+4=6;3+6=9;…….这是因为,在没有死亡的情况下,每年牛的个数由两部分组成:去年的牛数+今年新生的牛数。去年的牛数=其前一个数;今年新生的牛数=大前年的牛数,即上上上个数。因为去年的母牛中有一部分到今年还不能生小牛,只有大前年已有的牛才能生小牛。第四十页,共四十八页,编辑于2023年,星期五C语言描述为:n1=n2=n3=1;

从第四年开始重复执行下面语句:

n4=n3+n1;

今年的牛数=去年的牛数+大前年的牛数

n3=n4;n2=n3;n1=n2;1,1,1,2,3,4,6,9,13,19,28,42,……

n1n2n3n4

n1n2n3n4

n1n2n3n4

n1n2n3n4

n1n2n3n4

n1n2n3n4

n1n2n3n4i=4时,n4=n1+n3=1+1=2;i=5时,n4=n1+n3=1+2=3;i=6时,n4=n1+n3=1+3=4;i=7时,n4=n1+n3=2+4=6;……第四十一页,共四十八页,编辑于2023年,星期五

main()

{

intn1,n2,n3,n4,i,n;/*定义变量*/

n1=1;n2=1;n3=1;/*给变量赋初值*/

printf(“\ninputn”);/*显示提示语句*/

scanf(“%d”,&n);/*从键盘读入所求年数*/

printf(“%8d”,n1);/*将第一、二、三年的牛的

printf(“%8d”,n2);个数显示在屏幕上*/

printf("%8d",n3);

程序实现:第四十二页,共四十八页,编辑于2023年,星期五for(i=4;i<=n;i++)/*从第四年开始循环计算

{

n4=n1+n3;每年牛的个数*/

printf(“%8d”,n4);

if(i%4==0)/*四年为一行显示*/

printf(“\n”);

n3=n4;/*将n1,n2,n3的值改变*/

n2=n3;

n1=n2;

}

}第四十三页,共四十八

温馨提示

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

评论

0/150

提交评论