Напишите C программу для преобразования 1D массива в 2D массив с использованием указателей - PullRequest
1 голос
/ 24 апреля 2020

Напишите программу C для преобразования 1D массива в 2D массив с использованием указателей. Выполните данные шаги для реализации приведенного выше кода.

  1. Попросите пользователя ввести количество строк (m) и количество столбцов (n) двумерного массива. Таким образом, общее количество элементов массива 1D = (m * n) элементов.
  2. Вызов функции input_array для сохранения элементов в массиве 1D.

    void input_array (int *arr,int size) // size = ​ m * n

  3. Вызов функции print_array для печати элементов массива 1D.

    void print_array (int *arr, int size)

  4. Вызов Функция array_to_matrix для преобразования 1D-массива в 2D-массив.

    void array_to_matrix(int **matrix, int *arr, int row, int col)

  5. Вызов функции print_matrix для печати элементов 2D-массива.

    void print_matrix(int **mat, int row, int col)

Все функции должны вызываться из main (). Доступ и хранение элементов в указателях должны выполняться только с помощью указателей.

Код:

#include <stdio.h>
#include <stdlib.h>
#define max 100

void input_array (int *arr,int size);
void print_array (int *arr, int size);
void array_to_matrix(int **matrix, int *arr, int row, int col);
void print_matrix(int **matrix, int row, int col);


int main()
{
    int m, n, arr[max], mat[max][max];
    printf("Enter the number of rows(m):");
    scanf("%d",&m);
    printf("Enter the number of columns(n):");
    scanf("%d",&n);
    int size = m*n;

    input_array (arr,size);
    print_array (arr,size);
    array_to_matrix(mat, arr, m, n);
    print_matrix(mat, m, n);
}

void input_array (int *arr,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("Enter element a[%d]",i);
        scanf("%d",&arr[i]);    
    }
}

void print_array (int *arr, int size)
{
    int i;
    printf("\n 1D array is as follows : \n");
    for(i=0;i<size;i++)
    {
        printf("%d",arr[i]);
    }
}

void array_to_matrix(int **matrix, int *arr, int row, int col)
{
    int i,j,k=0;     
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            matrix[i][j] = arr[k];
            k++;
        }
    }

}

void print_matrix(int **matrix, int row, int col)
{
    int i,j;
    printf("\n 2D matrix is as follows : \n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
}

Ошибка: Я получаю ошибка сегментации. У меня проблема связана с указателем на массивы и с тем, как передать их в функцию.

1 Ответ

2 голосов
/ 24 апреля 2020

in

void main()
{
    int m, n, arr[max], mat[max][max];
    int size = m*n;

Вы вычисляете размер , в то время как m и n еще нет (возможно) инициализируется, поэтому значение size не определено с неопределенным поведением

In

 void array_to_matrix(int **matrix, int *arr, int row, int col)
 {
     int i,j,k=0;     
     for(i=0;i<row;i++)
     {
         for(j=0;j<col;j++)
         {
             matrix[i][j] = arr[k];
         }
     }
 }

подпись функции говорит matrix - это массив указателей на int , но он не совместим с main , где вы используете 2D-массив. Для совместимости:

void array_to_matrix(int (*matrix)[max], int *arr, int row, int col)

и то же для print_matrix :

void print_matrix(int (*matrix)[max], int row, int col)

или, если вы предпочитаете:

void array_to_matrix(int matrix[][max], int *arr, int row, int col)
void print_matrix(int matrix[][max], int row, int col)

Но:

Напишите программу C для преобразования массива 1D в массив 2D с использованием указателей

" 2D массив с использованием указателей " является злоупотреблением языком и означает одномерный массив указателей на int , 2D-массив отсутствует.

В предыдущей версии вы ограничивали размеры до 100, у вас нет причина сделать это, просто выделить массивы в куче.

Обратите внимание также k всегда значения 0 в array_to_matrix , поэтому вы всегда используете arr[0]

И:

void main()

неправильно, main возвращает int

Я также призываю вас всегда проверьте результат scanf , чтобы убедиться, что использовался правильный ввод, иначе вы работаете с неинициализированным значением с неопределенным поведением. Когда вы читаете количество строк и столбцов, проверьте, что есть не менее 1

В print_array для разделения значения печати с пробелом, чтобы сделать результат читабельным

Окончательно:

#include <stdio.h>
#include <stdlib.h>

void input_array (int *arr,int size);
void print_array (int *arr, int size);
void array_to_matrix(int ** matrix, int *arr, int row, int col);
void print_matrix(int ** matrix, int row, int col);


int main()
{
    int m, n, * arr, ** mat;
    int size, i;

    printf("Enter the number of rows(m):");
    if ((scanf("%d",&m) != 1) || (m < 1)) {
      puts("invalid value for rows");
      return -1;
    }

    printf("Enter the number of columns(n):");
    if ((scanf("%d",&n) != 1) || (n < 1)) {
      puts("invalid value for columns");
      return -1;
    }

    size = m*n;
    if (((arr = malloc(size * sizeof(int))) == NULL) ||
        ((mat = malloc(m * sizeof(int))) == NULL)) {
      puts("not enouh memory");
      exit(-1);
    }

    for (i = 0; i < m; ++i) {
      if ((mat[i] = malloc(n * sizeof(int))) == NULL) {
        puts("not enouh memory");
        exit(-1);
      }
    }
    input_array (arr,size);
    print_array (arr,size);
    array_to_matrix(mat, arr, m, n);
    print_matrix(mat, m, n);

    /* free resources */
    free(arr);
    for (i = 0; i < m; ++i)
      free(mat[i]);
    free(mat);

    return 0;
}

void input_array (int *arr,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("Enter element a[%d]",i);
        if (scanf("%d",&arr[i]) != 1) {
          int c;

          puts("invalid value, redo");

          /* flush invalid value up to the end of line */
          while ((c = getchar()) != '\n') {
            if (c == EOF) {
              puts("EOF, abort");
              exit(-1);
            }
          }

          i -= 1;
        }
    }
}

void print_array (int *arr, int size)
{
    int i;
    printf("\n 1D array is as follows : \n");
    for(i=0;i<size;i++)
    {
        printf("%d ",arr[i]);
    }
}

void array_to_matrix(int ** matrix, int *arr, int row, int col)
{
    int i,j,k=0;     
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            matrix[i][j] = arr[k++];
        }
    }

}

void print_matrix(int ** matrix, int row, int col)
{
    int i,j;
    printf("\n 2D matrix is as follows : \n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -g -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
Enter the number of rows(m):2
Enter the number of columns(n):aze
invalid value for columns
pi@raspberrypi:/tmp $ ./a.out
Enter the number of rows(m):-1
invalid value for rows
pi@raspberrypi:/tmp $ ./a.out
Enter the number of rows(m):2
Enter the number of columns(n):3
Enter element a[0]1
Enter element a[1]aa
invalid value, redo
Enter element a[1]2
Enter element a[2]3
Enter element a[3]4
Enter element a[4]5
Enter element a[5]6

 1D array is as follows : 
1 2 3 4 5 6 
 2D matrix is as follows : 
1 2 3 
4 5 6 
pi@raspberrypi:/tmp $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...