|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - The_Reaper22
Páginas: [1]
1
« en: Viernes 15 de Octubre de 2010, 12:47 »
Tengo que desarrollar una aplicación que visualice cómo se comportan los diferentes algoritmos de ordenación, y ando un poco perdido, porque no sé me ocurre el modo de realizar esto. La idea sería realizar una animación con gráficos de barras animadas; de modo que se visualicen los intercambios, comparaciones... Tenía idea de trabajar con WPF, no sé si alguien podría orientarme sobre el modo de poder conseguirlo con WPF.
Muchas gracias. Un saludo.
2
« en: Viernes 24 de Septiembre de 2010, 20:40 »
He conseguido hacer funcionar el programa, combinando vuestras ideas, mil gracias. Pero pienso que no está demasiado optimizado... Mi idea sería no utilizar los métodos estáticos en cada algoritmo de ordenación como en el código que me adjuntó tannke, y hacer una clase Ordenación<Tip> que sea clase ancestro de burbuja, inserción, selección.... de modo que no tenga que hacer una llamada distinta para cada algoritmo, y mediante polimorfismo con objeto tipo Ordenación<Tip> pueda instanciar cualquiera de sus descendientes; burbuja, inserción....Las clases que contienen los métodos de ordenación están implementadas tal y como está en el ejemplo de tannke. Mi main tiene el siguiente aspecto de momento: static void Main(string[] args) { int opcAlgoritmo,tam; string tipo; ProcesadorDatos datosAOrdenar; int[] vectorInt=null; double[] vectorDouble=null; char[] vectorChar=null; char función; do { NanoTemporizador temporizador = new NanoTemporizador (); opcAlgoritmo = MenúAlgoritmo(); if (opcAlgoritmo != 8) { tipo = MenúTipo(); tam = MenúTamaño(); datosAOrdenar = new ProcesadorDatos (tam, tipo ); datosAOrdenar = MenúModo(tipo, tam); función = MenúFunción(); //creamos el array en función del tipo if (tipo.CompareTo("int") == 0) { vectorInt = new int[tam ]; datosAOrdenar.listaToArray(vectorInt); } else if (tipo.CompareTo("char") == 0) { vectorChar = new char[tam ]; datosAOrdenar.listaToArray(vectorChar); } else { vectorDouble = new double[tam ]; datosAOrdenar.listaToArray(vectorDouble); } switch (opcAlgoritmo) { //Caso de la burbuja case 1: if (tipo.CompareTo("int") == 0) { temporizador.Start(); if (función.CompareTo('A') == 0) Burbuja<int>.Ordenar(vectorInt, Gener.IntAscendente); else Burbuja<int>.Ordenar(vectorInt, Gener.IntDescendente); temporizador.Stop(); Burbuja<int>.Mostrar(vectorInt); } else if (tipo.CompareTo("char") == 0) { temporizador.Start(); if (función.CompareTo('A') == 0) Burbuja<char>.Ordenar(vectorChar, Gener.CharAscendente); else Burbuja<char>.Ordenar(vectorChar, Gener.CharDescendente); temporizador.Stop(); Burbuja<char>.Mostrar(vectorChar); } else { temporizador.Start(); if (función.CompareTo('A') == 0) Burbuja<double>.Ordenar(vectorDouble, Gener.DoubleAscendente); else Burbuja<double>.Ordenar(vectorDouble, Gener.DoubleDescendente); temporizador.Stop(); Burbuja<double>.Mostrar(vectorDouble); } break; //Caso de la burbuja bidireccional case 2: if (tipo.CompareTo("int") == 0) { temporizador.Start(); if (función.CompareTo('A') == 0) BurbujaBidireccional<int>.Ordenar(vectorInt, Gener.IntAscendente); else BurbujaBidireccional<int>.Ordenar(vectorInt, Gener.IntDescendente); temporizador.Stop(); BurbujaBidireccional<int>.Mostrar(vectorInt); } else if (tipo.CompareTo("char") == 0) { temporizador.Start(); if (función.CompareTo('A') == 0) BurbujaBidireccional<char>.Ordenar(vectorChar, Gener.CharAscendente); else BurbujaBidireccional<char>.Ordenar(vectorChar, Gener.CharDescendente); temporizador.Stop(); BurbujaBidireccional<char>.Mostrar(vectorChar); } else { temporizador.Start(); if (función.CompareTo('A') == 0) BurbujaBidireccional<double>.Ordenar(vectorDouble, Gener.DoubleAscendente); else BurbujaBidireccional<double>.Ordenar(vectorDouble, Gener.DoubleDescendente); temporizador.Stop(); BurbujaBidireccional<double>.Mostrar(vectorDouble); } break;
La clase ProcesadorDatos la utilizo para insertar elementos en los arrays y para transformar los ArrayList en los arrays del tipo que corresponda. Adjunto algo de código de dicha clase: namespace MétodosOrdenación { class ProcesadorDatos { private ArrayList lista; private string tipo; private int tamaño; public ProcesadorDatos(int tamaño, string tipo) { lista = new ArrayList (tamaño ); this.tipo = tipo; this.tamaño = tamaño; } public void insertaAleatorio() { int semilla = System.Convert.ToInt32(DateTime.Now.Millisecond); if (this.tipo == "int") { Console.WriteLine("Introduciendo elementos aleatorios..."); Random rnd = new Random (semilla ); for (int i = 0; i < this.tamaño; i++) lista.Add((int)(rnd.NextDouble() * 1000)); } else if (this.tipo == "double") { Console.WriteLine("Introduciendo elementos aleatorios..."); Random rnd = new Random (semilla ); for (int i = 0; i < this.tamaño; i++) lista.Add((double)(rnd.NextDouble() * 1000)); } else { Random prRand = new Random (semilla ); Console.WriteLine("Introduciendo elementos aleatorios..."); Random rnd = new Random (semilla ); for (int i = 0; i < this.tamaño; i++) lista.Add((char)(prRand.Next(97, 123))); } } public void listaToArray(int[] vectorInt) { int posicion = 0; foreach (Object obj in this.Lista) { vectorInt[posicion] = Convert.ToInt32(obj); posicion++; } } public void listaToArray(double[] vectorDouble) { int posicion = 0; foreach (Object obj in this.Lista) { vectorDouble[posicion] = Convert.ToDouble(obj); posicion++; } } public void listaToArray(char[] vectorChar) { int posicion = 0; foreach (Object obj in this.Lista) { vectorChar[posicion] = Convert.ToChar(obj); posicion++; } }
Pienso que tengo bastantes "apaños" en el código y que podría estar más depurado apoyándome en la genericidad utilizando la clase Ordenación<Tip> mencionada y creo que podría también implementar la interfaz IComparable, pero no me desenvuelvo muy bien con la genericidad, agradecería alguna idea.
3
« en: Lunes 20 de Septiembre de 2010, 14:17 »
Eso es justamente lo que quería hacer yo... mil millones de gracias, probaré a adaptar esa idea al código que tengo. Gracias!!
4
« en: Lunes 20 de Septiembre de 2010, 09:25 »
Muchas gracias compi!!, la verdad es que me será de mucha ayuda, no conocía ese modo de validar el tipo de datos introducido, me parece muy interesante... Seguiré intentando avanzar con el programa. Mil gracias de nuevo!!
5
« en: Domingo 19 de Septiembre de 2010, 21:05 »
Muchas gracias!!, la idea sería pedir el tipo de datos con el que trabajar(char,double,float), y una vez seleccionado utilizar sólo ese tipo de dato. El problema lo tendría a la hora de declarar las cabeceras de los métodos, por ejemplo; public void Burbuja(int[] vector), es este caso especifico el tipo, pero la idea que yo tenía era declarar una sola cabecera de forma que para cualquier array pasado como argumento sea del tipo que sea, pudiera trabajar con el, y en este caso pudiera ordenarlo. No obstante me sirven las ideas, quizás utilizar un ArrayList sea la solución... Lo probaré estos días.. muchas gracias por tu ayuda.
6
« en: Sábado 18 de Septiembre de 2010, 12:13 »
Antes de nada saludaros a todos ya que soy nuevo en el foro : . Mi duda es la siguiente; toy programando una aplicación que trabaje con distintos algoritmos de ordenación, y estoy planteandome la posibilidad de que pueda trabajar con datos int, double o incluso char, pero no se me ocurre el modo de hacerlo, os comento un poco por encima la estructura del programa que estoy realizando para ver si es posible añadir esta funcionalidad: De momento mi programa consta de una clase "Ordenación", que tiene los métodos "Insertar", "Insertar aleatorio", "Mostrar", "Ordenar"... de la cual heredan una serie de clases que serán los distintos algoritmos de ordenación; "Burbuja", "QuickSort", "Inserción"...Luego tengo el main, desde el cual por medio de menús, selecciono el tipo de algoritmo a utilizar y las operaciones que se quieran realizar con ellos, todo esto instanciando objetos de tipo "Ordenación" ya que por medio del poliformismo se ejecutará en cada caso el método ordenar requerido. Pues bien, el caso es que no veo el modo de poder trabajar con arrays de distintos tipos...Si teneis alguna idea o sugerencia.. Os adjunto algo de código que tengo hecho: /// método llamado desde otro menú del main una vez hayamos elegido ///el tipo de algoritmo con el que vamos a trabajar /// el objeto algoritmo es de tipo Ordenación public static void MenúModo(Ordenación algoritmo,int tamaño) { int modo; int[] vector = new int[tamaño]; do { Console.Clear(); Console.WriteLine(".- SELECCIONA UNA OPCIÓN"); Console.WriteLine("1.- INTRODOCIR VECTOR MANUALMENTE"); Console.WriteLine("2.- GENERAR VECTOR ALEATORIO"); Console.WriteLine("3.- ORDENAR VECTOR: ORDEN ASCENDENTE"); Console.WriteLine("4.- ORDENAR VECTOR: ORDEN DESCENDENTE"); Console.WriteLine("5.- MOSTRAR VECTOR"); Console.WriteLine("6.- BORRAR VECTOR"); Console.WriteLine("7.- VOLVER AL MENÚ"); Console.Write("Elija opción(1-7): "); modo = Convert.ToInt32(Console.ReadLine()); switch (modo) { case 1: algoritmo.Insertar(vector); Console.WriteLine("Pulse entrar para continuar"); Console.ReadLine(); break; case 2: algoritmo.InsertarAleatorio(vector); Console.WriteLine("Pulse entrar para continuar"); Console.ReadLine(); break; case 3: Console.WriteLine("Ordenando...."); algoritmo.Ordenar(vector); Console.WriteLine("¡Vector ordenado en orden ascendente!"); Console.WriteLine("Tiempo empleado"+algoritmo.TiempoEjecución); Console.WriteLine("nº comparaciones:" + algoritmo.NumComparaciones); Console.WriteLine("nº intercambios" + algoritmo.NumIntercambios); Console.WriteLine("Pulse entrar para continuar"); Console.ReadLine(); break; ///Clase ancestro de clases; "Burbuja", "Selección"..., cada cual con su propio método ordenar public class Ordenación { protected long tiempoEjecución; protected int numComparaciones; protected int numIntercambios; public void Insertar(int[] vector) { for (int i = 0; i < vector.Length; i++) { Console.Write("Introduzca elemento["+i+"]"); try { int elemento = Convert.ToInt32(Console.ReadLine()); vector[i] = elemento; } catch (FormatException ) { Console.WriteLine("Elemento incorrecto"); } } } ///Clase Burbuja public class Burbuja: Ordenación { private int nComparaciones = 0; private int nIntercambios = 0; public override void Ordenar(int[] vector) { Stopwatch temporizador = new Stopwatch(); temporizador.Start(); int sup = vector.Length - 1; int temp; for (int i = sup; i >= 1; i--) { for (int j = 0; j <= i - 1; j++) if (vector[j] > vector[j + 1]) { temp = vector[j]; vector[j] = vector[j + 1]; vector[j + 1] = temp; nIntercambios++; } nComparaciones ++; } temporizador.Stop(); TiempoEjecución = temporizador.ElapsedMilliseconds; NumComparaciones = nComparaciones; NumIntercambios = nIntercambios; }
Páginas: [1]
|
|
|