Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: dav2k6 en 10 de Julio 2019, 15:37
-
Hola, vengo con otra duda; se nota que soy nuevo en esto de programación...
Tengo una Matriz y tengo que cambiar el último valor, ponerlo en primer lugar y que todos los demas bajen una posición. 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 posición...
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?
-
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.
-
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...
-
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:
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
-
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[i];
}
cout<<endl;
//Muestra
for(i=0;i<n;i++){
cout<<vec[i]<<" ";
}
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 número mayor adelante si quieren pruébenlo y corríjanme si algo está mal.
-
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:
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.