




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第章4循环结构程序设计C语言主要提供了4种循环语句,包括while语句、do-while语句、for语句以及if和goto语句构成的循环。虽然各循环语句的格式不同,关键字不同,对循环条件判断的先后顺序不同,循环次数是否固定也有所不同,但循环控制是它们的共同点,都是由循环条件判断和循环体两部分组成,相互之间也可以进行转换。—2—4.1while循环4.2do-while循环4.3for循环目录CONTENTS4.4循环嵌套4.5goto语句4.6其他循环控制语句PARTwhile循环4.14.1while循环while循环语句的一般形式为:while(表达式)语句;/*循环体*/while循环—5—4.1while循环圆括号内的表达式是控制表达式,语句是循环体,循环体可以是一条简单的语句,也可以是多条语句组成的复合语句(用花括号括起来)。其执行流程如右图所示。语句表达式非00while循环语句的执行流程—6—4.1while循环执行该语句时,先计算表达式的值,如果它为真,则执行循环体;接着再次判定表达式的值,如果它仍为真,继续执行循环体,依此类推,直到表达式的值为假结束循环,执行while语句后的下一条语句。—7—4.1while循环【例4.1】计算从1到100的和。#include<stdio.h>intmain(){inti,sum;sum=0;i=1;while(i<=100){/*定义变量*//*赋初值*//*循环,当i>100时结束*/sum=sum+i;i=i+1;/*求和,将结果放入sum中*//*循环控制变量i加1*/}printf("1+2+3+...+99+100=%d",sum);return0;/*输出sum的值*/}—8—4.1while循环程序运行的结果为:1+2+3+…+99+100=5050(1)变量初始化描述要完整、准确。(2)在循环体中应有使循环趋向于结束的语句。注意—9—4.1while循环【例4.2】统计从键盘输入一行字符的个数。#include<stdio.h>intmain(){intn=0;printf("inputastring:\n");while(getchar()!='\n')/*初始化变量n*//*输出提示信息*//*循环输入字符,当输入回车时结束*//*n自加1*//*输出n的值*/n++;printf("%d",n);return0;}程序运行的结果为:inputastring:abcdef6—10—4.1while循环【例4.3】输出1~10中各个数的平方。#include<stdio.h>intmain(){intn=10;while(n){/*初始化变量*//*当n不为0时循环*/printf("%d",n*n);n--;/*输出n*n的值*//*n自减1*/}return0;}本例程序将执行10次循环,每执行一次,n值减1。循环体输出表达式n*n的值。程序运行的结果为:100816449362516941—11—4.1while循环【例4.4】使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10-4。提示格里高利公式求π:π/4=1-1/3+1/5-1/7+…#include<stdio.h>#include<math.h>intmain(){intdenominator=1,flag=1;doubleitem=1.0,pi=0;while(fabs(item)>=0.0001){/*初始化变量*//*当精度大于0.0001时循环*/item=flag*1.0/denominator;pi=pi+item;flag=-flag;/*计算每一项*//*累加*//*取反*/—12—4.1while循环denominator=denominator+2;/*底数加2*/}pi=pi*4;printf("pi=%f\n",pi);return0;/*求pi的值*//*输出pi的值*/}本例题while循环将计算精度作为循环执行条件,用flag变量作为正负标记。程序运行的结果为:pi=3.141793—13—PARTdo-while循环4.24.2do-while循环do-while语句的一般形式为:do语句;/*循环体*/while(表达式);do-while循环—15—4.2do-while循环这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。其执行过程如右图所示。语句表达式非00do-while语句的执行流程—16—4.2do-while循环【例4.5】求nn!123...。#include<stdio.h>intmain(){inti=1,s=1,n;printf("pleaseinputn:");scanf("%d",&n);do{/*定义及初始化变量*//*输出提示语*//*输入n的值*//*开始循环*/s=s*i;i++;/*计算阶乘*//*i自加1*//*当i<=n成立时循环*//*输出*/}while(i<=n);printf("%d!=%d\n",n,s);return0;}—17—4.2do-while循环程序运行的结果为:pleaseinputn:55!=120使用do-while循环语句时,如果循环体中有多条语句,必须采用复合语句的形式。do-while语句中,条件放在while后面的圆括号中,并且最后必须加上一个分号,这是很多初学者容易遗漏的。注意—18—4.2do-while循环while语句先进行循环条件的判断,再决定是否执行循环体;do-while语句则先执行一次循环体,再进行循环条件的判断决定是否继续循环。do-while语句至少要执行一次循环体,而while语句在第一次条件判断不成立时,则一次循环体都不执行。—19—4.2do-while循环因此,如果用这两种语句描述同一个循环功能时,当第一次判断循环条件表达式成立时,两种语句的执行结果完全一致,只有在第一次判断循环条件表达式不成立时,二者的执行结果才可能出现不同。因此,在编程时,要注意do-while语句的至少执行一次循环体的特点。—20—4.2do-while循环【例4.6】统计一个整数的位数。#include<stdio.h>intmain(){intcount=0,number;printf("Enteranumber:");scanf("%d",&number);if(number<0)/*定义及初始化变量*//*输出提示语*//*输入整数*//*如果输入的为负整数则取反*/number=-number;do{number=number/10;count++;/*number整除10,即去掉最低位*//*位数加1*//*number不为0时循环*//*输出位数*/}while(number!=0);printf("Itcontains%ddigits.\n",count);return0;}—21—4.2do-while循环程序运行的结果为:Enteranumber:456Itcontains3digits.—22—PARTfor循环4.34.3for循环在C语言中,除了可以用while和do-while语句实现循环外,还可以用for语句实现循环。其一般形式为:for(表达式1;表达式2;表达式3)语句;/*循环体*/for循环—24—4.3for循环for循环语句的执行流程,如右图所示。求解表达式11先求解表达式1。表达式202然后求解表达式2,若其值为真(非0),则执行for语句中指定的循环语句,然后执行第(3)步;若其值为假(0),则结束循环,转到第(5)步。非0语句3求解表达式3。求解表达式34返回到第(2)步继续执行。for语句的下一个语句5循环结束,执行for语句下面的语句。for循环语句的执行流程—25—4.3for循环for语句将控制循环的主要操作集中在循环语句开头的圆括号里。圆括号中的三个表达式的作用是:表达式1表达式2表达式3通常为关系表达式或逻辑表达式,用来判断是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环。一般被称为“步长”环变量的修改,该表达式是在每次循环体执行完以后、下一次循环条件判断之前执行的,使循环变量经过多次循环的累积而发生改变,最终因为不满足循环条件退出循环。,用于循通常为赋值表达式,实现循环控制变量的初始化,只执行一次。—26—4.3for循环【例4.7】编程计算1到49之内的奇数和。#include<stdio.h>intmain(){intsum=0,n;for(n=1;n<=49;n+=2)/*定义及初始化变量*//*循环,当n>49时结束,步长为2*//*累加*//*输出结果*/sum=sum+n;printf("sum=%d",sum);return0;}程序运行的结果为:sum=625—27—4.3for循环可将for循环语句改写为如下的while循环形式:表达式1;while(表达式2){语句;表达式3;}例如:for(i=1;i<=100;i++)sum=sum+i;相当于:i=1;while(i<=100){sum=sum+i;i++;}—28—4.3for循环因此,可以将例4.7用while语句进行改写如下:#include<stdio.h>intmain(){intsum=0,n;n=1;while(n<=49){/*定义及初始化变量*//*n的初值为1*//*循环,当n>49时结束*/sum=sum+n;n+=2;/*累加*//*步长为2*/}printf("sum=%d",sum);return0;/*输出结果*/}—29—4.3for循环使用for循环语句时,我们必须注意以下几个问题:for循环中的“表达式1”“表达式2”和“表达式3”都是可选项,即可以缺省,但表达式之间的分号“;”绝对不能缺省。省略“表达式1”,表示不对循环控制变量赋初值。0102—30—4.3for循环例如:省略“表达式2”,表示不用判断循环条件是否成立,循环条件总是满足的,则如果不做其他处理,便成了死循环。for(i=1;;i++)sum=sum+i;相当于:03i=1;while(1){sum=sum+i;i++;}—31—4.3for循环例如:省略“表达式3”,则不对循环控制变量进行操作,这时可在循环体中加入修改循环控制变量的语句。for(i=1;i<=100;){04sum=sum+i;i++;}—32—4.3for循环例如:for(;;)05省略3个表达式。相当于:while(1)—33—4.3for循环表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。例如:06for(i=0,j=100;i<=100;i++,jk=i+j;--)—34—4.3for循环【例4.8】含有逗号表达式的for语句。#include<stdio.h>intmain(){inti,j;for(i=1,j=1;i<=10||j<30;i++,j+=4)/*定义变量*//*循环判断*//*输出i*j的值*/printf("%d",i*j);return0;}程序运行的结果为:110275285126175232297370—35—4.3for循环表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非零,就执行循环体。07—36—4.3for循环【例4.9】将用户输入的字符全部显示出来,直到用户输入回车为止。#include<stdio.h>intmain(){charc;for(;(c=getchar())!='\n';)/*定义变量*//*当输入不是回车时循环*/printf("%c",c);/*输出字符c*/return0;}程序运行的结果为:asdfghjkl,123asdfghjkl,123—37—PART循环嵌套4.44.4循环嵌套一个循环语句的循环体内包含另一个完整的循环结构,称为循环的嵌套。嵌在循环体内的循环称为内循环,嵌有内循环的循环称为外循环。内嵌的循环中还可以嵌套循环,这就是多重循环。—39—2do-while循环number=number/10;循环体包括整个内循环及退出内循环后执行2*1=22*2=4循环体包括整个内循环及退出内循环后执行函数的内容将会在第5章进行介绍,在此对其简loop:if(i>=1)#include<stdio.很多初学者容易遗漏的。当用户输入编号1~4时,显示相应通常为关系表达式或逻辑通常为赋值表达式,实现输入其他编号,显示价格为0。通常为赋值表达式,实现编程计算1到49之内的奇数和。4.4循环嵌套【例4.10】打印九九乘法表。程序可用for循环的嵌套来实现,用外循环控制被乘数i的变化,用内循环控制乘数j的变化,内循环的循环体计算i*j并输出结果。外循环的循环体包括整个内循环及退出内循环后执行的“printf("\n");”语句。—40—4.4循环嵌套#include<stdio.h>intmain(){inti,j;for(i=1;i<=9;i++){/*定义变量*//*外循环控制被乘数*/for(j=1;j<=9;j++)/*内循环控制乘数*//*输出结果*//*结束一个内循环后输出一个回车*/printf("%d*%d=%d",i,j,i*j);printf("\n");}return0;}程序运行的结果为:1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=92*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=18…9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81—41—4.4循环嵌套上述程序中,输出了很多多余项,可以通过修改程序去掉这些多余项,具体代码如下:#include<stdio.h>intmain(){inti,j;for(i=1;i<=9;i++){/*定义变量*//*外循环控制被乘数*/for(j=1;j<=i;j++)/*内循环控制乘数,乘数小于等于被乘数*/printf("%d*%d=%d",i,j,i*j);/*输出结果*//*结束一个内循环后输出一个回车*/printf("\n");}return0;}—42—4.4循环嵌套程序执行结果为:1*1=12*1=22*2=49*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81—43—4.4循环嵌套循环嵌套时应注意以下问题:01020304or循环、while循环和do-while循环可以相互嵌套,无论如何嵌套,都必须满足内循环完整地包含在外循环中,不能形成循环的交叉。嵌套循环的层数没有限制,但嵌套的层数太多,会消耗大量的内存空间,程序的可读性将变差。循环嵌套时,内外层循环不能使用相同的循环变量。为了使嵌套的层次关系清晰明了,易于阅读和纠错,建议采用缩进格式书写程序。—44—PARTgoto语句4.54.5goto语句goto语句是无条件转移语句,使用它可以使程序跳转到函数中任何有标号的语句处。标号是放置在语句开始处的标识符,并以一个冒号“:”作为后缀,其一般形式为:标识符:语句;goto语句的一般形式为:goto标识符;通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。—46—4.5goto语句【例4.11】用if语句和goto语句构成循环,求5!。#include<stdio.h>intmain(){inti=5,result=1;/*初始化变量*//*若i>=1求阶乘*/loop:if(i>=1){result*=i;i--;gotoloop;/*求乘积*//*i自减1*//*转向loop*/}printf("5!=%d\n",result);return0;/*输出结果*/}—47—4.5goto语句程序运行的结果为:5!=120(1)goto语句的跳转只能在函数内部,不能在不同的函数之间进行。函数的内容将会在第5章进行介绍,在此对其简单了解即可。(2)goto语句在早期编程语言中很常见,但在现在的C语言编程中却很少用到它了,这是因为它的大量使用会破坏程序的结构化,使程序的流程控制混乱,可读性降低,调试困难。提示—48—PART其他循环控制语句4.64.6其他循环控制语句4.6.1break语句在几种循环结构中,主要是在循环次数不能预先确定的情况下使用break语句,在循环体中增加一个分支结构,当某个条件成立时,由break语句退出循环体,从而结束循环过程。其一般形式为:break;—50—4.6其他循环控制语句4.6.1break语句【例4.12】求300以内能被19整除的最大数。#include<stdio.h>intmain(){intx;for(x=300;x>=1;x--)/*循环*/if(x%19==0)break;/*当x能被19整除时跳出循环*//*输出x的值*/printf("x=%d\n",x);return0;}在for语句中,当x能被19整除时,执行语句“break;”结束for循环语句;否则,进入下一次循环。程序运行结果为:x=285—51—4.6其他循环控制语句4.6.1break语句(1)break语句不能用于循环语句和switch语句之外的其他语句。提示(2)在多重循环的情况下,使用break语句时,仅退出包含break语句的那层循环体。—52—4.6其他循环控制语句4.6.1break语句【例4.13】假设自动售货机出售4种商品,薯片、爆米花、巧克力和可乐,售价分别是每份3.0,2.5,4.0和3.5元。在屏幕上显示以下菜单,用户可以连续查询商品的价格,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。当用户输入编号1~4时,显示相应商品的价格;输入0,退出查询;输入其他编号,显示价格为0。[1]Selectcrisps[2]Selectpopcorn[3]Selectchocolate[4]Selectcola[0]Exit—53—4.6其他循环控制语句4.6.1break语句#include<stdio.h>intmain(){intchoice,i;doubleprice;for(i=1;i<=5;i++){/*定义变量*//*循环5次*/printf("[1]Selectcrisps\n");printf("[2]Selectpopcorn\n");printf("[3]Selectchocolate\n");printf("[4]Selectcola\n");printf("[0]Exit\n");printf("Enterchoice:");scanf("%d",&choice);if(choice==0)break;/*输出提示信息*//*输入数据*//*当输入为0时跳出循环*/—54—4.6其他循环控制语句4.6.1break语句switch(choice)/*根据输入的数值决定price的取值*/{case1:price=3.0;break;case2:price=2.5;break;case3:price=4.0;break;case4:price=3.5;break;default:price=0.0;break;}printf("price=%0.1f\n",price);/*输出price的值*/}printf("Thanks\n");return0;/*输出提示信息*/}—55—4.6其他循环控制语句4.6.1break语句程序运行的结果为:[1]Selectcrisps[2]Selectpopcorn[3]Selectchocolate[4]Selectcola[0]ExitEnterchoice:1price=3.0[1]Selectcrisps[2]Selectpopcorn[3]Selectchocolate[4]Selectcola[0]ExitEnterchoice:0Thanks—56—4.6其他循环控制语句4.6.1break语句【例4.14】输入10个字符,分别统计出其中空格或回车、数字和其他字符的个数。#include<stdio.h>intmain(){intblank=0,digit=0,i,other=0;charch;printf("Enter10characters:");for(i=1;i<=10;i++){/*初始化变量*//*输出提示信息*//*循环10次*//*输入一个字符*//*判断字符*/ch=getchar();switch(ch){case'':case'\n':blank++;break;case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':digit++;break;/*如果为空格或回车,blank自加1*//*计算数字的个数*/—57—4.6其他循环控制语句4.6.1break语句default:other++;break;/*计算其他字符的个数*/}}printf("blank=%d,digit=%d,other=%d\n",b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险解除合同样本
- 修乡村道路合同样本
- 企业集体合同样本
- 买房委托中介合同样本
- 出水果合同标准文本
- 外科护理人员职业发展计划
- 出售工地防尘网合同范例
- 出口代理协议合同样本
- 产品展示合同样本
- 班主任如何引导班级舆论计划
- 2025年安徽合肥兴泰金融控股集团招聘笔试参考题库含答案解析
- 《道路交通安全法》课件完整版
- 加快形成农业新质生产力
- 施工现场应急救援知识
- 饲料行业业务员聘用合同范本
- 全国园地、林地、草地分等定级数据库规范1123
- 人工智能在教学动画设计中的应用与创新路径探究
- 护理中医新技术新项目
- VDA-6.3-2016过程审核检查表
- 【MOOC】普通地质学-西南石油大学 中国大学慕课MOOC答案
- 《医疗废物的处理》课件
评论
0/150
提交评论