Как напечатать элементы 2D матрицы в виде прямоугольной формы с помощью ввода, заданного пользователем

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Я столкнулся с этим вопросом на одном из экзаменов в нашем колледже. Никто из моих друзей не смог мне помочь. Я даже проверил все ведущие онлайн-платформы на предмет желаемых критериев вывода. Но бесполезно, поэтому я хотел опубликовать свой вопрос в Stack Overflow.

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

 #include <stdio.h>

int main()
{

     int a[4][4] = {{1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 16}};

     int k, l, m, n, o, r;

     int temp[4][4] = {0};
     printf("Enter index of row amp; column: ");

     int p, q;
     scanf("%d %d", amp;p, amp;q);

     for (int i = p; i < 4; i  )
     {
          for (int j = q; j < 4; j  )
          {
               temp[i][j] = a[i][j];
               // initial given index number to left_most number
          }
          k = i   1, l = 4 - q;

          for (k; k <= l; k  )
          {
               temp[k][l] = a[k][l];
               //rightmost element to bottom
          }
          m = k - 1, n = l - 1;

          for (n; n >= q; n--)
          {
               temp[m][n] = a[m][n];
               //bottomright to left elements upto the column index provided by user
          }
          o = m, r = q;

          for (o; o >= i   1; o--)
          {
               temp[o][r] = a[o][r];
               //bottomleft to initial index element
          }
          break;
     }

     for (int i = 0; i < 4; i  )
     {
          for (int j = 0; j < 4; j  )
          {

               //if the element is zero then priting a space else printing the number
               if (temp[i][j] == 0)
               {
                    printf(" ");
               }

               else
               {
                    printf("%d ", temp[i][j]);
               }
          }
          printf("n");
     }
     return 0;
}
  

Пример ввода:
Введите индекс строки и столбца: 0 1

Пример вывода:

 2  3  4
6     8
10    12
14 15 16
  

Мой код работает только для примера ввода и следующего столбца.

Итак, мне нужна помощь в том, как заставить мой код работать для любого ввода, заданного пользователем, он должен вывести из него нулевую (0) форму.

Комментарии:

1. Хотя это допустимо для C , это намного лучше подходит для языка программирования C. Я оставил тег C , но вы, возможно, захотите его удалить. Visual Studio code и C 14 не имеют абсолютно никакого отношения к этому вопросу, поэтому я удалил их теги.

2. спасибо вам за это, сэр. Я новичок в сообществе stack overflow. Поэтому я приношу извинения за это

3. Как должен выглядеть вывод для других входных данных? Все, с чем нам нужно работать, — это приведенный код, и, по вашему собственному признанию, он не работает. Это затрудняет определение того, что должен делать код. Например, каким должен быть вывод, скажем, 10, 3?

Ответ №1:

Существует довольно аккуратное решение этой проблемы

   for (int r = 0; r < numrows; r  ) {
      for (int c = 0; c < numcols; c  ) {
          if (r >= p amp;amp; c >= q amp;amp; 
             (c == q || c == numcols - 1 || r == p || r == numrows - 1)){
             printf("- ",a[r][c]);
          }
          else {
             printf("  ");
          }
       }
       printf("n");
   }
  

где numrows = 4 и numcols = 4

Комментарии:

1. Большое вам спасибо. ваш ответ был очень полезен.

Ответ №2:

Для начала нет необходимости объявлять вспомогательный массив, если задача состоит просто в выводе подмассива исходного массива.

Простой подход в C может выглядеть следующим образом.

 #include <stdio.h>

void rectangle_pattern( size_t n, int a[][n], size_t row, size_t col )
{
    for ( size_t i = row; i < n;   i )
    {
        if ( i == row || i == n - 1 )
        {
            for ( size_t j = col; j < n; j   )
            {
                printf( "- ", a[i][j] );
            }
        }
        else
        {
            printf( "-", a[i][col] );
            if ( col != n - 1 ) printf( "%*d", ( int )( 3 * ( n - col - 1 ) ), a[i][n-1] );
        }
        putchar( 'n' );
    }
}

int main(void) 
{
    enum { N = 4 };
    int a[N][N]= 
    { 
        {  1,  2,  3,  4 },
        {  5,  6,  7,  8 }, 
        {  9, 10, 11, 12 }, 
        { 13, 14, 15, 16 } 
    };

    size_t row = 0, col = 0;
    
    rectangle_pattern( N, a, row, col );
    
    putchar( 'n' );
    
    row = 0, col = 1;
    
    rectangle_pattern( N, a, row, col );
    
    putchar( 'n' );

    row = 0, col = 2;
    
    rectangle_pattern( N, a, row, col );
    
    putchar( 'n' );

    row = 0, col = 3;
    
    rectangle_pattern( N, a, row, col );
    
    putchar( 'n' );

    return 0;
}
  

Вывод программы

  1  2  3  4 
 5        8
 9       12
13 14 15 16 

 2  3  4 
 6     8
10    12
14 15 16 

 3  4 
 7  8
11 12
15 16 

 4 
 8
12
16 
  

Объявление функции использует массив переменной длины в качестве параметра. Вы можете изменить объявление функции, объявляющее параметр как имеющий массив с фиксированным размером.

Комментарии:

1. Большое вам спасибо. ваш ответ был очень полезен.