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

循环控制-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”);}

 

(本节完)

 

共享软件营销:如何将你的产品推向海外 谷歌使用Debian Linux作为GCE的默认操作系统 大数据?别唬人了!我们真的需要盲目烧钱追求大数据吗? 日本社交手游公司GREE巨星陨落 中国区全员被裁 战歌:85后手游开发团队背后的故事 分秒钟做款App:细数国内外在线DIY应用网站 指点传媒CEO专访:紧握二三线市场用户命脉 专访Waygo创始人:白切鸡怎么翻译? 探究共享软件海外营销新策略(西安站) 讲师秀8:车音网沈康麒和他的智能驾车服务 数据可视化独领风骚:看这6家初创公司如何玩转大数据? 最新研究显示:IE10防恶意软件能力比Chrome等浏览器都要强 Windows Blue正式定名Windows 8.1 对Windows 8及RT用户免费 Testin云测试破1000万次 自动化测试成趋势 接手Android后首次接受媒体采访 Sundar Pichai谈Android未来 C语言实现二分法查找 让开发者高效编程的10个新框架 Google Analytics中显示访客停留时间为“0”的秘密 大数据之惑 麻省理工三位物理学家自建数据库服务Cloudant 融资1200万美元 网页浏览器进入再造新时代 AMD揭露HSA运算架构新技术hUMA细节 美团悄然上线云主机服务:与亚马逊殊途同归,还是另有谋划? 微软发布deep-tech团队招募令,期望获得下一代开发者的支持 2013谷歌I/O开发者大会:发布多个软件产品和服务 C语言实现二分法求解方程 开发测试云与虚拟化解决方案 学苹果?微软淘汰Points支付系统改用Gift cards 甲骨文改变Java版本号命名方式 [CTO俱乐部第97期]中科院、腾讯、深圳明源研发团队管理经验分享 Android Studio来了,它能取代Eclipse吗? 请教零长度问题(不好意思没分了救命啊) 高分寻求jtest4.5的破解 或注册方法 关于批量删除不同目录下相同文件的问题。 如何在VFP中运行VFP代码? 如何调用chm帮助文件? iptables问题 请教零长度问题(不好意思没分了救命啊) 大家來討論工作的問題 能用c语言编有关网络的程序吗?谢谢大侠们了:) 要在程序中控制在DBCHART显示不同颜色部分的内容及数值,如'34 丰田',来者有分? 提个建议:在祝福 璇玑大力 的贴子中,有不少的“名句妙词”,我们花点时间,搜集于一贴,同意的举手!(我的分数太紧张) 低级问题:如何把TFileStream中的一个字节读到一个byte变量中? 串口编程问题 jsp+mysql用的的resin服务器,运行一段时间,网站访问速度就很慢了,一般会是什么原因引起的呢? 两个字符串,前面是任意字符,后面必须是数字,怎么验证这两个字符串前面的字符是否一样? 怎么才能不关?? 祝大家中秋节快乐,进来帮小妹一把!关于JavaMail收邮件的问题! 一段列表筐代码不知道能不能短一些(请高手帮忙) 一个关于安装控件的问题? 请教SNMP的命令? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 如何在formload时就确定TabControl1显示第3页?菜鸟提问 css的问题,如何使字体大一点??? 紧急求救 datagrid选中的颜色(我重新画了一个datagrid,设置颜色) 在access中如何控制查询 avg(某字段)的小数位数,比如要两位小数 如何起死回生 一道题目 做文件上传系统时,当上传较大容量的文件时如大于2M的文件时出差,请问是什么问题? 请教一个insert into select...语句的问题! 简单的问题,取出头n条记录的select语句怎么写? 谁可以介绍一下关于HMM(隐马可尔夫模型)方面的资料? 在windows2003下能上网,不能下载东西,为什么? strtolower 的问题 各位大侠谁知道,哪里能下到LEI或ESB? 在LotusScript中如何输出到控制台? 各位中秋节快乐! 怎样不通过post传输方式传输数据(肯定给分) eMvb中的image和picture控件怎么插入不了图片啊。。。。 有关路径问题 在jsp中的 文件是否存在file.exists()的监测和打开这个文件的疑惑 中秋节了,睡个好觉吧 怎样合并字符串? SQL SERVER 2000为什么安装不了! ■■■■■■十万火急。。公司里,急需给全体员工的一份中秋贺信,谁帮我找一分,拜托了! 關于數據庫系統表的說明和pb本身的自主創建的四個系統表的相關細節 关于App.path的丢失 如何动态设置cedit中可输入数据的长度呢 关于用c读取文件 我有一个内网,怎么使外网能访问内网的网页. 我靠,JBuilder 9怎么就那么那么那么那么那么那么那么那么慢啊??? 更那堪冷落 仲秋节!今宵酒醒何处?杨柳岸晓风员残月。 每个时期的蝉都能吃吗 台胞证号码后面括号里的英文字母是什么意思啊?比如证号为0086582105(B),前8位为编号,05 表示第5次领证,但后面括号里的B哪?有的括号里还是D、35,又代表什么啊? gear box 德文是什么?gearbox的中文意思是齿轮箱或者变速箱 有木有入手GEAR FIT的朋友?三星GEAR FIT比GEAR 2好在哪?有什么亮点呢? this is also common for pupils themselves to form their own bands.求翻译 决战斯大林格勒 STALINGRAD怎么样 斯大林格勒的少年英雄 THE BOY FROM STALINGRAD怎么样 There will be smaller and smaller (f ) in the future. 迈进英语 怎么迈进英语的门槛.英语都像我的死穴一样,总是学不进去.我学其他的东西还是挺快啊但对英语就是一窍不通!我服了.很想学好,但都不知道从哪下手.迷茫啊……求过来人分享下 英语翻译把迈进翻译成英文真是麻烦 我也不知道那3个翻译的准确 土叙战机再次相会教皇被爆长期遭美监听 意大利梵蒂冈 高失业率威胁欧洲健康奥巴马豪华座驾“野兽”细节曝光纽约规定21岁以下禁买烟谷歌雅虎数据遭美NSA窃取 美媒称超加拿大首设比特币自动提款机普京登顶权力榜刺痛美国 美俄反应冰火日本今日起举行大规模\"夺岛\"演习德清三位工人井底昏倒 民警冒死相救杭州六旬大伯住院期间扇护士耳光赔偿2宁波超5万辆汽车因台风遭殃 汽车被淹部分银行又喊“季末钱紧” 未来政策仍两性:侧卧姿势省力 60岁性爱有技巧不妥善解决人质事件 会继续影响港菲关东莞市委原副秘书长 吴湛辉在广州受审北京一商场起火 两消防员牺牲两性养生:女人50岁后性欲可能更强连胜背后的致命隐忧 场均20失误国奥余姚籍消防战士鄞州执勤排涝 重灾区待普兰德利:平丹麦有点幸运 巴神发烧了7名“油老鼠”磁县打孔盗油300余吨帝国的黎明重生之征战岁月扬威异域之东方大公爵网游之三国狂想网游之近战法师无限之军火狂人异界大科学家超级空骑网游之重现神话地道战之一代功枭异界东方龙西沙群岛旅游贺州旅游南平旅游琼海旅游忻州旅游廊坊旅游九份旅游黄姚旅游自贡旅游泸定旅游玛旁雍错旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