第4章循环语句和转移语句_第1页
第4章循环语句和转移语句_第2页
第4章循环语句和转移语句_第3页
第4章循环语句和转移语句_第4页
第4章循环语句和转移语句_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

循环语句和转移语句第

4章第4章循环语句和转移语句

4.1循环的概念

4.2for

循环

4.3while

循环

4.4dowhile

循环

4.5多重循环

4.6转移语句

4.7程序举例4.1循环的概念1.问题的提出编写下列程序∑i=1+2+3+4+5=?i=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6条赋值语句100?4.1循环的概念2.什么是循环用C语言编写下列程序∑s=1+2+3+4+5=?S=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6条赋值语句

循环思想:

有规律重复执行相同操作的过程称为循环;

实现这种循环操作的程序称为程序的循环结构。4.1循环的概念3.解决循环的关键用C语言编写下列程序∑s=1+2+3+4+5=?S=15S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;6条赋值语句确定循环的规律(循环条件、循环条件的修改)

确定重复的内容(算法)S=0;i=1;S=S+i;i++;4.1循环的概念3.解决循环的关键p=1;p=p*1;p=p*2;p=p*3;……;p=p*20;p=1i=1p*=ii++用C语言编写下列程序∏p=1*2*3*4*…20=?S=120其它问题如:1+1/2+1/3+……1/n1-1/3+1/5-……等4.1循环的概念4.循环的种类C语言可实现的循环:for

循环while

循环do~while

循环用goto

和if构成循环多重循环4.2for循环1.for语句的一般形式for([表达式1];[表达式2];[表达式3])

循环体;表达式2成立吗?求解表达式3真(非0)假(0)求解表达式1循环体语句执行流程注:

①表达式1用于循环控制变量赋初始值,它只能执行一次;②表达式2是循环条件;③表达式3用于对循环变量的修改,以使循环能够结束。2.for语句举例用for循环编写下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){inti,sum=0;

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

sum+=i;

printf("%d",sum);}i<=5?i←i+110i=1sum←sum+i打印sum的值循环体2.for语句举例用for循环编写下列程序

#include<stdio.h>voidmain(){inti,sum=0;

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

sum+=i;

printf("%d",sum);}i<=

100?i=i+110i=1sum=sum+i打印sum的值3.for语句说明①for语句的三个表达式都可以缺省,但两个分号不能缺省;②若在for语句之前已经对循环控制变量赋初值,则表达式1

可以缺省;例:i=1;for(;i<=5;i++)sum=sum+i;for(i=1;i<=5;i++)sum=sum+i;3.for语句说明③缺省表达式2,即不判断循环条件,循环将无终止的执行,即认为表达式2始终为真;为了结束循环,在循环体内用if和break控制循环结束。if(条件)break;for(i=1;;i++)sum=sum+i;for(i=1;1;i++)sum=sum+i;④可以把表达式3改为表达式语句移到循环体的尾部,作为循环体的一部分。for(i=1;i<=100;

)

{

sum=sum+i;

i++;

}⑤可以省略表达式1

和表达式3,即只给循环条件。如:i=1;for(;i<=100;){sum=sum+i;i++;}构成复合语句

简化为:

i=1;for(;i<=100;)sum=sum+i++;⑥如果循环体中没有任何语句,则应该加一个分号。例如:

s=0;

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

F1=1 (n=1) F2=1 (n=2)Fn=Fn-1+Fn-2(n>=3) 2=1+13=1+2 5=2+38=3+5 …在一次循环中计算两项,递推公式为:

F1=1F2=1(初值)

F1=F1+F2 F2=F2+F1例

求Fibonacci数列1,1,2,3,5,8的前16个数#include<stdio.h>voidmain()

{longintf1,f2;

int

i,n;

printf(“\nInputn:”);

scanf(“%d”,&n);f1=f2=1;

for(i=1;i<=n/2;i++){printf(“%d\t%d\n”,f1,f2);f1=f1+f2;f2=f2+f1;}

if(n%2)printf(“%d\n”,f1);}Inputn:16

