Eliminar dato de matriz y array

Iniciado por eleaefe, 29 Junio 2017, 16:28 PM

0 Miembros y 1 Visitante están viendo este tema.

eleaefe

Hola, hice este metodo:

Código (csharp) [Seleccionar]
static bool eliminar(int[] lista, string[] nombre, string nom, ref int tope) //ELIMINAR EN UN ARRAY
       {
           
           Console.WriteLine("\t\t3 - Elimine una apuesta: ");
           Console.WriteLine();
           Console.Write("Ingrese Nombre del Cliente: ");
           nom = Console.ReadLine().ToUpper().Trim();
           bool e = false;
           for (int i = 0; i < tope; i++)
           {
               if (nom == nombre[i])
               {
                   for (int j = i; j < tope - 1; j++)
                   {
                       lista[j] = lista[tope - 1];
                       nombre[j] = nombre[j - 1];
                       tope--;
                       e = true;
                       i = tope;
                   }
               }
           }
           return e;
       }





invoco en el main asi:


Código (csharp) [Seleccionar]
case 3:
                       Console.WriteLine("\t\t3-Eliminar Apuesta");

                       eliminar(vector, nombre,  ref  tope);//ACA ME DA ERROR NO SE COMO LLAMARLO

                       break;




no se porque no puedo incovarlo me da error de argumentos y tampoco se si el codigo es el correcto


el resto del main es este


Código (csharp) [Seleccionar]
string[] nombre;

           int opcion, tope = 0, cantidad;
           bool seguir = true;
           Console.WriteLine("cantidad de apostantes: ");

           cantidad = Convert.ToInt32(Console.ReadLine());
           int[] vector = new int[cantidad];
           nombre = new string[cantidad];
           int[,] matriz = new int[cantidad, 5];


Eleкtro

#1
Bienvenido al foro, pero debes leer las reglas de un subforo antes de publicar, y usar las etiquetas GeShi para insertar código...

Declaraste 4 parámetros para esa función, pero tan solo le estás pasando 3 argumentos, ahí tienes el error...

La próxima vez al formular una duda de programación que implique un mensaje de error, por favor muestra el mensaje.




Cita de: eleaefe en 29 Junio 2017, 16:28 PMtampoco se si el codigo es el correcto

Si tu intención es buscar un elemento (o "apuesta") y eliminarlo de una lista, entonces todo ese código sobra... puedes usar los miembros de la clase List para satisfacer la funcionalidad de buscar y/o eliminar elementos que cumplan "X" condición:

Código (csharp) [Seleccionar]
List<string> list = new List<string> {
   "q", "w", "e", "r", "t", "y"
};

string find = "e";

// list.Remove( find ); // Eliminar un elemento.
// list.Remove( list.Find(condición) ); // Eliminar un elemento que cumpla "X" condición.
list.RemoveAll((string item) => item.Equals(find, StringComparison.Ordinal)); // Eliminar todos las elementos que cumplan "X" condición.

Console.WriteLine(string.Join(Environment.NewLine, list));
Console.ReadLine();


Saludos.








eleaefe

#2
tengo el siguiente metodo, pero solo me esta eliminando el nombre y no la apuesta, tengo una matriz definida como:

cantidad = Convert.ToInt32(Console.ReadLine());
            int[] vector = new int[cantidad];
            nombre = new string[cantidad];
            int[,] matriz = new int[cantidad, 5];

donde cantidad es la cantidad de apostantes (nombre) y las columnas 5 bolillas

METODO:

static bool elimino(int[] lista, string[] nombre, string nom, ref int tope)
        {
           
           
            nom = Console.ReadLine().ToUpper().Trim();
            bool e = false;
            for (int i = 0; i < tope; i++)
            {
                if (nom == nombre[i])
                {
                    for (int j = i; j < tope - 1; j++)
                    {
                        lista[j] = lista[j + 1];
                        nombre[j] = nombre[j + 1];
                        tope--;
                        e = true;
                        i = tope;
                    }
                }
            }
            return e;
        }


y asi llamo al metodo:

elimino(vector, nombre, nom,  ref  tope);

Serapis

#3
Elektro, ya te ha respondido...
Imagino que estás empezando y por eso has saltado por encima de las recomendaciones que te daba Elektro, al no entender de que te hablaba... Voy a suponer que es así.

