在c中将5x5矩阵缩减为25个元素的数组

时间:2016-11-10 07:56:19

标签: c++ c arrays matrix

我有以下的作业问题,我似乎无法找到解决方案。 问题:创建一个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]);
    }
}

4 个答案:

答案 0 :(得分:3)

以下循环不正确:

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 < 25条件。您可能也想使用它。

答案 1 :(得分:2)

请记住,C中的数组是连续的内存区域。五个数组的数组是相同的,它只是一块连续的内存。

现在为了简单起见,我们可以采用更小的矩阵,例如

int a[2][2];

在记忆中,它的布局如下:

+---------+---------+---------+---------+
| a[0][0] | a[0][1] | a[1][0] | a[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]?这有点困难,但如果你想一点,仍然很容易。矩阵是两个数组的数组,两个乘以1(行索引)等于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(以区分数组中的“未使用”元素与实际零),当然还要添加对矩阵值的检查。

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

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

答案 2 :(得分:0)

为B数组提供单独的索引;

int b_i = 0;
然后

循环A阵列的5x5次

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++;
        }
    }
}

答案 3 :(得分:0)

我认为,我们可以将两个循环压缩成一个。请看下面。 虽然我接受输入,但我自己正在检查条件并将其放入新的1D阵列。因为,我有一个数组的计数器(在插入新数字时递增),同时显示;我也可以使用它。

    #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;
    }