【卡码网C++基础课 9.打印正方形】


题目描述与分析

题目描述:
编写一个程序,模拟打印一个正方形的框。程序应该接受用户输入的正整数作为正方形的边长,并打印相应大小的正方形框。 请注意,内部为空白,外部是由 “*” 字符组成的框。

输入描述:
输入只有一行,为正方形的边长 n

输出描述:
输出正方形组成的框

输入示例:

5

输出示例:

*****
*   *
*   *
*   *
*****

一、循环嵌套

我们在之前的学习中,已经知道了如何遍历数组结构,比如下面一个长度为5的数组。
在这里插入图片描述

for(int i = 0; i < 5; i++) {
  std::cout << arr[i] << " ";
}

但数据的组织形式除了是一维的,还可能是多维的,比如数学中的矩阵、表格、游戏棋盘。
在这里插入图片描述
上图中的数据就是一个二维数组,它是由行和列组成的表格状数据结构,可以理解为包含其他数组的数组,二维数组的元素可以通过两个索引来访问,一个索引表示行,另一个表示列, 比如arr[0][0] 表示第一行第一列的元素,值为1,arr[2][2] 表示第三行第三列的元素,值为13。

由于是二维的,显然这个时候想要直接通过一层for循环来实现遍历是不太现实的,这就需要使用到前言中所讲的循环嵌套。

// 遍历二维数组
for (int i = 0; i < 5; i++) { // 外部循环迭代行,也就是第一行,第二行... 第n行
    for (int j = 0; j < 5; j++) { // 内部循环迭代列,也就是第一列,第二列...第n列
        std::cout << arr[i][j] << " "; // 输出元素值
    }
    std::cout << std::endl; // 在每行结束后换行
}

这里就使用了两层for循环, 外部的 for 循环 i 用于控制迭代行,在每一行的迭代内部,有了第二个for循环,用于控制每一行中各列的迭代(即一个一维数组),通过这两个循环的嵌套,可以遍历整个二维数组,并使用 arr[i][j] 访问每个元素的值。在每行结束后,使用 std::endl 换行到下一行。

二、代码编写

题目要求我们模拟打印一个正方形的框,根据题目可以联想到我们需要使用循环嵌套来控制行和列的打印,并根据当前行和列的位置来决定打印 “*”(外部边界)还是空白(内部)。

我们先把代码的基础结构给书写完整

#include<iostream>
using namespace std;
int main() {
  // n代表正方形的边长
   int n;
  // 输入n
   cin >> n;
}

然后我们需要一个循环嵌套来控制打印

// 外层for循环控制每一行
for(int i = 0; i < n; i++) {
  // 内层for循环控制每一列
  for(int j = 0; j < n; j++) {
    
  }
  // 每行打印完之后,输出换行,行数i + 1, 转到下一行中
  cout << endl;
}

题目要求我们只打印边界,也就是说对于边界的内容打印"*",非边界的内容打印空白,这种结构满足之前所讲的根据某个条件来选择不同的代码路径执行,需要使用到if-else。
在这里插入图片描述

// 如果处于边界,打印 *
if () {
  cout << "*";
} else {
   // 否则,打印空格
   cout << " ";
}

所需要判定的边界其实指的是第一行、最后一行、第一列、最后一列,只需要满足这四个条件中的任何一个就表示当前遍历的位置处在边界中。

i == 0; // 表示第一行
i == n - 1; // 表示最后一行
j == 0; // 表示第一列
j == n - 1; // 表示最后一列

四个条件,不可能使用四个if语句来进行判定,我们可以使用之前所讲的逻辑或运算符||来组合多个条件,只要其中任何一个条件为真(true),整个表达式就会被认为是真(true)

if (i == 0 || i == n - 1 || j == 0 || j == n - 1) {
  // 只要满足上面条件的一个,就会判定为真,执行逻辑体中的代码
}

完整代码如下:

#include<iostream>
using namespace std;
int main() {
  // 输入正方形的边长
    int n;
    cin >> n;
    // 打印正方形框
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
          // 判断是否在边界位置,如果是,则打印 "*"
            if (i == 0 || i == n -1 || j == 0 || j == n - 1) {
                cout << "*";
            } else {
              // 否则,打印空格
                cout << " ";
            }
        }
        // 换行到下一行输出
        cout << endl;
    }
     
}

三、延伸

除了for循环嵌套之外,C++中的循环嵌套还有多种形式,比如while循环嵌套

int i = 0, j = 0;
while (i < 5) {
    while (j < 5) {
        // 嵌套循环的代码
        j++;
    }
    i++;
    j = 0; // 重置内部循环的计数器
}

还可以混合使用不同类型的循环,例如将for循环嵌套在while循环内,或者将while循环嵌套在do-while循环内

int i = 0;
while (i < 5) {
    for (int j = 0; j < 5; j++) {
        // 嵌套循环的代码
    }
    i++;
}

如果有多层嵌套循环,break 和continue只会退出最内层的循环

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (j == 1) {
            break; // 这将退出内层循环,但外层循环仍然继续执行
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值