c++ - Making a Function to Shift an Array that the User Has Entered -


the question is, how write function shifts array's elements given number, whether number positive or negative? example, given array

{22, 33, 44, 55, 66, 77, 88, 99}

and user wants shift 3 elements, array should become:

{77, 88, 99, 22, 33, 44, 55, 66}

my declaration function looks void rotate(int a[], int n, int k) where:

  • a array
  • n number of elements in array
  • k numbers of elements shift by

so above example call: void rotate(a, 8, 3)

this have far:

#include <iostream> using namespace std;  void rotate (int [], int, int);   int main() {     cout << "how many numbers wanna enter?"<< endl << "enter number: ";     int n;     int i;     cin >> n;     int a[n];     cout << "now have enter " << n << "number in array."<< endl<< "pls eneter number aaray"<<endl;     (i=0; i<n; i++) {         cout << "a["<<i<<"] = ";         cin >> a[i];     }     cout << "how many numbers wanna shift?"<< "pls eneter number: ";     int k;     cin >> k;     rotate(a,n,k);     (i=0; i<n; i++)         cout<<"a["<<i<<"] = "<<a[i]<<endl;      return 0; }     void rotate (int a[] , int n , int k ){     if  (k>0){     }     else if (k<0){     } } 

as nathan oliver states you're trying reinvent rotate. given input: int a[] = {22,33,44,55,66,77,88,99} do:

rotate(begin(a), next(begin(a), ((-k % size(a)) + size(a)) % size(a)), end(a)); 

if don't have c++17, can this:

const auto size = sizeof(a) / sizeof(a[0]);  rotate(begin(a), next(begin(a), ((-k % size) + size) % size), end(a));   

live example

let me unpack math here:

  • the interior (-k % size(a)) inverts k match rotate's approach, mods ensure k < size(a) && -k > size(a)
  • the middle addition: ((-k % size(a)) + size(a)) removes negative such value less size(a) * 2 , greater 0
  • the exterior ((-k % size) + size) % size puts value in range of legal inputs next; less size(a) , greater or equal 0

next(begin(a), ((-k % size) + size) % size) selecting element of array rotated first element in array:

  • for k = 7 first element be: next(begin(a), 1) , a contain:

    {33, 44, 55, 66, 77, 88, 99, 22}

  • for k = 6 first element be: next(begin(a), 2) , a contain:

    {44, 55, 66, 77, 88, 99, 22, 33}

  • for k = 5 first element be: next(begin(a), 3) , a contain:

    {55, 66, 77, 88, 99, 22, 33, 44}

  • for k = 4 first element be: next(begin(a), 4) , a contain:

    {66, 77, 88, 99, 22, 33, 44, 55}

  • for k = 3 first element be: next(begin(a), 5) , a contain:

    {77, 88, 99, 22, 33, 44, 55, 66}

  • for k = 2 first element be: next(begin(a), 6) , a contain:

    {88, 99, 22, 33, 44, 55, 66, 77}

  • for k = 1 first element be: next(begin(a), 7) , a contain:

    {99, 22, 33, 44, 55, 66, 77, 88}

  • for k = 0 first element be: next(begin(a), 0) , a contain:

    {22, 33, 44, 55, 66, 77, 88, 99}

  • for k = -1 first element be: next(begin(a), 1) , a contain:

    {33, 44, 55, 66, 77, 88, 99, 22}

  • for k = -2 first element be: next(begin(a), 2) , a contain:

    {44, 55, 66, 77, 88, 99, 22, 33}

  • for k = -3 first element be: next(begin(a), 3) , a contain:

    {55, 66, 77, 88, 99, 22, 33, 44}

  • for k = -4 first element be: next(begin(a), 4) , a contain:

    {66, 77, 88, 99, 22, 33, 44, 55}

  • for k = -5 first element be: next(begin(a), 5) , a contain:

    {77, 88, 99, 22, 33, 44, 55, 66}

  • for k = -6 first element be: next(begin(a), 6) , a contain:

    {88, 99, 22, 33, 44, 55, 66, 77}

  • for k = -7 first element be: next(begin(a), 7) , a contain:

    {99, 22, 33, 44, 55, 66, 77, 88}


Comments