C 程序设计教程(16)—— 循环结构程序设计
创始人
2024-05-10 10:01:49
0

C 程序设计教程(16)—— 循环结构程序设计

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(16)—— 循环结构程序设计
    • 一、while 循环
    • 二、do - while 循环
    • 三、for 循环
    • 四、break 与 continue 语句
        • 1、break 语句
        • 2、continue 语句
    • 五、循环的嵌套

循环结构是结构化程序中的三种基本结构之一,和顺序结构、选择结构共同作为这种复杂程序的基本构造单元。

一、while 循环

while 循环的语法格式如下:

while (表达式)
{循环体}

while 循环的执行过程如下:

(1)计算 while 后括号内的表达式的值,当它的值为非 0 时,执行步骤(2),否则退出循环。

(2)执行循环体。然后执行步骤(1)。

while 循环的特点是先计算表达式的值,然后根据表达式的决定是否执行循环体中的语句。如果表达式的值一开始就为 “假”,则循环一次也不执行。例如:

int i=3;
while (i<3){printf("i=%d",i);
}

其中,printf 函数是while 循环的循环体,但是一次也不执行,因为循环一开始,while 后面的表达式就不成立。

例如:求 1+2+3+……+100 的结果

程序如下:

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

以上程序的执行结果为:

在这里插入图片描述

例如:用公式 π/4=1-1/3+1/5-1/7+1/9-……求 π 的值,直到最后一项的绝对值小于 10^(-4)为止。

程序如下:

#include
#include
int main() 
{int i=1;float pi=0,t=1,s=1;while (fabs(t)>1e-4){pi+=t;i+=2;s=-s;t=s/i;}pi=4*pi;printf("pi=%f\n",pi);return 0;
}

以上程序的执行结果为:

在这里插入图片描述

二、do - while 循环

do-while语句构成的循环称为 “直到型循环”,语法格式如下:

do
{循环体
} while (表达式);

其中,“表达式” 称为循环条件。循环执行的过程如下:

(1)执行 do 后面的循环体。

(2)计算机 while 后面的表达式的值,如果为 “真” 则继续执行循环体,如果 “表达式” 的值为假,则退出循环结构。

例如:计算 1 + 1/2 + 1/3 + 1/4 +…… + 1/50。程序如下:

#include
int main() 
{int i=2;float sum=1; do{sum=sum+1.0/i;i++;} while (i<=50);printf("sum=%f\n",sum);return 0;
}

以上程序的执行结果为:

在这里插入图片描述

三、for 循环

for 循环的语法格式如下:

for(表达式1; 表达式2; 表达式3){循环体;
}

for 循环的执行过程为:

(1)计算 “表达式1”。

(2)计算 “表达式2”,如果值为真(非0),执行循环体,否则退出循环。

(3)计算 “表达式3”,然后转向步骤(2)。

说明:

(1)for 循环的执行方式和 while 循环类似。for 循环与 while 循环相比,在格式上显得更紧凑。for 循环的形式可以改写为 while 循环的形式。

表达式1;
while (表达式2){循环体;表达式3;
}

(2)for 循环的【表达式1】可以写在 for 循环之前,此时,for 语句中有两个表达式,但【表达式2】之前的分号不能省略。即:

表达式1;
for(; 表达式2; 表达式3){循环体;
}

例如:

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

以上程序可以写成如下格式:

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

(3)如果省略【表达式2】,即不在【表达式2】的位置判断循环条件,将形成死循环。此时,应该在循环体中设置退出循环的机制。例如:

#include
int main() 
{int i,sum=0;for(i=1;;i++){if(i>100) break;sum+=i;		}printf("sum=%d\n",sum);return 0;
}

(4) 如果省略【表达式3】,即不在此位置进行循环变量的修改,则应该在循环体中编写使循环趋向于结束的语句。例如:

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

(5)可以省略【表达式1】和【表达式3】,仅有【表达式2】。例如:

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

(6)for 语句中的【表达式1】、【表达式2】或【表达式3】都可以省略,甚至三个表达式可以同时省略,但是分号不能省略。例如:

#include
int main() 
{int i=1,sum=0;for(;;){if(i>100) break;sum+=i;		i++;}printf("sum=%d\n",sum);return 0;
}

(7)使用逗号表达式表示【表达式1】和【表达式3】可以使 for 语句更简洁。例如:

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

(8)【表达式2】一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值为非 0,就执行循环体。例如:

#include
int main() 
{char ch;for(;ch=getchar()!='\n';);printf("ch=%c\n",ch);return 0;
}

例1:求斐波那契数列 1,1,2,3,5,8,…的前40项,公式如下:

fn=1 (n=1)
fn=1 (n=2)
fn=f(n-1)+f(n-2) (n>2)

程序如下:

#include
int main() 
{long f1=1,f2=1,f;int i;printf("%12ld%12ld",f1,f2);for(i=3;i<=40;i++){f=f1+f2;printf("%12ld",f);if (i%4==0) printf("\n");f1=f2;f2=f;}	return 0;
}

以上程序的执行结果为:

在这里插入图片描述

例2:任意输入一个正整数,判断是否为素数。

