Создание динамических массивов из двумерного массива. С(Си)
Данные: 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 шт):
Автор решения: Mikhailo
→ Ссылка
Во-первых, вам нужны сами функции. Напишем. Функция возвращает одномерный массив, и его размер через 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);
}