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