------------------------------------
Tu has colocado una función que requiere que se le pasen 4 parámetros, pero sólo le envías 3 desde la llamada. el 4º parámetro (el 3º según el orden que ocupa en la función) lo obtienes desde dentro de la función... algo que rompe la lógica de las funciones, pero que admeás te genera el error al invocarla (no porque esto dentro, si no porque reclamas un parámetro que no se recibe desde fuera...

Si la función recibe dos arrays, un texto y un entero, esa función debe servir para cualesquiera arrays se reciban, por tanto la petición del texto por consola, la inutiliza para propósitos generales y la hace específica de ese único caso. y a tal efecto, entonces ya porqué no hacerlo más 'íntimo' y 'particular' y obtener el resto de parámetros también desde ahí...  :silbar: :silbar: :silbar:


Esta línea debería estar antes de invocar la función. Para que al invocar la función, 'nom' ya tenga el valor que usará la función
nom = Console.ReadLine().ToUpper().Trim();

Luego tus bucles son extraños... e inenecesarios ¿por qué pones dos bucles uno dentro de otro?. Cuando usas dos bucles de pongamos 100 ciclos cada uno, al final se ejecutan 100x100 ciclos.
Buscar en un array de 100 elementos, solo requiere un máximo 100 ciclos, nunca 10.000 (100x100)

El pseudocódigo de tu función debería ser similar a esto:
NombreBuscado = Consola.LeerEntradaUser("blablabla")

buleano = Funcion Eliminar (ArrayEntero Lista, ArrayString Nombre, String NombreBuscado, Entero Tope)
    Entero n=-1

    // buscar si existe: Nombrebuscado en la lista
    Bucle para k desde 0 hasta array.items-1
         Si Nombre(k) = NombreBuscado
              n = k
              Salir de este bucle //para continuar en el siguiente
         Fin si
    Siguiente
    // Si Existe, eliminar y bajar todos los elementos encima de él
    Si n >= 0 luego
         Bucle para k desde n hasta Lista.Items-2 // ojo -2, por si se hallara en el último puesto
              Lista(k) = Lista(k+1)
              Nombre(k) = nombre(k+1)
         Siguiente
         // Borramos el último elemento (no es imprescindible).
         Lista(k) = ""
         Nombre(k)= ""
         //tope -= 1 Tope parece ser el punto final hasta el cual buscar, pero.. (comentado más abajo)
         return TRUE
    Fin si
Fin funcion


Como te decía el propósito del parámetro "Tope" parece ser el punto final hasta el cual buscar, pero si es un array, tras eliminar un item en un punto que no sea el final, exige bajar todos los que tiene encima una posición (hasta el final de la lista)...
Salvo que pretendas insertar uno en determinada posición, en cuyo caso crea una función remplazar, con la particularidad que localiza y borra un elemento y si lo encuentra, en el índice marcado como tope inserta el remplazo.


NombreBuscado = Consola.LeerEntradaUser("blablabla")
NombreRemplazo = Consola.LeerEntradaUser("blablabla")

buleano = Funcion Remplazar (ArrayEntero Lista, ArrayString Nombre, string NombreBuscado, String Nombreremplazo, entero TopeRemplazo)
    entero n=-1
    // buscar si existe: Nombrebuscado en la lista
    Bucle para k desde 0 hasta TopeRemplazo
         Si Nombre(k) = NombreBuscado
              n = k
              Salir de este bucle //para continuar en el siguiente
         Fin si
    Siguiente
    // Si Existe, eliminar y bajar todos los elementos encima de él
    Si n >= 0 luego
         Bucle para k desde n hasta TopeRemplazo-1 // si (n) se haya en el último puesto, no se ejecuta el bucle.
              Lista(k) = Lista(k+1)
              Nombre(k) = nombre(k+1)
         Siguiente
         // el remplazo se coloca en el TopeRemplazo (último elemento donde se permitió buscar).
         //Lista(k) = "" <---- no queda claro que va aquí *
         Nombre(k)= NombreRemplazo
         return TRUE  //señala que el ítem localizado en 'n' fue remplazdo en 'ToopeRemplazo'
    Fin si
Fin funcion


Nota:* Aún así, no me queda claro el propósito del array 'Lista', si tienen valores precisos asignados a cada nombre (algo normal), entonces la función debería incluir  un parámetro más para remplazar en la misma posición y asnignarlo donde he puesto el comentario:   <---- no queda claro que va aquí *

Finalmente aclararte que incluso así, esa función deberían ser dos funciones... para
generar un código más eficiente:

// Busca un elemento Si existe devuelve el índice donde se localiza, si no , devuelve -1
Entero = Funcion Buscar(ArrayString Nombre, String NombreBuscado)
   Bucle para K desde 0 hasta Nombre.Items -1
       Si Nombre(k) = NombreBuscado luego Devolver K  //y salir de la función.
   Siguiente

   Devolver -1 //No encontrado
Fin Funcion

// Elimina un ítem del array (si existe dicho índice en el array).
Buleano = Funcion Eliminar(ArrayEntero Lista, ArrayString Nombre, Entero Indice )
    Si Indice < Lista.Items entonces
        Bucle para k desde Indice hasta Nombre.Items -1
            Nombre(k) = Nombre(k + 1)
            Lista(k) = Lista(k + 1)
        Fin bucle
        Nombre(k) = ""
        Lista(k) = 0
        Devolver TRUE
    Fin si
Fin Funcion


// Remplaza un ítem del array (si existe dicho índice en el array).
Buleano = Funcion Remplazar(ArrayEntero Lista, ArrayString Nombre, Entero Indice, String Remplazo, entero Valor )
    Si Indice < Lista.Items entonces
        Nombre(Indice) = Remplazo
        Lista(Indice) = Valor
     
        Devolver TRUE
    Fin si
Fin Funcion


Igualmente puedes hacer funciones más específicas de remplazo.
En cualquier caso, siempre que puedas separa la tareas, en este caso en dos funciones: 'Buscar' y luego la acción adicional, resulta más útil... que hacer bastante código en una sola función que "busca y remplaza", o "busca y elimina".
-------------------------------------------
También te decía Elektro, que cuando escribas código si pertenece a un lenguaje 'conocido' (específico), usa las etiqeutas GESHI (aparece en el editor, arriba a la derecha), seleccióna el trozo de código y marca el lenguaje al que pertenece en ese combo desplegable, así queda bien coloreado y las líneas numeradas y mucho más nítido...