Создание динамических массивов из двумерного массива. С(Си)

Рейтинг: -1Ответов: 1Опубликовано: 22.01.2023

Данные: tab2 - массив действительных чисел размерностью n строк, m столбцов. Напишите функции:

• f1 — создает массив tabD, содержащий положительные элементы,

• f2 — создает массив tabU, содержащий отрицательные элементы.

Напишите программу, в которой загружаются данные, вызываются функции и отображаются результаты.


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


void main() {
    int **tabD;
    int **tabU;
    int i, j;
    int i2, j2;
    int m, n;
    printf("Podaj m & n:\n");
    scanf("%d/%d", &m, &n);
    tabD = (int**) malloc(sizeof(int*)*m);
    tabU = (int**) malloc(sizeof(int*)*m);
    for (i = 0; i < m; i++) {
        tabD[i] = (int*) malloc(sizeof(int)*n);
    }
    for (i2 = 0; i2 < m; i2++) {
        tabU[i2] = (int*) malloc(sizeof(int)*n);
    }
 

    for (i = 0; i < m; ++i) {
        for (j = 0; j < n; ++j) {
         tabD[i][j] = rand() % 1000;
         printf("%d ", tabD[i][j]);
        }
        printf("\n");
    }
    for (i2 = 0; i2 < m; ++i2) {
        for (j2 = 0; j2 < n; ++j2) {
         tabU[i2][j2] = -(rand() % 1000);
         printf("%d ", tabU[i2][j2]);
        }
        printf("\n");
    }
 

    free(tabD);
    free(tabU);
     
}

Подскажите как правильно это сделать! А то мне кажется, что мое решение не является хорошим.

Ответы

▲ 1Принят

Во-первых, вам нужны сами функции. Напишем. Функция возвращает одномерный массив, и его размер через newSize:

double* f2(double** t, int r, int c, int* newSize) {
    int cnt = 0, k = 0;
    // Считаем отрицательные
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            if (t[i][j] < 0) cnt++;
    // Выделяем нужную память
    double* tn = malloc(cnt * sizeof(double));
    // Записываем отрицательные элементы
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            if (t[i][j] < 0) tn[k++] = t[i][j];
    // Возврат
    *newSize = cnt;
    return tn;
    }

Вторая функция абсолютно такая же, только ищет положительные элементы.

double* f1(double** t, int r, int c, int* newSize) {
    int cnt = 0, k = 0;

    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            if (t[i][j] > 0) cnt++;

    double* tn = malloc(cnt * sizeof(double));

    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            if (t[i][j] > 0) tn[k++] = t[i][j];

    *newSize = cnt;
    return tn;
    }

Вот и всё. А еще в main создаем и наполняем двумерный массив tab2.

int main() {
    int n, m;
    // Читаем размер
    scanf("%d %d", &n, &m);
    // Выделяем память, заполняем и выводим одновременно
    double** tab2 = malloc(n * sizeof(double*));

    for (int i = 0; i < n; ++i) {
        tab2[i] = malloc(m * sizeof(double));

        for (int j = 0; j < m; ++j) {
            tab2[i][j] = rand() % 200 - 100;
            printf("%lf  ", tab2[i][j]);
            }

        puts("");
        }

    puts("\n");

    // Вызываем f1
    int tabDcount;
    double* tabD = f1(tab2, n, m, &tabDcount);
    // Выводим результаты и освобождаем память    
    for (int i = 0; i < tabDcount; ++i) printf("%lf  ", tabD[i]);

    puts("\n");
    free(tabD);

    // То же самое и для f2
    int tabUcount;
    double* tabU = f2(tab2, n, m, &tabUcount);

    for (int i = 0; i < tabUcount; ++i) printf("%lf  ", tabU[i]);

    puts("\n");
    free(tabU);

    // Освобождаем память tab2    
    for (int i = 0; i < n; ++i) {
        free(tab2[i]);
        }
    free(tab2);
    }