1 12 35 813 2134 5589 144233 377610 987前16个数N为奇数时再输出一项小结 for

语句的特点1、使用了三个表达式2、循环控制变量可以在循环体内使用,也可以不使用,仅用来控制循环次数。3、从正常出口离开循环时,循环控制变量会超过终值。4.3while循环1.while语句的一般形式while(表达式)循环体;功能:计算并判断表达式的值;若值为0,则结束循环,退出while

执行后续语句;若值为非0,则执行循环体语句;依次往复。特点:先判断表达式,后执行循环体。表达式成立吗?循环体语句真(非0)假(0)执行流程2.while语句说明①循环体有可能一次也不执行。②循环体可为任意类型语句,复合语句{}不能忘记。③下列情况,退出while循环:条件表达式不成立(为零);循环体内遇break、return、goto;④无限循环:while(1)

循环体语句;⑤循环体中必须有使循环趋于结束的语句,如i++

。3.while语句举例用while循环编写下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){int

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

while(i<=5)

{s=s+i; i++; }

printf(”Sum=%d”,s);}i<=5?i←i+110s=0,i=1s←s+i打印sum的值循环体循环初值循环终值循环变量增殖3.while语句举例用while循环编写下列程序∑i=1+2+3+4…+100i=1100#include<stdio.h>voidmain(){int

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

while(i<=100)

{s=s+i; i++; }

printf(”Sum=%d”,s);}i<=100?i←i+110s=0,i=1s←s+i打印sum的值改变终值

例:将键盘输入复制到屏幕,直到 按下一个回车键为止,程序如下:#include“stdio.h”voidmain(){charc;c=getchar();

while(c!=‘\n’){putchar(c);c=getchar();}}#include“stdio.h”voidmain(){charc;while((c=getchar())!='\n')

putchar(c);}abcdef

abcdef

例:利用辗转相除法, 求两个正整数的最大公约数算法:

⑴若J=0,则I为最大公约数

⑵若J!=0

将I除以J,余数为temp

I=J;J=temp

转⑴#include<stdio.h>voidmain(){int

i,j,temp;

printf(“\n\tEnter2integers:”);

scanf(“%d%d”,&i,&j);

while(j){temp=i%j;i=j;j=temp;}

printf(“Gcd=%d\n”,i);}Enter2integers:12

18

Gcd=6分析:

i j temp 12 18 12 18 12 6 12 6 0 6 0(退出循环)小结 while

语句的特点1、循环一般由条件控制。2、在循环体内至少有一条语句能对循环条件产生影响,以防止死循环。

4.4do-while循环1.do-while语句的一般形式

do

循环体

while(表达式);功能:先执行一遍循环体,再判断表达式,当表达式的值为非0(真)时,返回重新执行循环体;如此反复,直到表达式的值为0(假)时退出循环。特点:先执行循环体,后判断循环条件(表达式)是否成立,即循环体至少执行一次。do循环体表达式成立吗?假(0)真(非0)while执行流程2.do-while语句说明①循环体至少能执行一次。②循环体可为任意类型语句,复合语句{}不能忘记。③do…while允许嵌套。④do…while(1)表示无穷循环。⑤while后必须跟();。3.while语句举例用do-while循环编写下列程序∑i=1+2+3+4+5i=15#include<stdio.h>voidmain(){int

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

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

printf(”Sum=%d”,s);}循环体循环初值循环终值循环变量增殖i<=5?i←i+110s=0,i=1s←s+i打印sum的值注意“;”

例:从键盘输入一个字符,判别其是否为大写字母,如果是,则将其转换为小写字母并输出;否则不转换,不输出。#include“stdio.h”#include“ctype.h”voidmain(){charch,answer;

do

{printf(“Enteraletter:”);

ch=getchar();

if(isupper(ch))

printf(“%c”,ch+’a’-’A’);getchar();

printf(“\nDoyouwanttodo

again?(Y/N)”);answer=getchar();

getchar();

}while(answer==‘Y’||answer==‘y’);}y

清除输入的回车键Enteraletter:A

aDoyouwanttodoagin?(Y/N))Enteraletter:b

