C言語で2次元配列の各列の最大値と最小値の差の計算を実装します(C言語の基本的な5つの例 - 2次元配列)

質問 1 ~ 3

C 言語の基本的な質問例 1 ~ 3 - ポインタ

序文

この記事のタイトルはCの基礎演習、二次元配列編です。これらの演習を行う前に、2 次元配列について学習していることを確認する必要があります。

トピック

質問4

3 行 4 列のサイズの 2 次元整数配列を定義するプログラムを作成します。キーボードから 12 個の整数を入力し、配列に保存します。

2 次元配列と配列内の行数をパラメーターとして受け取り、配列内のすべての要素の合計を計算して返す関数を作成します。

main 関数でこの関数を呼び出して、配列内のすべての要素の合計を計算して出力します。
ここに画像の説明を挿入します

テストケース

このプログラムを実行するときに、検証のために次のテスト データを入力できます。

入力:
1 2 3 4 5 6 7 8 9 10 11 12
出力:
2D配列のすべての要素の合計は: 78

質問5

4 行 5 列のサイズの 2 次元整数配列を定義するプログラムを作成します。キーボードから 20 個の整数を入力し、配列に保存します。

2 次元配列と配列内の行数をパラメータとして受け取り、配列内の各列要素の最大値と最小値の差を計算して返す関数を作成します。

この関数を main 関数で呼び出して、各列の要素の最大値と最小値の差を計算して出力します。

ここに画像の説明を挿入します

テストケース

このプログラムを実行するときに、検証のために次のテスト データを入力できます。

入力:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15< /span> 最大値と最小値の差値であり、列 5 の要素の最小値は次のとおりです: 15< /span> 列 4 の要素の最大値と最小値の差は次のとおりです。15 の最大値と最小値の差列 3 の要素は次のとおりです。15 列 2 の要素の最大値と最小値の差は次のとおりです。 15 列 1 の要素の最大値と最小値の差は次のとおりです。 : 15出力:
16 17 18 19 20





入力:
-1 -2 -3 -4 -5
-6 -7 -8 -9 -10< a i=3> -11 -12 -13 -14 -15 -16 -17 -18 -19 -20出力: 列 1 の要素の最大値と最小値の差は次のとおりです: 15 列 2 の要素の最大値と最小値の差は次のとおりです: 15 3 列目の要素の最大値と最小値の差は次のとおりです。 15 要素の最大値と最小値の差4 列目の要素は: 15 5 列目の要素の最大値と最小値の差は: 15







入力:
9 5 7 2 1
6 8 3 4 10
11 15 12 13 14< /span> 最大値と最小値の差値であり、列 5 の要素の最小値は次のとおりです: 18 列 4 の要素の最大値と最小値の差は次のとおりです。 18 の最大値と最小値の差列 3 の要素は次のとおりです。 14 列 2 の要素の最大値と最小値の差は次のとおりです。 13 列 1 の要素の最大値と最小値の差は次のとおりです。 : 10出力:
16 18 17 20 19





参考回答

質問4

#include<stdio.h>
#define ROW 3
#define COLUMN 4
int calculateSum(int arr[][COLUMN],int row);
int main(void)
{
    
    
    int arr[ROW][COLUMN];
    for(int i=0;i<ROW;i++)
    {
    
    
        for(int j=0;j<COLUMN;j++)
        {
    
    
            scanf("%d",&arr[i][j]);
        }
    }
    printf("二维数组所有元素的和为: %d\n",calculateSum(arr,ROW));

    getchar();
    getchar();
    return 0;
}
int calculateSum(int arr[][COLUMN],int row)
{
    
    
    int sum=0;
    for(int i=0;i<row;i++)
    {
    
    
        for(int j=0;j<COLUMN;j++)
        {
    
    
            sum+=arr[i][j];
        }
    }
    return sum;
}

解析する

まず、2次元配列の行数を表すために定数ROWが定義され、2次元配列の列数を表すために定数COLUMNが定義される。次に、main 関数では、ユーザーが入力した 2 次元配列の要素を、ネストされた for ループによって 1 つずつ読み込んで、arr 配列に格納します。次に、calculateSum 関数を呼び出して 2 次元配列のすべての要素の合計を計算し、結果を出力します。

CalculateSum 関数では、まず計算結果を保存するローカル変数 sum を定義します。次に、2D 配列の各要素がネストされた for ループで反復され、合計に累積されます。最後に、計算結果の合計を返します。

質問5

答え 1

