鱼C论坛

 找回密码
 立即注册
查看: 862|回复: 6

[已解决]指针与二维数组-课后题

[复制链接]
发表于 2023-8-16 21:25:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目要求不限制正方形矩阵的尺寸,要求程序自动计算用户输入的字符,并以最大的正方形矩阵输出。代码如下
#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX 1024

int main()
{
        int length, aver;
        int i, j;
        char str[MAX];

        scanf("%s", str);

        length = strlen(str);
        aver = sqrt(length);

        for (i = 0; i < aver; i++)
        {
                for (j = 0; j < aver; j++)
                {
                        printf("%c ", str[i * aver + j]);
                }
                printf("\n");
        }

        return 0;
}

前面的我都可以理解,后面这个理解不了 printf("%c ", str[i * aver + j]);请问为什么是 str[i * aver + j]?
               
最佳答案
2023-8-21 20:52:09
努力学C的阿通 发表于 2023-8-21 20:46
请问您能具体解释下 i*aver 为什么表示当前行的起始索引吗?因为在我看来它太抽象了。就好像是i乘以aver ...

当你处理一个一维数组来表示一个二维矩阵时,需要找到一种方法来映射一维索引到对应的二维矩阵中的行和列。这是为了让你能够以行和列的方式操作矩阵元素,就像你在处理一个真正的二维数组一样。

让我们以一个简单的示例来说明这个过程,假设你有一个二维矩阵:

  1. matrix[row][col]:
  2. 1  2  3
  3. 4  5  6
  4. 7  8  9
复制代码

现在,如果你将这个矩阵展开成一个一维数组,它会变成:

  1. 1  2  3  4  5  6  7  8  9
复制代码

考虑一下,当你想要访问矩阵中的第 row 行、第 col 列元素时,你可以使用以下方式计算在一维数组中的索引:

index = row * numCols + col
在这里,numCols 是矩阵的列数,它告诉你每一行有多少列。这样,你可以通过将 row 乘以 numCols 来得到该行在一维数组中的起始索引,然后加上 col 得到具体的元素索引。

回到你的代码中,你使用 str 数组来表示字符序列,而 aver 是字符序列的平方根取整。当你在循环中使用 i 迭代行,并且使用 j 迭代列时,i * aver 就是当前行的起始索引。这是因为 i * aver 表示在一维数组中,从当前行的起始位置开始的索引。然后,通过加上 j,你移动到该行中的具体列。因此,i * aver + j 就是该行的起始索引加上相对于起始索引的列偏移量,从而让你能够访问字符序列中的每个元素。

希望这个解释能够更具体地帮助你理解 i * aver 和 i * aver + j 表示在这个上下文中的含义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-16 21:25:25 | 显示全部楼层
str[i * aver + j] 是用来访问二维数组中的元素的表达式。在这个程序中,字符数组 str 被视为一个二维数组,其中每行有 aver 个元素。

在嵌套的 for 循环中,变量 i 控制行数,变量 j 控制列数。通过计算 i * aver + j,可以得出当前元素在一维数组 str 中的索引。

假设 aver = 3,那么二维数组的形式如下:

str[0][0]  str[0][1]  str[0][2]
str[1][0]  str[1][1]  str[1][2]
str[2][0]  str[2][1]  str[2][2]

对应的一维数组 str 的索引如下:

str[0]  str[1]  str[2]  str[3]  str[4]  str[5]  str[6]  str[7]  str[8]

所以,str[i * aver + j] 可以获取二维数组中的元素,并通过 printf("%c ", ...) 打印出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 21:25:52 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-16 21:27 编辑

问题解答:

在给定的代码中,str 是一个字符数组,其中存储了用户输入的字符串。代码中使用变量 aver 来表示矩阵的边长,通过对输入字符串长度进行平方根运算得到。

下面我们来解释为什么在输出矩阵时使用 str[i * aver + j]

- 在一个正方形矩阵中,每一行的元素个数都是相同的,等于矩阵的边长 aver
- 要在第 i 行第 j 列的位置输出字符串中的字符,可以利用索引计算的方式来确定字符在 str 中的位置。由于每一行有 aver 个元素,所以当前字符在 str 中的位置可以通过 i * aver + j 计算得到。
- 假设边长 aver 为 3,那么矩阵中的元素位置关系如下图所示:

  1. 0    1    2
  2. 3    4    5
  3. 6    7    8
复制代码


