Копирование элементов двумерного массива в одномерный - C (СИ)

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

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

Значения элементов двумерного массива из m строк и n столбцов скопировать в одномерный масси размером m*n. Копирование проводить: а)по строкам, начиная с первой (а в нем - с крайнего лвеого эл-та) б)по столбцам начиная с первого (а в нем - с самого верхнего эл-та) написал начало программы, а дальше не знаю как. Можете объяснить, как делать дальше:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
 int m,n,i,j;
 printf("Vvedite razmer massiva");
 scanf("%d",&n);
 scanf("%d",&m);
 int **a=(int**)malloc(sizeof(int**)*n);
 for(i=0;i<n;i++)
 {
 a[i]=(int*)malloc(sizeof(int*)*m);
 }
 
 for(i=0;i<n;i++)
 {
 for(j=0;j<m;j++)
 {
 a[i][j]=rand()%10;
 printf(" %d",a[i][j]);
 }printf("\n");
 
 }
 int *p;
 p=(int *)malloc(sizeof(int *));
 for(i=0;i<n;i++)

 return 0;
}

Решение задачи: «Копирование элементов двумерного массива в одномерный»

textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
 
int main(void)
{
  int** a = NULL;
  int* b = NULL;
 
  int i = 0;
  int j = 0;
  int cnt = 0;
  int flag = 0;
 
  const int N = 3;
  const int M = 4;
 
  srand(time(NULL));
 
  a = malloc(M * sizeof(*a));
  b = malloc(M * N * sizeof(*b));
 
  if ((a != NULL) && (b != NULL))
  {
    i = 0;
    cnt = 0;
    flag = 1;
 
    while ((i < M) && flag)
    {
      a[i] = malloc(N *  sizeof(**a));
 
      if (a[i] == NULL)
      {
        flag = 0;
      }
      cnt++;
      i++;
    }
 
    if (!flag)
    {
      for(i = cnt - 1; i > -1; i--)
      {
        free(a[i]);
      }
    }
    else
    {
      for(i = 0; i < M; i++)
      {
        for(j = 0; j < N; j++)
        {
          a[i][j] = rand() % 10;
          printf("%2d ", a[i][j]);
        }
        printf("\n");
      }
      printf("\n");
 
      for(i = 0; i < M; i++)
      {
        memcpy(&b[i * N], &a[i][0], N * sizeof(*b));
      }
 
      for(i = 0; i < (M * N); i++)
      {
        printf("%2d ", b[i]);
      }
      printf("\n");
 
      for(i = 0; i < M; i++)
      {
        free(a[i]);
      }
    }
  }
 
  free(a);
  free(b);
 
  return 0;
}

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

Код начинается с объявления двух указателей на двумерный массив (int* a) и одномерный массив (int b). Затем объявляются переменные для управления циклом: i, j, cnt и flag. Далее определяются константы N и M, которые представляют собой размеры массивов. Затем производится инициализация генератора случайных чисел. Следующий блок кода выделяет память под двумерный массив (a) и одномерный массив (b). Если память успешно выделена, то флаг устанавливается в 1. Если произошла ошибка выделения памяти, то флаг устанавливается в 0. Далее следует цикл, который заполняет двумерный массив случайными числами от 0 до 9. Затем происходит копирование элементов из двумерного массива в одномерный. После этого двумерный массив освобождается от выделенной под него памяти, а затем и одномерный массив. Код завершается возвратом 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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