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

下载本文档

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

文档简介

第五章循环结构程序设计内容提要:概述构成循环的语句:while、do-while、for几种循环的比较循环的嵌套break语句和continue语句概述实现循环的语句:1.用while语句;当型循环—先判断再执行2.用do-while语句;直到型循环—先执行再判断3.用for语句。多功能while循环(实现当型循环)while语句的一般形式:

while(表达式)语句当表达式的值为真(非0)时,执行其中的内嵌语句(循环体),然后回过头来再判断表达式的值,如此重复;当表达式为假(0)时结束循环。如:s=0;k=1;while(k<=100)

{s=s+k;k++;}

(循环控制表达式、循环控制变量、循环体)

k=11<=100s=0+1 k=22<=100s=0+1+2 k=33<=100s=0+1+2+3

……k=100100<=100s=0+1+…+99+100k=101101<=100结束循环

s=0;k=1;while(k<=100)

{s=s+k;k++;}注意:若循环体包含一条以上的语句,应以复合语句形式出现;循环前,必须给循环控制变量赋初值;循环体中,必须有改变循环控制变量值的语句(使循环趋向结束的语句);循环体可以为空,如:while((c=getchar())!=‘A’);

等价于:c=getchar();while(c!=‘A’)c=getchar();例:计算S=分析:这是一个累加求和问题。

s=1+2+3s=0s=s+1s=s+2s=s+3s=s+k和的新值和的当前值求和项当前值用while语句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}注意:s、k的初值与位置。若交换这两句的位置,要实现同样功能怎么改?用while语句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}s=0k=1k=11<=3s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立用while语句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=1;while(k<=3){k++;

s=s+k;}printf(“s=%d”,s);}s=0k=11<=3k=2s=0+22<=3k=3s=0+2+33<=3k=4s=0+2+3+44<=3不成立用while语句的程序如下:#include<stdio.h>intmain(){intk,s;s=0;k=0;while(k<=3){k++;

s=s+k;}printf(“s=%d”,s);}s=0k=00<=3k=1s=0+11<=3k=2s=0+1+22<=3k=3s=0+1+2+33<=3k=4s=0+1+2+3+44<=3不成立例:读程序#include<stdio.h>intmain(){intk,s,n;printf(“entern:”);scanf(“%d”,&n);s=0;k=1;while(k<=n){s+=k;k++;}printf(“%d=%d\n”,n,s);}#include<stdio.h>intmain(){intk,t,n;printf(“entern:”);scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;k++;}printf(“%d!=%d\n”,n,t);}#include<stdio.h>intmain(){intk,t,n,s=0;printf(“entern:”);scanf(“%d”,&n);t=1;k=1;while(k<=n){t*=k;s+=t;k++;}printf(“s=%d\n”,s);}s=0k=1t=1n=3k=11<=3t=1*1s=0+1!k=22<=3t=1*2s=0+1!+2!k=33<=3t=1*2*3s=0+1!+2!+3!k=44<=3不成立【例】求100以内的奇数、偶数之和分析:偶数和s1=2+4+6+…+100

奇数和s2=1+3+5+…+99#include<stdio.h>intmain(){intk=1,s1=0,s2=0;

while(k<=100){if(k%2==0)s1+=k;elses2+=k;k++;}printf(“偶数和为%d,奇数和为%d\n”,s1,s2);}do-while循环do-while语句用来实现“直到型”循环,它的一般形式为:do语句

while(表达式);例:计算S=#include<stdio.h>intmain(){intk,s;s=0;k=1;

while(k<=3){s=s+k;k++;}printf(“s=%d”,s);}#include<stdio.h>intmain(){intk,s;s=0;k=1;do{s=s+k;k++;}while(k<=3);printf(“s=%d”,s);}先判断后做先做后判断例:计算S=#include<stdio.h>intmain(){intk,s;s=0;k=1;do{s=s+k;k++;}while(k<=3);printf(“s=%d”,s);}s=0k=1s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立for循环for循环的一般形式:for(表达式1;表达式2;表达式3)

语句

表达式1在进入循环之前求解(循环变量赋初值);表达式3是循环体的一部分。s=0;for(k=1;k<=3;k++)s=s+k;s=0k=1k=11<=3s=0+1k=22<=3s=0+1+2k=33<=3s=0+1+2+3k=44<=3不成立例:for循环的其他形式:

