C语言。如何找到最大最小值。(二维阵列)

C语言。如何找到最大最小值。(二维阵列),c,multidimensional-array,C,Multidimensional Array,我已经编写了允许您输入NxN双数组的一维的代码。然后,它将在2D数组中打印随机数,并找到每行的最大和最小数。然后打印它们及其坐标(行和列) 注意!!!! 我修改了我的代码,使它能找到最大值的最小值。我现在不知道如何找到它的坐标 我的代码如下: int N, i, j, min=1000, max, m , o; time_t t; int masyvas[100][100], minmax[100]; printf("Enter one dimension of a NxN array\n");

我已经编写了允许您输入NxN双数组的一维的代码。然后,它将在2D数组中打印随机数,并找到每行的最大和最小数。然后打印它们及其坐标(行和列)

注意!!!! 我修改了我的代码,使它能找到最大值的最小值。我现在不知道如何找到它的坐标

我的代码如下:

int N, i, j, min=1000, max, m , o;
time_t t;
int masyvas[100][100], minmax[100];
printf("Enter one dimension of a NxN array\n");
scanf("%d", &N);



srand((unsigned) time(&t));
for (i=0; i<N; i++)
{
    for (j=0; j<N; j++)
    {
        masyvas[i][j] = rand() % 10;
        printf("%4d", masyvas[i][j]);

    }
    printf("\n");
}




int k, l, idkeymax, idkeymin;
for(k=0; k<N; k++)
{

    max=-1000;
    for(l=0; l<N; l++)
    {
        if(max<masyvas[k][l])
        {
            max=masyvas[k][l];

        }

    }
    minmax[k]=max;

}
for(m=0; m<N; m++)
    {if(minmax[m]<min)
        min=minmax[m];
    }

printf("maziausias skaicius tarp didziausiu yra %d eiluteje %d stulpelyje %d\n",min);
int N,i,j,min=1000,max,m,o;
时间;
int masyvas[100][100],minmax[100];
printf(“输入NxN数组的一个维度\n”);
scanf(“%d”和“&N”);
srand((未签名)时间(&t));

对于(i=0;i,这里是您需要执行的伪代码

for row in grid {
    row_max = max_in_row(row)
    grid_min = min(grid_min, row_max)
}
第一步是编写一个例程,在列表中查找最大值和位置。您可以将其作为一个大函数来完成,但它更易于理解和调试

您还需要找到它的索引。由于C无法返回多个值,因此我们需要一个结构来存储数字/索引对。无论何时创建结构,都要创建并销毁它的例程。对于像这样琐碎的事情来说,这似乎有些过分,但它会使您的代码更易于理解和调试

typedef struct {
    int num;
    size_t idx;
} Int_Location_t;

static Int_Location_t* Int_Location_new() {
    return calloc(1, sizeof(Int_Location_t));
}

static void Int_Location_destroy( Int_Location_t* loc ) {
    free(loc);
}
现在我们可以做一个小函数来查找行中的最大数和位置

static Int_Location_t* max_in_row(int *row, size_t num_rows) {
    Int_Location_t *loc = Int_Location_new();

    /* Start with the first element as the max */
    loc->num = row[0];
    loc->idx = 0;

    /* Compare starting with the second element */
    for( size_t i = 1; i < num_rows; i++ ) {
        if( row[i] > loc->num ) {
            loc->num = row[i];
            loc->idx = i;
        }
    }

    return loc;
}
static Int\u Location\u t*max\u in\u row(Int*row,size\t num\u rows){
Int_Location_t*loc=Int_Location_new();
/*以第一个元素作为最大值开始*/
loc->num=行[0];
loc->idx=0;
/*将开始与第二个元素进行比较*/
对于(大小i=1;iloc->num){
loc->num=行[i];
loc->idx=i;
}
}
返回loc;
}
我使用了另一种技术,将max设置为第一个元素,然后从第二个元素开始检查,而不是从任意的max或min开始


现在我有了一个函数来查找一行中的最大值,现在我可以循环它,得到每行的最大值,并将它与整个表的最小值进行比较

int main() {
    int grid[3][3] = {
        {10, 12, 15},
        {-50, -15, -10},
        {1,2,3}
    };

    int min = INT_MAX;
    size_t row = 0;
    size_t col = 0;

    for( size_t i = 0; i < 3; i++ ) {
        Int_Location_t *max = max_in_row(grid[i], 3);
        printf("max for row %zu is %d at %zu\n", i, max->num, max->idx);

        if( max->num < min ) {
            min = max->num;
            col = max->idx;
            row = i;
        }

        Int_Location_destroy(max);
    }

    printf("min for the grid is %d at row %zu, col %zu\n", min, row, col);
}
intmain(){
整数网格[3][3]={
{10, 12, 15},
{-50, -15, -10},
{1,2,3}
};
int min=int_MAX;
行大小=0;
大小=0;
对于(大小i=0;i<3;i++){
Int_Location_t*max=行中的max_(网格[i],3);
printf(“行%zu的最大值为%d,位于%zu\n”,i,max->num,max->idx);
如果(最大值->数值<最小值){
最小值=最大值->数值;
col=max->idx;
行=i;
}
内部位置销毁(最大);
}
printf(“网格的最小值为%d,在第%zu行,列%zu\n”,最小值,行,列);
}

我使用了一种不同的技术来初始化最小位置,因为获得第一个最大值需要在循环中重复一些代码。相反,我将
min
设置为可能的最小整数,
INT\u MAX
,从中可以得到可能的最高整数。这允许代码与任何整数范围一起使用,有n个o限制。在使用最小/最大算法时,这是一种非常常见的技术。

不相关,但您应该检查用户输入的
N
是否在[1,10]范围内。否则,您将超出数组的范围(
N==0
也可以,但不会发生任何事情)。谢谢你的回答。但是这个练习要求我不使用struct。我修改代码的方式使它可以找到最小值。现在我很难找到它的坐标。我知道你的编码方式很有效。但这是一个相当简单的任务,我只能使用数组,可能只使用函数r我的偏好,但简单是让人难以想象的。你有什么想法吗?我如何存储坐标以便打印它们,从下面的代码:@Rytis*sigh*愚蠢的家庭作业限制,它们教人坏习惯。你可以使用两个元素的整数数组来避开结构限制;第一个是数字,第二个是lo阳离子。使用
#define NUM 0
#define IDX 1
可以编写
max[NUM]
max[IDX]
可读性。这允许您继续使用函数,而不是将所有内容塞进多级循环中。愚蠢的问题,但我如何在注释中添加代码,我认为您更容易看到我所做的事情,而不是含糊其辞。我同意您的看法,限制不利于提高效率:x@Rytis背虱是代码,但只有一行。你最好用额外的细节编辑你的问题,有一个编辑按钮,然后每个人都可以看到。会的,只是抬头,一些单词和我一样是立陶宛语,所以如果有人听不懂,我会翻译所有内容。请稍等。