Autor Tema: Mover los datos de un Array o Arreglo Unidimensional (Matriz random corrimiento)  (Leído 7940 veces)

dav2k6

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Hola, vengo con otra duda; se nota que soy nuevo en esto de programación...

Tengo una Matriz y tengo que cambiar el ultimo valor , ponerlo en primer lugar y que todos los demas  bajen una posicion. Lo puedo hacer con randomize o asignando yo los valores a la matriz. Tengo como generar la matriz en forma random pero no sé como hacer el cambiar de posicion...

de esto:

4 8 6 2 5 8 9 1 3 7

a esto:

7 4 8 6 2 5 8 9 1 3

alguna sugerencia?¿

« Última modificación: 07 de Junio 2020, 19:45 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re:Mover los datos de una Array (Matriz)
« Respuesta #1 en: 11 de Julio 2019, 00:34 »
Los pasos a seguir podrían ser:

- Haces copia del último elemento en una variable de apoyo.
- Recorres el array de manera inversa mediante un bucle, empezando por el penúltimo elemento hasta el primero.
- En cada elemento que te posicionas, lo mueves al siguiente.
 Es decir:
- Empiezas en el penúltimo y lo pones el último.
- Pasas al antepenútlimo y lo pasas al penúltimo.
- Pasa al anterior y lo poner el antepenúltimo.
- Etc...

- Cuando el bucle haya terminado de recorrer y mover elementos, entonces recuperas el valor que guardaste en la variable de apoyo y lo colocas en el primer elemento.

Y ya está.
Intenta desarrollar tú el código que siga estos pasos. Si no lo consigues, muestra lo que hayas podido hacer y te ayudamos a completarlo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

dav2k6

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re:Mover los datos de una Array (Matriz)
« Respuesta #2 en: 11 de Julio 2019, 11:50 »
Entender lo entiendo, pero me faltan nociones. A ver..

 For i = 0 To MiArray.GetUpperBound(0)
            If MiArray(i) > (i) Then
                MiArray(i) = MiArray(i + 1)
            End If
        Next
        MiArray(10) = MiArray(i)

El unico problema que tengo que siempre me dice que indice fuera de la matriz ya que me hace una vuelta de mas.....

de esta manera me recorre toda la array uno a uno...

Eso si... lo he hecho al reves.. de como dije...

« Última modificación: 07 de Junio 2020, 19:42 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re:Mover los datos de una Array (Matriz)
« Respuesta #3 en: 11 de Julio 2019, 20:49 »
Yo soy más de Java/Kotlin y C/C++

En otros lenguajes me pierdo un poco, pero veo un par de cosas a mencionar:

Código: [Seleccionar]
MiArray(10) = MiArray(i)Eso te dará error por que no hay ningún elemento con posicion 10.

Si el array tiene 10 elementos, estarán numerados del 0 al 9. Si intentas apuntar a la posición 10, será cuando te da error avisando de que te has salido "fuera".

Por otro lado, mueves los elementos sin guardar previamente el último valor (el de la posición 9). Este valor hay que guardarlo en otra variable, entonces mueves los elementos y terminado el proceso, el valor guardado se adjudica a la posición 0.

EL array es mejor recorrerlo a la inversa. Si empiezas desde el principio, seguramente solo conseguirás repetir el mismo número en todo el array.
Supón este array:

[10,20,30,40]

Eso son 4 elementos, numerados del 0 al 3.

El valor de la posición 0, hay que pasarlo a posición 1.
El valor de la posición 1, hay que pasarlo al posición 2.
-etc...

¿Qué pasa si empezamos desde el principio?
La i del bucle vale 0.

Así que cogemos el valor de la posición i (0) y lo pasamos a posición i+1 (1).
El array queda así:
[10,10,30,40]

Ya podemos darnos cuenta de que hemos perdido el valor 20
Pero sigamos, el bucle comienza el siguiente paso y ahora i vale 1

Así que cogemos el valor de la posición i (1) y lo pasamos a posición i+1 (2).
El array queda así:
[10,10,10,40]

No hace falta seguir, ahora hemos perdido el 30 y es evidente que también perderemos el 40.

Hay que recorrer al revés.

Bueno, lo primero como dije antes, es guardar el ultimo valor antes de que el bucle mueva nada.

Si volvemos al array de ejemplo:

[10,20,30,40]


Pues primero guardamos el 40, que está en posición 3.

variableAux = miArray(3)

OK, guardado. Ahora comienzca el bucle, pero ha de ir hacia atrás y comenzará en la posicion penúltima.
Al comenzar la i ha de tener la posicion valor 2.

Así que cogemos el valor de la posición i (2) y lo pasamos a posición i+1 (3).
El array queda así:
[10,20,30,30]

Hemos machacado el 40, pero no importa, ya que lo hemos guardado en una variable.
Sigamos el bucle va hacia atrás y la i vale 1.

Así que cogemos el valor de la posición i (1) y lo pasamos a posición i+1 (2).
El array queda así:
[10,20,20,30]

El bucle llega al último paso, la i vale 0.
Así que cogemos el valor de la posición i (0) y lo pasamos a posición i+1 (1).
El array queda así:
[10,10,20,30]


Vale, el bucle ha terminado. Ya solo queda coger el valor que habiamos guardado, el 409 y colocarlo al principio, en la posición 0.
El array queda así:
[40,10,20,30]

LISTO. Se han movido los valores como se pide, no se ha perdido ningún dato, el bucle for no va a intentar acceder a posiciones del array que no existen...

No necesitas ningún IF dentro del bucle.

Tan solo tienes que:
- Guardar último valor en otra variable.
- Hacer que la variable i del FOR vaya desde el penúltimo (no el último) hasta posición 0.
- En cada iteración del bucle, mover lo que está en posición i a la posición i+1
- Terminado el bucle, el valor que habíamos guardado lo colocamos en posicion 0.

Y ya está. La clave es saber establecer la condición ideal del bucle FOR

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

HeyMrDave

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
De hecho no es necesario hacer nada mas que esto:

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
    int n,vec[9999],i=0,ward=0;
   
    cin>>n;
    //Ingreso de numeros
    for(i=0;i<n;i++){
        cin>>vec;
    }
    cout<<endl;
    //Muestra
    for(i=0;i<n;i++){
        cout<<vec<<" ";
    }
    cout<<endl;
    //Con el numero mayor adelante
    for(i=0;i<n;i++){
       cout<<vec[i-1]<<" ";

    }

    return 0;
}

solamente con el i-1 ya coloca el numero mayor adelante si quieren pruebenlo y corrijanme si algo esta mal

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Hola HeyMrDave
Gracias por tu aportación.

Usar negativos como índice en vectores puede funcionar en C/C++, pero no en la mayoría de lenguajes, así que no puede tomarse como una solución de uso general.
Aunque está bien comentarla.

Por otra parte, tampoco se sí es algo que depende del compilador.
Si por ejemplo pruebo tu código en este compilador online: https://www.online-ide.com/FVug3D20z4

No da buen resultado:
Citar
4
10
20
30
40

10 20 30 40
0 10 20 30

** Process exited - Return Code: 0 **

Claro que quizás no es el mejor sitio para probarlo.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".