什么是C++中的嵌套循环,并举例说明?

232 阅读2分钟

首先,什么是循环?循环是一种结构,它重复执行语句,直到满足一个指定的条件。这些语句都在循环的块中。在C++中,如果只有一条语句被重复,那么就没有块(大括号)。有do-while循环、while-循环和for-循环。这样的结构被称为复合语句。

暂时性循环

一个简单的do-while循环是

  int m = 0;

        do
            {
                cout << m << ' ';
                ++m;
            } while (m<5);

有一个初始条件,并不是循环的真正组成部分。这个初始条件是 "int m = 0;"。循环以保留字do开始,并以分号结束,在while条件之后,"(m<5)"。循环意味着打印出整数,从零开始直到m等于5。当m等于5时,不进行打印。

在do-while循环中,在检查条件之前,先执行该块。当m等于5时,条件得到满足。在此之前,该块被执行5次,从0到4的计数开始。 因此,输出是:

0 1 2 3 4

暂时循环

在do-while循环中,每次在检查条件之前都会执行该块。另一方面,在while循环中,每次在执行程序块之前,都会先检查条件。下面的while循环做了上面的do-while循环所做的事情。

 int m = 0;
       
         while (m<5)
            {
                cout << m << ' ';
                ++m;
            }

有一个初始条件,并不是循环的真正组成部分。这个初始条件是 "int m = 0;"。循环从保留字开始,在其块的第二个和收尾括号处结束。这里没有 "do "保留字。while条件是"(m<5)",与上面的代码相同。当while条件为假时,即m等于5,该块不被执行,这就是循环的结束。注意,在这种情况下,循环没有以分号结束。输出结果与前面的代码相同,即:

0 1 2 3 4

for-loop

在上面的while-loop中,有五个主要部分。第一个是初始化语句。

        int m = 0;

循环块的重复执行发生在5个数字上,从m为0时开始。下一个组件是while条件(m<5)。当while条件的结果为假时,不发生重复(不执行块)。第三个组成部分是循环复合语句本身,它可以被想象成一个块。第四部分是在循环复合语句内部。它是

cout <<m<< ' '

它打印了m的值。第五部分是增量语句。

++m;

这是在块中,在最后。这将导致该块的重复执行。它引入了下一个数字来重复执行该块。然而,如果while条件的结果是假的,那么重复就不会发生了。

不同的五个部分可以在for-loop中重新排列如下。

 for (int m=0; m<5; ++m)
            {
                cout << m << ' ';
            }

输出结果是一样的,即:

0 1 2 3 4

在for-loop的括号里有三条语句:有初始化语句,有while条件,这是一条简短的语句,还有就是增量语句。在块中,这次只有一条语句,即核心语句。原本在块中的增量语句,已经被收进了括号里。更多的语句可以被添加到上述任何一个块中。

do-while循环和while循环在本质上与for-loop是一样的。for-loop把循环放在一个经典的、简化的形式中。任何循环都需要一个初始化状态,一个while条件,以及导致下一次重复的代码,当while条件的结果为假时,就不会发生。

在嵌套循环时,应考虑到这三个特征。本文解释了C++中嵌套循环的不同方式。上面已经解释了基本的循环形式。

文章内容

嵌套do-while循环

在下面的程序中,显示了一个5行4列的字符表。在C++中,大写字母的序列或小写字母的序列都可以像整数的比较一样进行比较,正如下面的嵌套循环所说明的。

 #include <iostream>
    using namespace std;

    int main()
    {
        int i = 0;
        char j = 'A';

        do
            {
                do
                    {
                        cout << j << ' ';
                        j++;
                    } while (j < 'E');
                j = 'A';
                cout << endl;

                i++;
            } while (i < 5);
     
        return 0;
    }

输出结果是:

    A B C D
    A B C D
    A B C D
    A B C D
    A B C D

该程序的第一行将iostream库纳入程序。这个库对于打印出文本是必要的。下一行是一个声明,确保所使用的任何名称都来自标准名称空间,除非另有说明。