表达式1;1)表达式1可以移到for语句的前边2)表达式3可以移到内嵌语句中for(表达式1;表达式2;表达式3)

语句表达式1;for(;表达式2;){语句表达式3;}for(;表达式2;表达式3)

语句for循环的其他形式:

3)表达式2为空,值永远为真称为死循环for(表达式1;表达式2;表达式3)

语句表达式1;for(;;){语句表达式3;}for循环的其他形式:

for(表达式1;表达式2;表达式3)

语句表达式1;1)表达式1可以移到for语句的前边2)表达式3可以移到内嵌语句中{语句表达式3;}3)表达式2为空,值永远为真称为死循环说明:1、表达式1省略时,应在for前给循环变量赋初值如:s=0;k=1;for(;k<=3;k++)s=s+k;2、表达式2省略时,不判断循环条件,将成为“死循环”,需要在循环体中引入break语句以退出循环。3、表达式3省略时,循环体内应有使循环条件改变的语句。如:for(k=1;k<=3;){s=s+k;

k++;}4、同时省略表达式1和表达式3,只有表达式2,此时相当于while语句。如:

k=1;for(;k<=3;){s=s+k;k++;}5、表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值不等于0就执行循环体。如:s=0;for(k=1;k-4;k++)s=s+k;

仅当k的值等于4时终止循环,k-4是数值表达式。k=1;while(k<=3){s=s+k;k++;}如:s=0;for(k=1;k-4;k++)s=s+k;

仅当k的值等于4时终止循环,k-4是数值表达式。s=0k=11-4=-3s=0+1k=22-4=-2s=0+1+2k=33-4=-1s=0+1+2+3k=44-4=0结束例:读程序,判断程序的功能。#include<stdio.h>intmain(){charc;for(;(c=getchar())!=‘\n’;)putchar(c);putchar(‘\n’);}读入一个字符,当它不是回车符时就输出。注意:getchar()仅当遇到回车符时才开始执行,从键盘缓冲区中取字符。如:OK!输入

OK!输出

仅输出字母怎么做?而不是OOKK!!循环的嵌套一个循环体内包含着另一个完整的循环结构,称为循环嵌套;内嵌的循环中又可以嵌套循环,从而构成多重循环;三种循环可以互相嵌套。下面几种都是合法的形式:(1)while()(2)do(3)for(;;){…{…{

while()

do

for(;;){…}{…}{…}}while();}}while();

(4)while()(5)for(;;)(6)do{…{…{…

do{…}

while()for(;;){}while();{}

…}}}while();

例:打印图形分析:1)图形每行的起始位置相同2)每行的字符数相同3)用一重循环控制输出行数#include<stdio.h>intmain(){introw;for(row=1;row<=5;row++)

printf(“********\n”);}例:打印图形#include<stdio.h>intmain(){introw;for(row=1;row<=5;row++)

printf(“********\n”);}#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++)

{for(col=1;col<=8;col++)printf(“*”);printf(“\n”);}}循环嵌套的说明:1、嵌套的循环控制变量不能相同;2、内循环变化快,外循环变化慢如:for(i=1;i<=3;i++){for(j=1;j<=i;j++)printf(“%d+%d=%2d”,i,j,i+j);printf(“\n”);}3、正确确定循环体4、循环控制变量常与求解的问题挂钩for(i=1;i<=3;i++){for(j=1;j<=i;j++) printf(“%d+%d=%2d”,i,j,i+j);printf(“\n”);}i=1j=11<=11+1=2j=22<=1i=2j=11<=22+1=3j=22<=22+2=4j=33<=2i=3j=11<=33+1=4j=22<=33+2=5j=33<=33+3=6j=44<=31+1=22+1=32+2=43+1=43+2=53+3=6编程实现:按如下形式打印九九乘法口诀表

1*1=12*1=22*2=43*1=33*2=63*3=9……9*1=99*2=189*3=27…9*9=81for(i=1;i<=9;i++){for(j=1;j<=i;j++) printf(“%d*%d=%2d”,i,j,i*j);printf(“\n”);}例:打印图形分析:1)每行的起始位置不同,空格数递减12)每行的字符数相同3)用二重循环实现:外循环控制输出行数;内循环控制输出空格数第1行4个空格第2行3个空格第3行2个空格第4行1个空格第5行0个空格第row行5-row个空格例:打印图形#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“