程序如下:

#include
#include
int main() 
{int x,i,w=1;printf("请输入一个正整数:");scanf("%d",&x);if(x<1) printf("输入数据非法\n");for (i=2;i

以上程序的执行结果为:

在这里插入图片描述

四、break 与 continue 语句

1、break 语句

在循环体中可以通过 break 语句立即终止循环的执行。

说明:

(1)break 语句只用于循环语句或 switch 语句。在循环语句中,break 常常和 if 语句一起使用,表示当条件满足时,立即终止循环。

(2)循环语句可以嵌套使用,break 语句只能终止其所在的循环。

例如:任意输入一个正整数,判断是否为素数。

#include
#include
int main() 
{int x,i;printf("请输入一个正整数:");scanf("%d",&x);if(x<1) printf("输入数据非法\n");for (i=2;i=sqrt(x)) printf("%d是素数\n",x);else printf("%d不是素数\n",x);return 0;
}

以上程序的执行结果为:

在这里插入图片描述

例:从键盘上连续输入字符,并统计字母的个数,直到输入换行符(\n)时结束。

程序如下:

#include
int main() 
{int sum=0;char ch;do {ch=getchar();if (ch>=65&&ch<=90||ch>=97&&ch<=122) sum++;} while(ch!='\n');printf("一共输入了%d个字母\n",sum);return 0;
}

以上程序的执行结果为:

在这里插入图片描述

2、continue 语句

continue 语句的功能是结束本次循环。即:跳过本次循环中余下尚未执行的语句,接着再次进行循环条件的判定。

在 while 和 do-while 循环中,continue 语句使流程直接跳到循环控制条件的判断部分,以决定循环是否继续执行。

在 for 循环中,遇到 continue 语句后,跳过循环体中余下的语句,对【表达式3】求值,然后进行【表达式2】的判断,决定 for 循环继续执行。

例:输出 100~200 之间所有能被 3 整除的整数。

程序如下:

#include
int main() 
{int i,n=0;for(i=100;i<=200;i++){if(i%3!=0) continue;printf("%6d",i);n++;if(n%5==0) printf("\n");}return 0;
}

以上程序的执行结果为:

在这里插入图片描述

五、循环的嵌套

一个循环结构的循环体内又包含另一个循环结构,称为循环的嵌套。

利用循环嵌套可以解决复杂问题,一般把内嵌的循环称为内循环,外层的循环称为外循环。

例:求 1!+3!+5!+…+(2n-1)!

程序如下:

#include
int main() 
{int i,j,n=5,p;long sum=0;for(i=1;i<=n;i++){p=1;for (j=1;j<=2*i-1;j++)p=p*j;sum+=p;}printf("%ld",sum);return 0;
}

以上程序的执行结果为:

在这里插入图片描述

使用嵌套循环时,应注意以下几点:

(1)for 循环、while 循环和 do-while 循环可以相互嵌套,无论如何嵌套,都必须满足内层循环完整地包含在外层循环中,不能形成循环的交叉。

(2)嵌套循环的层数没有限制,但嵌套的层数太多,会消耗大量的内存,并且程序的可读性变差。

(3)内外层循环尽量不要使用相同的循环控制变量。

相关内容

热门资讯

赛事火热、“南客北上”、长期参...   央视网消息:近日,随着第十二届全国大众冰雪季的全面启动以及寒假的陆续到来,各主要冰雪运动目的地客...
遥远星系里“小红点”神秘天体是...   中新网北京1月17日电 (记者 孙自法)国际知名学术期刊《自然》最新发表一篇天文学论文称,研究人...
美舰船过航台湾海峡 东部战区全...   东部战区新闻发言人就美“菲恩”号导弹驱逐舰、“西尔斯”号海洋测量船过航台湾海峡发表谈话  东部战...
全球首次!中国10万亿用电量背...   超过10万亿千瓦时的用电量这一数字在全球单一国家中尚属首次。  全社会用电量年度成绩单出炉。  ...
优良天数率超90% 绘就长江黄...   编者按:2026年是“十五五”开局之年。内需市场潜力持续释放,消费新场景不断涌现,文旅融合、冰雪...
视频丨“一半冰湖、一半沙海” ...   入冬以来,新疆冰雪旅游热潮持续升温,各大雪场迎来客流高峰。新疆巴州博湖县依托得天独厚的沙漠与湖泊...
马杜罗之子建议向国际组织寻求支...   新华社加拉加斯1月16日电 在16日举行的委内瑞拉法学家会议上,委内瑞拉总统马杜罗之子尼古拉斯·...
(经济观察)破万亿美元后再蓄新...   中新社南宁1月17日电 (记者 蒋雪林)中国海关总署近日公布的数据显示,2025年中国对东盟进出...
人民论坛网评 | “老字号”焕...   元旦假期,哈尔滨中华巴洛克历史文化保护街区累计接待游客19.8万人。百年老字号“张包铺”门前排起...
国宝画重点|不断刷新认知的“海...   汉代文明  上接先秦文脉之深厚  下启后世华章之滥觞  在历史坐标系中  占据着独一无二的地位 ...