2D数组如何打印数字及其坐标

时间:2016-11-24 17:42:29

标签: c multidimensional-array

我需要在2D数组的每一行中找到并打印出最大和最小数字。这是我到目前为止所尝试过的。

int max(int N, int masyvas[][])
{
    int i, j, max[N][N]
    for(i=0; i<N; i++)
        for(j=i; j<N; j++)
            if(masyvas[i][j] > max) max=masyvas[i][j];
    return max;
}

我知道这不起作用,但是它至少有用吗?有关如何处理此问题的任何建议?

3 个答案:

答案 0 :(得分:1)

你非常接近。两个主要问题是max类型(它不应该是 另一个数组,但只是一个普通的int),以及你没有重置的事实 每行前的max值。

int i, j, max;
for(i=0; i<N; i++) {
    max = 0; // reset max before checking a row
    for(j=i; j<N; j++) {
        if (masyvas[i][j] > max) max = masyvas[i][j];
    }
}

添加min支票应该不难:

int i, j, max, min;
for(i=0; i<N; i++) {
    max = min = 0; // reset max & min before checking a row
    for(j=i; j<N; j++) {
        if (masyvas[i][j] > max) max = masyvas[i][j];
        if (masyvas[i][j] < min) min = masyvas[i][j];
    }
    // print the values here
}

现在,您说要打印这些值。你可以在结束时这样做 外环,如上所述。像原版一样返回最终值 代码没有多大意义,因为只有最后一行max和min仍然存在 在那里。另一种可能是你想要的方法是 make max和min一个数组并返回一个指针:

int *maxValues = calloc(sizeof(int) * N);
int i, j;
for(i=0; i<N; i++)
    for(j=i; j<N; j++)
        if (masyvas[i][j] > maxValues[i]) maxValues[i] = masyvas[i][j];

return maxValues;

您可能已经注意到要返回最大值和最小值(数组) 你需要另一个级别的指针...

int **
find_max_and_min(int **masyvas)
{
    int **values = malloc(sizeof(int *) * 2);
    values[0] = calloc(sizeof(int) * N); // to hold min
    values[1] = calloc(sizeof(int) * N); // to hold max

    for (int i = 0; i < N; i++) {
        for (int j = i; j < N; j++) {
            if (masyvas[i][j] > values[1][i]) values[1][i] = masyvas[i][j];
            if (masyvas[i][j] < values[0][i]) values[0][i] = masyvas[i][j];
        }
    }
    return values;
}

int **result = find_max_and_min(data);
// now result[0] is a 1d array of N size with the minimal values of each
// row i from data, and result[1] is a similar array but holding the max
// of each row.

答案 1 :(得分:1)

我的解决方案:

#include <stdio.h>

struct Output {
   int value;
   int pos;
};

void max(int N, int masyvas[N][N], struct Output max_by_rows[N]){
    int i, j;
    for(i=0; i<N; i++){
        max_by_rows[i].value = masyvas[i][0];
        max_by_rows[i].pos = 0;
        for(j=i; j<N; j++)
            if(masyvas[i][j] > max_by_rows[i].value)
            {
                max_by_rows[i].value=masyvas[i][j];
                max_by_rows[i].pos = j;
            }
    }
}


void min(int N, int masyvas[N][N], struct Output min_by_rows[N]){
    int i, j;
    for(i=0; i<N; i++){
        min_by_rows[i].value = masyvas[i][0];
        min_by_rows[i].pos = 0;
        for(j=i; j<N; j++)
            if(masyvas[i][j] < min_by_rows[i].value)
            {
                min_by_rows[i].value=masyvas[i][j];
                min_by_rows[i].pos = j;
            }
    }
}

int main(){
    int N = 4;
    int a[4][4] = {
        {0, 1, 2, 3} ,
        {7, 6, 5, 4} ,
        {8, 9, 10, 11},
        {15, 14, 13,12}
    };
    struct Output maxs[4];
    struct Output mins[4];
    max(N, a, maxs);
    min(N, a, mins);
    int i;
    for(i=0; i <N; i++)
    {
        printf("row %d \tmax: %d\tpos: %d\tmin: %d\tpos: %d\n", i, maxs[i].value, maxs[i].pos, mins[i].value, mins[i].pos);
     }
    return 0;
}

输出:

row 0   max: 3  pos: 3  min: 0  pos: 0
row 1   max: 7  pos: 0  min: 4  pos: 3
row 2   max: 11 pos: 3  min: 8  pos: 0
row 3   max: 15 pos: 0  min: 12 pos: 3

答案 2 :(得分:0)

int i, j, max, min;
for(i=0; i<N; i++) {
  max = 0;
  min = 0;
  for(j=i; j<N; j++    ) {
    if (masyvas[i][j] > max) 
       max = masyvas[i][j];
    if (masyvas[i][j] < min) 
       min = masyvas[i][j];
   }
}