把嵌套的循环看成是两个维度是有帮助的。两个循环都作用于每个单元格。内循环负责列,而外循环则负责行。

事情是这样的。当外循环指向第一行时,内循环为第一行的每一列打印一个单元格值。当外循环指向第二行时,内循环为第二行的每一列打印一个单元格值。这样一直持续到打印完最后一行。

在上面的程序中,外循环的初始化状态是。

        int i = 0;

内循环的初始化状态是。

        char j = 'A';

请注意,整个内循环就放在外循环的开口括号之后。每个字符只有一条语句可以打印,而且这条语句必须在内循环中。这是因为循环在每次组合迭代时访问一个单元。这条语句是

                cout << j << ' ';

大写字母可以像整数(正整数)一样处理。

内循环的while条件是。

        while (j < 'E')

在内循环核心的末尾,但不在内循环代码的末尾。这意味着第五个字母'E'及以后不能显示。在内循环连续显示了4个元素后,初始状态被重置,或用语句重新初始化。

            j = 'A';

前面没有保留字,char。在它前面的保留字char将声明一个新的变量,它将不属于二维迭代的一部分。之后的语句,即

                cout << endl;

强制将屏幕光标移到下一行,这样就可以在下一行打印下一个行。

这条语句之后,外循环的基本代码开始了。外循环的while条件是。

(i < 5)

意味着行数被计算为0、1、2、3、4,仍然是五个数字。

内循环的代码是,在同一行中引起下一个字符的打印(列重复)。

j++;

当内循环的while条件为false时,不会再打印任何字符。导致打印下一行(行重复)的外循环的代码是。

   i++;

当外循环的while条件为false时,不再打印任何一行。

因此,变量i被用于外循环,即行;而变量j则被用于内循环,即行字符。

嵌套的while-loop

下面的程序与上面的程序做了同样的事情。

 #include <iostream>
    using namespace std;

    int main()
    {
        int i = 0;
        char j = 'A';

        while (i < 5)
            {
                 while (j < 'E')
                    {
                        cout << j << ' ';
                        j++;
                    };
                j = 'A';
                cout << endl;

                i++;
            };
     
        return 0;
    }

输出结果是:

    A B C D
    A B C D
    A B C D
    A B C D
    A B C D

这段代码的算法与上一段代码的算法几乎相同。主要的区别是,在这里,对于内循环或外循环的每一次迭代,在执行循环的主体之前都要检查while条件。而在前面的代码中,主体是在检查while条件之前执行的。

嵌套for-loop

下面的程序与上面的程序做了同样的事情。

 #include <iostream>
    using namespace std;

    int main()
    {
        for (int i = 0; i < 5; i++)
            {
                 for (char j = 'A'; j < 'E'; j++)
                    {
                        cout << j << ' ';
                    }
                cout << endl;
            }
     
        return 0;
    }

输出结果是:

    A B C D
    A B C D
    A B C D
    A B C D
    A B C D

这里有一些事情需要注意。嵌套的for-loop在高度上比其他的对应程序要短。内循环的递增语句已经从其主体中移除,并被纳入其for-loop的括号中。外循环的递增语句已从其主体中删除,并被纳入其for-loop的括号中。内循环变量j的重新初始化(重置)不再需要作为外循环的语句;因为内循环的初始化语句在外循环的每个迭代中都会重新初始化自己。

不要忘记,for 循环是其他两个循环的经典和简化形式。

结论

一个循环有三个重要的特征:初始化状态、while条件和推动循环主体的下一次重复。当一个循环被嵌套到另一个循环中时,这三个特征必须被考虑到每个相应的循环中。所有上述嵌套的循环都是单层嵌套循环。把单层嵌套的循环,看作是一个二维的布局,是很有帮助的。嵌套循环的代码就是访问二维布局的每个单元。本教程向读者介绍了循环嵌套的基本知识。