C语言之循环语句

本文介绍了编程中常用的几种循环语句,包括while、for和do-while,通过实例展示了它们在计算平方和、序列求和、解决实际问题(如纸张折叠厚度计算)以及计算最大公约数和最小公倍数中的应用。同时,强调了不同循环语句的特点和选择原则。
摘要由CSDN通过智能技术生成

一.基本概念

循环:

条件满足时,重复多次做同一件事。

构成有效循环的两个条件:

  1. 循环体:需要重复执行的操作。

  2. 循环控制条件:循环在什么情况下停止进行。

循环控制条件:

是一个最终能得到值为0(假)或非0(真)的表达式,包含在表达式中的变量称为循环控制变量

二.while语句

一般形式:

while(表达式)
语句

执行流程:

1c016dd939de43aea6c017130969d7d4.jpg

注意事项:

  • while后面的括号()不能省。
  • while后面的表达式是循环的控制条件,可以是任意类型的条件表达式,但一般是关系表达式逻辑表达式。
  • 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。

特点:

先判断,  后执行,循环体语句有可能一次也不执行。

应用样例:

例1:计算并输出1~10的平方。

a286142926e940dbaa2a2159e4f86472.jpg

39bd5ff838cd43f299f12ae96056dd31.jpg

代码如下:

#include<stdio.h>
#include<math.h>
void main()
{
  int i=1;
  while(i<=10)
  {
   printf("%d*%d=%d\n",i,i,i*i);
   i++;
  }
}

例2:编程计算1+2+3+...+100。

流程图:

1764eedba2b24bdbab4883c6b40443d0.jpg

 用i来控制循环次数,用sum来记录数字和。

5e2d95f377274fe080f4366777b40361.jpg

代码如下:

#include<stdio.h>
#include<math.h>
void main()
{
  int i=1,sum=0;
  while(1<=i&&i<=100)
  {
   sum=sum+i;
   i++;
  }
  printf("%d",sum);
}

例3:若一张纸厚0.1mm,将这张纸不断对折,问多少次后其厚度超过珠穆朗玛峰的高度(8848m)。

思路:迭代法

迭代法:是一种不断用变量的旧值递推新值的过程。

分析:这是一个典型的由迭代法求解的问题,从变量的初值开始,不断用变量的原值递推出新值的过程,关键是求取迭代公式。本例中纸张的厚度paper从0.1mm开始,不断对折,用paper*2取代paper取值,迭代公式为paper=paper*2。对折的操作具有重复性,适合用循环结构求解,对折的次数未知,根据其结束条件,采用while语句。

流程图:

602f917d69174fc8bb046b67b22fb90a.jpg

具体实现步骤:

  • 定义两个变量papert和n,分别记录纸的厚度与对折的次数,并把papert变量的初始值记为0.1mm,n的开始值记为零。
  • 如果papert<8848000mm,重复做以下工作:
  1. 裁纸对折起来,即papert*2;
  2. 次数加1,即n+1。
  • 如果papert>=8848000mm,完成以下工作:
  1. 输出纸的厚度,即打印papert;
  2. 输出最后记录的次数,即打印n。

注意单位换算,可以如流程图中,全部转化为㎜,也可以如代码中转化为米。如果以米做单位,自然会出现小数,所以定义变量需要用实型

88b787ffd12d42bca4ae33e03e3fd928.jpg代码如下:

#include<stdio.h>
#include<math.h>
void main()
{
  double i=0,paper=0.0001;
  while(paper<=8848)
  {
   paper=paper*2;
   i++;
  }
  printf("次数为:%f\n",i);
  printf("此时高度为:%f",paper);
}

例4:输入两个正整数m和n,求其最大公约数和最小公倍数。

思路:辗转相除法

欧辗转相除法欧又称几里得算法,是指用于计算两个非负整数a,b的最大公约数。

 

ece1773d5c114a6ebe0fc6ed2b63232c.jpg

