1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

90 degree rotation of a 2D array in c++

  1. Apr 17, 2012 #1
    1. The problem statement, all variables and given/known data

    I am trying to rotate a 2D array of type string. I am not sure what the problem is with my function. Flipping does occur but for some reason, it's not by 90.


    2. Relevant equations



    3. The attempt at a solution
    The program consists of a function and the main. Here's the code (without all the declarations in the beginning)

    function:
    void rotate90(string &a, string &b, string &c, string &d)
    {
    string temp = a;
    a = b;
    b = c;
    c = d;
    d = temp;
    }

    Main: (rotation + output)

    for(int i=0; i<arr_row/2; i++)
    for(int j=0; j<(arr_col+1)/2; j++)
    rotate90(a[j], a[arr_row-1-j], a[arr_row-1-i][arr_col-1-j], a[j][arr_col-1-i]); //error is here

    //output of a 90 degree rotation
    cout<<"the matrix rotation"<<endl;
    for (int i = 0; i< arr_row; i++) {
    for (int j = 0; j< arr_col; j++) {
    cout << a[j] << " ";

    can someone figure out where the error is in the rotation part? Thank you
     
  2. jcsd
  3. Apr 17, 2012 #2

    I like Serena

    User Avatar
    Homework Helper

    Hi Absolutism! :wink:

    What is the error that you get?
    Which matrices did you try?
     
  4. Apr 17, 2012 #3
    I didn't get an error, but I guess they won't rotate because they're rectangular?
     
  5. Apr 17, 2012 #4

    I like Serena

    User Avatar
    Homework Helper

    I think it does sort of rotate, but perhaps not the way it's supposed to.

    Perhaps you could try the program with a couple of matrices?
    Say a 2x2 one?
    Or a 3x4 one?
     
  6. Apr 17, 2012 #5
    yes, it worked for square matrices, but not for rectangular ones for some reason L:
     
  7. Apr 17, 2012 #6

    I like Serena

    User Avatar
    Homework Helper

    What happened to a rectangular one?
     
  8. Apr 17, 2012 #7
    if I input..
    7 3 6
    8 1 2

    I get
    1 8 7
    2 6 3
     
  9. Apr 17, 2012 #8

    I like Serena

    User Avatar
    Homework Helper

    Which matrix would you like to have had?
     
  10. Apr 17, 2012 #9
    7 3 6
    8 1 2

    87
    12
    26
     
  11. Apr 17, 2012 #10

    I like Serena

    User Avatar
    Homework Helper

    Okay.
    Your program "rotates" the matrix in place, keeping the number of rows and columns the same.
    But the matrix you just wrote down has a different number of rows and columns (exchanged actually)...

    Are you supposed to rewrite the program?
    Or are you supposed to find and fix bugs in it?
     
  12. Apr 17, 2012 #11
    No, I am supposed to rewrite it
     
  13. Apr 17, 2012 #12

    I like Serena

    User Avatar
    Homework Helper

    In that case, shouldn't you create a new output matrix with the proper number of rows and columns?
     
  14. Apr 17, 2012 #13
    Yes, I tried that and compiled it, but it results in
    73
    81
    62

    so, it wouldn't rotate any more
     
  15. Apr 17, 2012 #14

    I like Serena

    User Avatar
    Homework Helper

    How does that program look?

    Btw, perhaps you could put your program between [ code ]...[ /code ] tags (without the spaces)?
     
  16. Apr 17, 2012 #15
    The program looks quite messy L: However, the part in bold is the matrix rotation part.
    Code (Text):
    #include <iostream>      
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <vector>

    using  namespace  std;

    [B]void rotate90(string a, string b, string c, string d)
    {
       string temp = a;
       a = b;
       b = c;
       c = d;
       d = temp;
    }
    [/B]


    int calc_occ (vector<vector<string> >a, vector<vector<string>> p )
    {
    int  a_rows = a.size( );
    int  a_cols = a[0].size( );
    int  p_rows = p.size( );
    int  p_cols = p[0].size( );

    int counter=0;
    bool flag=false;
    int x=0; int y=0;
    int i=0; int j=0;

    while (a_cols!= i+x && p_cols!= j+y)
    {
    for (int i=0; i<p_rows; i++){
        for (int j=0; j<p_cols; j++)
    {
        if (a[x+i][y+j]==p[i][j])
            flag = true;
        if (flag = false){x++; y++;  break;} //outer loop increment x until rows then x=0 then y until last dimention
    }
        if (flag == true) {counter++; x= + p_rows; y= + p_cols; }
    }

    }
    return counter;
    }

    int  main ( )  {


    ifstream infile1;
    ifstream infile2;
    infile1.open ("Array.txt");
    infile2.open ("Pattern.txt");
    if (!infile1||!infile2) {cout<<"error"; return -1;}

    int arr_col, arr_row, pat_col, pat_row;
    cout<<"Enter number of rows in your file (array)"<<endl;
    cin>> arr_row;
    cout<<"Enter Number of columns in your file (array)"<<endl;
    cin>> arr_col;
       
    string line; string word;
    vector<vector<string> > a;

    while(!infile1.eof())
    {
    getline(infile1, line);
    istringstream stringline(line);
    vector<string> b;
    while(stringline >> word) {
    b.push_back(word);
    }
    a.push_back(b);
    }
    //output
    for (int i = 0; i< arr_row; i++) {                  
                for (int j = 0; j< arr_col; j++) {
                    cout << a[i][j] << " ";
                }
                cout << endl;
        }

    [B]//rotation

    for(int i=0; i<arr_row/2; i++)
       for(int j=0; j<(arr_col+1)/2; j++)
           rotate90(a[i][j], a[arr_row-1-j][i], a[arr_row-1-i][arr_col-1-j], a[j][arr_col-1-i]);

    //output of a 90 degree rotation
    cout<<"the matrix rotation"<<endl;
    for (int i = 0; i<arr_col; i++) {                  
                for (int j = 0; j<arr_row; j++) {
                    cout << a[i][j] << " ";
                }
                cout << endl;
        }[/B]

    cout<<"Enter number of rows in your file (pattern)"<<endl;
    cin>> pat_row;
    cout<<"Enter Number of columns in your file (pattern)"<<endl;
    cin>> pat_col;


    vector<vector<string> > p;
    while(!infile2.eof())
    {
    getline(infile2, line);
    istringstream stringline(line);
    vector<string> c;
    while(stringline >> word) {
    c.push_back(word);
    }
    p.push_back(c);
    }

    for (int i = 0; i< pat_row; i++) {                    //output of array
                for (int j = 0; j< pat_col; j++) {
                    cout << p[i][j] << " ";
                }
                cout << endl;
        }




    }
     
  17. Apr 17, 2012 #16

    I like Serena

    User Avatar
    Homework Helper

    Well, your rotate90() function exchanges elements in the matrix "a".
    But a has the wrong size for the output.

    So it seems to me that you should create a new output matrix (which I don't see in your current code), and you should copy entries from the matrix "a" to this output matrix in a different position.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook