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

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

 

(本节完)

 

在Access数据库中实现密码管理的另一种方式 -VB资料 在VB6.0中使ACCESS数据库在网络使用中保持同步 在VB中更改SQL Server数据库结构 在VB中兼容非ACCESS数据库的技巧 在VB中引用dbf及索引文件 在VB中运行Microsoft Access报表的好方法 在VB中直接用ODBC API访问数据库 在数据库应用中, 经常要动态生成 Select 语句,典型的情况:-VB资料 在运行时修改DataEnvironment的连接字符串-VB资料 在抓取資料庫之資料前先計算資料總筆數 -VB资料 增加 MsFlexGrid 的编辑功能-VB资料 真正删除数据库的记录 -VB资料 用VB制作屏幕保护程序 VB多媒体程序设计 VB设计动画时钟 VB游戏写作技巧(1)秀图篇 VB游戏写作技巧(2)网络篇 VB中播放WAV文件 VB中播放三维动画编程一例 Visual Basic 5.0多媒体创作技巧 Visual Basic 5.0中实现视频画中画 Visual Basic 中制作流水灯 Visual Basic动画编程技术 Visual Basic环境下Video/ Audio压缩数据流播放技术 Visual Basic设计多媒体应用程序 Visual Basic影音控制 Web动画图像分解在VB动画设计中的应用 播放 .flc 动画 -VB资料 播放 AVI -VB资料 播放MP3文件 -VB资料 播放背景音乐 -VB资料 这个UDL文件错在哪? 推荐一篇文章《麦子的颜色》 大家来灌水. vc service pack? 关于聊天室的界面 c++库函数的头文件有.h和没有有什么区别?为什么c++的库函数在VC很多不能用,怎么办? 可以在dll里面放SDI框架并调用吗? MIDAS中,怎样通过Client.exe生成MS Sql2000数据库?(就像《管家婆》那样,运行一次客户端,输入数据库的名称,就会自动在SQL Server2000 如何查找一个对话框的owner窗口? 我应该选择VC还是C#??? 在系统启动时至少有一个服务或驱动程序产生错误,详细信息,请使用事件查看器查看事件日志 操作系统是如何发现新插入的设备的? 关于对Com1,Com2读取条形码的编程 帮个忙,先,谢了! 接着那个堆栈问题,创建了,试验了。但应用时出现了对创建错误? 我想在对话框上输出一个char数组,用什么方法比较好????????????? 怎样移动较大副图片的时候避免或者尽量减少闪动? 怎么把网络编程和数据库联系起来 如何贴背景透明的按钮?急,急,在线等待!!! 奇怪了! 请问如何获得居于网中一个工作组下的所有计算机?? 还是一个dll内部变量的问题。 怎么回事? 送分! 大家看看 请问MSDN的帮助怎么获得 怎么样获得一同名text表单域的值? **C++语言的设计和演化** 图书好贵呀!!! 求表达式正确与否的校验算法 怎样控制DllMain?在哪里可以编辑这个函数? 同一个句柄对于所有进程是否一样? 我的red hat linux8 怎么才能配置声卡 如何判断一个字符串是否是常数 《Java与模式》一书已经出版 --- 作者 各为高手,如何能够看到我打开网页的session的值 关于 Geforce256 的问题. 一定给分!数据库查询问题 solaris下有没有用过syslog编程的? 推荐个好点的flash的控件吧 数据库中的Currency类型字段 初学pb8请指教!多谢! 如何让richtextbox支持语法高亮显示 请问rtsp是什么协议? 函数返回临时指针到底如何处理较好? 原来在bcb4下的程序为什么在BCB6下运行出错? 我是新手 如何用代码关闭显示器和硬盘??????? 如何打印PictureBox中的所有内容,分不够可以再加 问一下大家的下载和注册的比率好吗? 我的IE怎么了? 这是我第二天的C#学习笔记,敬请高手指教 如图,A,B表示两个厂库,要在A,B一侧的河岸边建筑一个码头,使它到两个厂库的距离相等,码头应建筑在什么位置(图片中的红笔画的是我研究时画的,可以忽视这红线) we are not fit in with each other帮忙翻译 太阳轨道旁出现千艘地球大小的飞船是真的吗别乱说些不关这问题的话那你们说他为什么不会被太阳给消灭吖、又不会被引力给吸进去呢 卡尺怎么应用 what was your mother doing when I ----(phone)you yesterday?并翻译 Chinese currency is issued in the following denominations什么意思? 一条大河上有A、B两个码头……一条大河上有A、B两个码头,A在B的上游50千米处,客船、货船分别从A、B两码头同时出发向上游行驶,两船的静水速度相同且始终保持不变.客船出发时有一物品从 how long did you write to your e-friend yesterday?译 Lucy told me happily that she___to Hong Kong for her holiday with her parents the next weekA.WENTB.WOULD GO C.IS GOING TO D.HAD GONE 卡尺怎么使用,谢谢了 七大洲平均海拔都是多少? 欢迎远道而来的朋友(名句) 如何正确使用卡尺 七大洲哪个海拔最高有喜马拉雅山 海拔就高啊 顾明常于同学闹矛盾,因此没有朋友.我们可以用“( ),( )”这句俗语来劝他与大家和睦相处请勿抄袭别人已经传电脑上的答案 数显卡尺第一次使用时候,要按下ORIGIN是什么意思?使用的是日本三丰的量具,新买的卡尺上面就挂着一块牌子这样特别说明:第一次使用该卡尺时的动作步骤, Though having lived abroad for years,many Chinese still ______ the traditioA.perform B.possess C.observe D.support为什么 简单的英语两人对话每人十到二十句左右, 寒假的英文单词是什么 世界七大洲中,平均海拔最高的是什么给出四个选项,请尽快回答A.亚洲 B.非洲 C.南极洲 D.北美洲 法语名词复数的s读不读出来?有什么规律? 用英语表示寒假这个单词 七大洲平均海拔. 法语名词变复数des chinois 和des Chinoises 有什么不同北外的法语第一册P107页,des chinois 和des Chinoises 到底有什么不同?不是以s结尾,复数形式不变嘛?不明白怎么有俩个形式,是不是二者一样? I go to Hong Kong by plane是否等于 I fly to Hong KONG为什么? 英语翻译星期六的晚上,我独自完成了我的家庭作业.因为星期天我要去奶奶家跟她一起玩3个小时.奶奶很喜欢吃蛋糕.所以我买了两块蛋糕.妈妈开心的对我说:“你会让奶奶感到高兴的.”奶奶 Mao Zedong ____for many years ,but he still lives in the hearts of Chinese people.A.died B.had died C.has been died D.has been dead ,为什么? will he go to Hong Kong by plane or by train?改为同义句will he fly to Hong Kong or (take/taking) a train?who is the first person that (eat/eating) cakes? Did you ( ) your room yesterday?A .clean B.cleaned 这个是选择A还是B?为什么? 30.This machine, ______for many years, is still working perfectly. A. after which I have looked B. which I have looked after C. that I have looked after D. I have looked after 为什么A不对 和B不一样吗 世界上有七大洲 是那七个 英语翻译­when you realize thatsomeone is very important to you please tell her ( or him) that youmatters to me! the machine-,( )for many years,is still walking perfectlyA; after which i have looked B;which i have looked after为什么是选b不是a呢?还有一题the secretary asked her boss whether he had anything more-( )before she went back home?A;to type 世界上有哪七大洲? Did your parents help you clean your room?有无错误.十分钟内急求.Did your parents help you clean your room?No,them didn't. 古人认为昼夜交替现象是怎么形成的? 世界七大洲是哪些? 最好别和我说话 翻译英文, what fun we have (chat) with each other during lunchtime,这里的chat 是用动名词形式吗 翻译学什么语言好 I have been corresponding ___ him for many years.填一个介词 _____________(study) volcanoes for many years,I am still amazed ___ its beauty as well ___ itspotential to cause great damage. 翻译要学哪些语言 Have you been corresponding with him?这句话是什么时态?什么用法呢? Though having lived abroad for years,many Chinese still___the traditional customsA perform B possess C observe D support 英语寒假计划按照星期的旅游计划, 世界上有七大洲,分别是:写七个. 七年级英语改写句子:He watched too much TV last week.(保持句意基本不变)He watched TV for ______ ______ last week. 请你用英语来写写自己的寒假计划! 生物的分类依据是什么 He failed to pass the text last week.(句意不变)He_____ _____ ______pass the text last weekHe_____ _____ ______pass the text last week 世界七大洲是那几个 生物的分类是以生物的————,————以及生物之间的————依据进行分类的. 根据句意补全单词:Last week I went to that place m___.还有:Have you ever b__ to Hainan?(这个帮我讲解一下)I have been to the a__.I saw many kinds of fishes.He decided that the best way to do this was to become a flight a__.The p__ 带“树”字的成语 双色叶树种是有哪些 修改病句:爷爷已70多岁了,但精力仍很充足. 如图所示,在河L的同侧有A,B两个村庄,现要在河边建一个货运码头,使该码头到两村的距离相等,问:码头应建在何处?请在图中找出码头的位置. 新叶有色树种有那些这个是我们观赏树木课要用的. 丁大爷今年70岁了
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