1

int 2D配列で最大5つの要素を見つけることを目的とした質問をしようとしています。配列を動的に割り当てて要素を入力することに問題はありませんでした。

printf("Your 2-d order of choice?\n");
    scanf ("%d %d", &i ,&j);
    int array[i][j];
    //Taking 2d array input
    for (int c = 0; c < i; c++)
    {
        for (int d = 0; d < j; d++) 
        {
            scanf("%d", &array[c][d]);
        }
    }

ただし、最大 5 つの要素を見つけて配列に格納するには、プロトタイプを持つ関数を要求します。

int * max5(int **, int ,int)

に関する他のいくつかの投稿を読んでも、ダブルポインターを使用して2D配列をトラバースする方法、および(戻り値の型)が正確にint**何であり、それを組み込む方法がわかりません。int*

4

3 に答える 3

1

配列をポインタとして渡す方法はたくさんあります

あなたが言ったように、のような配列を取るとint array[10][10];.

単一のポインターを使用すると、次のように実行できます

int *arr = max5 ((int *)array, 10, 10);

そして、配列を次のようにトラバースします

int * max5 (int *arr, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));

    //.........
}

またはダブルポインターを使用して、次のようにすることもできます

 int *arr =  max5 ((int **)array, 10, 10);

そしてトラバース

int * max5 (int **arr, int m, int n)// Same as int * max5 (int *arr[], int m, int n)
{

    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));

    //.........
}

参考までに、他の方法も可能です

C99 以降、C 言語は、可変次元を指定するだけで可変サイズの配列を渡すことができるようになりました。

int *arr =  max5 (array, 10, 10);

そしてトラバース

int * max5 (int arr[][10],int m,int n) //Same as int * max5 ( int (*arr)[10], int m,int n))
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", arr[i][j]);

     //.........
}
于 2014-06-14T08:43:49.740 に答える
0

これがmax5関数です。

resの 5 つの要素 (malloc によって割り当てられます) を取得し、 aの残りの要素について、 resの最小要素を見つけて、それをそのa要素と比較します - res要素がa要素よりも小さい場合、そのres要素はaのものに交換。

通常、関数ではマジック ナンバー (5) を使用しないことに注意してください

#include <limits.h>

int *max5(int **a, int rows, int cols) {
    int *res = malloc(5 * sizeof(int));
    int i,j,k,n=0; // n, number of elements in res

    for (i=0 ; i<rows ; i++) {
       for (j=0 ; j<cols ; j++) {
          if (n < 5) res[n++] = a[i][j];
          else {
             // find lowest res element
             int lowest=0;
             for(k=1 ; k<5 ; k++) { // start from 1!
                if (res[k] < res[lowest]) {
                    lowest = k;
                }
             }
             // if lowest res is < a[i][j], replace it
             if (res[lowest] < a[i][j]) res[lowest] = a[i][j];
          }
       }
    }
    return res;
}

デモのために、これは最適化されていません (常に分を探します)。1 つの方法は、5 つの要素が挿入された後、およびその要素の 1 つが置き換えられた後にres配列をソートすることです (統計的には、反復中にますます少なくなるはずです)。別の方法は、要素が最初に入力されたときにツリーを構築することです。

@hacks で述べたように、配列は a として宣言されint **、次にi行をint *割り当てる必要があり (つまり、intへのiポインター)、各行にj intのサイズを割り当てる必要があります。

于 2014-06-14T08:44:30.660 に答える
0

指定されたプロトタイプを使用して、 as を宣言arrayし、int **それに動的にメモリを割り当てる必要があります。

int **array = malloc(i*sizeof(int*)); 
for(int row = 0; row < i; row++)
    array[row] = malloc(j*sizeof(int));

max5これで、関数を 次のように呼び出すことができます

int *a = max5(array, i, j);

次に、内部max5で配列を動的に割り当ててから返しmax5ます。

于 2014-06-14T08:30:02.553 に答える