[good]c语言数组的运算

发布时间 2023-11-29 09:54:34作者: 风中狂笑
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10

int **createRandom2DArray(int rows, int cols)
{
    srand(time(NULL)); // 初始化随机数生成器

    int **arr = (int **)(malloc(sizeof(int *) * rows));
    if (arr == NULL)
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    for (int i = 0; i < rows; i++)
    {
        arr[i] = (int *)(malloc(sizeof(int) * cols));
        if (arr[i] == NULL)
        {
            printf("Memory allocation failed.\n");
            exit(1);
        }
        for (int j = 0; j < cols; j++)
        {
            arr[i][j] = rand() % 100; // 生成一个0到99的随机数
        }
    }
    return arr;
}

int *create1DArray(int size)
{
    int i;
    int *arr = (int *)(malloc(sizeof(int) * size));
    for (i = 0; i < size; i++)
    {
        arr[i] = 0;
    }
    return arr;
}

int *create2DArray(int rows, int cols)
{
    int i, j;
    int **arr = (int **)(malloc(sizeof(int *) * rows));
    if (arr == NULL)
    {
        printf("Error allocating memory\n");
        exit(1);
    }
    for (i = 0; i < rows; i++)
    {
        arr[i] = (int *)(malloc(sizeof(int) * cols));
        if (arr[i] == NULL)
        {
            printf("Error allocating memory\n");
            exit(1);
        }
        for (j = 0; j < cols; j++)
        {
            arr[i][j] = 0;
        }
    }
    return arr;
}

int *transTo1DOnesArray(int *arr, int size)
{
    int i;
    for (i = 0; i < size; i++)
    {
        arr[i] = 1;
    }
    return arr;
}

int **transTo2DOnesArray(int **arr, int rows, int cols)
{
    int i, j;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            if (i == j)
            {
                arr[i][j] = 1;
            }
        }
    }
    return arr;
}

int sum1DArray(const int *arr, const int size)
{
    int i = 0;
    int sum = 0;
    for (i = 0; i < size; i++)
    {
        sum += arr[i];
    }
    return sum;
}

int sum2DArray(const int **arr, const int rows, const int cols)
{
    int sum = 0;
    int i = 0, j = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            sum += arr[i][j];
        }
    }
    return sum;
}

int sum2DArrayByPointers(int *start, int *end)
{
    int sum = 0;
    int *p = start;
    while (p < end)
    {
        sum += *p;
        p++;
    }
    return sum;
}

void print2DArray(int **p, int rows, int cols)
{
    printf("2D Array:\n");
    for (int i = 0; i < rows; i++)
    {
        printf("[");
        for (int j = 0; j < cols; j++)
        {
            printf("%d", p[i][j]);
            if (j != cols - 1)
            {
                printf(", ");
            }
        }
        printf("]\n");
    }
}

void print1DArray(int *p, int size)
{
    printf("Array: [");
    for (int i = 0; i < size; i++)
    {
        printf("%d", p[i]);
        // 不在最后一个元素后面打印逗号
        if (i != size - 1)
        {
            printf(", ");
        }
    }
    printf("]\n");
}

int **transpose2DArray(int **p, int rows, int cols)
{
    int **p_trans = (int **)malloc(sizeof(int *) * cols);
    if (p_trans == NULL)
    {
        printf("malloc failed\n");
        exit(1);
    }
    for (int i = 0; i < cols; i++)
    {
        p_trans[i] = (int *)malloc(sizeof(int) * rows);
        if (p_trans[i] == NULL)
        {
            printf("malloc failed\n");
            exit(1);
        }
    }
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            p_trans[j][i] = p[i][j];
        }
    }
    return p_trans;
}

int main()
{
    int *p_arr1d = create1DArray(10);
    print1DArray(p_arr1d, 10);
    int rows = 3;
    int cols = 4;
    int **p_arr2d = create2DArray(rows, cols);
    print2DArray(p_arr2d, rows, cols);
    int sum2 = 0;

    int *p1darr_ones = transTo1DOnesArray(p_arr1d, 10);
    print1DArray(p1darr_ones, 10);
    int **p2darr_ones = transTo2DOnesArray(p_arr2d, rows, cols);
    print2DArray(p2darr_ones, rows, cols);
    int sum1d = sum1DArray(p1darr_ones, 10);
    int sum2d = sum2DArray(p2darr_ones, rows, cols);
    printf("sum1d=%d, sum2d=%d\n", sum1d, sum2d);

    int **p2d = createRandom2DArray(3, 5);
    print2DArray(p2d, 3, 5);
    int **p2d_tr = transpose2DArray(p2d, 3, 5);
    print2DArray(p2d_tr, 5, 3);

    // free memory
    free(p_arr1d);
    for (int i = 0; i < rows; i++)
    {
        free(p_arr2d[i]);
    }
    free(p_arr2d);

    printf("all done");

    return 0;
}