Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chona en 6 Marzo 2020, 04:28 am



Título: Rotar n veces un arreglo con n digitos
Publicado por: chona en 6 Marzo 2020, 04:28 am
Hola tengo que determinar un vector con n casillas y hacerlo girar determinadas veces para calcular el vector y
ejemplo
casillas=5 giro=1 vectorx {1,2,3,4,5} vectory {5,1,2,3,4}
Lo hice de la siguiente forma pero no entiendo muy bien donde colocar los giros para que rote el arreglo
Agradeceria su ayuda

Código
  1. #include <stdio.h>
  2. #define N 10
  3.  
  4. int main() {
  5.    int n,g;
  6. scanf ("%i" ,&n);
  7. scanf(" %i",&g);
  8.    int i;
  9.   int  x[n];//arr
  10.    int y[n];//arr2
  11.  
  12.    for( int i = 0; i < n; i++ );{
  13.        scanf (" /n%i/n", &x[i]);}
  14.  
  15. for (i=0;i<g;i++)
  16. {
  17.    x[n]=x[i+1];
  18.  x[i+1]=x[0];
  19.  x[0]=y[n];
  20.  printf ("%i",y[n]);
  21. }
  22.  
  23.    return 0;
  24. }


Título: Re: Rotar n veces un arreglo con n digitos
Publicado por: K-YreX en 6 Marzo 2020, 05:26 am
Para rotar las posiciones de un array necesitas guardar uno de los valores en una variable auxiliar para empezar a guardar los nuevos valores en la posición que has guardado fuera y al final restaurar ese valor que tiene la variable auxiliar. Ahora bien, hay muchas formas de hacerlo.

Una forma visual es hacer una función que rote el array a la derecha 1 vez y hacer un bucle for que llame a dicha funciones n veces siendo n el número de posiciones que se quiere rotar el array a la derecha. No es lo más eficiente pero como te digo es visual.
Código
  1. void rotarDerecha(int *numeros, int size){
  2.  int aux = numeros[size-1];
  3.  for(size_t i = size - 1; i > 0; --i)
  4.    numeros[i] = numeros[i-1];
  5.  numeros[0] = aux;
  6. }
  7.  
  8. int main(){
  9.  //...
  10.  for(size_t i = 0; i < rotaciones; ++i)
  11.    rotarDerecha(numeros, size);
  12.  //...
  13. }

Para mejorar un poco la eficiencia del código, en vez de repetir el for tantas veces como el valor de rotaciones, podemos hacerlo (rotaciones % size) veces. Así aunque el número de rotaciones sea muy grande, siempre daremos menos de una vuelta completa al array.

Si lo quieres hacer más eficiente puedes trabajar sobre esta versión y utilizar un poco las matemáticas para sacar alguna relación entre las posiciones del array el número de rotaciones. Esta parte te la dejo a ti que te va a ser más satisfactorio que si te lo encuentras hecho.

Y recuerda que si te atascas en alguna parte puedes volver a dejar tu código para que te echemos una mano. Y te recomendaría usar nombres de variables más significativos; sobre todo si el código lo van a tener que leer terceras personas como es el caso... :rolleyes:   Suerte.  :-X