繁体   English   中英

2 维数组的最小值和最大值

[英]Min and Max of 2 of 2D array

#include <stdio.h>
#include <stdlib.h>

#define ROWS 15
#define COLS 10

void find_elements(int mtr[ROWS][COLS], int a, int b, int *p1, int *p2);

int main(void) {
    int i, j;
    int z, l;
    int arr[ROWS][COLS];
    int min;
    int max;
    FILE *fp;

    fp = fopen("numbers2.txt", "r");

    printf("------------------------------------------------------------------------------\n");
    printf("                                   Loaded Array                               \n");
    printf("------------------------------------------------------------------------------\n");

    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            fscanf(fp, "%d", &arr[i][j]);
            printf("%d\t", arr[i][j]);
        }
        printf("\n\n");
    }

    do {
        printf("Enter row[1-15]:\n");
        scanf("%d", &z);
    } while ((z > 15) || (z < 1));

    do {
        printf("Enter column[1-10]:\n");
        scanf("%d", &l);
    } while ((l > 10 || (l < 1)));

     printf("------------------------------------\n");
     printf("The Max of Row %d is: %d\n", z, max);
     printf("The min of Column %d id: %d\n", l, min);

     find_elements(arr[ROWS][COLS], i, j, &min, &max);

     fclose(fp);
     return 0;
}

void find_elements(int mtr[ROWS][COLS], int a, int b, int *p1, int *p2) {
    int k;

    *p1 = mtr[a][0];
    *p2 = mtr[0][b];

    for (k = 1; k < COLS; k++) {
        if (*p1 <= mtr[a][k])
            *p1 = mtr[a][k];
    }

    for (k = 1; k < ROWS; k++) {
        if (*p2 >= mtr[k][b])
            *p2 = mtr[k][b];
    }
}

当我编译这个程序时,会出现以下消息:

[Warning] passing argument 1 of 'find_elements'
 makes pointer from integer without a cast

[Note] expected 'int (*)[10]' but argument is of type 'int'

我在 C 编程了大约 3 个月,之前没有编程经验,所以我不明白我做错了什么。 我需要一些帮助。 谢谢

正如评论所指出的,在这一行中:

find_elements(arr[ROWS][COLS],i,j,&min,&max);

function 调用的第一个参数是单个int ,实际上是一个甚至不存在的int ,它会调用未定义的行为。

您需要做的是,将整个数组传递给 function,如下所示:

find_elements(arr,i,j,&min,&max);
           // ^^^  just the array name

您的代码中至少存在 3 个问题:

  • 您应该将arr作为第一个参数传递给find_elements
  • 您应该在 printf之前移动printf调用。
  • 你应该通过zl而不是ij
  • 为什么从搜索中排除第 0 行和第 0 列?

这是修改后的版本:

#include <stdio.h>

#define ROWS 15
#define COLS 10

void find_elements(int mtr[ROWS][COLS], int a, int b, int *p1, int *p2);

int main(void) {
    int i, j, z, l;
    int arr[ROWS][COLS];
    int min, max;
    int c;
    FILE *fp;

    fp = fopen("numbers2.txt", "r");
    if (fp == NULL) {
        printf("cannot open numbers2.txt\n");
        return 1;
    }

    printf("------------------------------------------------------------------------------\n");
    printf("                                   Loaded Array                               \n");
    printf("------------------------------------------------------------------------------\n");

    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (fscanf(fp, "%d", &arr[i][j]) != 1) {
                printf("invalid data\n");
                return 1;
            }
            printf("%d\t", arr[i][j]);
        }
        printf("\n\n");
    }
    fclose(fp);

    do {
        printf("Enter row[1-%d]:\n", ROWS);
        if (scanf("%d", &z) != 1) {
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            if (c == EOF) {
                printf("end of file\n");
                return 1;
            }
            printf("invalid entry\n");
            continue;
        }
    } while (z > ROWS || z < 1);

    do {
        printf("Enter column[1-%d]:\n", COLS);
        if (scanf("%d", &l) != 1) {
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            if (c == EOF) {
                printf("end of file\n");
                return 1;
            }
            printf("invalid entry\n");
            continue;
        }
    } while (l > COLS || l < 1);

     find_elements(arr, z, l, &min, &max);

     printf("------------------------------------\n");
     printf("The Max of Row %d is: %d\n", z, max);
     printf("The min of Column %d id: %d\n", l, min);

     return 0;
}

void find_elements(int mtr[ROWS][COLS], int a, int b, int *p1, int *p2) {
    int k;

    *p1 = mtr[a][0];
    *p2 = mtr[0][b];

    for (k = 1; k < COLS; k++) {
        if (*p1 < mtr[a][k])
            *p1 = mtr[a][k];
    }

    for (k = 1; k < ROWS; k++) {
        if (*p2 > mtr[k][b])
            *p2 = mtr[k][b];
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM