循环控制课件_第1页
循环控制课件_第2页
循环控制课件_第3页
循环控制课件_第4页
循环控制课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

第六章循环控制

用于解决语句的重复执行,以克服一

条语句只能执行一次的限制。

■几种简要的循环结构

■break和continue语句

■for语句的变化形式

■循环嵌套

第六章循环控制

■问题:

、10

求sum=2i

i=l

intsum;

sum=1+2+3+4+5+6+7+8+9+10;

、100

求sum=2i?

i=l

求sum=2i?(n由键盘输入)

i=l

第六章循环控制

■问题:

、10

求sum=2i

i=l

i=1;sum=O;

sum=部分累加和+i(i=l〜〜10)

sum=sum+i;i++;\

......,十行

sum=sum+i;i++;/

goto语句以及用goto语句构成循环

一般形式:goto语句标号;

其中标号是一个有效的标识符,这个标识符加上

一个“:”一起出现在函数内某处,执行goto语

句后,程序将跳转到该标号处并执行其后的语句。

另外标号必须与goto语句同处于一个函数中,但

可以不在一个循环层中。通常goto语句与if条

件语句连用,当满足某一条件时,程序跳到标

号处运行。

例6.1使用goto语句实现求解1〜100累计和

main()“loop:"为语句标号

{intn=l,sum=0;其命名遵循标识符

命名规则。

loop:sum+=n;n++;

goto语句格式:goto

if(n<=100)gotoloop;标号,功能为:使

printf("sum=%d\n'',系统转向标号所在

sum);的语句行执行。

■结构化程序设计方法,主张限制使用

goto语句。因为滥用goto语句,将会导

致程序结构无规律、可读性差。

另外,从功能上说,for语句可完全代

替当型循环语句while,所以该语句也不

是必需的。

for语句

■1.用for语句实现

ftinclude<stdio.h>

main()

inti,sum=0;_^定重旻次装

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

sum=sum+i;-

printf(”%cT,siim);重复执行的语句

for语句

■for语句格式:

for(初值飞达式;循环继续表达式;循环变化表达式)

一条节反复执行的白句;/

三个独立的表达式

fbr(i=l;i<=10;i++)

sum=sum+i;

for语句

■for语句格式:

for(初值表达式;循环继续表达式;循环变化表达式)

一条要反复执行的语句;

执行流程:

for语句

IJ

Ifbr(i=Li<=10E++)

■sum=sum+i^->

for语句

■从键盘输入100个整数,求其中正数之和。

include<stdio.h>

•重复步骤:

main()

(1输入一个数

inti,sum=0,x;2对正数求和

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

scanf("%cT,&x);•共重复100次

if(x>0)sum=sum+x;

)

printf(”%d”,sum);

for语句

■从键盘输入100个整数,求其中正数的平均数。

ftinclude<stdio.h>

main(){

inti,count=0,x;

floatsum=0;

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

{scanf("%d”,&x);

if(x>0){sum=sum+x;count++;}

)

sum/=count;

printf("%fH,sum);

)

for语句

■用for语句实现10+9+8+7+6+5+4+3+2+1

ttinclude<stdio.h>

main()

(

inti,sum=0;

for(i=10;i>0;i--)

sum=sum+i;

printf(H%dH,sum);

while语句

■while(条件)

重复执行的一条语句复合语句

不满足

后一语句;

二while语句

[■while实现要点

整个循环由i控制,i称循环变量

1i=1;循环变量必须有初值

.while(i<=10)继续循环的条件

.{sum=sum+i;

.循环体j++;循环变量的改变

例6.2用while语句求1〜100的累计和

main()

{inti=l,sum=0;/*初始化循环控制变量i和累计器

sum*/

while(i<=100)

{sum+=i;/*实现累加*/

i++;/*循环控制变量i增1*/

printf("sum=%d\n”,sum);

程序运行情况如下:

sum=5050

,循环体如果包括一个以上语句,应该用花括号括起来,

■形成复合语句

while语句

■for语句与while语句比较

main()

{inti,sum=0;

for(i=1;i<=10;i++)while(i<=10)

sum=sum+i;{sum=sum+i;

printf("%d\sum);、i++;)

do-while语句

■用do-while语句实现

do-while语句格式:

do一条要反复执行的语句;

while(条件表达式)

「while是先判别条件,再决定是否循环;

do-while是先至少循环一次,然后再根

据循环的结果决定是否继续循环。

do-while语句

■do-while语句实现流程

do-while语句

■do....while与while的用法有所不同

例:输入一串正数求和,例:输入一串正数求和,

直到数据学好?直到数据为非正数结束。

main()

main()

{intx,sum=0;

{intx,sum=0;scanf(66%d5\&x);

do{while(x>0){

scanf("%d”,&x);sum+=x;

sum+=x;scanf("%d”,&x);

}while(x>0))

printfV'sum=%d'',sum-x);printf(66sum=%d5\sum);

■编写数列求和程序:

1+l/2+1/3+1/4+....+l/n

l/l+l/2+1/3+1/4+....+l/n

main()

{inti,n;floaty=0;

scanf("%d\&n);

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

y+=1.0/i;

printf(Hn=%dy=%f\nH,n,y);

循环结构的实现

循环实现要点「(1)找出什么要反复执行

(2)重复到何时结束

假定输入x=12345,逆序输出。从低位开始分割

12345%10=5(1)反复执行x%10

12345/10=1234x=x/10

1234%10=4(2)何时结束x==0

1234/10=123scanf(66%d5\&x);

123%10=3

123/10=12while(x>0)

12%10=2{printf(66%d

12/10=1x=x/10;

1%10=1}

1/10—0结束

循环结构的实现

循环实现要点:(1)找出什么要反复执行

(2)重复到何时结束

假定输入x=12345顺序输出,从高位开始分割

12345/10000=1开始如何得至

12345%10000=2345(1)Uloooo

2345/1000=2找输入数据的位数

2345%1000=345d=l;

345/100=3for(i=10;x/i>0;i=i*10)

345%100=45

45/10=4d++;

45%10=5⑵每次循环缩小10倍

5/1=5⑶缩小到。结束

5%1=5

§6.2break和continue语句

例:读入一行字符(不超过io个),给予输出

include〃stdio.h〃有两个条件决定循环的结束

main()main()

{charc;{charc;

inti=0;inti=0;

for(i=0;i<c=getchar();

{c=getchcfor(i=0;i<10&&c!='\n';i++)

if(c==,{putchar(c);两个结束条件合并

putcharc=getchar();

)

continue流程

程序:

fbr(表1;表2;表3)

(语句1;

if(...)continue;

语句2;

)

for后的下一条语句;

for的下一条语句

continue语句例子

ftinclude〃stdio.h〃输入:abc/

main()efgh/

{charc;123/

inti;输出:abcefghl

for(i=0;i<10;i++)/*i>=10是结束条件*/

{c=getchar();

if(c='\n')continue;

putchar(c);/*c二回车也是结束条件*/

)

}问:若把break改成continue,

结果会怎样?

§6.3for语句的变化形式

原形:inti,sum=0;

for(i=l;i<=10;i++)sum=sum+i;

§6.3for语句的变化形式

原形:inti,sum=0;

for(i=1;i<=10;i++)sum=sum+i;

§6.3for语句的变化形式

原形:inti5sum=0;

for(i=1;iv=10;i++)sum=sum+i;

变形1inti=1,sum=0;

for(;i<=10;i++)sum=sum+i;

变形2inti=1,sum=0;

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

变形3inti=1,su*=0;

for(;;){if(i>10)break;

无限宿环sum=sum+i;i++}

变形4inti,sum;

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

不管那一种变形,循环变量的初值、判断和变化

表达式仍都存在,只是改变了所处的位置。

不管那一种变形,三个表达式的功能缺一不

可,且执行流程不得改变。

原形:inti,sum=O;

for(i=1;i<=10;i++)sum=sum+i;

§6.4循环嵌套

一循环体中又包含了循环语句称循环嵌套。

例:求S=1!+2!+3!+...+n!

分析:首先要循环n次来累加i!

for(i=l;i<=n;i++)

s=s+i!;

如果存在求阶乘的运算!,计算完成。

for(i=l;i<=n;i++)

(;

t=t*i;

§6.4循环嵌套

例:已知小鸡0.5文钱/只,公鸡2文钱/只,

母鸡3文钱/只,现要求100文钱正好买100只鸡,

请给出所有的组合。

组合问题用计算机解,通常采取“凑”的办法

母鸡可能的只数:0—100hen

公鸡可能的只数:0—100cock

小鸡可能的只数:0—100chick

然后对三种鸡所有的组合方式,排除不等于

100元和100只的那些组合。

R§6.4循环嵌套

main()

■{

■intchick,cock,hen;

for(cock=0;cock<=100;cock++)cock=0->100

for(hen=0;hen<=100;hen++)hen=0^100

for(chick=0;chick<=100;chick++)chick=0

pf(cock+hen+chick==100&&~>100

cock*2+hen*3+chick*0.5==100)

・printf("cock=%dhen=%d

chick=%d\n”,cock,hen,chick);

§6.4循环嵌套

运行结果:

cock=0hen=20chick=80

cock=5hen=17chick=78

cock=10hen=14chick=76

cock=15hen=11chick=74

cock=20hen=8chick=72

cock=25hen=5chick=70

cock=30hen=2chick=68

§6.4循环嵌套

运行过程:

cock二°

"ken=Ochicl^p〜100共101次〕

hen=lchick/〜100共101次:

■hen=100chick=0〜100共101次J次

cock=l

-口hen=0chfek=0〜1Op10

共101次I101、多

~hen二100——chick-0-100共101次J次广万

、r

cock=100

hen=0chick=0〜100共101次1101

hen=100chick=0〜100共101次j次J

§6.4循环嵌套

main()

(

intchick,cock,hen;

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

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

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

printf("cock=%dhen=%d

chick=%d\nH,cock,hen,chick);

)

§6.4循环嵌套

循环嵌套均是大循环包小循环

绝对不允许循环体交叉!

for()

for()■

{.....{………

—do{do{-

>3.....}while]...,-

/\}while(….)〉

§6.4循环嵌套

main()

(

intchick,cock,hen;

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

{for(hen=0;hen<=33;hen++)

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

)

§6.4循环嵌套

main()

结论:break只能终止内层循环

intchick,cock,hen,flag=0;

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

{for(hen=0;hen<=33;hen++)

{chick=100-cock-hen;

if(cock*2+hen*3+chick*0.5==100)

}{flag=1;br

“接力赛”第一棒

if(flag)break]

)printf(......“接力赛”第二棒

例题

求算式】__L+L_-+

612203042_____-〜,“一

置到t第40项的和

main()

{inti,s=l;第i项:l/(i*(i+l))

floaty=0;

符号:s=l

for(i=l;i<=40;i++)

{y=y+s/((float)

s=-s;

}

printf("%f”,y);

例题

求算式】__L+L_-+

612203042_____-〜,“一

置到t第40项的和

main()

{inti,s=-l;第i项:l/(i*(i+l))

floaty=l;

符号:s=l

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

{y=y+s/((float)

s=-s;

}

printf("%f”,y);

例题

编禾ftinclude<stdio.h>

main()

{inti,j;

printfT〃);第1行先输出5个空格

for(i=l;i<10;i++)printf(〃(%d)〃,i);

putchar('\n');

for(i=l;i<10;i++){i代表行

printf(〃(%d)〃,i);

for(j=l;j<10;j++)j代表列

printf(z/%2d〃,i*j);

putchar('\n');

例题

下歹ll程序求Sn=a+aa+aaa+……+aa...aa(n个己)的值,

sn=2+22+222+2222+22222,其值应为24690。

#include<stdio.h>

Imain()

inta,n,count=lrsn=0,tn=0;

scanf(''%d^d”,&a,&n);

for(count=l;count<=n,count++){

tn=tn*10+a;tn=0*10+2=2

sn=sn+tn;tn=2*10+2=22

}tn=22*10+2=222

printf(''th㊀snis:%d\n”,sn);

)

[程序举例

■l.输入一行字符,统计其中的单词数,单词之间用

格分隔开。

如:输入youareastudent则有4个单词。

智^思路:

M)用空格区分每一个单词;

■)遇到空格,则表示前一个单词结束;(word=0)

(3)遇到一个非空格:若前面一个字符是空格(即

ord=0),则开始一个新单词(word=1,计数加1,;

若前面一个字符是非空格(即word=1),则仍然是同

■^个单词。

wHclude<stdio.h>

main()

■charstring[81];

inti,num=O,word=0;

gets(string);

.for(i=0;string[i]!=i\0,;i++)

if(string[i]=='')word=0;

elseif(word==0){

word++;num++;

u,,

printf(Thereare%dwordsintheline.\nJnum);

程序举例

2.打印以下图案:

$

$$$

eeeeed

e金金e金e金e金e金e金e

wwDwweCL

I$$$$

分析:分上下两部分考虑

对上半部每一行:$数+空格数=列数(n)

行数$数空格数(单边)

.........$.......:11(n-1)/2

$$$|22*2-1=3(n-3)/2

eeeee32*3-1=5(n-5)/2

金让让金金金企

VVVVVVV42*4-1=7(n-7)/2

一般地:2*i-1(n-(2*i-1))/2

分析:

对下半部每一行:$数+空格数=列数(n)

行数空格数(单边)$数

$11n-1*2

$$$22n-2*2

eeeee33n-3*2

■■

e金让e让e金e金e金e金e11n-i*2

$$$

•……$……

■#include<stdio.h>

■main()

intn_blank,n_dollar,i,j,n,m;

scanf("%d”,&n);

m=(n+1)/2;

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

n_dollar=2*i-1;

n_blank=(n-n__dollar)/2;

for(j=0;j<n_blank;j++)

putcharC

forG=0;j<n_dollar;j++)

putchar($);

putchar(J\n5);

)

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

n_blank=i;

n_dollar=n-2*n_blank;

for(j=0;j<n_blank;j++)

putchar(fi

for(j=0;j<n_dollar;j++)

putcharC$9);

putchar(i\n,);

)

return0;

)

例6.6用公式求TT直到某一项的绝对值小于10-6

#include<math.h>

main()

{Fl,pi=0,n=4,s=l

ints;

当It|

floatn,t,pi;

t=l,pi=0;n=l.0;s=l;pi=pi+t

while(fabs(t)>le-6)

{pi=pi+t;n=n+2

n=n+2;s=-s

s=-s;

t=s/n;t=s/n

pi=pi*4

pi=pi*4;

printf(〃pi=%10.6f\n〃,pi);

■[例6.7]求Fibonacci数列的前40个数。该数列的

生成方法为:F.l,F2=l,Fn=Fnl+Fn2

(n>=3),即从第3个数开始,每个数等于前2

个数之和。

fbri=lto20

输出fl,f2

fl=fl+f2

f2=f2+fl

main()

{longintfl=l,f2=l;/*定义并初始化数列的头2个

数*/

inti=l;/*定义并初始化循环控制变量i*/

fbr(i=l;i<=20;i++)/*1组2个,20组40个

温馨提示

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

评论

0/150

提交评论