Doyouwanttodoagin?(Y/N))n

清除输入的回车键测试c是否为大写字母4.5多重循环1.什么是

多重循环一个循环体内又包含另一个完整的循环结构,称为循环嵌套。嵌套多层的循环结构又称为多重循环。2.三种循环的

多重循环形式while(){······while(){······}······}for(;;){······for(;;){······}······}do{······do{······}while();······}while();while(){······for(;;){······}······}for(;;){······do{······}while();······}while(){······do{······}while();······}外循环内循环外循环内循环3.

循环嵌套说明⑴三种循环可互相嵌套,层数不限。⑵外层循环可包含两个以上内循环,但不能相互交叉。⑶嵌套循环的跳转应禁止:①从外层跳入内层。②跳入同层的另一循环。如

for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环

例:打印九九乘法表#include<stdio.h>voidmain(){int

i,j;

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

printf("%d*%d=%d",i,j,i*j);

printf("\n");}}对第一个乘数循环1-9对第二个乘数循环1-i输出完一行后输出换行符4.6转移语句1.break语句break语句可以用于两个地方:在switch语句中,用于中断语句的执行。在循环语句中,break语句常与if语句配合使用,当条件成立后就跳出循环体,提前结束循环。break语句示例此循环本是无限循环,因加上了break语句,使程序在输入字符常量′!′时就终止循环。…for(;;){scanf(″%c″,&ch);

if(ch==′!′)

break;

else

printf(″%c″,ch);}

例:求2~M之间的全部素数。

要判断一个数n是否素数,只需判断2~之间的整数是否 能整除n,如能整除,则不是素数。#include<stdio.h>

#include″math.h″

voidmain()

{intn,m,i,j,l=0;

scanf(″%d″,&m);for(n=2;n<=m;n++){i=sqrt(n);

for(j=2;j<=i;j++)if(!(n%j))break;

if(j>=i+1)/*若是素数*/

if(l<5)/*控制输出一排的个数*/

{printf(″%d\t″,n);l++;}else{printf(″%d\n″,n);l=0;}}}m:给定的一个自然数n:2~m中的任意自然数i:存放n的平方根值j:2~i之间的整数l:一排输出素数计数器100

23571113171923293137414347535961677173798389972.continue语句continue语句用于提前结束循环中的一轮循环。当程序执行到continue语句时,就跳过循环中后面还未执行的语句,回到循环的起始处,继续进行下一轮的循环。continue语句常与if语句联合起来使用,以便在满足一定条件时提前结束本轮循环。continue语句示例例如

对除5的倍数以外的1~100的数求和

…s=0;

for(i=1;i<=100;i++){if(!(i%5))

continue;

s+=i;}

printf(″SUM=%d\n″,s);…if(i%5==0)3.goto

语句goto语句作用:将控制转到标号所指定的语句去执行。goto语句格式:

…或:goto

标号;

标号:语句标号:语句…goto

标号;…语句使用说明goto语句对结构程序设计有影响。它将使程序的结构不清晰。应尽可能用break和continue语句代替goto

不能用goto语句从循环的外层跳到循环的内层,否则会导致程序的混乱。4.7程序举例求最大、最小和平均级数求和迭代算法打印图案穷举法

置初值的方法一般有两种:

⑴极值法: 取有界数据的上界作为最小值的初值, 取有界数据的下界作为最大值的初值。

⑵成员法: 取一批数据的第一个数作为最大值和 最小值的初值 本程序采用极值法【例1】求10个大于0小于100的数中的最大数和最小数求最大、最小和平均

#include<stdio.h>voidmain()

{inta,i,max,min;max=0;min=100;

for(i=1;i<=10;i++){scanf(“%d”,&a);if(max<a)max=a;if(min>a)min=a;}

printf(“Max=%d,Min=%d\n”,max,min);}20

Max=98,Min=2086

45

50

90

88

28

98

77

27

【例2】求每个班的平均成绩,各班人数不等#include<stdio.h>voidmain(){int

m,n,i,j;floatscore,sum,aver;

printf("Inputnumbersofclasses:");

scanf("%d",&m);

