Перенести из двумерного массива числа в одномерный - кратные трем - 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;
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • i, j - индексы для обхода массива
    • m, n - размерности массива
    • p, tmp - указатели для работы с памятью
    • k - счетчик для подсчета количества найденных чисел
    • a - двумерный массив
    • out - одномерный массив для хранения найденных чисел
  2. Ввод размерностей массива с помощью функции scanf.
  3. Выделение памяти под двумерный массив с помощью функции malloc.
  4. Инициализация массива случайными числами от 0 до 99 с помощью функции rand().
  5. Поиск чисел, которые кратны 3, с помощью условия if(a[i][j] % 3 == 0).
  6. Если число найдено, то выполняется:
    • Реализация динамического массива для хранения найденных чисел с помощью realloc.
    • Если realloc не может выделить память, то выводится сообщение об ошибке и программа завершается.
    • Число добавляется в динамический массив.
  7. Вывод результата с помощью функции printf. Если динамический массив не пустой, то выводятся все числа, иначе выводится слово empty.
  8. Освобождение памяти с помощью функции free.
  9. Возврат 0 в конце программы означает успешное выполнение.

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы