C真的不难学,不信就看下我关于循环的理解

简介: C真的不难学,不信就看下我关于循环的理解

生就是日复一日地不断的重复,既有相同的事情,也有相似的事情,却无论如何也无法回到最初。要想在生活的每一时刻都能有新的发现,恐怕只是一个美好的愿望。

下面将会给大家介绍程序中的重复流程——循环。

do语句

C语言中提供了3中循环执行语句,首先我们来看下do循环。

do语句

输入一个整数,显示它是奇数还是偶数。然后询问是否重复同样的操作,并按要求处理。

代码如下:

#include<stdio.h>
int main()
{
  int ret = 0;
  do
  {
    int n = 0;
    printf("请输入一个整数:");
    scanf("%d", &n);
    if (n % 2 == 0)
    {
      printf("输入的数是一个偶数\n");
    }
    else
    {
      printf("输入的数是一个奇数\n");
    }
    printf("要重复一次嘛?【Yes……0/No……9】");
    scanf("%d", &ret);
  } while (ret==0);
  return 0;
}

以上就是do语句的使用,下面是结构流程图

do是”执行“的意思,while是”在……期间“的意思。根据do语句的处理流程,只要在()中的表达式的判断结果不是0,语句就会循环执行。

另外do语句循环的对象语句称为循环体

本程序中do语句的循环体是{和}之间的复合语句(程序块),执行流程如下图:

本程序的情况下,如果读取到的变量的值为0,那么控制表达式ret0的判断结果就为1。因为1不等于0,所以复合语句的循环体就会再次被执行。
如果读取到的变量的值不为0,那么控制表达式ret
0的判断结果就为0,do语句就结束了。

复合语句(程序块)中的声明

上述例子中的n是在do语句中的复合语句部分进行声明的。需要注意的是,仅在复合语句中使用的变量通常要再复合语句中声明。

注意:

仅仅在复合语句中使用变量要在该复合语句中进行声明。

读取一定范围内的值

使用do语句的话,从键盘读取的数值是有限制的。代码如下;

#include<stdio.h>
int main()
{
  int hand = 0;
  do
  {
    printf("请选择出什么拳【0……石头/1……剪刀/2……布】");
    scanf("%d", &hand);
  } while (hand<0||hand>2);
  printf("你选择了");
  switch (hand)
  {
  case 0:
    printf("石头。\n");
    break;
  case 1:
    printf("剪刀。\n");
    break;
  case 2:
    printf("布。\n");
    break;
  }
  return 0;
}

如果读取的数值是0,1,2这些”合法的值“,就会显示”石头“”剪刀“”布“。而如果输入3或者-1这样的非法的值,就会提醒再次输入。

德摩根定律

对各条件取非,然后将逻辑与变为逻辑或、逻辑或变为逻辑与,然后再取其否定,结果和原条件一样。这就是德摩根定律。表示如下图:

求多个数的和及平均值

不停地输入整数,显示其和及平均值。

代码如下:

#include<stdio.h>
int main()
{
  int sum = 0;
  int cnt = 0;
  int retry = 0;
  do
  {
    int t = 0;
    printf("请输入一个整数:");
    scanf("%d", &t);
    sum = sum + t;
    cnt = cnt + 1;
    printf("是否继续?<Yes……0/No……9>");
    scanf("%d", &ret);
  } while (retry==0);
  printf("和为%d,平均值为%.2f\n", sum, (double)sum / cnt);
  return 0;
}

只要retry的值为0,就继续进行循环。

下面是求和的过程图:

复合赋值运算符

这样的称为复合赋值运算符。这里的@指代前面提到的各种运算符。

使用复合赋值运算符,计算输入的值的和以及平均值,代码如下:

#include<stdio.h>
int main()
{
  int sum = 0;
  int cnt = 0;
  int retry = 0;
  do
  {
    int t = 0;
    printf("请输入一个整数:");
    scanf("%d", &t);
    sum += t;
    cnt++;
    printf("是否继续?<Yes……0/No……9>");
    scanf("%d", &retry);
  } while (retry==0);
  printf("和为%d,平均值为%.2f\n", sum, (double)sum / cnt);
  return 0;
}

后置递增运算符和后置递减运算符

上述程序中使用的++是后置运算符,使用该运算符的表达式a++,能够是操作数的值仅增加1。这种只增加1的情况,我们称为递增。

如上表,是操作符的数值减1的–运算符是后置递减运算符。

两个运算符的功能如下图:

使用复合赋值运算符和后置递增运算符、后置递减运算符,能够使程序更加简洁、更易读。

while语句

