Home > Enterprise >  Print 2D array in reverse (C )
Print 2D array in reverse (C )

Time:02-02

Write a program that reads 12 integers into a 2D integer array with 4 rows and 3 columns. The program then outputs the 2D array in reverse order according to both rows and columns.

Ex: If the input is:

5 7 3
6 4 3
5 6 9
5 2 8

then the output is:

8 2 5 
9 6 5 
3 4 6 
3 7 5 

For coding simplicity, output a space after every integer, including the last one on each row.

#include <iostream>
using namespace std;

int main() {

   const int ROWS = 4;
   const int COLS = 3;
   int arr[ROWS][COLS];
   int i, j;
   for(i = 0; i < ROWS; i  ){
        for(j = 0; j < COLS; j  ){
               cin>>arr[i][j];
         }
   }
   cout << arr[3][2] << " " << arr[3][1] << " " << arr[3][0] << " " << endl;
   cout << arr[2][2] << " " << arr[2][1] << " " << arr[2][0] << " "<< endl;
   cout << arr[1][2] << " " << arr[1][1] << " " << arr[1][0] << " "<< endl;
   cout << arr[0][2] << " " << arr[0][1] << " " << arr[0][0] << " "<< endl;


   return 0;
}

I ended up having to hardcode this question because I couldnt find a way to reverse the 2D array with a loop and get it to be outputted in the form of a graph. Is there a way i could reverse the 2D array using for loops and would it be possible to be able to change the amount of rows and columns and still output the corresponding graph of values?

CodePudding user response:

try this:

#include <iostream>
using namespace std;

int main() {

    const int ROWS = 4;
    const int COLS = 3;
    int arr[ROWS][COLS];
    int i, j;
    for (i = 0; i < ROWS; i  ) {
        for (j = 0; j < COLS; j  ) {
            cin >> arr[i][j];
        }
    }
    
    // output the reversed array
    for (int i = ROWS - 1; i >= 0; i--) {
        for (int j = COLS - 1; j >= 0; j--) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

CodePudding user response:

You can reverse a 2D array using nested for loops, try

#include <iostream>
using namespace std;

int main() {

   const int ROWS = 4;
   const int COLS = 3;

   int arr[ROWS][COLS];
   int i, j;

   // Input the values into the 2D array
   for(i = 0; i < ROWS; i  ) {
      for(j = 0; j < COLS; j  ) {
         cin >> arr[i][j];
      }
   }

   // Reverse the rows and columns of the 2D array
   for(i = ROWS - 1; i >= 0; i--) {
      for(j = COLS - 1; j >= 0; j--) {
         cout << arr[i][j] << " ";
      }
      cout << endl;
   }

   return 0;
}

As mentioned in comments below if you don't know ROWS and COLS size at compile time dynamically allocate the memory for 2D array(arr) in C using new operator.

CodePudding user response:

There is very little point reading the data into a 2D array for this program. A std::vector would do the trick, sized with ROWS * COLS values. You then have the benefit of being able to read those dimensions from the user, which addresses the second part of your question.

size_t size = ROWS * COLS;

// Read data
std::vector<int> data;
data.reserve(size);
for (int value; std::cin >> value; )
{
    data.push_back(value);
}

// Validate data
if (data.size() != size)
{
    std::cerr << "Unexpected end of input!\n";
    return EXIT_FAILURE;
}

When outputting, you can use a reverse iterator through the vector, and simply write a newline every COLS values.

// Output in reverse
int col = 0;
for (auto it = data.rbegin(); it != data.rend(); it  )
{
    std::cout << *it << " ";
    if (  col == COLS)
    {
        std::cout << "\n";
        col = 0;
    }
}

You can even easily fix the "space at the end of the line" problem by adjusting your output loop as follows:

// Output in reverse
int col = 0;
for (auto it = data.rbegin(); it != data.rend(); it  )
{
    std::cout << *it;
    if (  col == COLS)
    {
        std::cout << "\n";
        col = 0;
    }
    else
    {
        std::cout << " ";
    }
}
  •  Tags:  
  • c
  • Related