说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

循环控制-C语言教程

HTML文档下载 WORD文档下载 PDF文档下载
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。

 

6.1 概述

循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。

1) 用goto语句和if语句构成循环;

2) 用while语句;

3) 用do-while语句;

4) 用for语句;

 

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

 

goto语句是一种无条件转移语句, 与BASIC中的goto语句相似。goto 语句的使用格式为:

     goto  语句标号;

其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。

goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。

【例6.1】用goto语句和if语句构成循环,

 

main(){        int i,sum=0;        i=1;loop:   if(i<=100)          {sum=sum+i;           i++;           goto loop;}         printf("%d\n",sum);}

6.3 while语句

while语句的一般形式为:

    while(表达式)语句

其中表达式是循环条件,语句为循环体。

    while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用下图表示。

 

【例6.2】用while语句求 。

用传统流程图和N-S结构流程图表示算法,见图:

 

main(){   int i,sum=0;   i=1;   while(i<=100)        {sum=sum+i;          i++;         }   printf("%d\n",sum);}

【例6.3】统计从键盘输入一行字符的个数。

 

#include <stdio.h>main(){    int n=0;    printf("input a string:\n");    while(getchar()!='\n') n++;    printf("%d",n);}

    本例程序中的循环条件为getchar()!='\n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。

使用while语句应注意以下几点:

1) while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。

【例6.4】

 

main(){    int a=0,n;    printf("\n input n:    ");    scanf("%d",&n);    while (n--)      printf("%d  ",a++*2);}

本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)。

2) 循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。

 

6.4 do-while语句

 

do-while语句的一般形式为:

        do

            语句

        while(表达式);

这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。其执行过程可用下图表示。

【例6.5】用do-while语句求 。

用传统流程图和N-S结构流程图表示算法,见图:

main(){   int i,sum=0;   i=1;   do        {sum=sum+i;          i++;         }while(i<=100)    printf("%d\n",sum);}

 同样当有许多语句参加循环时, 要用"{"和"}"把它们括起来。

【例6.6】while和do-while循环比较。

(1)

main(){int sum=0,i; scanf(“%d”,&i); while(i<=10)    {sum=sum+i;     i++;}printf(“sum=%d”,sum);}

(2)

main(){int sum=0,i; scanf(“%d”,&i); do   {sum=sum+i;    i++;}while(i<=10);printf(“sum=%d”,sum);}

6.5 for语句

在C语言中,for语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为:

        for(表达式1;表达式2;表达式3) 语句

它的执行过程如下:

1) 先求解表达式1。

2) 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。

3) 求解表达式3。

4) 转回上面第2)步继续执行。

5) 循环结束,执行for语句下面的一个语句。

其执行过程可用下图表示。

for语句最简单的应用形式也是最容易理解的形式如下:

for(循环变量赋初值;循环条件;循环变量增量) 语句

循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用“;”分开。

   例如:

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

   先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100时,结束循环。

相当于:

i=1;

while(i<=100)

    { sum=sum+i;

     i++;

}

对于for循环中语句的一般形式,就是如下的while循环形式:

表达式1;

while(表达式2)

    {语句

     表达式3;

}

注意:

1) for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。

2) 省略了“表达式1(循环变量赋初值)”, 表示不对循环控制变量赋初值。

3) 省略了“表达式2(循环条件)”, 则不做其它处理时便成为死循环。

例如:

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

相当于:

i=1;

while(1)

{sum=sum+i;

i++;}

4) 省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。

例如:

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

{sum=sum+i;

       i++;}

5) 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。

例如:

for(;i<=100;)

{sum=sum+i;

    i++;}

相当于:

while(i<=100)

{sum=sum+i;

i++;}

6) 3个表达式都可以省略。

例如:

for(;;)语句

相当于:

while(1)语句

7) 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。

例如:

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

8) 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。

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

或:

for(i=0,j=100;i<=100;i++,j--)k=i+j;

9) 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。

例如:

for(i=0;(c=getchar())!=’\n’;i+=c);

又如:

for(;(c=getchar())!=’\n’;)

printf(“%c”,c);

 

6.6 循环的嵌套

 

【例6.7】

 

main(){ int i, j, k; printf("i j k\n"); for (i=0; i<2; i++)    for(j=0; j<2; j++)       for(k=0; k<2; k++)           printf(“%d %d %d\n", i, j, k); }

6.7 几种循环的比较

 

1) 四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循环。

2) while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。

3) 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。

 

6.8 break和continue语句

 

6.8.1 break语句

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。break在switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。

当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。

【例6.8】

 