#include<stdio.h>
#include<stdlib.h>
#define ROW 4
#define COLUMN 5
int* calculateColumnDiff(int arr[][COLUMN],int row);
int main(void)
{
    
    
    int arr[ROW][COLUMN];
    int *difference;
    for(int i=0;i<ROW;i++)
    {
    
    
        for(int j=0;j<COLUMN;j++)
        {
    
    
            scanf("%d",&arr[i][j]);
        }
    }
    difference=calculateColumnDiff(arr,ROW);
    for(int i=0;i<COLUMN;i++)
    {
    
    
        printf("第%d列元素的最大值和最小值的差值为: %d\n",i+1,difference[i]);
    }

    getchar();
    getchar();
    return 0;
}
int* calculateColumnDiff(int arr[][COLUMN],int row)
{
    
    
    int max,min;
    int *difference=(int*)malloc(COLUMN*sizeof(int));
    for(int c=0;c<COLUMN;c++)
    {
    
    
        max=min=arr[0][c];
        for(int r=1;r<row;r++)
        {
    
    
            if(arr[r][c]>max)
                max=arr[r][c];
            else if(arr[r][c]<min)
                min=arr[r][c];
        }
        difference[c]=max-min;
    }
    return difference;
}
解析する

まず、2次元配列の行数を表すために定数ROWが定義され、2次元配列の列数を表すために定数COLUMNが定義される。

main関数では、各列の最大値と最小値の差の結果を保存するために、整数へのポインタdifferenceを宣言しています。次に、ユーザーが入力した 2 次元配列の要素が、ネストされた for ループによって 1 つずつ読み取られ、arr 配列に格納されます。次に、calculateColumnDiff 関数を呼び出して各列の差を計算し、返された結果を差に割り当てます。

CalculateColumnDiff 関数では、現在の列の最大値と最小値をそれぞれ表すローカル変数 max と min が最初に定義されます。次に、malloc 関数を使用して、動的メモリ割り当てを通じて COLUMN*sizeof(int) のサイズの 1 次元配列を割り当て、そのアドレスをポインタ差分に割り当てます。次に、2 レベルの for ループを使用して各列の要素を走査し、最大値と最小値を更新します。最後に、最大-最小の差を計算し、結果を差分配列の対応する位置に保存します。

最後に、main 関数で for ループを使用して、各列の差分結果を出力します。

答え 2

#include <stdio.h>

int calculateColumnDiff(int arr[][5], int rows)
{
    
    
    int diffArr[5];

    for (int j = 0; j < 5; j++)
    {
    
    
        int max = arr[0][j];
        int min = arr[0][j];

        for (int i = 1; i < rows; i++)
        {
    
    
            if (arr[i][j] > max)
            {
    
    
                max = arr[i][j];
            }

            if (arr[i][j] < min)
            {
    
    
                min = arr[i][j];
            }
        }

        diffArr[j] = max - min;
    }

    for (int i = 0; i < 5; i++)
    {
    
    
        printf("第%d列元素的最大值和最小值的差值为: %d\n", i + 1, diffArr[i]);
    }
}

int main()
{
    
    
    int arr[4][5];

    printf("请输入20个整数:\n");
    for (int i = 0; i < 4; i++)
    {
    
    
        for (int j = 0; j < 5; j++)
        {
    
    
            scanf("%d", &arr[i][j]);
        }
    }

    calculateColumnDiff(arr, 4);
    getchar();
    getchar();
    return 0;
}
解析する

主なアイデアは、2 つのネストされたループを使用して配列を反復処理し、各列の最大値と最小値を見つけ、差分を計算して結果を 1 次元配列 diffArr に格納することです。

main 関数では、ユーザーが入力した整数を格納する 2 次元配列 arr が最初に定義され、ユーザーが入力した整数は 2 つのネストされた for ループを通じて読み取られます。次に、calculateColumnDiff 関数を呼び出して、各列の差を計算します。

CalculateColumnDiff 関数では、まず、各列の差分値を格納する 1 次元配列 diffArr が定義されます。次に、各列で、最大値と最小値を現在の列の最初の要素に初期化します。 2 つのネストされたループを通じて 2 次元配列の各要素を反復処理し、最大値と最小値を更新します。最後に、各列の差分 max-min が diffArr 配列の対応する位置に格納され、ループを通じて各列の差分結果が出力されます。

2 つの回答を比較すると、最初の回答の方が質問の意味に沿っていますが、現時点では動的メモリ割り当てを学習していない読者もいることを考慮すると、2 番目の回答も受け入れられます。

おすすめ

転載: blog.csdn.net/weixin_44499065/article/details/134006351