Перенести из двумерного массива числа в одномерный - кратные трем - C (СИ)
Формулировка задачи:
Дан двумерный массив. Перенести из двумерного в одномерный - числа, кратные трем. Написал код, но в одномерный переносятся либо нули, либо какие-то пятизначные числа. Подскажите, пожалуйста, где я допустил ошибку?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n,i,j;
printf("vvedite m");
scanf("%d",&m);
printf("vvedite n");
scanf("%d",&n);
int**a=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
{
a[i]=(int*)malloc(sizeof(int)*n);
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=rand()%100;
printf("%d ",a[i][j]);
}
printf("\n");
}
int*p;
int k=0;
p[k];
p=(int*)malloc(sizeof(int)*k);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]%3==0)
{
p[k]=a[i][j];
k++;
}
printf("%d ",p[k]);
}
}
}Решение задачи: «Перенести из двумерного массива числа в одномерный - кратные трем»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **a, m, n, i, j, *p = 0, *tmp, k = 0;
//****** ввод размерностей массива ******
printf("vvedite m: ");
scanf("%d", &m);
printf("vvedite n: ");
scanf("%d", &n);
putchar('\n');
//****** выделение памяти ******
a = (int **)malloc(m * sizeof(int *));
for(i = 0; i < m; i++)
a[i] = (int *)malloc(n * sizeof(int *));
//****** инициализация массива ******
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
a[i][j] = rand() % 100;
printf("%02d ", a[i][j]);
}
printf("\n");
}
//****** поиск чисел, которые кратны 3 ******
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(a[i][j] % 3 == 0)
{
if(!(tmp = (int *)realloc(p, ++k * sizeof(int))))
{
printf("k = %d\n", k);
printf("\nError! Memory alloc!\n");
exit(-1);
}
p = tmp;
p[k - 1] = a[i][j];
}
}
}
//****** вывод результата ******
printf("\nout = ");
if(p)
{
for(i = 0; i < k; i++)
printf("%02d ", p[i]);
}else printf("empty");
printf("\n\n");
//****** освобождение памяти ******
for(i = 0; i < m; i++)
free(a[i]);
free(a);
return 0;
}
Объяснение кода листинга программы
- Объявление переменных:
- i, j - индексы для обхода массива
- m, n - размерности массива
- p, tmp - указатели для работы с памятью
- k - счетчик для подсчета количества найденных чисел
- a - двумерный массив
- out - одномерный массив для хранения найденных чисел
- Ввод размерностей массива с помощью функции scanf.
- Выделение памяти под двумерный массив с помощью функции malloc.
- Инициализация массива случайными числами от 0 до 99 с помощью функции rand().
- Поиск чисел, которые кратны 3, с помощью условия if(a[i][j] % 3 == 0).
- Если число найдено, то выполняется:
- Реализация динамического массива для хранения найденных чисел с помощью realloc.
- Если realloc не может выделить память, то выводится сообщение об ошибке и программа завершается.
- Число добавляется в динамический массив.
- Вывод результата с помощью функции printf. Если динамический массив не пустой, то выводятся все числа, иначе выводится слово
empty. - Освобождение памяти с помощью функции free.
- Возврат 0 в конце программы означает успешное выполнение.