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

下载本文档

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

文档简介

C语言程序设计第五章循环结构4种循环语句whilefordo-while循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。gotogoto语句一般格式:goto语句标号

由if……goto构成循环例4-1:main(){intx=0,y=0;star:if(x<=3){y=x+1;x=x+1;gotostar;}printf(“%d”,y);}分析输出结果。一般形式:while(<表达式>)<语句>执行流程:while语句循环体:被重复执行的部分表达式循环体假(0)真(非0)while特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,可退出while循环条件表达式不成立(为零)循环体内遇break,return,gotowhile语句特点和说明while(<表达式>)<语句>例4-2:main(){intcount=1;while(count<5) { printf(”goodmorning!\n”); count++; }}goodmorning!goodmorning!goodmorning!goodmorning!#include<stdio.h>main(){intn=9;while(n>6){n--;printf(“%d”,n);}}876main(){intn=9;while(n>6) n--;printf(“%d\n”,n);}6例4-3:用while循环求sum=1+2+3+……+100

#include<stdio.h>main(){intsum=0;inti=1;while(i<=100){sum+=i;i++;}printf(“sum=%d",sum);}循环初值循环终值循环变量增值循环条件循环体如何求sum=1*2*3*……*100?【例5-13】猴子吃桃问题。猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉前一天剩下的一半零一个。到第10天早上再想吃时,就只剩一个桃子了。问第一天共摘了多少个桃子?迭代法设第n天为xn个,第n+1天为xn+1则:xn+1=xn/2-1可得递推公式:xn=(xn+1+1)*21≤n≤9x10=1n=10即:x10=1

x9=(x10+1)*2=4x8=(x9+1)*2=10

……x1=(x2+1)*2=1534算法分析:倒推#include<stdio.h>main(){intp2=1,p1;intn=9;while(n>0) { p1=2*(p2+1); p2=p1; n--; }printf(“thetotalis%d\n”,p1);}#include<stdio.h>main(){intn=0;longt=1;printf(“nn!\n”);while(n<8){n++;t*=n;printf("%d%ld\n",n,t);}}运行结果:nn!1122364245120672075040840320求n!(n=1~8)do-while语句一般形式:do<语句>while(<表达式>);执行流程:do循环体expr假(0)真(非0)while“;

”不能少expr循环体假(0)真(非0)循环体while循环特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构do~while语句特点和说明do<语句>while(<表达式>);main(){intx=3;do{printf(“%d”,x-=2); }while(x>=0);}1-1x=x-2;printf(“%d”,x);求1+2+3+……100#include<stdio.h>main(){intsum=0,i;i=1;

do{sum=sum+i;i++;}while(i<=100);printf(”sum=%d\n”,sum);}#include<stdio.h>main(){intsum=0;inti=1;

while(i<=100){sum=sum+i;i++;}printf(“sum=%d",sum);}main(){inti=1,s=0;

while(i<1)

{

s=s+i;

i=i+1;

}

printf("s=%d\n",s);

}s=0main(){inti=1,s=0;

do

{

s=s+i;

i=i+1;

}while(i<1);

printf("s=%d\n",s);}s=1do-while与while的区别一般形式:for([表达1];[表达式2];[表达式3])<语句>执行流程:expr2循环体假(0)真(非0)forexpr1expr3for语句一般应用形式:for(初始化表达式;条件表达式;修正表达式)<语句>说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省for语句可以转换成while结构表达式1;while(表达式2){<语句>表达式3;}for语句for([表达1];[表达式2];[表达式3])<语句>形式1:#include<stdio.h>main(){inti=0;

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

for(;i<10;i++)putchar(‘a’+i);}形式3:#include<stdio.h>main(){inti=0;

for(;i<10;)putchar(‘a’+(i++));}形式4:#include<stdio.h>main(){inti=0;

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

;}例:for语句形式的多样性main(){inti;for(i=0;i<10;i++) {i++;printf(“%d”,i);}}main(){inti;for(i=1;i<5;i++);printf(“%d”,i);}513579空语句求1+2+3+……100main(){intsum=0,i;for(i=1;i<=100;i++) sum=sum+i;printf(”sum=%d\n”,sum);}几种循环的比较………while(表达式)语句;

………do语句while(表达式);循环控制条件循环条件初始化循环修改条件也可在for前也可在循环体内for(表达式1;表达式2;表达式3)语句几种循环的比较123循环体的执行:先判断条件,循环体可能一次也不执行。while(表达式)语句;