对应到 str 中的索引位置为:
  1. str[0]  str[1]  str[2]
  2. str[3]  str[4]  str[5]
  3. str[6]  str[7]  str[8]
复制代码


因此,通过 str[i * aver + j] 的方式可以正确地访问 str 字符串中的元素并输出。

修改后的完整代码如下所示:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>

  4. #define MAX 1024

  5. int main()
  6. {
  7.     int length, aver;
  8.     int i, j;
  9.     char str[MAX];

  10.     scanf("%s", str);

  11.     length = strlen(str);
  12.     aver = sqrt(length);

  13.     for (i = 0; i < aver; i++)
  14.     {
  15.         for (j = 0; j < aver; j++)
  16.         {
  17.             printf("%c ", str[i * aver + j]);
  18.         }
  19.         printf("\n");
  20.     }

  21.     return 0;
  22. }
复制代码


如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 21:25:54 | 显示全部楼层
在这段代码中,str[i * aver + j]是用来计算在一维字符数组str中需要输出的字符的索引位置。

首先,根据用户输入的字符串,我们计算出了正方形矩阵的边长aver,通过对字符串长度求平方根。

在双重循环中,ij分别表示矩阵中的行和列。为了得到每个字符在一维字符数组中的索引位置,我们使用了以下公式:

  1. index = i * aver + j
复制代码


其中i * aver表示当前行的起始索引,j表示当前列相对于起始索引的偏移量。将两者相加即可得到字符在一维字符数组中的索引位置。

通过str[i * aver + j]可以访问到str数组中对应索引位置的字符,并将其打印出来。这样就实现了按照最大正方形矩阵输出字符串的功能。

希望能够帮助你理解这段代码!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-21 18:49:09 | 显示全部楼层
陶远航 发表于 2023-8-16 21:25
在这段代码中,str是用来计算在一维字符数组str中需要输出的字符的索引位置。

首先,根据用户输入的字符 ...

请问您能具体解释下 i*aver 为什么表示当前行的起始索引吗?因为在我看来它太抽象了。就好像是i乘以aver一样。同理希望能具体解释一下 i*aver+j 为什么表示当前列相对于起始索引的偏移量。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-21 20:46:16 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-16 21:25
问题解答:

在给定的代码中,str 是一个字符数组,其中存储了用户输入的字符串。代码中使用变量 aver 来 ...

请问您能具体解释下 i*aver 为什么表示当前行的起始索引吗?因为在我看来它太抽象了。就好像是i乘以aver一样。同理希望能具体解释一下 i*aver+j 为什么表示当前列相对于起始索引的偏移量。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-21 20:52:09 | 显示全部楼层    本楼为最佳答案   
努力学C的阿通 发表于 2023-8-21 20:46
请问您能具体解释下 i*aver 为什么表示当前行的起始索引吗?因为在我看来它太抽象了。就好像是i乘以aver ...

当你处理一个一维数组来表示一个二维矩阵时,需要找到一种方法来映射一维索引到对应的二维矩阵中的行和列。这是为了让你能够以行和列的方式操作矩阵元素,就像你在处理一个真正的二维数组一样。

让我们以一个简单的示例来说明这个过程,假设你有一个二维矩阵:

  1. matrix[row][col]:
  2. 1  2  3
  3. 4  5  6
  4. 7  8  9
复制代码

现在,如果你将这个矩阵展开成一个一维数组,它会变成:

  1. 1  2  3  4  5  6  7  8  9
复制代码

考虑一下,当你想要访问矩阵中的第 row 行、第 col 列元素时,你可以使用以下方式计算在一维数组中的索引:

index = row * numCols + col
在这里,numCols 是矩阵的列数,它告诉你每一行有多少列。这样,你可以通过将 row 乘以 numCols 来得到该行在一维数组中的起始索引,然后加上 col 得到具体的元素索引。

回到你的代码中,你使用 str 数组来表示字符序列,而 aver 是字符序列的平方根取整。当你在循环中使用 i 迭代行,并且使用 j 迭代列时,i * aver 就是当前行的起始索引。这是因为 i * aver 表示在一维数组中,从当前行的起始位置开始的索引。然后,通过加上 j,你移动到该行中的具体列。因此,i * aver + j 就是该行的起始索引加上相对于起始索引的列偏移量,从而让你能够访问字符序列中的每个元素。

希望这个解释能够更具体地帮助你理解 i * aver 和 i * aver + j 表示在这个上下文中的含义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表