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

下载本文档

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

文档简介

第4章=循环结构

4.1=知识要点回顾

循环结构是程序中一种很重要的结构,其特点是:在给定条件成立时,反曳

执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程

序段称为循环体。在C语言中有三种可以构成循环结构的循环语句:while,

do-while和for。

本章主要掌握的知识要点:

(1)while循环结构。

⑵do-while循环结构。

(3)for循环结构。

4.1.1Zwhile语句

表4-1列出了while语句的语句形式以及对应的逻辑流程图。

表4-i=while语句的语句形式

语句形式流程图

while(表达式)|

(<$>n

=语句段

其中,表达式是循环条件,语句为循环体。while语句的执行过程是:首先

计算表达式的值,当值为真(非0)时,执行循环体语句:然后再判断表达式是否

为真,如果为真,再执行循环体语句,如此循环直到表达式的值为假为止。

由以上执行过程可知,while后面括号中表达式的值决定了循次体是否将被

执行。因此,进入while循环后,一定要有能使此表达式的值变为。的操作,否

则循环将会无限制地进行下去,成为无限循环(死循环)。若此表达式的值不变,

则循环体内应有在装种条件下强行终止循环的语句(如break等)。

说明:

(1)while语句的循环体可能一次都不执行,因为while后面括号中的表达式

可能一开始就为0»

(2)不要把由if语句构成的分支结构与由while语句构成的循以结构混同起

来。若if后条件表达式的值为非0,其后的if子句只可能执行一次:而while后

条件表达式的值为非0时,其后的循环体语句可能重复执行。在设计循环时,通

常应在循环体内找亚茶件袤达式中有关逆量的作,便条件耒达式的俏曲终观成

0.以便能结束循环。下面的while语句便是死循环:

x=2:

while(x<10)

(

=sum+=x;〃死般坏,因为x的值没有变化,永远小于10

}

printf("%d",sum);

(3)当循环体需要无条件循环,条件表达式可以设为1(恒为真),但在循环

体内要有带条件的非正常出口(break等)。例如,1+2+3+…+100的程序可以这

样设计:

i=1;

sum=0;

while(1)

(

=if(i>100)break;

^■sum+=i;

—1++;

}

(4)如果在执行循环体的过程中,遇见了continue语句,则循环体重

continue语句后面的其他语句将被跳过,而直接进入下一轮循环。将上例中的批注[fenl]:语句不通!

1+2+3+…+100的程序改写成:

1=1;

sum=0;

while(1)

(

=sum+=i;

—I++;

if(i<=100)continue;

break;

}

(5)在循环体中,语句的先后位置必须符合逻辑,否则将会影响运算结果。

例如,将上例中的1+2+3+…+100的程序改写成:

i=1;

sum=0;

while(i<=100)

(

=i++;〃县计算i++,再计算sum值

=sum+=i;

}

while语句执行结束以后,sum=5C49,因为在执行的过程中少加了第一项的值1。

4.1.2Zdo-while语句

表4-2列出了do-while语句的语句形式以及对应的逻辑流程图。

表4-2=do-while语句的语句形式

语句形式流程图

do

简坏】语句|

(

=语句段

}while(表达式);

do-while语句的执行过程是:先执行循环中的语句,然后再判断表达式是否

为其,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少

要执行一次循环语句。

说明:

(1)do是C语言的关键字,必须和while联合使用。

(2)do-while循环由do开始,至while结束。必须注意的是:在while(表达

式)后的不可丢,它表示do-while语句的结束。

(3)while后一对括号中的表达式,可以是C语言中任意合法的表达式,由

它控制循环是否执行。

说明:

(1)表达式1、表达式2、表达式3可以是任何类型的表达式。

(2)表达式1、表达式2、表达式3之间必须用分号隔开,表达式1只被执

行1次,通常用于初始化不循环控制变量。表达式2通常是循环的条

件。而表达式3通常用于改变循环控制变量的值。

(3)表达式2可以为空,相当于表达式2的值是真。因此,下面的循环是死

循环:

for(a=0;;a++)

=printf("%d",a);

(4)既可以在for语句的前面单独初始化循环控制变量,也可以利用for语句

的表达式1初始化循环控制变量。下而两个程序是等价的:

a=1;

for(a=1;a<=10;a++)

for(;a<=10;a++)

=printf(H%3d",a);

=printf("%3d”,a);

(5)既可以在循环体内改变循环控制变量的值,也可以利用for语句的表达

式3改变循环控制变量的值。下面两个程序是等价的:

a=1;

for(;a<=10:)

for(a=1;a<=10;a++)(

=printf("%3dn,a);=printf("%3d,',a);

^■a++;

)

(6)表达式1和表达式3可以是一个简单表达式,也可以是逗号表达式:

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

二sum=sum+i;

或:for(i=0,j=lOO;i<=j;i++,j-)

=k=i+j;

(7)如果在执行循环体的过程中遇见了break,则跳出for循环。

(8)如果在执行循环体的过程中,遇见了continue语句,则循环体重continue

语句后面的其他语句将被跳过,而直接进入下一轮循环。批注lfen3J:??

三种循环语句有以下异同点:

(1)在使用while和do-while语句时,必须在while和do-while语句前初始

化循环控制变量,但在for语句中却可以利用表达式1来初始化循环控制变量。

(2)在使用while和do-while语句时,循环控制变量的变化必须放在循环体

中,而for语句却可以利用表达式3来改变循环控制变量的值。

(3)do-while语句的循环体至少被执行1次,但while和for语句的循环体可

能1次都不执行。

(4)while和do-while语句中不能省略循环条件,但for语句却可以省略。

(5)break和continue语句在这三种循环语句中的作用是相同的,

(6)凡是用while语句能实现的循环,必然能用for语句实现,反之亦然。

4.1.4=break语句

break语句通常用在循环语句和开关语句中。当break用于开关语句switch

中时,可使程序跳出switch而执行switch以后的语句:如果没有break语句,

则将成为一个死循环而无法退出。

当break语句用于do-while,for、while循环语句中时,可使程序终止循环

而执行循环后面的语句,通常break语句总是与if语句联在一起,即满足条件时

便跳出循环。

感:(1)break语句对if-eIse的条件语句不起作用。

(2)在多层循环中,一个break语句只向外跳一层。

4.1.5=continue语句

continue语句的作用是跳过循环本中轲余的语句而强制执行下一次循环。

continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使

用,用来加速循环。

ik.itcontinue语句并没终止球个循3不《

4.1.6=常见错误举例

1.用“,”代替for语句中的“;”

C语言规定,for语句中的三个表达式可以为空,但分号不能省略,如果用

逗号代替分号,编译器将由于找不到分号而报错。下面的程序是错误的:

for(a=1,a<=10,a++)〃应该为for(a=1:a<=10:a++)

-sum+=a,

2.do-while语句漏掉了“:

正确错误

dodo

{|

=sum+=a++:=sum+=a++;

}while(a<=100);}while(a<=100)

3.循环语句中楣环控制变量无变化而造成无循环

仔细观察下面的程序,因为漏掉了a++,而造成死循环。

do

(

=sum+=a;

}while(a<=100);

4.不初始化循环控制变量就进入循环体

下面的程序由于没有对a初始化就进入循环体,执行结果是不可预知。

main()

(

=inta;

=longsum=0;

=do

={

==sum+=a;

Z}while(a<=100);

=printf("sum=%ld",sum);

}

4.2=实训内容

实验一=验证性实验

一、实验目的

(1)脸证教材中的典型例题。

(2)理解和掌握循环结构程序设计的方法。

(3)理解和掌握while、do-while,for语句的执行流程。

(4)掌握循环语句嵌套。

(5)堂握break和continue的使用方法。

二、实验设备和仪器

(1)IBMPC或兼容计算机。

(2)Windows9x/2000/XP操作系统。

(3)VisualC++6.0。

三、实验内容

(一)调试程序1

1.实验要求

11

求数列1+—+—+…+的和。

6IIl+5n1+500

2.程序代码progl.c

#include<stdio.h>

main()

(

Zinti;

=floatsum=l;

Zfor(i=l;i<=100;i++)

==sum=sum+l.0/(l+i*5);

=printf("数列的和的结果为%f\n",sum);

)

3.实验步骤

步骤一:

在D盘的根目录中创建一个以你的学号命名的文件夹,如D:\200710003o

步骤二:

打开“MicrosoftVisualC++”软件,新建progl.c文件,并榆入程序代码,

如图4-1所示。

图4-1=新建文件并输入程序代码

步骤三:

选择“编译”菜单命令对程序进行编译,如图4-2所示。

jxogl-创天中文VCH-[progl.(・l口第

图文件后丹查看痛入工程强法工具定口殳助x

国6ma电P*-▼口园老聃

合幽!51

J(Globals)▼||(Allglobalmember^||>main

,句21ttinclude<stdio.h>

proglclreain()

inti;

floatsum-1;

for(i-1;i<-10O;i**)

sura-sum*1.0/(1♦inS);

printf("数列的和的桀果为之f\n”,sun);

HI

Xprogl.obj-0error(s)»1warning(s)

Jj

F\娘译《调试〉查找文件查找文件25司・|,卜

ReadyLn7,Col1

图4・2=编译程序

步腺四:

若编译有错误需要重新检查;若编译没有错误,可以执行程序,此时输出

结果如图4-3所示。

:XDocumentsandSettings...|-|u~

数列的和的结果为1.980238

Pressanykeytocontinue1

图4-3=程序运行结果

按任意就关闭当前窗口,保存后关闭progl.c文件。

(二)调试程序2

1.实验要求

求开的近似值,精确到-^<10-1。。

Tt1111

——=>*t--r+…+^r+

6I222n2

2.程序prog2.c

#includc<s(dio.h>

#include<math.h>

main()

(

Zinli;

"doubles=0,pi;

=for(i=l;1.0/(i*i)>=le-l0;i++)

==s=s+1.0/(i*i);

Zpi=sqrt(s*6);

=printf("pi=%f\n",pi);

)

3.实验步骤

步骤一:

打开“MicrosoftVisualC++”软件,新建prog2.c文件,并输人程序代码,

如E14-4所示。

中文VC++-[proc2.c]□X

步骤二:

选择“编译”菜单命令对程年进行编译,如图4-5所示。

二proz2-tl天中文VCi-(proe2.c]□X

图文件玄看独人工援困谚工风匿口史助.1(9|X

悔d11印£盯国宙聃广

▼||伍11globalmemberT.main

二ttinclude<stdio.h>

llinclu(le<nath.h>八

reain()

<

int1;

doubles・9,pi;

for(i«1;1.O/(i»i)>«1e-10;i**)

pi-sqrt(s«6);

printFC'pi母\n“,pi);

」;「

^J(prog2.obj-0error(s)»GMrning(s)-

-pN编译人/谣试(查找文件1、杳找文件|《>r

Ready

图4-5=编译程序

步骤三:

若编译有错误需要重新检查;若编译没有错误,可以执行程序,此时榆出行

果如图4-6所示。

按任意键关闭当前窗口,保存后关闭prog2.c文件。

(三)调试程序3

1.实验要求

计算数列s=1!+2!+...+n!的值。

2.程序代码prog3.c

源代码如下:

#include<s(dio.h>

main()

(

Zinti*n,t=l,s=0;

=printf("pleaseinputn:");

=scanf("%d",&n);

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

={

==t=t*i;

==s=s+i;

=}

Zprin(f("l!+2!+......+%d!=%d\n",n,s);

)

3.实验步骤

步骤一:

打开“MicrosoftVisualC++”软件,新建prog3.c文件,并榆入程序代码,

如图4-7所示。

图4-7=新建文件并输入程序代码

步骤二:

选择“编译”菜单命令对程用进行编译,如图4-8所示。

图4.8=编译程序

步骤三:

若编译有错误需要重新检查。若编译没有错误,可以执行程序。输入4,输

出结果如图4-9所示。

:\Docu*entsand-Idxl

pleaseinputn:4▲

♦.M1-33

Fr«8Canykeytocontinue

________IL%

图4-9=程序运行结果I

步骤四:

按任意犍关闭当前窗口。再次输入5,输出结果如图470所示

图4-10=程序运行结果2

按任意键关闭当前窗口,保存后关闭pro3.c文件。

(四)调试程序4

1.实脸要求

输出n行以下图形:

2.程序代码prog4.c

#include<stdio.h>

main()

{

=inlii।i9j;

=prin(f("Inputn-');

=scanf("%d",&n);

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

SSfor(j=l;j<=n-i;j++)

===printfC");〃双引号里面有一个空格字符

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

===printf("*");

==printf("\n");

=}

}

3.实验步骤

步骤一:

打开"MicrosoftVisualC++”软件,新建prog4.c文件,并输入程序代码,

如图4-11所示。

图411=新建文件并输入程序代码

步骤二:

选择“编译”菜单命令对程序进行编译,如图472所示。

怪4-12=编译程序

步照三:

若编译有错误需要重新检查;若编译没有错误,可以执行程序。此时,揄入

5,输出结果如图4-13所示。

图4-13=程序运行结果1

步骤四:

拄任意键关闭当前窗口-再次输入8,榆出结果如图4-14所示,

图4-14=程序运行结果2

按任意健关闭当前窗口,保存后关闭pro4.c文件。

四、实验报告要求

(1)写出程序一的实脸原理与考查知识点。

(2)写出程序二的实脸原理与考查知识点。

(3)写出程序三的实验原理与考查知识点。

(4)写出程序四的实脸原理与考查知识点。

实验二=启发性实验

一、实验目的

(1)掌握程序设计与调试的方法。

(2)学,握循环结构程序填空的方法。

(3)掌握循环结构程序改错技巧。

(4)掌握循环结构程序编程能力

二'实验设备和仪器

(1)IBMPC或兼容计算机。

(2)Windows9x/2000/XP操作系统。

(3)VisuaIC++6.0。

三'实验内容

1.填空题

下面程序是求n以内(包括n)能被3或7整除的所有自然数的例数之和。

运行结果如下:

Entern:(输入提示)

3(XCR>(从键盘输入30,<CR>代表Enter键)

s=1.226323

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。注意:不得增行或删行,也不得更改程序的结构!

程序如下:

#includc<stdio.h>

main()

(

=intn,i;

Zdoubles=0.0;

=printf("Entern:\n");

=scanf("%d",&n);

=for(i=l;_l_:i++)

==if(_2_)

===s+=_3_/i:

:printf("s=%f\n",s);

2.改错题

下面给定的程序功能是:求〃的近似值,直到最后一项的绝对值小于指定的

数为止。

11

+-----

57

运行结果如下:

Enterafloatnumber:(输入提示)

().(X)()I<CR>(从键盘输入0.0001,<CR>代表Enter键)

3.1414

请改正程序中的两处错误,使程序能输出正确的结果。注意:程序中

产***********於1md************/表示错误就在下面一■行。不得增行或删行,也

不得更改程序的结构!

程序如下:

#include<math.h>

#include<stdio.h>

main()

=floatnum,pi

=pi=0;

=prinlf("Enterafloatnumber:\n");

=scanf("%f,&nurn);

=/********佑und********/

Zwhilc((>=num)

={

==pi=pi+t;

Z=n=n+2;

:l=s%n;

=pi=pi*4;

=printf(M%6.4f\n",pi);

)

3.编程题

w是一个大于10的无符号整数,若w是n(nN2)位的整数,求出w后n-I

位的数。部分源代码已经给出。例如,输入5923,则输出923。

程序如下:

#include<stdio.h>

main()

=/*将下面的代码补充完整可

实验三=启发性实验

一、实验目的

(1)进一步掌握C程序的编辑、编译、连接和运行的过程。

(2)熟悉循环结构的程序设计方法。

(3)熟练使用循环嵌套的使用。

二、实验设备和仪器

(1)IBMPC或兼容计算机。

(2)Windows9x/2000/XP操作系就。

(3)VisualC++6.0。

三、实验内容

1.填空题

统计所有小于等于20的素数的个数。

运行结果如下:

Theprimenumberbetween3to20:

35711131719

Tlienumberofprimeis:7

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。注意:程序中〃是对问题的提示。不得增行或删行,也不得更改程序的结构!

程序如下:

#include<sldio.h>

main()

(

=intn=20,count=0;

Zinti,j;

=printf("\nThcprimenumberbetween3to%d:\n">n);

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

={

==for(_1—;j<i;j++)

===if(_2_)〃判断是否整除

====break;

==if(_3_)〃判断上面循环结束时,循环变量j的值

=={

ZZZcounl++;

===printf(count%15"%5d":M\n%5d".i);

==}

=printf("\nThenumbe

温馨提示

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

评论

0/150

提交评论