后判断条件,循环体至少执行一次.do语句while(表达式);for循环功能强,两者界限不清,使用较随意。for(表达式1;表达式2;表达式3)语句界限不清……界限不清小结

循环控制有两种方法:计数法和标志法。

能确定循环次数时,采用计数法,用for语句比较清晰;

不能确定循环次数时,采用标志法,设法找出循环终止条件,用while或do-while语句来实现。

用while与do-while语句能实现的程序,用for语句未必可以实现。while语句是先判断后执行,do-while语句是先执行后判断。在循环体至少执行一次的情况下两者等价。#include<stdio.h>main(){inti,s;s=0;

i=1;while(i<=100){s=s+i;i++;}printf("s=%d\n",s);}计算s=1+2+3+…+100#include<stdio.h>main(){inti,s;s=0;

i=1;do{s=s+i;i++;}while(i<=100);printf("s=%d\n",s);}#include<stdio.h>main(){inti,s=0;for(i=1;i<=100;i++) s=s+i;printf("s=%d\n",s);}i=1;for(;i<=100;){s=s+i;i++;}main(){inti;for(i=1;i<5;i++);printf(“i=%d\n”,i);}main(){intx=3;do{printf(“%d\n”,x-=2);}while(x>=0);}去掉分号,结果是?例:求Fibonacci数列第40项。又叫兔子繁殖问题(Fibonacci提出的)

main()

{intn,m;longf1=1,f2=1,f3;printf(“%ld%ld”,f1,f2);for(m=3;m<=40;m++){f3=f1+f2;f1=f2;f2=f3;printf(“%d”,f3);}printf(“\n”);

}设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?迭代法算法分析:月:12345678

1--1—1—1—1—1—1--1

1

1--1

1—1--1

1

1—1—1--1

1

1--1

1—1—1—1—11

1--1

1—1—1

1兔:1123581321f1f21

1

f3=f1+f2

2f1f2

f3=f1+f2

3

f1f2

f3=f1+f2

5

f1f2f3=…初始条件终止条件迭代公式思考:f1=f2和f2=f3能否对换位置?不例:打印出所有的水仙花数。一个3位数,其各位数字的立方和等于它本身。分析:百位数i=m/100;十位数:j=m/10%10;个位数k=m%10;判断m==i^3+j^3+k^3main(){inti,j,k,m;for(m=100;m<1000;m++){

i=m/100; j=m/10%10;k=m%10;if(m==i*i*i+j*j*j+k*k*k) printf("%5d",m);}

}穷举法计数法统计从键盘输入一行字符的个数.main(){intcount=0;while(getchar()!='\n‘) count++;printf("%d",count);}标志法:循环终止条件main(){intx,max,i;scanf(“%d”,&x);max=x;for(i=2;i<=10;i++){scanf(“%d”,&x);if(x>max)max=x;}printf(“max=%d\n”,max);}依次输入10个数,找出最大数。分析:输入x1x1max输入x2若x2>max则x2max输入x3若x3>mx则x3max输入x4……打擂方式有一个分数序列2/1,3/2,5/3,8/5,21/13……求该数例前20项之和main(){intn,t;floata=2,b=1,s=0;for(n=1;n<=20;n++){s=s+a/b;

t=a;a=a+b;b=t;}printf("sumis%9.6f\n",s);}分析:每项用a/b表示,从第2项开始:每项的分子a是前一项的分子与分母之和,分母是前一项的分子。例题:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数#include"stdio.h"main(){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++;}printf("allinall:char=%dspace=%ddigit=%dothers=%d\n",letters,space,digit,others);}循环的嵌套:循环体本身包含循环语句三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环循环的嵌套for(i=1;i<5;i++){j=1;