for(i=1;i<=m;i++){sum=0;n=0;

printf("Inputscore:");

while(scanf("%f",&score),score>=0) {sum=sum+score; n++; }aver=sum/n;

printf("class%d,average=%5.1f\n",i,aver);}}累加器和计数器的初始化输入负数表示该班成绩输入结束

【例3】利用公式计算

ex=1+x/1!+x2/2!+x3/3!+……+xn/n!对于求级数的和,常用两类方法:

1)通项公式法

t0=1ti=xi/i!(i=1,2,…….n)

2)递推公式法

t0=1ti=ti-1.x/i(i=1,2,……n)对于本题使用递推公式法计算量要小。程序如下:级数求和#include<stdio.h>voidmain(){inti,n;doublet,x,ex;ex=1.0;

/*第一项*/t=1.0;

printf(“Entervalueofn,x:”);

scanf(“%d%lf”,&n,&x);

for(i=1;i<n;i++){t*=x/i;/*从第二项开始*/ex+=t;/*累加*/}

printf(“exp(%f)=%lf\n”,x,ex);}Entervalueofn,x:20

0.5

exp(0.500000)=1.648721Entervalueofn,x:20

5

exp(5.000000)=148.413108思考下列问题1、利用公式

π/4=1-1/3+1/5-1/7+…

求π的近似值,直到最后一项的绝对值小于10-5为止。2、利用公式

sinx=x-x3/3!+x5/5!-x7/7!+x9/9!-…+(-1)n-1·x2n-1/(2n-1)!

编程计算sinx的值。

【例4】用牛顿迭代法求方程f(x)=-6x-1=0在2.5附近的一个实根.直到满足:

所以牛顿迭代公式为:

在几何意义上:yY=f(x)xOx3迭代算法

已知:求出:算法:1、输入x的初值

2、做循环:

x0=x

按牛顿迭代公式计算x

直到满足:3、输出结果

#include<stdio.h>#include"math.h"voidmain(){floatx,x0;

printf("\nInputx0:");

scanf("%f",&x);do{x0=x;x=x0-(x0*x0*x0-6*x0-1)/(3*x0*x0-6);}while(fabs(x-x0)>1e-6);

printf("\nTherootis%f\n",x);}

【例5】输出下列图形:

ABCDEBCDE特点:行数i递增,

CDE字符数递减

DE每行的开头字符

E是前一行的下一个字符#include“stdio.h”voidmain(){constintROWS=5;/*循环终值*/constintCHARS=5;

inti;charch;

for(i=0;i<ROWS;i++)

{for(ch=‘A’+i;ch<‘A’+CHARS;ch++) printf(“%c”,ch);

printf(“\n”);}}每排第一个字符小于F当前字符ASCII码值增1打印图案

【例6】打印以下图案*

****************************************

1、图形对称,使用对称的循环参数i=-4到42、i与行号k的变换

k=5-|i|3、每行输出*的个数

2*k-14、每行第一个*的位置为:

常量-k5、定位方法:printf(“%*c”,输出位置,‘’);

程序如下:#include<stdio.h>#include<math.h>voidmain(){inti,j,k;

for(i=-4;i<=4;i++)

{k=5-abs(i);

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

for(j=1;j<=2*k-1;j++)

printf("%c",'*');

printf(“\n”);

}}注:printf(“%*c”,30-k,‘’);是输出30-k个空格思考:1、输入棱形的边长n怎么修改程序?2、*之间有一个空格怎么修改程序?3、输出以下图形怎么修改程序?

3333222222222222111111110

#include<stdio.h>#include"math.h"voidmain(){int

n,i,j,k,m;

printf("\nEnterthemaxnumber:");

scanf("%d",&n);m=2*n+1;

for(i=m;i>=1;i--){k=n+1-fabs(i-n-1);

printf("%*c",30-k,'');

for(j=1;j<=2*k-1;j++)printf("%d",i/2);

printf("\n");}}

3333222222222222111111110

【例7】

百元买百鸡,其中母鸡3元/只,公鸡2元

温馨提示

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

评论

0/150

提交评论