main(){   int i=0;   char c;   while(1)                 /*设置循环*/     {      c='\0';             /*变量赋初值*/      while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/        {         c=getch();         printf("%c\n", c);        }      if(c==27)         break;          /*判断若按Esc键则退出循环*/      i++;      printf("The No. is %d\n", i);      }    printf("The end"); }

 注意:

1) break语句对if-else的条件语句不起作用。

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

 

6.8.2 continue 语句

 

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其执行过程可用下图表示。

1) while(表达式1)

     { ……

       if(表达式2)break;

       ……

2) while(表达式1)

     { ……

       if(表达式2)continue;

       ……

}

 

【例6.9】

 

main(){  char c;  while(c!=13)      /*不是回车符则循环*/      {         c=getch();         if(c==0X1B)            continue; /*若按Esc键不输出便进行下次循环*/         printf("%c\n", c);       }}

6.9 程序举例

【例6.10】用 公式求π

N-S流程图:

#include<math.h>main(){  int s;  float n,t,pi;  t=1,pi=0;n=1.0;s=1;  while(fabs(t)>1e-6)      {pi=pi+t;       n=n+2;       s=-s;t=s/n;      }  pi=pi*4;         printf("pi=%10.6f\n",pi);  }

【例6.11】判断m是否素数。

N-S流程图:

#include<math.h>main(){int m,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)printf(“%d is a prime number\n”,m);elseprintf(“%d is not a prime number\n”,m);}

【例6.12】求100至200间的全部素数。

 

#include<math.h>main(){int m,i,k,n=0;for(m=101;m<=200;m=m+2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1){printf(“%d”,m);   n=n+1;}      if(n%n==0)printf(“\n”);}printf(“\n”);}

 

(本节完)

 

