Перенести из двумерного массива числа в одномерный - кратные трем - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дан двумерный массив. Перенести из двумерного в одномерный - числа, кратные трем. Написал код, но в одномерный переносятся либо нули, либо какие-то пятизначные числа. Подскажите, пожалуйста, где я допустил ошибку?
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int m,n,i,j;
  6. printf("vvedite m");
  7. scanf("%d",&m);
  8. printf("vvedite n");
  9. scanf("%d",&n);
  10. int**a=(int**)malloc(sizeof(int*)*m);
  11. for(i=0;i<m;i++)
  12. {
  13. a[i]=(int*)malloc(sizeof(int)*n);
  14. }
  15. for(i=0;i<m;i++)
  16. {
  17. for(j=0;j<n;j++)
  18. {
  19. a[i][j]=rand()%100;
  20. printf("%d ",a[i][j]);
  21. }
  22. printf("\n");
  23. }
  24. int*p;
  25. int k=0;
  26. p[k];
  27. p=(int*)malloc(sizeof(int)*k);
  28. for(i=0;i<m;i++)
  29. {
  30. for(j=0;j<n;j++)
  31. {
  32. if(a[i][j]%3==0)
  33. {
  34. p[k]=a[i][j];
  35. k++;
  36. }
  37. printf("%d ",p[k]);
  38. }
  39. }
  40. }

Решение задачи: «Перенести из двумерного массива числа в одномерный - кратные трем»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int **a, m, n, i, j, *p = 0, *tmp, k = 0;
  7.  
  8.     //****** ввод размерностей массива ******
  9.  
  10.     printf("vvedite m: ");
  11.     scanf("%d", &m);
  12.     printf("vvedite n: ");
  13.     scanf("%d", &n);
  14.     putchar('\n');
  15.  
  16.     //****** выделение памяти ******
  17.  
  18.     a = (int **)malloc(m * sizeof(int *));
  19.     for(i = 0; i < m; i++)
  20.         a[i] = (int *)malloc(n * sizeof(int *));
  21.  
  22.     //****** инициализация массива ******
  23.  
  24.     for(i = 0; i < m; i++)
  25.     {
  26.         for(j = 0; j < n; j++)
  27.         {
  28.             a[i][j] = rand() % 100;
  29.             printf("%02d ", a[i][j]);
  30.         }
  31.  
  32.         printf("\n");
  33.     }
  34.  
  35.     //****** поиск чисел, которые кратны 3 ******
  36.  
  37.     for(i = 0; i < m; i++)
  38.     {
  39.         for(j = 0; j < n; j++)
  40.         {
  41.             if(a[i][j] % 3 == 0)
  42.             {
  43.                 if(!(tmp = (int *)realloc(p, ++k * sizeof(int))))
  44.                 {
  45.                     printf("k = %d\n", k);
  46.                     printf("\nError! Memory alloc!\n");
  47.                     exit(-1);
  48.                 }
  49.  
  50.                 p = tmp;
  51.                 p[k - 1] = a[i][j];
  52.             }
  53.         }
  54.     }
  55.  
  56.     //****** вывод результата ******
  57.  
  58.     printf("\nout = ");
  59.  
  60.     if(p)
  61.     {
  62.         for(i = 0; i < k; i++)
  63.             printf("%02d ", p[i]);
  64.     }else printf("empty");
  65.  
  66.     printf("\n\n");
  67.  
  68.     //****** освобождение памяти ******
  69.  
  70.     for(i = 0; i < m; i++)
  71.         free(a[i]);
  72.     free(a);
  73.  
  74.     return 0;
  75. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы