I need help with a function that swaps array halves.

Discussion in 'C++' started by cheetahclaws@yahoo.com, Sep 6, 2007.

  1. Guest

    I am trying to create a function that reverses the halves of an
    integer array. For example. if the array contains 1,2,3,4 --- after it
    has gone to the function I constructed, the array will look like
    3,4,1,2. In the case the array contains an odd amount of elements e.g.
    1,2,3,4,5, it will look like 4,5,3,1,2.

    I have created such an array as followed:
    ==================================
    for(i=0;i<=((size/2)-1);i++)
    {
    if(size%2 != 0)
    {
    t = a;
    a = a[(size/2)+i+1];
    a[(size/2)+i+1] = t;
    }
    else
    {
    t = a;
    a = a[(size/2)+i];
    a[(size/2)+i] = t;
    }
    }
    ==================================


    NOW, the problem is I want to create a function that does the same
    thing, but I want to use a Nested For loop to do it as such without
    using IF statements to handle what to do when size is odd or not.


    I came up with the following code:
    ==================================
    void reverseHalves(int a[], int size)
    {
    int i, t, j=0;

    for(i=0;i<=((size/2)-1);i++)
    {
    t = a;
    a = a[(size/2)+i+1];
    a[(size/2)+i+1] = t;

    for(j=(size-(size/2));j<=(size/2)-1;j++)
    {
    t = a[j];
    a[j] = a[(size/2)+j-1];
    a[(size/2)+j-1] = t;
    }
    }
    ==================================


    The problem is the second nested-for-loop version I have come up with
    doesn't work. It only works for odd numbers. When I enter an even
    number, I always end up getting a -24214214 or something like that for
    one of the numbers.

    It alllllmost works. I have been at this for about three hours and
    almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
    GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

    -Thanks for listen.
     
    , Sep 6, 2007
    #1
    1. Advertising

  2. Jim Langston Guest

    <> wrote in message
    news:...
    >I am trying to create a function that reverses the halves of an
    > integer array. For example. if the array contains 1,2,3,4 --- after it
    > has gone to the function I constructed, the array will look like
    > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    > 1,2,3,4,5, it will look like 4,5,3,1,2.
    >
    > I have created such an array as followed:
    > ==================================
    > for(i=0;i<=((size/2)-1);i++)
    > {
    > if(size%2 != 0)
    > {
    > t = a;
    > a = a[(size/2)+i+1];
    > a[(size/2)+i+1] = t;
    > }
    > else
    > {
    > t = a;
    > a = a[(size/2)+i];
    > a[(size/2)+i] = t;
    > }
    > }
    > ==================================
    >
    >
    > NOW, the problem is I want to create a function that does the same
    > thing, but I want to use a Nested For loop to do it as such without
    > using IF statements to handle what to do when size is odd or not.
    >
    >
    > I came up with the following code:
    > ==================================
    > void reverseHalves(int a[], int size)
    > {
    > int i, t, j=0;
    >
    > for(i=0;i<=((size/2)-1);i++)
    > {
    > t = a;
    > a = a[(size/2)+i+1];
    > a[(size/2)+i+1] = t;
    >
    > for(j=(size-(size/2));j<=(size/2)-1;j++)
    > {
    > t = a[j];
    > a[j] = a[(size/2)+j-1];
    > a[(size/2)+j-1] = t;
    > }
    > }
    > ==================================
    >
    >
    > The problem is the second nested-for-loop version I have come up with
    > doesn't work. It only works for odd numbers. When I enter an even
    > number, I always end up getting a -24214214 or something like that for
    > one of the numbers.
    >
    > It alllllmost works. I have been at this for about three hours and
    > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
    > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!


    This looks like homework, but you have shown a lot of effort. Look at this
    code, although you'll have to fix one bug when the arrays are odd sized:

    #include <iostream>

    void reverseHalves(int a[], int size)
    {
    int half = size / 2;
    bool odd = size % 2 == 1;

    int j = half;
    if ( odd )
    j++;

    for ( int i = 0; i < half; ++i )
    {
    std::swap( a, a[j++] );
    }
    }


    int main()
    {
    int Array[] = { 1, 2, 3, 4, 5, 6 };
    reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
    for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
    std::cout << Array << " ";
    std::cout << "\n";

    int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
    reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
    for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
    std::cout << Array2 << " ";
    std::cout << "\n";

    }

    Output:
    4 5 6 1 2 3
    5 6 7 4 1 2 3

    The output is close to what you want except for odd, where the question
    becomes... do you want
    4567123
    or
    5671234

    Fix the code to express what you want.
     
    Jim Langston, Sep 6, 2007
    #2
    1. Advertising

  3. Guest

    On Sep 5, 8:19 pm, "Jim Langston" <> wrote:
    > <> wrote in message
    >
    > news:...
    >
    >
    >
    > >I am trying to create a function that reverses the halves of an
    > > integer array. For example. if the array contains 1,2,3,4 --- after it
    > > has gone to the function I constructed, the array will look like
    > > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    > > 1,2,3,4,5, it will look like 4,5,3,1,2.

    >
    > > I have created such an array as followed:
    > > ==================================
    > > for(i=0;i<=((size/2)-1);i++)
    > > {
    > > if(size%2 != 0)
    > > {
    > > t = a;
    > > a = a[(size/2)+i+1];
    > > a[(size/2)+i+1] = t;
    > > }
    > > else
    > > {
    > > t = a;
    > > a = a[(size/2)+i];
    > > a[(size/2)+i] = t;
    > > }
    > > }
    > > ==================================

    >
    > > NOW, the problem is I want to create a function that does the same
    > > thing, but I want to use a Nested For loop to do it as such without
    > > using IF statements to handle what to do when size is odd or not.

    >
    > > I came up with the following code:
    > > ==================================
    > > void reverseHalves(int a[], int size)
    > > {
    > > int i, t, j=0;

    >
    > > for(i=0;i<=((size/2)-1);i++)
    > > {
    > > t = a;
    > > a = a[(size/2)+i+1];
    > > a[(size/2)+i+1] = t;

    >
    > > for(j=(size-(size/2));j<=(size/2)-1;j++)
    > > {
    > > t = a[j];
    > > a[j] = a[(size/2)+j-1];
    > > a[(size/2)+j-1] = t;
    > > }
    > > }
    > > ==================================

    >
    > > The problem is the second nested-for-loop version I have come up with
    > > doesn't work. It only works for odd numbers. When I enter an even
    > > number, I always end up getting a -24214214 or something like that for
    > > one of the numbers.

    >
    > > It alllllmost works. I have been at this for about three hours and
    > > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
    > > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

    >
    > This looks like homework, but you have shown a lot of effort. Look at this
    > code, although you'll have to fix one bug when the arrays are odd sized:
    >
    > #include <iostream>
    >
    > void reverseHalves(int a[], int size)
    > {
    > int half = size / 2;
    > bool odd = size % 2 == 1;
    >
    > int j = half;
    > if ( odd )
    > j++;
    >
    > for ( int i = 0; i < half; ++i )
    > {
    > std::swap( a, a[j++] );
    > }
    >
    > }
    >
    > int main()
    > {
    > int Array[] = { 1, 2, 3, 4, 5, 6 };
    > reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
    > for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
    > std::cout << Array << " ";
    > std::cout << "\n";
    >
    > int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
    > reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
    > for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
    > std::cout << Array2 << " ";
    > std::cout << "\n";
    >
    > }
    >
    > Output:
    > 4 5 6 1 2 3
    > 5 6 7 4 1 2 3
    >
    > The output is close to what you want except for odd, where the question
    > becomes... do you want
    > 4567123
    > or
    > 5671234
    >
    > Fix the code to express what you want.




    Thanks for the help. I'm starting to put together a picture of
    something here. I was just wondering, how does the swap function work?
    If I wanted to exclude it from the For-Loop and use something like:

    t=a;
    a = a[j];
    a[j] = t;
    j++;

    where t is a temporary variable, would that be the same?
     
    , Sep 6, 2007
    #3
  4. Jerry Coffin Guest

    In article <>,
    says...
    > I am trying to create a function that reverses the halves of an
    > integer array. For example. if the array contains 1,2,3,4 --- after it
    > has gone to the function I constructed, the array will look like
    > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    > 1,2,3,4,5, it will look like 4,5,3,1,2.


    Already posted on c.l.c++.m, but since you seem a bit stressed and this
    will get to you a bit sooner:

    #include <algorithm>

    void swap_halves(int *a, size_t size) {

    int pivot = size/2;

    std::swap_ranges(a, a+pivot, a+pivot+size%2);
    }

    --
    Later,
    Jerry.

    The universe is a figment of its own imagination.
     
    Jerry Coffin, Sep 6, 2007
    #4
  5. Phoenix Guest

    On 9 6 , 7 50 , wrote:
    > I am trying to create a function that reverses the halves of an
    > integer array. For example. if the array contains 1,2,3,4 --- after it
    > has gone to the function I constructed, the array will look like
    > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    > 1,2,3,4,5, it will look like 4,5,3,1,2.
    >
    > I have created such an array as followed:
    > ==================================
    > for(i=0;i<=((size/2)-1);i++)
    > {
    > if(size%2 != 0)
    > {
    > t = a;
    > a = a[(size/2)+i+1];
    > a[(size/2)+i+1] = t;
    > }
    > else
    > {
    > t = a;
    > a = a[(size/2)+i];
    > a[(size/2)+i] = t;
    > }
    > }
    > ==================================
    >
    > NOW, the problem is I want to create a function that does the same
    > thing, but I want to use a Nested For loop to do it as such without
    > using IF statements to handle what to do when size is odd or not.
    >
    > I came up with the following code:
    > ==================================
    > void reverseHalves(int a[], int size)
    > {
    > int i, t, j=0;
    >
    > for(i=0;i<=((size/2)-1);i++)
    > {
    > t = a;
    > a = a[(size/2)+i+1];
    > a[(size/2)+i+1] = t;
    >
    > for(j=(size-(size/2));j<=(size/2)-1;j++)
    > {
    > t = a[j];
    > a[j] = a[(size/2)+j-1];
    > a[(size/2)+j-1] = t;
    > }
    > }
    > ==================================
    >
    > The problem is the second nested-for-loop version I have come up with
    > doesn't work. It only works for odd numbers. When I enter an even
    > number, I always end up getting a -24214214 or something like that for
    > one of the numbers.
    >
    > It alllllmost works. I have been at this for about three hours and
    > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
    > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!
    >
    > -Thanks for listen.


    I have a silly idea, what about to use a stack to make it? I think you
    understand what I mean.
     
    Phoenix, Sep 6, 2007
    #5
  6. Jim Langston Guest

    <> wrote in message
    news:...
    > On Sep 5, 8:19 pm, "Jim Langston" <> wrote:
    >> <> wrote in message
    >>
    >> news:...
    >>
    >>
    >>
    >> >I am trying to create a function that reverses the halves of an
    >> > integer array. For example. if the array contains 1,2,3,4 --- after it
    >> > has gone to the function I constructed, the array will look like
    >> > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    >> > 1,2,3,4,5, it will look like 4,5,3,1,2.

    >>
    >> > I have created such an array as followed:
    >> > ==================================
    >> > for(i=0;i<=((size/2)-1);i++)
    >> > {
    >> > if(size%2 != 0)
    >> > {
    >> > t = a;
    >> > a = a[(size/2)+i+1];
    >> > a[(size/2)+i+1] = t;
    >> > }
    >> > else
    >> > {
    >> > t = a;
    >> > a = a[(size/2)+i];
    >> > a[(size/2)+i] = t;
    >> > }
    >> > }
    >> > ==================================

    >>
    >> > NOW, the problem is I want to create a function that does the same
    >> > thing, but I want to use a Nested For loop to do it as such without
    >> > using IF statements to handle what to do when size is odd or not.

    >>
    >> > I came up with the following code:
    >> > ==================================
    >> > void reverseHalves(int a[], int size)
    >> > {
    >> > int i, t, j=0;

    >>
    >> > for(i=0;i<=((size/2)-1);i++)
    >> > {
    >> > t = a;
    >> > a = a[(size/2)+i+1];
    >> > a[(size/2)+i+1] = t;

    >>
    >> > for(j=(size-(size/2));j<=(size/2)-1;j++)
    >> > {
    >> > t = a[j];
    >> > a[j] = a[(size/2)+j-1];
    >> > a[(size/2)+j-1] = t;
    >> > }
    >> > }
    >> > ==================================

    >>
    >> > The problem is the second nested-for-loop version I have come up with
    >> > doesn't work. It only works for odd numbers. When I enter an even
    >> > number, I always end up getting a -24214214 or something like that for
    >> > one of the numbers.

    >>
    >> > It alllllmost works. I have been at this for about three hours and
    >> > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
    >> > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

    >>
    >> This looks like homework, but you have shown a lot of effort. Look at
    >> this
    >> code, although you'll have to fix one bug when the arrays are odd sized:
    >>
    >> #include <iostream>
    >>
    >> void reverseHalves(int a[], int size)
    >> {
    >> int half = size / 2;
    >> bool odd = size % 2 == 1;
    >>
    >> int j = half;
    >> if ( odd )
    >> j++;
    >>
    >> for ( int i = 0; i < half; ++i )
    >> {
    >> std::swap( a, a[j++] );
    >> }
    >>
    >> }
    >>
    >> int main()
    >> {
    >> int Array[] = { 1, 2, 3, 4, 5, 6 };
    >> reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
    >> for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
    >> std::cout << Array << " ";
    >> std::cout << "\n";
    >>
    >> int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
    >> reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
    >> for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
    >> std::cout << Array2 << " ";
    >> std::cout << "\n";
    >>
    >> }
    >>
    >> Output:
    >> 4 5 6 1 2 3
    >> 5 6 7 4 1 2 3
    >>
    >> The output is close to what you want except for odd, where the question
    >> becomes... do you want
    >> 4567123
    >> or
    >> 5671234
    >>
    >> Fix the code to express what you want.

    >
    >
    >
    > Thanks for the help. I'm starting to put together a picture of
    > something here. I was just wondering, how does the swap function work?
    > If I wanted to exclude it from the For-Loop and use something like:
    >
    > t=a;
    > a = a[j];
    > a[j] = t;
    > j++;
    >
    > where t is a temporary variable, would that be the same?


    Yes. Swapping two variables is a very common programming in task, where you
    save one variable to a temp, assign the other to it, then save the temp to
    the second. It is so common, in fact, that it's in the stl. Realistically,
    it's probably supposed to be std::swap and I'm not even sure what header
    it's supposed to be in. Whichever header, apparently <iostream> includes
    it.
     
    Jim Langston, Sep 6, 2007
    #6
  7. James Kanze Guest

    On Sep 6, 3:03 am, Jerry Coffin <> wrote:
    > In article <>,
    > says...


    > > I am trying to create a function that reverses the halves of an
    > > integer array. For example. if the array contains 1,2,3,4 --- after it
    > > has gone to the function I constructed, the array will look like
    > > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
    > > 1,2,3,4,5, it will look like 4,5,3,1,2.


    > Already posted on c.l.c++.m, but since you seem a bit stressed and this
    > will get to you a bit sooner:


    > #include <algorithm>


    > void swap_halves(int *a, size_t size) {
    >
    > int pivot = size/2;
    >
    > std::swap_ranges(a, a+pivot, a+pivot+size%2);
    > }


    Interesting. Yet another standard function which I didn't know
    about. Using std::vector (of course), something like:

    std::swap_ranges( v.begin(),
    v.begin() + v.size() / 2,
    v.end - v.size() / 2 ) ;

    should do the trick.

    My first reaction, not knowing of this function, was to ask why
    he didn't use the classical solution:

    std::reverse( v.begin(), v.end() ) ;
    std::reverse( v.begin(), v.begin() + v.size() / 2 ) ;
    std::reverse( v.end() - v.size() / 2, v.end() ) ;

    And of course, std::rotate can also be used, although it would
    require an extra test:

    std::rotate( v.begin(), v.begin() + v.size() / 2, v.end() ) ;
    if ( v.size() % 2 != 0 ) {
    std::rotate( v.begin(), v.begin() + 1, v.end() - v.size() /
    2 ) ;
    }

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
     
    James Kanze, Sep 6, 2007
    #7
  8. Jerry Coffin Guest

    In article <>,
    says...
    > On Sep 6, 3:03 am, Jerry Coffin <> wrote:


    [ ... ]

    > > std::swap_ranges(a, a+pivot, a+pivot+size%2);
    > > }

    >
    > Interesting. Yet another standard function which I didn't know
    > about.


    Quite honestly, I didn't either until this came up. What I orginally
    thought of (and was looking for) was whether there was a version of
    remove that took a pair of iterators to specify what was to be removed.
    It doesn't exist, but opening the reference for algorithm, I noticed
    swap_ranges, which sounded quite promising...

    > Using std::vector (of course), something like:
    >
    > std::swap_ranges( v.begin(),
    > v.begin() + v.size() / 2,
    > v.end - v.size() / 2 ) ;


    You meant 'v.end()' of course.

    > should do the trick.


    Yup. Roughly the same idea would work here, using a+size-size/2 instead
    of a+size+size%2 [or, equivalently, a+size+(size&1)].

    > My first reaction, not knowing of this function, was to ask why
    > he didn't use the classical solution:


    [ ... reversals ]

    > And of course, std::rotate can also be used, although it would
    > require an extra test:


    Right -- but at least in this case, the extra test is only executed
    once, instead of inside a loop.

    --
    Later,
    Jerry.

    The universe is a figment of its own imagination.
     
    Jerry Coffin, Sep 7, 2007
    #8
  9. BobR Guest

    Jim Langston wrote in message...
    >
    > Yes. Swapping two variables is a very common programming in task, where

    you
    > save one variable to a temp, assign the other to it, then save the temp to
    > the second. It is so common, in fact, that it's in the stl.

    Realistically,
    > it's probably supposed to be std::swap and I'm not even sure what header
    > it's supposed to be in. Whichever header, apparently <iostream> includes
    > it.


    #include <algorithm>

    --
    Bob R
    POVrookie
     
    BobR, Sep 7, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Bender MX

    Help with Image Swaps

    Bender MX, Nov 14, 2003, in forum: HTML
    Replies:
    4
    Views:
    402
    Bender MX
    Nov 15, 2003
  2. tschulz

    emacs swaps windows

    tschulz, Nov 9, 2004, in forum: Python
    Replies:
    1
    Views:
    295
    Harry George
    Nov 10, 2004
  3. Ook
    Replies:
    9
    Views:
    296
    Sandeep
    Oct 9, 2005
  4. Aaron Graham
    Replies:
    20
    Views:
    1,736
    Aaron Graham
    Feb 2, 2006
  5. Ken Sington

    find two halves of a word?

    Ken Sington, Aug 8, 2004, in forum: Perl Misc
    Replies:
    1
    Views:
    111
    gnari
    Aug 8, 2004
Loading...

Share This Page