【问题标题】:reduce a 5x5 matrix to an 25 element array in c将 5x5 矩阵减少为 c 中的 25 个元素数组
【发布时间】:2016-11-10 07:56:18
【问题描述】:

我有以下作业问题,我似乎无法找到解决方案。 问题:创建一个 5x5 整数矩阵,并检查矩阵的任何元素是否在区间 [-10,15] 内,并将属于区间的元素添加到 25 个元素的数组中。该程序应以 C/C++ 实现。问题:现在我编写了以下代码,我遇到的问题是当我尝试在嵌套的 for 循环中传输我发现符合条件的元素时。问题是当我循环遍历 5 个元素并同时迭代 25 个元素时。我怎样才能做到这一点?这是我的代码:

#include <stdio.h>
#include "stdafx.h"


void main()
{
    int i, j, k, l, m;
    int a[5][5];
    int b[25];


    printf("Please enter the elements of the matrix:\n");

    for ( i = 0; i < 5; i++)
    {
        for ( k = 0; k < 5; k++)
        {
            scanf_s("%d", &a[i][k]);
        }
    }

    for ( k = 0; k < 25; k++)
    {
        for ( l = 0; l < 5; l++)
        {
            if (a[k][l] > -10 && a[k][l] < 15) {
                b[k] = a[k][l];
            }
        }
    }
    printf("The elements which are in the range [-10, 15], are the   following:\n");

    for (m = 0; m < 25; m++)
    {
        printf("%d\n", b[m]);
    }
}

【问题讨论】:

  • 在循环变量@addy 上更正,除了他们还需要保留一个计数器,该计数器保留用于b 数组的索引,并在每次添加元素时递增它。 例如 b[bi++] = a[k][l]
  • 你说得对,帕迪。让我编辑我的评论。我无法编辑,所以我删除了我之前的评论并添加了新评论。
  • Ivan 删除 K -10 && a[k][l]
  • b[k] 是错误的。您需要使用独立索引访问b(不是您用于访问a 的索引之一)。

标签: c++ c arrays matrix


【解决方案1】:

以下循环不正确:

for ( k = 0; k < 25; k++)
{
    for ( l = 0; l < 5; l++)
    {
        if (a[k][l] > -10 && a[k][l] < 15) {
            b[k] = a[k][l];
        }
    }
}

混合输入 5x5 矩阵和输出数组。它应该是这样的:

k = 0;
for ( i = 0; i < 5; i++)
{
    for ( l = 0; l < 5; l++)
    {
        if (a[i][l] > -10 && a[i][l] < 15) {
            b[k++] = a[i][l];
        }
    }
}

我唯一省略的是k &lt; 25 条件。您可能也想使用它。

【讨论】:

  • 非常感谢您的回答,这是我正在寻找的缺失部分。再次感谢:)
【解决方案2】:

请记住,C 中的数组是一个连续的内存区域。五个数组组成的数组都是一样的,只是一块连续的内存。

现在为简单起见,让我们采用一个较小的矩阵,例如

int a[2][2];

在内存中是这样排列的:

+---------+---------+---------+---------+ |一个[0][0] |一个[0][1] |一个[1][0] |一个[1][1] | +---------+---------+---------+---------+

让我们取一个对应的数组:

int b[4];

布局如下

+------+------+------+------+ | b[0] | b[1] | b[2] | b[3] | +------+------+------+------+

在内存中,矩阵和数组看起来非常相似,不是吗?它们基本上相同的,只是语义和语言(和编译器)允许的不同。

您需要做的是找出某种方法将矩阵的索引映射到数组的索引。所以a[0][0]对应b[0]a[0][1]对应b[1]a[1][0]对应b[2]a[1][1]对应b[3]

那么如何从例如a[0][1]b[1]?这似乎很简单,只需将行索引和列索引相加就可以得到结果。

但是如何从a[1][0]b[2]?这有点难,但如果你稍微思考一下,仍然很容易。矩阵是两个数组的数组,二乘一(行索引)等于二。

最后一个,a[1][1]b[3]。结合上面的两个公式,我们将行索引乘以大小,再加上列索引:1 * 2 + 1

概括它,如果您有一个I 行数组,并使用索引i 对行和j 对列进行循环,则普通数组中的相应索引是i * I + j

在代码中类似于

int a[I][J] = { ... };  // Initialization, doesn't matter exactly what
int b[I * J] = { 0 };  // Initialize all to zero

// Loop over rows
for (int i = 0; i < I; ++i)
{
    // Loop over columns
    for (int j = 0; j < J; ++j)
    {
        b[i * I + j] = a[i][j];
    }
}

对于您的特定用例,您可能希望稍微不同地初始化数组 b(以区分数组中的“未使用”元素与实际零),当然还要添加对矩阵值的检查。


我意识到这可能不是完全您所追求的,但上面显示的循环可能是一个解决方案。而且它也是一种可以让你在矩阵和数组之间来回切换的解决方案。如果你有数组索引,你可以计算矩阵索引,如果你有矩阵索引,你可以计算数组索引。

对于一个解决方案,您不像我那样在矩阵和数组之间进行映射,而只是将值插入到数组中的下一个“可用”位置,然后其他两个答案将向您展示如何。

【讨论】:

  • 谢谢,非常全面的解释。对我理解数组操作很有帮助。谢谢。
【解决方案3】:

我认为,我们可以将两个循环压缩为一个。请看下文。 当我接受输入时,我正在检查条件并将其放入新的一维数组中。因为,我有一维数组的计数器(随着新数字的插入而增加),同时显示;我也可以用。

    #include <stdio.h>


    int main()
    {
        int a[5][5];
        int b[15];
        int c=0;
printf("Please enter the elements of the matrix:\n");
        for(int i=0;i<5; i++){
            for(int j=0;j<5;j++){
               scanf("%d",&a[i][j]);
                if(a[i][j]>-10 && a[i][j]<15){
                    b[c++]=a[i][j];
                }
            }
        }
printf("\nThe numbers that meet the condition are:\n");
        for(int i=0;i<c;i++)
        printf("%d,",b[i]); 

        return 0;
    }

【讨论】:

  • 是的,谢谢,这也是一个解决方案。我最初错过的是一维数组的额外计数器。这也是解决这个问题的一种非常紧凑的方法。
  • 如果这解决了您的问题,我想请您将其作为答案,以便其他面临类似/相同问题的人得到帮助。
【解决方案4】:

对B数组有一个单独的索引;

int b_i = 0;

然后循环 5x5 次 A 数组

for ( k = 0; k < 5; k++)  //only 5 times
{
    for ( l = 0; l < 5; l++)
    {
        if (a[k][l] > -10 && a[k][l] < 15) {
            b[b_i] = a[k][l];
            b_i++;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多