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

下载本文档

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

文档简介

第4章〓循环结构4.1〓知识要点回顾循环结构是程序中一种很重要的结构,其特点是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。在C语言中有三种可以构成循环结构的循环语句:while,do-while和for。本章主要掌握的知识要点:(1)while循环结构。(2)do-while循环结构。(3)for循环结构。4.1.1〓while语句表4-1列出了while语句的语句形式以及对应的逻辑流程图。表4-1〓while语句的语句形式语句形式流程图while(表达式){〓语句段}其中,表达式是循环条件,语句为循环体。while语句的执行过程是:首先计算表达式的值,当值为真(非0)时,执行循环体语句;然后再判断表达式是否为真,如果为真,再执行循环体语句,如此循环直到表达式的值为假为止。由以上执行过程可知,while后面括号中表达式的值决定了循环体是否将被执行。因此,进入while循环后,一定要有能使此表达式的值变为0的操作,否则循环将会无限制地进行下去,成为无限循环(死循环)。若此表达式的值不变,则循环体内应有在某种条件下强行终止循环的语句(如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;〓i++;}(4)如果在执行循环体的过程中,遇见了continue语句,则循环体重continue语句后面的其他语句将被跳过语句不通!,而直接进入下一轮循环。将上例中的1+2+3+…+100的程序改写成:语句不通!i=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=5049,因为在执行的过程中少加了第一项的值1。4.1.2〓do-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语言中任意合法的表达式,由它控制循环是否执行。(4)和while语句一样,在使用do-while时,不要忘记初始化循环控制变量,否则程序的结果实不可预知的。(5)要在do-while语句的某处(表达式或循环体内)改变循环控制变量的值,否则极易造成死循环。(6)如果在执行循环体的过程中遇见了break,则跳出do-while循环。(7)如果在执行循环体的过程中,遇见了continue语句,则循环体重continue语句后面的其他语句将被跳过,??而直接进入下一轮循环。??4.1.3〓for语句在C语言中,for语句使用最为灵活,它完全可以取代while语句。表4-3列出了for语句的语句形式以及对应的逻辑流程图。表4-3〓for语句的语句形式语句形式流程图for(表达式1;表达式2;表达式3){〓语句段}它的执行过程如下:求解表达式1。求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步;若其值为假(0),则结束循环,转到第(5)步。求解表达式3。转回上面第(2)步继续执行。循环结束,执行for语句下面的一个语句。说明:表达式1、表达式2、表达式3可以是任何类型的表达式。表达式1、表达式2、表达式3之间必须用分号隔开,表达式1只被执行1次,通常用于初始化不循环控制变量。表达式2通常是循环的条件。而表达式3通常用于改变循环控制变量的值。表达式2可以为空,相当于表达式2的值是真。因此,下面的循环是死循环:for(a=0;;a++)〓printf("%d",a);既可以在for语句的前面单独初始化循环控制变量,也可以利用for语句的表达式1初始化循环控制变量。下面两个程序是等价的:for(a=1;a<=10;a++)〓printf("%3d",a);a=1;for(;a<=10;a++)〓printf("%3d",a);既可以在循环体内改变循环控制变量的值,也可以利用for语句的表达式3改变循环控制变量的值。下面两个程序是等价的:for(a=1;a<=10;a++)〓printf("%3d",a);a=1;for(;a<=10;){〓printf("%3d",a);〓a++;}表达式1和表达式3可以是一个简单表达式,也可以是逗号表达式:for(sum=0,i=1;i<=100;i++)〓sum=sum+i;或:for(i=0,j=100;i<=j;i++,j--)〓k=i+j;如果在执行循环体的过程中遇见了break,则跳出for循环。如果在执行循环体的过程中,遇见了continue语句,则循环体重continue语句后面的其他语句将被跳过??,而直接进入下一轮循环。??三种循环语句有以下异同点:(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-else的条件语句不起作用。(2)在多层循环中,一个break语句只向外跳一层。4.1.5〓continue语句continue语句的作用是跳过循环本中剩余的语句而强制执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。执行continue语句并没终止整个循环。4.1.6〓常见错误举例1.用“,”代替for语句中的“;”C语言规定,for语句中的三个表达式可以为空,但分号不能省略,如果用逗号代替分号,编译器将由于找不到分号而报错。下面的程序是错误的:for(a=1,a<=10,a++)//应该为for(a=1;a<=10;a++)〓sum+=a;2.do-while语句漏掉了“;”正确错误do{〓sum+=a++;}while(a<=100);do{〓sum+=a++;}while(a<=100)3.循环语句中循环控制变量无变化而造成死循环仔细观察下面的程序,因为漏掉了a++,而造成死循环。do{〓sum+=a;}while(a<=100);4.不初始化循环控制变量就进入循环体下面的程序由于没有对a初始化就进入循环体,执行结果是不可预知。main(){〓inta;〓longsum=0;〓do〓{〓〓sum+=a;〓}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。三、实验内容(一)调试程序11.实验要求求数列的和。2.程序代码prog1.c#include<stdio.h>main(){〓inti;〓floatsum=1;〓for(i=1;i<=100;i++)〓〓sum=sum+1.0/(1+i*5);〓printf("数列的和的结果为%f\n",sum);}3.实验步骤步骤一:在D盘的根目录中创建一个以你的学号命名的文件夹,如D:\200710003。步骤二:打开“MicrosoftVisualC++”软件,新建prog1.c文件,并输入程序代码,如图4-1所示。图4-1〓新建文件并输入程序代码步骤三:选择“编译”菜单命令对程序进行编译,如图4-2所示。图4-2〓编译程序步骤四:若编译有错误需要重新检查;若编译没有错误,可以执行程序,此时输出结果如图4-3所示。图4-3〓程序运行结果 按任意键关闭当前窗口,保存后关闭prog1.c文件。(二)调试程序21.实验要求求的近似值,精确到。2.程序prog2.c#include<stdio.h>#include<math.h>main(){〓inti;〓doubles=0,pi;〓for(i=1;1.0/(i*i)>=1e-10;i++)〓〓s=s+1.0/(i*i);〓pi=sqrt(s*6);〓printf("pi=%f\n",pi);}3.实验步骤步骤一:打开“MicrosoftVisualC++”软件,新建prog2.c文件,并输入程序代码,如图4-4所示。图4-4〓新建文件并输入程序代码步骤二:选择“编译”菜单命令对程序进行编译,如图4-5所示。图4-5〓编译程序步骤三:若编译有错误需要重新检查;若编译没有错误,可以执行程序,此时输出结果如图4-6所示。图4-6〓程序运行结果按任意键关闭当前窗口,保存后关闭prog2.c文件。(三)调试程序31.实验要求计算数列s=1!+2!+......+n!的值。2.程序代码prog3.c源代码如下:#include<stdio.h>main(){〓inti,n,t=1,s=0;〓printf("pleaseinputn:");〓scanf("%d",&n);〓for(i=1;i<=n;i++)〓{〓〓t=t*i;〓〓s=s+t;〓}〓printf("1!+2!+......+%d!=%d\n",n,s);}3.实验步骤步骤一:打开“MicrosoftVisualC++”软件,新建prog3.c文件,并输入程序代码,如图4-7所示。图4-7〓新建文件并输入程序代码步骤二:选择“编译”菜单命令对程序进行编译,如图4-8所示。图4-8〓编译程序步骤三:若编译有错误需要重新检查。若编译没有错误,可以执行程序。输入4,输出结果如图4-9所示。图4-9〓程序运行结果1步骤四:按任意键关闭当前窗口。再次输入5,输出结果如图4-10所示图4-10〓程序运行结果2按任意键关闭当前窗口,保存后关闭pro3.c文件。(四)调试程序41.实验要求输出n行以下图形:*********************2.程序代码prog4.c#include<stdio.h>main(){〓intn,i,j;〓printf("Inputn=");〓scanf("%d",&n);〓for(i=1;i<=n;i++)〓{〓〓for(j=1;j<=n-i;j++)〓〓〓printf("");//双引号里面有一个空格字符〓〓for(j=1;j<=i;j++)〓〓〓printf("*");〓〓printf("\n");〓}}3.实验步骤步骤一:打开“MicrosoftVisualC++”软件,新建prog4.c文件,并输入程序代码,如图4-11所示。图4-11〓新建文件并输入程序代码步骤二:选择“编译”菜单命令对程序进行编译,如图4-12所示。图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)VisualC++6.0。三、实验内容1.填空题下面程序是求n以内(包括n)能被3或7整除的所有自然数的倒数之和。运行结果如下:Entern:(输入提示)30<CR>(从键盘输入30,<CR>代表Enter键)s=1.226323请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:不得增行或删行,也不得更改程序的结构!程序如下:#include<stdio.h>main(){〓intn,i;〓doubles=0.0;〓printf("Entern:\n");〓scanf("%d",&n);〓for(i=1;__1__;i++)〓〓if(__2__)〓〓〓s+=__3__/i;〓printf("s=%f\n",s);}2.改错题下面给定的程序功能是:求的近似值,直到最后一项的绝对值小于指定的数为止。运行结果如下:Enterafloatnumber:(输入提示)0.0001<CR>(从键盘输入0.0001,<CR>代表Enter键)3.1414请改正程序中的两处错误,使程序能输出正确的结果。注意:程序中/************found************/表示错误就在下面一行。不得增行或删行,也不得更改程序的结构!程序如下:#include<math.h>#include<stdio.h>main(){〓ints;〓floatnum,pi,t,n;〓t=1;〓pi=0;〓n=1;〓s=1;〓printf("Enterafloatnumber:\n");〓scanf("%f",&num);〓/********found********/〓while(t>=num)〓{〓〓pi=pi+t;〓〓n=n+2;〓〓s=-s;〓〓/********found********/〓〓t=s%n;〓}〓pi=pi*4;〓printf("%6.4f\n",pi);}3.编程题w是一个大于10的无符号整数,若w是n(n≥2)位的整数,求出w后n-1位的数。部分源代码已经给出。例如,输入5923,则输出923。程序如下:#include<stdio.h>main(){〓/*将下面的代码补充完整*/}

实验三〓启发性实验一、实验目的(1)进一步掌握C程序的编辑、编译、连接和运行的过程。(2)熟悉循环结构的程序设计方法。(3)熟练使用循环嵌套的使用。二、实验设备和仪器(1)IBMPC或兼容计算机。(2)Windows9x/2000/XP操作系统。(3)VisualC++6.0。三、实验内容1.填空题统计所有小于等于20的素数的个数。运行结果如下:Theprimenumberbetween3to20:35711131719Thenumberofprimeis:7请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:程序中//是对问题的提示。不得增行或删行,也不得更改程序的结构!程序如下:#include<stdio.h>main(){〓intn=20,count=0;〓inti,j;〓printf("\nTheprimenumberbetween3to%d:\n",n);〓for(i=3;i<=n;i++)〓{〓〓for(___1___;j<i;j++)〓〓〓if(___2___)//判断是否整除〓〓〓〓break;〓〓if(___3___)//判断上面循环结束时,循环变量j的值〓〓{〓〓〓count++;〓〓〓printf(count%15"%5d":"\n%5d",i);〓〓}〓}〓printf("\nThenumberofprimeis:%d\n",count);}2.改错题从键盘输入m,计算如下公式的值:运行结果如下:2000<CR>(从键盘输入2000,<CR>代表Enter键)Theresultis0.000160请改正程序中的两处错误,使程序能输出正确的结果。注意:程序中/************found************/表示错误就在下面一行。不得增行或删行,也不得更改程序的结构!程序如下:#include<stdio.h>main(){〓intm,i,d;〓doubley=0;〓scanf("%d",&m);〓/************found************/〓for(i=100,i<=m,i+=100)〓{

温馨提示

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

评论

0/150

提交评论