VMworld 2014 Day One:Docker、数据中心、混合云新举措 Docker和Kubernetes或将加速SDN发展 前端开发框架三剑客—AngularJS VS. Backone.js VS.Ember.js 【CTO俱乐部读书会】《流程的永恒之道》辛鹏:企业的本质就是流程运营 紧扣微信研发痛点 2014微信开发者大会吸引大量外地参会者 Mobile First!jQuery UI组件集Wijmo五年最大更新 首届TCL杯HTML5智能电视—应用开发大赛火热开启! MDCC智能硬件征集关键词:智能家居、机器人、健康生活 采集颜色、自动同步,还有比这更牛叉的儿童触控笔么? AppCan移动平台:为企业移动化进程加速 学生强则国强,访天猫推荐算法大赛Top 9团队 Mozilla与三星之子——Servo特性解读 360天巡启动公测 打造新一代企业级无线安全解决方案 继Storm和Spark之后,Hortonworks添加对Kafka的支持 一周消息树:国产操作系统最快10月发布,并支持应用商店 技术团队看板方法实践的难点分析 SAP云服务加速转型:调动资源瞄准中国市场 开发测试全承包!移动应用开发工具Telerik平台 火火火火火!看HomeKit如何改变物联网和智能家居? MDCC应用与工具关键词:平台、社交、垂直、解决方案 Leap Motion正式入华 将发布第二代软件SDK 120万操作/秒Redis Cloud 集群单一服务器非基准测试程序 2014微信开发者大会顺利结束 TOP10优秀微信开发商名单公布 【最佳实践】通过DevOps确保可靠和有效的信息安全 2048 Hello World:跨平台快速应用开发Python框架Kivy Forrester:关于私有云的10个事实 2014年8月操作系统份额:Win 8.x大涨,Linux继续下跌 0代码、不编程—交互式网页设计工具VXPLO 揭秘Instagram Hyperlapse背后的技术 【CTO俱乐部在线教育研讨会】用互联网技术深入创新教育产品 降低门槛!Hybrid应用开发框架LigerMobile 关于多台电脑的串口通信,请高手执教!!!!!!不够可以在加!!!! 各位大侠,我想用VB实现多线程,如何做?小弟在线急等,QQ:19671554 关于多台电脑的串口通信,请高手执教!!!!!!不够可以在加!!!! 各位大侠,我想用VB实现多线程,如何做?小弟在线急等,QQ:19671554 SimpleObjectBroker问题 我的报表需要打印"接下页" 猜字游戏 小弟载了一个教程,里面的文件扩展名是pdf的,请问要用什么软件打开啊? 求教一个简单的问题。关于打包。 在线等。在线等 关于函数 ASP.NET中操作EXCEL,为何添加操作可象操作ACCESS一样没问题,而删除和更改操作却出错?100*n分for your answer 求助:如何调出linux下kppp源代码? www.clpclub.com是不是不能上了? 如何制作登陆窗口? 关于中大型网站如何应用软件工程的问题 求救高手,如何使双硬盘同步写 请问怎样在用户点击(s)后将用户点击的软件自动安装到用户(c)的机器上 请问如何用网站提供的搜索引擎,知道查找关键字,我用的是WebBrowser1,100分呀 tomacat的配置问题?急 学过严蔚敏的〈数据结构(C语言版)〉的请进! 开发过nokia上运行程序的朋友,请进来,本人遇到一个非常麻烦的问题,欢迎各位赐教. 如何从字符串中提取单词? 谁知道那里有longhorn下载??? 100分请教实现播放列表的思路? 有关图形化公交车线路的问题!! 关于网站软件工程的问题 我的sqlserver 2000 在安装的时竟然说什么不支持??? 免费ASP空间申请 有关用Firework作网页模板的问题-急! 大虾请指点~~!!~~ 如何固定游戏中的分辨率? 今天见到了蓝心MM,估计她是CSDN有史以来最PL的MM。 也来贴一篇!!!送给大学毕业几年的哥们!(转) 急:关于weblogic的控制台 ? 请问各位:哪里有好的javascript的教程? 小问题 请问在哪里可以找到监控局域网的网络流量的工具,不够再加? 免费ASP空间申请 白羊座的进来领分,水园里白羊座好像很少。。。。 ie无法编译jsp? 300分!求《程序员增值合订本》上册中的"完全掌握TCppWebBrowser控件"内容! Google搜索从入门到精通(散分) 由于工作需要,将要转到Linux平台,请问那位知道有什么好的SQL Client在Linux下? 由于工作需要,将要转到Linux平台,请问那位知道有什么好的SQL Client在Linux下? 你是怎么过的?CSDN无高人?:( 找asp.net入门经典!一定是C#写的!!!在线等! 菜鸟的关于DataGrid的问题 资源管理器中选中的多个文件怎样传给我的程序 什么是“三层数据库”和“嵌入式软件系统”? 什么是“三层数据库”和“嵌入式软件系统”? 类似"hello world"的简单问题,求教 工程制图题求解答,完成平面立体的三面投影,完成平面立体的三面投影完成平面立体及表面上点的三面投影 同质量稀硫酸中放入不同质量的铝和镁,置换出等质量氢气,则烧杯两边是否质量相同 帮我找3篇700字的作文 写人写事的.别胡给我粘贴过来一堆 只有在酸碱盐之间发生的反应叫做复分解反应.那为什么酸+金属氧化物=盐+水 也是? AQ代表什么呢? You are walking on air 求易错解的成语求容易解释错的成语(病句中常出)例如,目无全牛,表面象盲人摸象似的成语,实质指技术精练. AQ a什么意思 以‘’感恩‘’为话题的 700字作文 20个高中易错成语解释并造句 【化学】FeS中S的化合价为多少FeS中S的化合价为多少 以感恩为话题700字作文 男人的肉密度大,女人的肉密度小,相同重量,女人看上去要比男的胖一圈, 尖利什么意思? 字母旋转矩阵!求高手!C语言编写……给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A 能量高的和能量低的哪个燃烧热高一些? 请用自己的语言回答. 英语翻译不要太生硬,CaraDillo唱的 放出的热量比燃烧热大吗一个物质的燃烧热与他实际的放出热量相比哪个大? I _____(have)a shower yesterday.用所给单词的适当形式填空. 英语翻译I wait inside ,I was not myselfI was fool inside and eling form You stand outside ,your hand on my shoulderbut this moment that day between usI walk walk along no matter whether people know at allI walk walk along and keep my sad that in 新托福的相关复习问题我去年3月开始准备托福,6级就480.那时还没毕业,边上课边折腾了2个月,后来因为课程实在很多,就暂时搁置了.去年裸考了下,阅读23,听力12,口语18,作文22.今年过完年把单词 -why didn't you answer my phone call yesterday evening?-oh,sorry.I_____(have)a shower and didn't hear the call 氨的氧化反应为什么是放热反应 密度符号ρ是读漏还是读肉?我们老湿是读作漏的. 新人复习托福有经验者请进我没复习考了一次雅思看情况,现在要转战托福IBT.怎么复习,什么资料要买,什么计划表复习表什么的,懵懵懂懂~希望考过的经验人士能给写点意见建议什么的!没有考 c语言中解决一行电文中将第一个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母不变.要求编程序将密码译回原文,并输出密码和原文.A-Z a-zB-Y b-y. 氧化性的漂白原理? 很有意思,大家来看看.3只小猫3天抓3只老鼠,那么要在10天里抓10只老鼠需要多少只小猫? 关于托福考试时间和复习问题 有经验的来 本人现大三 大四要去美国交流 最好考托或G,我觉得G短时间准备太难,就决定考托.现情况如下:我四级600+,六级600不到一点,过了高级口译笔试(口试 蛋白质的化学组成:(C、H、O、N、S) 小学一年级语文练习册52页怎么作 如何提高边际利润率 元素强氧化性和漂白性两者有什么联系?为什么说是强氧化性的物质有漂白性?里面的原理是什么? 小学一年级常用的课外练习册有哪些? 关于边际转换率为什么边际转换率还可以表示为 X的边际成本/Y的边际成本,(跟机会成本有关).谁能解释一下.请别粘贴我说的是MC,怎么解释 KMn O 4与S O 2反应化学方程式? 锋利无比的意思 陈甘棠主编的化学反应工程第三版答案 F e S 与K O H 是否反应? 锋利如初意思 滥用抗生素会从哪些途径促进细菌耐药性的增强 你应该往汤里加些盐,汤更好喝的 You should ____ some _____ ____ the soup ,the soup will be more ____ 锋利如初的意思 两个月复习托福能到105分吗?我四级560 六级540 在新东方上了半个月的强化班,还有两个月考托福心里没底,想问问考过的人,我这个水平,努力复习两个月能考出105分吗? 以下四种物质漂白原理与其他三种不同的是?A.SO2 B.Na2O2 C.O3 D.HClO 密度单位rou读第几声?怎么一二三四声的都有! 还有两个月托福,如何复习?我现在的情况大致是这样的:已经对于题型有了充分了解了,但是对于阅读和听力正确率不是特别高,最好也就26.27分,一般就20出头.有什么其他好的材料?听力方面用 "因为大一新生马上就要入学了,我要做好帮助迎接新生的工作"用英语怎么说? rou 密度单位 怎么打啊 固醇的作用 我是英语翻译的大一新生,可是我想当英语教师,那我需要转到英语师范去么?还是继续读英语翻译再去考教师资格证呢? 一个正方形周长是36厘米,它的面积是多少 走过那个拐角作文800字拜托各位了 3Q 大一新生怎样考相关的英语证书,还有我是电气的可以提前考哪些证书 有什么最快学会自行车的办法? 求《走过那个拐角作文》~3Q~ 能不能发给我一份啊 我是大一新生刚学这个……就是关于C语言的编译系统的文件 铝与镁在相同时间内产生的氢气谁多 walk on 埃及前总统穆尔西将受审 拒绝审判无人金华00后女生溜冰场结识男子 旷课5迈克尔杰克逊私人医生刑满出狱 欲再获55岁女子带出骗婚小团队 8个男人相拆反美海报 伊朗要与美国和好?国家公务员考试报名审查结束 浙江8万浙江省质监局:8家桶装水企业连续两次金华8890便民平台开通首日呼入电话安倍窜访土耳其 搅局土中军购“抗衡中国说”凸现安倍“同盟困境”奥巴马医改网站承包商高管是第一夫人同斯诺登曝美国一月内监听西班牙6000英国发生强烈暴风雨天气已致4死 逾6“手机门”困扰德美关系法国总统称新加坡是“战略伙伴”德黑兰“敏感时刻”撤下街头反美海报 波兰前总理在华沙去世 被赞波兰史上最美国政府“秋后”问责 摩根大通掏钱“日抗议中国海警船巡航钓鱼岛 遭驻日公美议员称监听欧洲是“救命”中国将带动全球天然气需求增长孙晋芳卸任江苏省体育局党组书记男子QQ上冒充女大学生爸爸行骗 被揭持假身份证上网 还在网吧偷钱合肥市三十头社区用真情帮扶困难群众两人骑车去偷车 遇上民警丢下车图解考试招生改革“五大任务”专家:乌克兰民间武装海陆控制能力有重“让历史永远铭记” 人民网记者赴菲寻可可西里卓乃湖近4万只藏羚羊产仔 幼中国大使:中比铭记历史 共建明日世界中国中药企业在美国开张阿莱格里称错过法尔考不遗憾 欧冠首要杜文龙:俄若真对乌出兵 用不了两周就汤普森:不担心全队进攻 我们的天赋足信威通信灵巧通信试验卫星发射成功图解高考招生改革方案云南普洱市政协副主席张丽菊涉嫌受贿被严查购物店 台湾“交通部长”:税收增遏止旅游团购物乱象 台湾“交通部长”台北市长参选人柯文哲到南门市场拜票浙江试点失业预警机制
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