和上面介绍的do语句不同,再循环体执行之前对循环的继续条件进行判断的是while语句。

while语句

输入一个整数数值,显示它开始递减到0的每个整数的程序如下:

#include<stdio.h>
int main()
{
  int n = 0;
  printf("请输入一个整数:");
  scanf("%d", &n);
  while (n>=0)
  {
    printf("%d", n);
    n--;
  }
  printf("\n");
  return 0;
}

这里为了实现递减使用了while语句,结构如下图;

while语句会在表达式达到0之前循环其中的语句。程序的流程图如下:

用递减运算符简化程序代码

#include<stdio.h>
int main()
{
  int n = 0;
  printf("请输入一个正整数:");
  while (n>=0)
  {
    printf("%d", n--);
  }
  printf("\n");
  return 0;
}

数据递增

显示出从0开始递增到输入的整数的各个整数。代码如下;

#include<stdio.h>
int main()
{
  int i = 0;
  int n = 0;
  printf("请输入一个正整数:");
  scanf("%d", &n);
  while (i<=n)
  {
    printf("%d", i++);
  }
  return 0;
}

限定次数的循环操作

输入一个正数后,并排连续显示出该整数的个数*,代码如下:

#include<stdio.h>
int main()
{
  int n = 0;
  printf("正整数:");
  scanf("%d", &n);
  while (n-->0)
  {
    putchar('*');
  }
  printf("\n");
  return 0;
}

假设输入的值等于15为例,首先对while语句的控制表达式n–>0进行判断。–是后置递减运算符,所以会对n的值是否大于0进行判断。

字符常量和putchar函数

在while语句执行的过程中,putchar('‘);被执行;像’‘这样,使用单引号括起来的字符称为字符常量,字符常量是int类型。

字符常量’'和字符串常量""的区别如下:

do语句和while语句

在执行过程中是有区别的:

do语句的循环体至少执行一次,而while语句的循环体则有可能一个也不会执行。

另外在判断时候继续执行的时间方面,do语句和while语句也完全不相同。

逆向显示整数值

输入一个非负整数,并进行逆向显示。

代码如下:

#include<stdio.h>
int main()
{
  int n = 0;
  do
  {
    printf("请输入一个正整数:");
    scanf("%d", &n);
    if (n<=0)
    {
      puts("\a请不要输入一个非正整数。");
    }
  } while (n<=0);
  while (n>0)
  {
    printf("%d", n % 10);
    n /= 10;
  }
  return 0;
}

下面是执行过程;

for语句

比起使用while语句,使用for语句实现循环会使程序更加简洁、易读。

for语句

递增显示从0到输入正整数为止的各个整数。

代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int n = 0;
  printf("请输入一个正整数:");
  scanf("%d", &n);
  for ( i = 0; i <= n; i++)
  {
    printf("%d ", i);
  }
  return 0;
}

程序变得更加的简洁了。for语句的结构图如下;

  1. 作为”预处理“,判断并执行A部分。
  2. 如果作为”继续条件“的B部分控制表达式不为0,则执行语句(循环体)。
  3. 执行语句后,判断并执行作为”收尾处理“或”下一个循环的准备处理“的C部分返回到2中。

使用for语句实现固定次数的循环

输入一个整数连续显示出该整数整数个*

代码如下:

#include<stdio.h>
int main()
{
  int n = 0;
  int i = 0;
  printf("请输入一个整数:");
  scanf(("%d", &n));
  for ( i = 1; i <=n; i++)
  {
    putchar('*');
  }
  putchar("\n");
  return 0;
}

本程序中的for语句也可以替换为如下形式:

for(i=0;i<n:i++)
{
    putchar('*');
}

for循环和while循环的执行区别:

输入规定个数个整数并显示出它们的合计值和平均值(使用for语句)

代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int sum = 0;
  int num = 0;
  int temp = 0;
  printf("输入多少个整数:");
  scanf("%d", &num);
  for ( i = 0; i < num; i++)
  {
    printf("No.%d", i + 1);
    scanf("%d", &temp);
    sum += temp;
  }
  printf("合计值:%d\n", sum);
  printf("平均值:%.2f\n", (double)sum / num);
  return 0;
}

偶数的枚举

下面是我编写的一段程序,实现输入一个整数值,显示该整数值以下的正偶数,代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int n = 0;
  printf("请输入整数值:");
  scanf("%d", &n);
  for ( i = 2; i <= n; i+=2)
  {
    printf("%d ", i);
  }
  putchar('\n');
  return 0;
}

for语句中的i+=2部分中使用了复合赋值运算符+=,其作用是将右操作数的值加左操作数的值。

