I need help with a function that swaps array halves.

C

cheetahclaws

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.
 
J

Jim Langston

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.
 
C

cheetahclaws

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?
 
J

Jerry Coffin

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);
}
 
P

Phoenix

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.
 
J

Jim Langston

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.
 
J

James Kanze

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 ) ;
}
 
J

Jerry Coffin

On Sep 6, 3:03 am, Jerry Coffin <[email protected]> wrote:

[ ... ]
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.
 
B

BobR

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>
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top