”);printf(“********\n”);}}例:打印图形#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“

”);for(col=1;col<=8;col++)printf(“*”);printf(“\n”);}}例:试找出满足下列条件的所有两位数

1)其十位数不大于2

2)将个位与十位对换,得到的两位数是原两位数的两倍多分析:用二重循环的循环控制变量分别表示十位数和个位数。十位数i取值1~2

个位数j取值2~9n=10*i+jm=10*j+i

若m>=2*n并m<3*n,则n为满足条件的两位数。#include<stdio.h>intmain(){inti,j,n,m;for(i=1;i<=2;++i)for(j=2;j<=9;++j){n=10*i+j;m=10*j+i;if(m>=2*n&&m<3*n)printf(“%d”,n);}}i=1j=2n=12m=21j=3n=13m=31……j=9n=19m=91i=2j=2n=22m=22j=3n=23m=32……j=9n=29m=92#include<stdio.h>intmain(){inti,j,n,m,s=0;for(i=1;i<=2;++i)for(j=2;j<=9;++j){n=10*i+j;m=10*j+i;if(m>=2*n&&m<3*n){++s;printf(“%d”,n);

if(s%5==0)printf(“\n”);}}}i=1j=2n=12m=21j=3n=13m=31……j=9n=19m=91i=2j=2n=22m=22j=3n=23m=32……j=9n=29m=92几种循环的比较1、关于循环的控制2、循环体的执行先判断条件,循环体可能一次也不执行:

while(表达式)语句后判断条件,循环体至少执行一次:

do语句

while(表达式);3、for循环功能强两个界限不清,使程序设计较随意。

for(表达式1;表达式2;表达式3)语句4、都可以用break语句终止循环,用continue语句结束本次循环。break语句用break语句可以结束switch结构和三种循环。例:对所有输入的字符进行计数,直到输入的字符为换行符为止。intmain(){ charc;inti=0; while(1) {c=getchar(); if(c=='\n')break; i++;} printf("字符数为%d\n",i);}break语句用break语句可以结束switch结构和三种循环。例:判断m是否为素数。分析:素数是指除了1和它本身以外,不能被其他整数整除的数。i的取值范围可以缩小到2~k=因此,判断m是否为素数的算法是:1、依次用2~k之间的数整除m,如果找到某个整数i能整除m,则m必不是素数;2、如果找不到i,则可以断定m为素数。#include<stdio.h>#include<math.h>intmain(){intm,i,k;

scanf(″%d″,&m);k=sqrt(m);

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

if(m%i==0)break;/*结束循环*/

if(i>k)printf(“%d是素数\n″,m);

elseprintf(”%d是合数\n″,m);

}i初值能否为1?#include<stdio.h>#include<math.h>intmain(){intm,i,k,flag=1;

scanf(″%d″,&m);k=sqrt(m);

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

if(m%i==0){flag=0;break;}

if(flag)printf(“%d是素数\n″,m);

elseprintf(”%d是合数\n″,m);

}continue语句用continue语句可以结束本次循环,即忽略循环体中剩余的语句。例:把100~200之间的不能被3整除的数输出#include<stdio.h>

intmain()