因为是将变量i加2,所以每次循环时i的值都会加2。

约数的枚举

编写一段程序,实现输入一个整数值,显示该整数值的所有约数,代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int n = 0;
  printf("整数值:");
  scanf("%d", &n);
  for ( i = 1; i <=  n; i++)
  {
    if (n%i==0)
    {
      printf("%d ", i);
    }
  }
  printf("\n");
  return 0;
}

for语句中,变量i的值是从1到n递增的。

如果n除以i的余数为0(即n能被i整除),则判断i是n的约数,并显示它的值。

表达式语句和空语句

请看下面的代码,感觉这段代码是要显示变量n个*

for(i=1;i<=n;i++);
  putchar('*');

但是,无论n是怎样的值,结果都只显示一个*。

原因在于i++)后面的分号。只包含一个分号的语句,称为空语句,执行代码的时候什么也不会发生。

循环语句

以上说到的do语句、while语句、for语句,都是循环执行流程的语句。这就是循环语句。

多重循环

将循环语句的循环体作为循环语句,就可以进行二重、三重循环。这样的循环称为多重循环。

二重循环

实际上,在一个程序中还可以嵌套另一个循环。所根据嵌套的循环的多少,有二重循环三重循环等。它们统称为多重循环

使用二重循环显示九九乘法表,代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int j = 0;
  for ( i = 1; i <= 9; i++)
  {
    for ( j = 1; j <=i ; j++)
    {
      printf("%d*%d=%d ", i, j, i * j);
    }
    printf("\n");
  }
  return 0;
}

运行结果:

外侧的for语句的作用是使变量i的值从1到9递增。其中循环分别对应乘法表的第一行、第二行、……第九行。即纵方向的循环。

各行中执行的内侧的for语句的作用使变量j的值从1到9递增,这是各行中的横方向的循环。

使用break语句强制结束循环

在多重循环中执行break语句时,仅仅会跳出内侧的循环语句,而不会直接跳出所有的循环如下代码所示:

#include<stdio.h>
int main()
{
  int i = 0;
  int j = 0;
  for (i = 1; i <= 9; i++)
  {
    for (j = 1; j <= i; j++)
    {
      if (i*j>=40)
      {
        break;
      }
      printf("%d*%d=%d ", i, j, i * j);
    }
    printf("\n");
  }
  return 0;
}

代码运行;

当i*j的值大于等于40时直接跳出内层循环。

显示图形

下面我们来显示长方形,代码如下:

#include<stdio.h>
int main()
{
  int i = 0;
  int j = 0;
  int width = 0;
  int height = 0;
  printf("请输入长宽:");
  scanf("%d %d", &width, &height);
  for ( i = 0; i < height; i++)
  {
    for ( j = 0; j < width; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  return 0;
}

程序的组成元素和格式

关键字

在C语言中,像if和else这样的标识符被赋予了特殊的意义。这种具有特殊意义的标识符称为关键字,它们是不能作为变量名使用的。

分隔符

一种有13中分隔符,就是又来分割的。

常量和字符串常量

字符常量、整数常量、浮点数常量和字符串常量都是程序的构成要素。

总结

以上就是关于C中的循环控制,其实这样看起来C也不是很难。

相关文章
|
6月前
|
前端开发 Java API
【面试题】数组去重你想到几种办法呢?
【面试题】数组去重你想到几种办法呢?
|
3月前
|
搜索推荐 大数据 数据处理
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
47 0
循环初级一(附小练习和详细代码答案)
循环初级一(附小练习和详细代码答案)
110 0
|
算法 搜索推荐 程序员
ChatGPT,为啥写二分搜索容易死循环?
ChatGPT,为啥写二分搜索容易死循环?
101 0
|
消息中间件 前端开发 NoSQL
蔚来手撕代码题:三个线程循环打印ABC
蔚来手撕代码题:三个线程循环打印ABC
109 3
蔚来手撕代码题:三个线程循环打印ABC
|
存储 算法 Linux
当我用几道题考了一遍做Linux驱动的同事......
当我用几道题考了一遍做Linux驱动的同事......
循环初级二(附小练习及其代码答案)
循环初级二(附小练习及其代码答案)
65 0
|
JavaScript
for-in循环一看就懂
for-in循环一看就懂
56 0
|
监控 Java 关系型数据库
让我干一遍也就罢了,居然还一次次的要我给你,当我好欺负吗?
让我干一遍也就罢了,居然还一次次的要我给你,当我好欺负吗?
148 0
|
存储 算法 C语言
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
143 0
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~