Как вставить элемент в 2d массив в C без потери предыдущего значения? В чем проблема с моей программой? - PullRequest
0 голосов
/ 18 марта 2019
#include<stdio.h>
int main()
{
    int a[4][3],i,j,k,row,col;
    puts("Enter the elemennts");
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            scanf("%d",&a[i][j]);
    puts("Enter the number:");
    scanf("%d",&k);
    puts("Enter row and column:");
    scanf("%d %d",&row,&col);
    row--; col--;
/**    row-2 col-2*/

    for(i=2;i>=0;i--)
    {
        for(j=2;j>=0;j--)
        {
                a[i+1][j+1]=a[i][j];
                if(i==row && j==col-1)
                    break;
        }
    }
        a[row][col]=k;
    for(i=0;i<4;i++)
    {
        for(j=0;j<3;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}

Вот, пожалуйста, помогите мне, где я не прав.

Как я хочу получить вывод, подобный этому примеру. Вывод:

1 2 3
4 5 6
6 7 8
Enter the number:32
Enter row and column:2 2
1 2 3
4 32 5
6 6 7
8

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

В чем проблема с моей программой?

Ваша ошибка a[i+1][j+1]=a[i][j];, так как ячейка сразу после i,j не i+1,j+1

Предложение:

#include<stdio.h>

#define NROW 4
#define NCOL 3

int main()
{
  int a[NROW][NCOL] = { 0};
  int i,j,k,row,col;
  puts("Enter the elements");
  for(i = 0; i<(NROW - 1); ++i) {
    for(j = 0; j<NCOL; ++j) {
      if (scanf("%d", &a[i][j]) != 1) {
        puts("invalid value");
        return -1;
      }
    }
  }
  puts("Enter the number:");
  if (scanf("%d", &k) != 1) {
    puts("invalid value");
    return -1;
  }
  printf("Enter row (1..%d) and column (1..%d):", NROW - 1, NCOL);
  if ((scanf("%d %d", &row, &col) != 2) ||
      (row < 1) || (row >= NROW) || (col < 1) || (col > NCOL)) {
    puts("invalid value");
    return -1;
  }
  row--;
  col--;

  /* i,j at the new last cell position */
  i = NROW - 1;
  j = 0;

  do {
    int previ, prevj; /* the cell before i,j */

    if (j == 0) {
      previ = i - 1;
      prevj = NCOL - 1;
    }
    else {
      previ = i;
      prevj = j - 1;
    }

    a[i][j] = a[previ][prevj];
    i = previ;
    j = prevj;
  } while ((i != row) || (j != col));

  a[row][col] = k;

  for(i = 0; i < NROW; ++i)
    {
      for(j = 0; j < NCOL; ++j)
        printf("%d ",a[i][j]);
      printf("\n");
    }
}

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

/tmp % gcc -pedantic -Wextra i.c
/tmp % ./a.out
Enter the elements
1 2 3
4 5 6
6 7 8
Enter the number:
32
Enter row (1..3) and column (1..3):
2 2
1 2 3 
4 32 5 
6 6 7 
8 0 0 

/tmp % ./a.out
Enter the elements
1 2 3
4 5 6
6 7 8
Enter the number:
32
Enter row (1..3) and column (1..3):
1 2
1 32 2 
3 4 5 
6 6 7 
8 0 0 

Как вы можете видеть, я также проверяю достоверность входов и использую определения препроцессора NROW и NCOL для легкого изменения размеров массива

1 голос
/ 18 марта 2019

Поскольку двумерный массив (он же массив массив) основан на последовательной памяти, вы можете упростить код с помощью memmove.

Функция для вставки значения в индекс r, c может быть простой:

#define ROWS 4
#define COLS 3

void insert_arr(int r, int c, int a[][COLS], int v)
{
  size_t elements_to_move = ROWS * COLS - (r * COLS + c + 1);
  memmove(&a[r][c] + 1, &a[r][c], sizeof(int) * elements_to_move);
  a[r][c] = v;
}

Пример программы:

void print_arr(int a[][COLS])
{
  for (int i=0; i<ROWS; ++i)
  {
    for (int j=0; j<COLS; ++j) printf("%4d ", a[i][j]);
    printf("\n");
  }
}

int  main()
{
  int a[ROWS][COLS];
  for (int i=0; i<ROWS; ++i)
  {
    for (int j=0; j<COLS; ++j) a[i][j] = 10*i + j;
  }

  print_arr(a);
  printf("------------------\n");
  insert_arr(1, 1, a, 9);
  print_arr(a);
}

Выход:

   0    1    2
  10   11   12
  20   21   22
  30   31   32
------------------
   0    1    2
  10    9   11
  12   20   21
  22   30   31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...