分析:用辗转相除法求最大公约数。m对n求余数为r,若r≠0,则将除数的值赋给下一次被除数即m=n,将余数的值赋给下一次的除数即n=r(相当于在下图中,将除数n移动到被除数m处,余数r移动到除数n处),继续求余;否则n为最大公约数。

以m=12,n=21为例:

ca838ec300f040ea89ce0864368e2c17.jpg

 最小公倍数公式:

1e1fc9b794644178b44a3bc51fa57903.jpg

 所以我们可以设置一个变量a来存放m和n的积。

6b6107eaf0cf4824b8a23e1f72857144.jpg

代码如下:

#include<stdio.h>

void main()

{

  int m,n,r,a;

  printf("请输入m,n的值:");

  scanf("%d %d",&m,&n);

  a=m*n;

  r=m%n;

  while(r!=0)

 {

   m=n;

   n=r;

   r=m%n;

 }

  printf("最大公约数是:%d\n",n);

  printf("最小公倍数是:%d",a/n);

}

三.for语句

一般形式:

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


其中:
表达式1:一般为赋值表达式,给控制变量赋初值。
表达式2:关系表达式逻辑表达式,循环控制条件。
表达式3:一般为赋值表达式,给控制变量增量或减量。

  • 表达式之间用分号分隔。
  • 循环体若包含多条语句时,应使用复合语句

for语句很好地体现了正确表达循环结构应注意的三个问题:

  • 控制变量的初始化
  • 循环的控制条件
  • 循环控制变量的更新

注意事项:

(1)表达式1、表达式2、和表达式3可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式。

(2)表达式1、表达式2、和表达式3都是任选项,可以省掉其中的一个、两个或全部,但其用于间隔的分号是一个也不能省

(3)表达式2如果为空则相当于表达式2的值是真。

(4)循环体可以是空语句。

例:编程实现:输出所有的“水仙花数”。(水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身)

324381299aff4ad5b339db6cdc37390a.jpg

 代码如下:

#include<stdio.h>
void main()
{
  int n,gw,sw,bw;
  printf("水仙花数:");
  for(n=100;n<1000;n++)
  {
    gw=n%10;
    sw=n/10%10;
    bw=n/100;
    if(n==gw*gw*gw+sw*sw*sw+bw*bw*bw)
    printf("%d ",n);
   }
}

四.do...while语句

一般形式:

do
     语句
while(表达式);

执行流程:

3b17dec0aa2746a489fe110aba5f58ab.jpg

注意事项:

  • while后面的括号( )不能省。
  • while最后面的分号;不能省。
  • while后面表达式可以是任意类型表达式,但一般是关系表达式或逻辑表达式。
  • 循环体语句如果包含多条时,应使用复合语句

特点:

先执行,后判断,循环体语句至少要执行一次。

例:从键盘输入各学生成绩,并对成绩不及格(60分以下)的学生人数进行计数,直到输入的成绩为负为止,最后输出成绩不及格的学生人数。

476388df233a4e9eb861c954f95238c9.jpg

代码如下:

#include<stdio.h>
void main()
{
  int a,n=0;
  do
  {
  scanf("%d",&a);
  if(a>0&&a<60)
  n++;
  }while(a>=0);
  printf("不及格的人数是%d",n);
}

五.循环语句的选择

2cc824ad32b8424fb82cae0e44592863.jpg

 一般情况下三种循环语句可以相互代替。但三种循环语句有如下的各自特点:

  1.  while语句和for语句是先判断,后执行循环体语句;do-while语句是先执行循环体语句做条件判断
  2.  while语句和do-while语句的循环变量初值在循环语句执行之前完成,for语句的循环变量初值可出现在表达式1的位置或for语句之前。
  3. while语句和do-while语句的循环体语句中包含使循环趋于结束的语句,for语句的表达式3中可包含使循环趋于结束的表达式。

选取方法:

  • 如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是由循环体的执行情况确定的,一般用while语句或者do-while语句。
  • 当循环体至少执行一次时,用do-while语句,反之,如果循环体可能一次也不执行,选用while语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值