Перенести из двумерного массива числа в одномерный - кратные трем - 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 в конце программы означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д