Melin Ven Melin Ven - 2 months ago 15
C++ Question

Shift array elements

I need some help, I know this question was asked before but I don't get it and I cant solve it, so I need help. I need to move the elemnts of my array to a position to left. So if the input will be 1,2,3,4,5 then the output will be 2,3,4,5,1. I have dne the same to right but to left I cant figure it out, please also explain the logic , thanks.

#include <iostream>
using namespace std;
int a[100],n,i,tempr,templ;
int main()
{
cin>>n;
for(i=1;i<=n;i++) cin >> a[i];
for(i=1;i<=n;i++)
{
tempr = a[n];
a[n] = a[i];
a[i] = tempr;
cout<<"Right: "<<a[i]<<endl;
}
for(i=1;i<=n;i++)
{
templ = a[2];
a[2] = a[i];
a[i] = templ;
cout<<"Left: "<<a[i]<<endl;
}
return 0;
}


Please help!

Answer

First problem is bad indexing:

for(i=1;i<=n;i++) cin >> a[i]; //wrong logic, C++ indexing start from 0

Correct approach:

for(i=0;i<n;i++) //all your loops

Second problem is wrong logic for shifting elements: Corrected version:

//input example: 1 2 3 4 5
//to the left
int temp = a[0]; //remember first element
for(i=0;i<n-1;i++)
{
    a[i] = a[i+1]; //move all element to the left except first one
}
a[n-1] = temp; //assign remembered value to last element
//output: 2 3 4 5 1
cout << "To left: " << endl;
for(i=0;i<n;i++)
    cout << a[i] << endl;

//to the right
temp = a[n-1]; //remember last element
for(i=n-1;i>=0;i--)
{
    a[i+1] = a[i]; //move all element to the right except last one
}
a[0] = temp; //assign remembered value to first element
//output: 1 2 3 4 5 because elements are shifted back by right shift
cout << "To right: " << endl;
for(i=0;i<n;i++)
    cout << a[i] << endl;

EDIT:

How to display both shifts:

#include <iostream>
    using namespace std;
    int to_left[5], to_right[5],n,i,tempr,templ;
    int main()
    {

    cout << "Input array size: ";
    cin >> n;

    for(i=0;i<n;i++)
    {
        cin >> to_left[i]; //read values to first array
        to_right[i]=to_left[i]; //then copy values to second one
    }

    //shift first array to left
    int temp = to_left[0]; 
    for(i=0;i<n-1;i++)
    {
        to_left[i] = to_left[i+1]; //move all element to the left except first one
    }
    to_left[n-1] = temp; //assign remembered value to last element
    //output: 2 3 4 5 1
    cout << "To left: " << endl;
    for(i=0;i<n;i++)
        cout << to_left[i] << endl;

    //shift second array to right
    temp = to_right[n-1]; //remember last element
    for(i=n-1;i>=0;i--)
    {
        to_right[i+1] = to_right[i]; //move all element to the right except last one
    }
    to_right[0] = temp; //assign remembered value to first element
    //output: 1 2 3 4 5 because elements are shifted back by right shift
    cout << "To right: " << endl;
    for(i=0;i<n;i++)
        cout << to_right[i] << endl;

    return 0;
}

Note that your code look very much like C code. In C++, you can declare variables in any segment of code, not just at the beginning. In C++, you can declare variable in for loop like this: for(int i=0; i<...) - no need for global variable i

For reference, this would be good C++ code example that satisfies problem you are facing:

#include <iostream>
#include <vector>
int main()
{   
    std::size_t n; //size_t is unsiged type used for various sizes of containers or types
    std::cout << "Input array size: ";
    std::cin >> n;

    std::vector<int> to_left(n), to_right(n); //two dynamic arrays containing integers, takin n as their size

    for(std::size_t i=0;i<to_left.size();++i) //use vector size(), instead of n, also ++i in considered better for loops that i++ (may be faster)
    {
        std::cin >> to_left[i];
        to_right[i]=to_left[i];
    }

    int temp = to_left[0]; //declare temp here, not at the begining of code
    for(std::size_t i=0;i<n-1;++i)
        to_left[i] = to_left[i+1];
    to_left[n-1] = temp;

    std::cout << "To left: " << std::endl;
    for(std::size_t i=0;i<n;++i)
        std::cout << to_left[i] << std::endl;

    temp = to_right[n-1]; //reuse temp
    for(int i=to_right.size()-1;i>=0;--i) //note int, not std::size_t, because size_t is always >=0, loop would never end.
        to_right[i+1] = to_right[i];
    to_right[0] = temp;

    std::cout << "To right: " << std::endl;
    for(std::size_t i=0;i<n;i++)
        std::cout << to_right[i] << std::endl;

    return 0;
}
Comments