Página 1 de 1

Eliminar un elemento de un arreglo por el usuario

NotaPublicado: 2021-08-28 15:14 @676
por alexismoran72
Hola a todos, necesito ayuda con un programa que estoy haciendo y hay algunas opciones que no tengo idea de cómo hacerlo.

Aquí dejo mi programa, espero me puedan ayudar :( me faltan las opciones 3, 6 y 7.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @lista;  
  2. my $accion;
  3. print "Menú:
  4. 1.- Agregar en cabecera.
  5. 2.- Agregar en cima.
  6. 3.- Agregar antes de.
  7. 4.- ¿Está vacía?
  8. 5.- Imprimir.
  9. 6.- Modificar.
  10. 7.- Eliminar.
  11. 8.- Salir.\n";
  12. do{
  13. print"\nEscoja una opción: ";
  14. chop ($opcion = <STDIN>);
  15. if ($opcion == 1){
  16.         print "Agregue valor: ";
  17.         $valor = <>;
  18.         unshift  @lista, $valor;
  19.         print "¡agregado!\n ";
  20. }
  21. elsif($opcion == 2){
  22.         print "Agregue valor: ";
  23.         $valor = <>;
  24.         push @lista, $valor;
  25.         print "¡agregado!\n ";
  26. }
  27. elsif($opcion == 3){
  28.         #Agregar antes de
  29.        
  30.         # si en la @lista están los valores [40, 50, 60]
  31.         # quiero que me permita guardar un valor por ejemplo el 5 y quiero guardarlo antes del 50
  32.         # quedaría algo así [40, 5, 50, 60]
  33.        
  34.        
  35. }
  36. elsif($opcion ==4){
  37.         if (@lista){
  38.                 print "\nNo está vacío\n";
  39.         }
  40.         else
  41.         {
  42.                 print "\nEstá Vacío\n";
  43.         }
  44. }
  45. elsif($opcion ==5){
  46.         chomp(@lista);
  47.         print "Los números agregados en la lista: @lista" . "\n";
  48. }
  49. elsif($opcion == 6){
  50.        
  51.         #Modificar
  52.        
  53.         #que me permita guardar un nuevo valor y modificar un valor dentro del @lista [40, 50, 60]
  54.         #nuevo valor a guardar 2 y quiero que el 40 sea el 2.
  55.         #[2, 50, 60]
  56.        
  57.        
  58.        
  59. }
  60. elsif($opcion == 7){
  61.         #eliminar
  62.        
  63.         #Eliminar algún número de la @lista [40, 50, 60] quiero eliminar el 50
  64.         #quedaría [40, 60]
  65.        
  66.        
  67. }
  68. elsif($opcion ==8){
  69.                 print "¿Desea salir?:
  70. 1.- SI    2.- NO";
  71.         print "\n";
  72.         chomp($accion = <STDIN>);
  73. }
  74. }while $accion ne '1';
  75. print "Salió del programa.\n";
  76.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Cualquier recomendación que tengan me podría ayudar. Muchas gracias.

Re: Eliminar un elemento de un arreglo por el usuario

NotaPublicado: 2021-08-28 16:20 @722
por explorer
Hola.

Las tres opciones las puedes realizar con splice().

(De hecho, TODAS las operaciones con los arrays las puedes hacer con splice(). Lo tienes explicado en este documento: https://github.com/perldocES/perldoc-es ... rlfunc.pod en la sección splice ARRAY,DESPLAZAMIENTO,LONGITUD,LISTA). Pero... usar push(), pop(), shift() y unshift() son más cómodas.

En la opción 3, primero debes hacer una búsqueda (por ejemplo, con foreach()) para encontrar el elemento -ver más abajo-. Si no está, sacar un mensaje de error. Si está, usar splice() para insertarlo delante.

En la opción 6 es lo mismo, pero en lugar de insertar, hacer una sustitución. En este caso no necesitamos ni siquiera splice(). Si, por ejemplo, lo encuentras en la posición 0, bastaría hacer un $lista[0] = $valor;

En la opción 7, hay que buscar el elemento para saber su posición, y luego sacarlo del array. Lo puedes hacer con splice(). Por ejemplo, si @lista es (40, 50, 60), y queremos eliminar 50, primero lo buscamos y luego lo eliminamos de la @lista:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;                    # activar say(); y each() para arrays
  3.  
  4. my @lista = (40, 50, 60);
  5. my $valor_a_eliminar = 50;
  6. my $encontrado = -1;
  7.  
  8. while (my($posicion,$valor) = each @lista) {# recorremos todo el array, sacando los índices y valores
  9.     if ($valor == $valor_a_eliminar) {      # ¿lo hemos encontrado?
  10.         $encontrado = $posicion;            # sí, guardamos posición
  11.         last;                               # no hace falta seguir buscando más
  12.     }
  13. }
  14.  
  15. if ($encontrado != -1) {                    # si lo hemos encontrado,
  16.     splice(@lista, $encontrado, 1);         # en la @lista, posición $encontrado, sustituimos 1 elemento por... nada
  17. }
  18. else {
  19.     say "Error: no encontré [$valor_a_eliminar]";
  20. }
  21.  
  22. say "[",join(",",@lista),"] ", scalar(@lista), " elementos";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Eliminar un elemento de un arreglo por el usuario

NotaPublicado: 2021-08-28 22:41 @987
por alexismoran72
Lo siento pero no puedo con la opción 3 y 6, llevo horas intentando :( Soy muy principiante en el tema de programación, tal vez puede ser muy fácil programar la opción 3 y 6, pero no puedo.

Aquí dejo lo que tengo, para ustedes ha de ser una abominación :lol: me estuve guiando con el código que mostró.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $encontrado = -1;
  2. print "Valores en la lista: \n";
  3. @lista = (10, 20, 30, 40);
  4. print "@lista", "\n";
  5.  
  6. print "Ingrese valor: ";
  7. $nuevo_valor = 5;
  8. print "Despues del valor: "; #poner el 5 después del 20
  9. $despues_de = 20;
  10.  
  11. while(my($posicion, $valor) = each @lista){  #######################
  12.         if($valor == $despues_de){           #Por lo que entiendo todo esto
  13.                 $encontrado = $posicion;     #es para recorrer todo el array
  14.                 last;                        #y encontrar el valor que uno quiere
  15.         }                                    #######################
  16. }
  17. if ($encontrado != 1){                       #######################
  18.         splice (@lista, $encontrado, 1);     #creo que el problema esta aquí
  19. }                                            #######################
  20. print @lista;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Eliminar un elemento de un arreglo por el usuario

NotaPublicado: 2021-08-29 14:44 @656
por explorer
Para la opción 6, te vale con hacer una asignación, como te indiqué: $lista[$encontrado] = $nuevo_valor;

Para la opción 3 (insertar delante), hay que cambiar ligeramente splice(): splice(@lista, $encontrado, 0, $nuevo_valor);
La clave está en el tercer parámetro, que indica cuántos elementos queremos sustituir. Como no queremos sustituir, sino insertar, ponemos 0 (0 sustituciones), y entonces, splice(), en la posición $encontrado de @lista, inserta $nuevo_valor.

Prueba de que funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E 'use v5.12; my @lista = (40, 50, 60); my $valor_a_eliminar = 50; my $encontrado = -1; my $nuevo_valor = 5; while(my($i,$v) = each @lista) { if ($v == $valor_a_eliminar) { $encontrado = $i; last } } if ($encontrado != -1) { splice(@lista, $encontrado, 0, $nuevo_valor); } say "[",join(",",@lista),"] ", scalar(@lista), " elementos"'
  2. [40,5,50,60] 4 elementos
  3.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4