[ Foro de C# ]

busqueda binaria y secuencial

26-Nov-2014 15:11
Invitado (Luis)
3 Respuestas

Mi duda es como hacer una busqueda binaria y secuencial. Cogí como ejemplo una práctica ya expuesta dónde por lo visto también se pide, pero es que leo tutoriales del tema y no me entero. Si alguien me puede ayudar se lo agradecería


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
 
namespace Practica1MenuNotas
{
    //Declaramos como pública la estructura de la tabla que vamos a hacer después.
    struct dato
    {
        public int numero;
        public string nombre;
        public double nota;
    }
    class Program
    {
        //static int numero = 1;
        static void Main(string[] args)
        {
 
            dato[] tabla = new dato[5];
            //Dclaro primero la variable op dentro de la función Main y seguidamente hago un
            //do-while en el cual llamo al menú para que se efectúe
            //el bucle que repite el menú si no pulsamos 0.
            //Seguidamente hago un switch que es el que recogerá las diferentes llamadas a las funciones
            //cuando introduzca el número que está en el menú indicado.
            /*int op = Menu();*/
            //Llamo a la función opciones que va a recibir tabla.
            opciones (tabla);
            /*Console.ReadLine();*///NO HACE FALTA
        }
        //Aquí he conseguido meter el switch dentro de una función aparte.
        //Lo que he hecho ha sido crear una función estática que no devuelva ningún valor.
        //static void opciones y dentro de opciones lo que hacemos es meterle los parámetros a la tabla dato.
        //Luego en la función principal Main llamo a la funciójn opciones.
        static void opciones(dato [] tabla)
        {
            /*int i = 0;*/
            int op;
            do
            {
                op = Menu();
                switch (op)
                {
                    case 1:
                        Console.Write("<------------>\n");
                        Console.Write("<- 1. ALTAS ->\n");
                        Console.Write("<------------>\n");
                        Altas(tabla);//Llamo a la función de altas.
                        /*Console.ReadLine();*/
                        break;
                    case 2:
                        Console.Write("<------------>\n");
                        Console.Write("<- 2. BAJAS ->\n");
                        Console.Write("<------------>\n");
                        bajas(tabla);//Llamo a la función de bajas.
                        /*Console.ReadLine();*/
                        break;
                    case 3:
                        Console.Write("<--------------------->\n");
                        Console.Write("<- 3. MODIFICACIONES ->\n");
                        Console.Write("<--------------------->\n");
                        modificaciones(tabla);//Llamo a la función de modificaciones.
                        /*Console.ReadLine();*/
                        break;
                    case 4:
                        Console.Write("<---------------->\n");
                        Console.Write("<- 4. CONSULTAS ->\n");
                        Console.Write("<---------------->\n");
                        consultas(tabla);
                        /*Console.ReadLine();*/
                        break;
                    case 5:
                        Console.Write("<-------------->\n");
                        Console.Write("<- 5. ORDENAR ->\n");
                        Console.Write("<-------------->\n");
                        Console.ReadLine();
                        break;
                    case 6:
                        Console.Write("<-------------------------->\n");
                        Console.Write("<- 6. BÚSQUEDA SECUENCIAL ->\n");
                        Console.Write("<-------------------------->\n");
                        Console.ReadLine();
                        break;
                    case 7:
                        Console.Write("<----------------------->\n");
                        Console.Write("<- 7. BÚSQUEDA BINARIA ->\n");
                        Console.Write("<----------------------->\n");
                        Console.ReadLine();
                        break;
                    case 8:
                        Console.Write("<-------------->\n");
                        Console.Write("<- 8. MEZCLAR ->\n");
                        Console.Write("<-------------->\n");
                        Console.ReadLine();
                        break;
                }
            } while (op != 0);
        }
        //FUNCIÓN Menu.
        static int Menu()
        {
            //int op = 0;
            //Limpiamos Pantalla.
            Console.Clear();
            //Aquí el menú.
            Console.WriteLine("<-----------Menú de opciones----------->");
            //Thread.Sleep(300);
            Console.WriteLine(" |    1- Altas                        |");
            //Thread.Sleep(320);
            Console.WriteLine(" |    2- Bajas                        |");
            //Thread.Sleep(325);
            Console.WriteLine(" |    3- Modificaciones               |");
            //Thread.Sleep(330);
            Console.WriteLine(" |    4- Consultas                    |");
            //Thread.Sleep(335);
            Console.WriteLine(" |    5- Ordenar                      |");
            //Thread.Sleep(340);
            Console.WriteLine(" |    6- Búsqueda secuencial          |");
            //Thread.Sleep(345);
            Console.WriteLine(" |    7- Búsqueda Binaria             |");
            //Thread.Sleep(350);
            Console.WriteLine(" |    8- Mezclar                      |");
            //Thread.Sleep(355);
            Console.WriteLine(" |    0- Salir                        |");
            //Thread.Sleep(360);
            Console.WriteLine("<-------------------------------------->");
            //Thread.Sleep(365);
            Console.Write("--->Seleccione una opción del menú: ");
            int op = Convert.ToInt32(Console.ReadLine());
            return (op);
        }//FIN FUNCIÓN MENU
 
        //Función que revisa si el id ingresado está o no repetido.
        static int comprobacion(dato[] tabla, int comprueba)
        {
            int i;
            for (i = 0; i < tabla.Length; i++)
            {
                if (tabla[i].numero == comprueba)
                {
                    return i;
                }
            }
            return -1;
        }
 
        //  1)  INICIO FUNCION ALTAS
        static void Altas(dato[] tabla)
        {
            int comprueba,check,c=1;
            Console.Clear();
            for (int i = 0; i < tabla.Length;i++)
                if (tabla[i].numero == 0)
                {
                    Console.Write("Inserte el Id. del alumno: ");
                    comprueba = Convert.ToInt32(Console.ReadLine());
                    check = comprobacion(tabla, comprueba);
                    if (check == -1)
                    {
                        while (c != 0)
                        {
                            tabla[i].numero = comprueba;
                            c = 0;
                        }
                    }
                    else
                    {
                        Console.Write("....¡ERROR!....   No es posible ingresar el mismo id. para varios alumnos.\n pulse una tecla para continuar\n");
                        Console.Read();
                        break;
                    }
                    Console.Write("\n Introduzca nombre: ");
                    tabla[i].nombre = Console.ReadLine();
                    Console.Write("\n Introduzca nota: ");
                    tabla[i].nota = Convert.ToDouble(Console.ReadLine());
                }
                else
                {
                    Console.Write("\nSe ha alcanzado el número máximo de datos. \n\n     TABLA LLENA.... Saliendo al menú...");
                    Console.ReadLine();
                    break;
                }
            /*Console.Write("Inserte el Id. del alumno: ");
            comprueba = Convert.ToInt32(Console.ReadLine());
            i = comprobacion(tabla, comprueba);
            if (i == -1)
            {
                for (i = 0; i < tabla.Length && c != 0; i++)
                {
                    if (tabla[i].numero == 0)
                    {
                        tabla[i].numero = comprueba;
                        c = 0;
                    }
                }
            }
            else
            {
                Console.Write("....¡ERROR!....   No es posible ingresar el mismo id. para varios alumnos.\n pulse una tecla para continuar");
                Console.ReadLine();
            }
            for (i = 0; i < tabla.Length; i++)
            {
 
            }
            Console.Write("Escriba el nombre del alumno: ");*/
            //Lo de arriba lo dejo comentado de forma provisional.... Lo de abajo lo mismo...
 
            /*for (int i = 0; i < tabla.Length; i++)
            {
                if (tabla[i].numero == 0)
                {
                    /*string confirmacion;*/
           //         Console.Write("Introduzca el Id. del alumno: ");
                    //tabla[i].numero = Convert.ToInt32(Console.ReadLine());
                    /*Console.Write("\n {0}", i);*/
           /*         Console.Write("\n Introduzca nombre: ");
                    tabla[i].nombre = Console.ReadLine();
                    Console.Write("\n Introduzca nota: ");
                    tabla[i].nota = Convert.ToDouble(Console.ReadLine());
                    numero++;
                    /*if (numero <= tabla.Length)
                    {
                        Console.Write("\n¿Desea continuar?(s,n)");
                        confirmacion = Console.ReadLine();
                        if (confirmacion == "n")
                        {
 
                            break;
                        }
                    }*/                    
           /*     }
                else
                {
                    Console.Write("\nSe ha alcanzado el número máximo de datos. \n\n     TABLA LLENA.... Saliendo al menú...");
                    Console.ReadLine();
                    break;
                }
            }
            /*return (j);*/
        }//FIN FUNCION ALTAS
        //  2)  INICIO FUNCION BAJAS
        static void bajas(dato[] tabla)
        {
            Console.Write("Introduzca el id del alumno que quiere eliminar de la tabla:");
            int n = Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < tabla.Length; i++)
            {
                if (n == tabla[i].numero)
                {
                    tabla[i].numero = 0;
                }
            }
        }//FIN FUNCION BAJAS
        //  3)  INICIO FUNCIÓN MODIFICACIONES
        static void modificaciones(dato[] tabla)
        {
            Console.Write("Introduzca el id del alumno que desea modificar:");
            int modif = Convert.ToInt32(Console.ReadLine());
            for (int i = 0; i < tabla.Length; i++)
            {
                if (modif == tabla[i].numero)
                {
                    Console.Write("Introduzca el nuevo nombre:");
                    tabla[i].nombre = Console.ReadLine();
                    Console.Write(".");
                    Thread.Sleep(300);
                    Console.Write(".");
                    Thread.Sleep(350);
                    Console.Write(".");
                    Thread.Sleep(360);
                    Console.Write(".");
                    Thread.Sleep(365);
                    Console.Write(".");
                    Thread.Sleep(370);
                    Console.Write(" ¡Acción Realizada Correctamente!");
                    Console.Write("\n\n Presione una tecla para continuar y modificar la nota...");
                    Console.ReadLine();
                    Console.Write("Introduzca la nueva nota:");
                    tabla[i].nota = Convert.ToDouble(Console.ReadLine());
                    Console.Write(".");
                    Thread.Sleep(300);
                    Console.Write(".");
                    Thread.Sleep(350);
                    Console.Write(".");
                    Thread.Sleep(360);
                    Console.Write(".");
                    Thread.Sleep(365);
                    Console.Write(".");
                    Thread.Sleep(370);
                    Console.Write(" ¡La nota ha sido cambada correctamente!");
                    Console.Write("\n Acaba de cambiar los datos del alumno que ha seleccionado.\n Pulse una tecla para volver al menú");
                }
            }
        }
        //  4)  INICIO FUNCION CONSULTAS
        static void consultas(dato[] tabla)
        {
            for (int i = 0; i < tabla.Length; i++)
            {
                if (tabla[i].numero != 0)
                {
                    Console.Write("Id.  |   Nombre   |   Nota\n");
                    Console.Write("----------------------------\n");
                    Console.Write(tabla[i].numero + "   || " + tabla[i].nombre + "           || " + tabla[i].nota + "\n"); // muestra la tabla.
                    Thread.Sleep(500);
                    Console.ReadLine();
                }
            }
        }//FIN FUNCION CONSULTAS
    }
}





27-Nov-2014 01:16
Nacho Cabanes (+84)

Vamos por partes. Aquí tienes la idea de cómo hacer la búsqueda secuencial y un ejemplo:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=725

Confírmame si entiendes eso y seguimos.


04-Dec-2014 13:01
Invitado (Luis)

Oks. Eso lo entiendo.


05-Dec-2014 10:33
Nacho Cabanes (+84)

La búsqueda binaria es un poco más difícil, pero no mucho. Mira el final de este apartado:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=732







(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)