{intn;

for(n=100;n<=200;n++)

{if(n%3==0)continue;

printf("%d″,n);

}

}本次循环结束,循环体的剩余语句被忽略,执行表达式3,进入下一循环,continue总是作if的内嵌语句if(n%3)printf(“%d”,n);例:用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于10-6为止。分析:pi---求和结果,其初值为0;n---求和项分母,初值为1,每次前进2;s---符号项,初值为1;t---求和项,值为s/n;|t|>=10-6---循环控制条件#include<stdio.h>#include<math.h>intmain(){ints;floatpi,n,t;pi=0;n=1;t=1;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=4*pi;printf(“π=%8.6f\n”,pi);}n改为整型如何?例:求Fibonacci数列前40个数,每行输出4个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)

分析:(1)f1、f2直接赋值;(2)进行20次循环,每次计算并输出两项;(3)f3=f1+f2,此后f1已无用,f3可存于f1,即用语句f1=f1+f2;f4=f2+f3,f3已在f1中,此后f2已无用,f4可存于f2,即用语句f2=f2+f1。(4)此数列增长很快,输出宜用长整型(%ld),每行输出4个数,即每输出4个数后输出一个换行符。#include<stdio.h>

intmain()

{longintf1,f2;

inti;

f1=1;f2=1;

for(i=1;i<=20;i++)

{printf(″%12ld%12ld″,f1,f2);

f1=f1+f2;

f2=f2+f1;}

}#include<stdio.h>

intmain()

{longintf1,f2;

inti;

f1=1;f2=1;

for(i=1;i<=20;i++)

{printf(″%12ld%12ld″,f1,f2);

if(i%2==0)printf(″\n″);

f1=f1+f2;

f2=f2+f1;}

}编程实现:打印输出以下图案***************#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=row;col++)printf(“*”);printf(“\n”);}}作业3:编程实现:打印输出以下图案(两个并列的内循环控制输出每行的空格数和字符数)#include<stdio.h>intmain(){introw,col;for(row=1;row<=5;row++){for(col=1;col<=5-row;col++)printf(“

”);for(col=1;col<=2*row-1;col++)printf(“*”);printf(“\n”);}}作业4:1、编程实现:统计全班某门功课期末考试的平均分和最高分。(设全班人数10人,10位同学的成绩都用变量score存储)2、编程实现:按如下形式打印九九乘法口诀表

1*1=12*1=22*2=43*1=33*2=63*3=9……9*1=99*2=189*3=27…9*9=81#include<stdio.h>intmain(){inti=1,a,max=0;while(i<=3){scanf(“%d”,&a);if(max<=a)max=a;i++;}printf(“最大值为%d”,max);}max0a90假设有三位同学成绩分别为90,85,9590859595#include<stdio.h>intmain(){inti=1,score,max=0;floatsum=0;while(i<=10){printf(“请输入第%d位同学的成绩:”,i);scanf(“%d”,&score);sum=sum+score;if(max<=score)max=score;i++;}printf(“平均分为%f,最高分为%d”,sum/10,max);}例:输入两个正整数m和n,求其最大公约数和最小公倍数。分析:1、用辗转相除法求最大公约数。

m对n求余数为a,若a≠0,则m<-n,n<-a,继续求余;否则n为最大公约数。如:m=12,n=212、最小公倍数=两个数的积/最大公约数#include<stdio.h>intmain(){intm,n,s=1,t=1,i,j;scanf("%d,%d",&m,&n);if(m<n){t=m;m=n;n=t;}for(i=1;i<=m;i++) if(m%i==0&&n%i==0)s=i;j=m;while(1){if(j%m==0&&j%n==0){t=j;break;}elsej++;}printf(“最大公约数s=%d,最小公倍数t=%d\n",s,t);}用while语句编写的程序如下:#include<stdio.h>intmain(){intm,n,m1,n1,a;printf(“输入两个正整数:\n”);scanf(“%d%d”,&m,&n);m1=m;n1=n;a=m1%n1;while(a!=0){m1=n1;n1=a;a=m1%n1;}printf(“最大公约数是%d\n”,n1);printf(“最小公倍数是%d\n”,m*n/n1);}m*n/n1注意循环变量赋初值,改变循环变量值。1.若i,j已定义为int型,则以下程序段中循环体的总的执行次数是

for(i=5;i;i--)for(j=0;j<4;j++){}A)20B)24C)25D)302.下面程序的运行结果是:

。#include<stdio.h>main(){intI;for(I=1;I<=5;I++)switch(I%5){case0:printf(“*”);break;case1:printf(“#”);break;default:printf(“\n”);case2:printf(“&”);break;}}A)#&&*B)#&C)#D)#&&&&*&*&*3.在下列程序中,while循环的循环次数是

。main(){ inti=0; while(i<10) { if(i<1)continue; if(i==5)break; i++; } ......}A)1B)10C)6D)死循环、不能确定次数2.程序段如下intk=-20;while(k=0)k=k+1;则

温馨提示

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

评论

0/150

提交评论