while(j<4){printf(i=%d,j=%d\n",i,j);j++;}}

for(j=1;j<4:j++)printf((i=%d,j=%d\n",i,j);i=1,j=1i=1,j=2i=1,j=3i=2,j=1i=2,j=2i=2,j=3i=3,j=1i=3,j=2i=3,j=3i=4,j=1i=4,j=2i=4,j=3

形状

形状main()

{inti,j;

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

printf(“%4d”,i);

printf(“\n”);

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

printf(“%c”,‘-’);

printf(“\n”);

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

{for(j=1;j<=9;j++)

printf(“%4d”,i*j);

printf(“\n”);

}

}P71例12:打印九九乘法表

形状123456789

12

3456789

246

81012141618

36912

…打印表头

9个数字打印虚线打印表体……

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

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

printf(“%4d”,i*j);

printf(“\n”);

}打印表体for(i=1;i<=9;i++)

{for(j=0;j<=i-1;j++)

printf(“%4c”,‘’);

for(j=i;j<=9;j++)

printf(“%4d”,i*j);

printf(“\n”);

}打印表体打印空格例:百马百担有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担。问有大、中、小马各多少?算法分析:main()

{inta,b,c;

for(a=0;a<33;a++)

for(b=0;b<50;b++)

{c=100-a-b;

if(3*a+2*b+c/2.0==100)

{printf(“a=%d”,a);

printf(“b=%d”,b);

printf(“c=%d\n”,c);}

}

}设大、中、小马各为a、b、c,则:3a+2b+c/2=100a+b+c=100可得:

0≤a<330≤b<500≤c≤200穷举法若问有几种解决方法,则应如何修改程序?用变量k作为计数器,在if语句中增加“k++;”语句例:打印图形。12345678901****************算法分析:第1行:1个*,6个空格,换行第2行:3个*,4个空格,换行第3行:5个*,1个空格,换行第4行:7个*,0个空格,换行第i(1~4)行:2i-1个*,8-2i个空格,换行main(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=2*i-1;j++)printf(“*”);for(k=1;k<=8-2*i;k++)printf(“”);printf(“\n”);}}2i-1个*8-2i个空格换行补充举例:打印图形。1234567891011*************************算法分析:第1行:1个空格,5个*号,换行第2行:2个空格,5个*号,换行第3行:3个空格,5个*号,换行第4行:4个空格,5个*号,换行第5行:5个空格,5个*号,换行第i(1~5)行:i个空格,5个*号,换行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf(“”);for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}i个空格5个*号换行循环语句嵌套时,当外层循环变量取1个值时,内层循环变量要取遍所有值补充举例(续):打印图形。12345678901***************1234567890112233344445555512345678901***************算法分析:第1行:5个空格,1个*_,换行第2行:4个空格,2个*_,换行第3行:3个空格,3个*_,换行第4行:2个空格,4个*_,换行第5行:1个空格,5个*_,换行第i(1~5)行:6-i个空格,i个*_,换行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf(“”);for(j=1;j<=i;j++)printf(“*_”);printf(“\n”);}}6-i个空格i个*_换行算法分析:第1行:5个空格,1个1_,换行第2行:4个空格,2个2_,换行第3行:3个空格,3个3_,换行第4行:2个空格,4个4_,换行第5行:1个空格,5个5_,换行第i(1~5)行:6-i个空格,i个i_,换行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf(“”);for(j=1;j<=i;j++)printf(“%d_”,i);printf(“\n”);}}6-i个空格i个i_换行算法分析:第1行:1个空格,5个*_,换行第2行:2个空格,4个*_,换行第3行:3个空格,3个*_,换行第4行:4个空格,2个*_,换行第5行:5个空格,1个*_,换行第i(1~5)行:i个空格,6-i个*_,换行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf(“”);for(j=1;j<=6-i;j++)printf(“%d_”,i);printf(“\n”);}}i个空格6-i个*_换行流程控制语句流程

控制

语句选择结构

(条件语句)双分支结构多分支结构if()…else语句elseif语句

switch语句循环结构while()…语句

do…while()语句

for()…语句流程

转向

语句条件转向语句无条件

转向语句goto语句中止循环或switch语句:break

跳过其后语句返回循环开始:continue

函数返回语句:return()while(){……

break;

……}……break;while(){……

continue;

……}……continue;

……gotoer;

……er

……

……

……goto标号;几种控制语句判断一个正整数m>3是否为素数main(){intn,m;scanf("%d",&m);for(n=2;n<=m-1;n++)if(m%n==0)break;if(n>m-1)printf("the%disaprimer\n",m);elseprintf("the%disnotaprimer\n",m);}例:验证素数素数是除了1和它自身外,再也找不到能被它整除的数。即:若m不能被2到m-1中所有整数整除,则n为素数。已证明只要从2判断到m/2或即可。算法分析:求100~200间的全部素数?也可用m/2或sqrt(m)与break语句退出循环不同的是,continue语句只结束本次循环,忽略循环体中剩下

温馨提示

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

评论

0/150

提交评论