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