如何通过用户输入将2D矩阵的元素打印为矩形

问题描述

我在我们大学的一项评估中遇到了这个问题。我的朋友都无法帮助我。我什至检查了所有领先的在线平台的期望输出标准。但是没有用,所以我想在堆栈溢出中发布我的问题。

我请正在关注此标签的人来帮助我。尽管我的评估已经完成,但我还是很想解决这个问题,但我没有解决

#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 & column: ");

     int p,q;
     scanf("%d %d",&p,&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)形状。

解决方法

有一个很好的解决此问题的方法

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

其中numrows = 4numcols = 4

,

对于初学者来说,如果任务只是输出原始数组的子数组,则无需声明辅助数组。

使用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( "%2d ",a[i][j] );
            }
        }
        else
        {
            printf( "%2d",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,col );
    
    putchar( '\n' );

    row = 0,col = 2;
    
    rectangle_pattern( N,col = 3;
    
    rectangle_pattern( N,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 

函数声明使用可变长度数组作为参数。您可以更改函数声明,以声明参数为具有固定大小的数组。