Qué es esto..??
Altas
Consultas
Bajas
Modificar
Bonus..!!
Imprimir
Combo
Grilla
| Volver | |
Agenda | |
Archivo | |
Base de dato |
Basico | |
Cola y Pila |
| Editor | |
Editor2 | |
Fibonacci | |
Hanoi | |
Listas | |
Matriz |
| Modelo 1 | |
Modelo | |
Polimorfismo |
Punteros | |
Sobrecarga | |
Vectores |
.. Si crees que los árboles son plantas con raices y que de cuando en cuando dan bananas o este raro tema no te importa un comino y estas de acuerdo con Batman, que afirma que Robin la tiene chica...!!!, te puedo demostrar que tu paradigma debe ser el
.. pero si lo anterior te huele mal, solo ponte a..
¿¿Para qué corremos rápido bajo la lluvia, si delante también llueve.??
Si quiero comprar un boomerang nuevo, ¿cómo me deshago del viejo?
Los árboles son estructuras dinámicas de datos
Estan conformados estructuralmente por conjuntos de uno más nodos, quienes pueden o no estar vacíos y están dotados de enlaces jerárquicos.
LIO FAMILIAR:
Aquellos nodos que tienen el mismo padre se llaman "Hermanos" y los hijos de estos son
"Nietos" del "Padre". Está claro no.???
ARBOL DE EXPRESION: (a + b * c ) + (( d * e + f ) * g )
Los árboles pueden ser usados para representar expresiones de
memoria; para ello se usan árboles binarios que tienen operaciones binarias y están constituidos por hojas que son
operandos y los demás nodos contienen operadores.
En este ejemplo, a + (d * c) se evalúa en el subárbol izquierdo y ((d * e) + f ) se evalúa en el subárbol derecho.
Este esquema "Izquierda, Nodo, Derecha" se denomina de "Recorrido simétrico"
RECURSIVIDAD
Recordemos que un proceso es recursivo cuando está parcial o totalmente definido en términos de sí mismo; de modo que algo que sea infinito pueda ser definido de forma finita; así, un programa recursivo podrá llamarse a sí mismo y deberá tener dos partes:
DECLARAR NODOS DEL ÁRBOL
Usa y analiza la sintaxis y la semántica del siguiente ejemplo para que aprendas a operar tus árboles
//////////////////////////////////////////////////// // C++ Builder Wilo Carpio // MANEJO DE ARBOLES CON ARCHIVO //////////////////////////////////////////////////// #include#pragma hdrstop #include #include "Agenda.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMiFormulario *MiFormulario; //////////////////////////////////////////////////// // ESTRUCTURA DEL ARBOL //////////////////////////////////////////////////// struct Arbol { char CampoNombre[30]; char CampoEmail[40]; int borrado; struct Arbol *Derecha; struct Arbol *Izquierda; }; //////////////////////////////////////////////////// // ESTRUCTURA DEL ARCHIVO //////////////////////////////////////////////////// struct Archivo { char CampoNombre[30]; char CampoEmail[40]; }; //////////////////////////////////////////////////// // ESTRUCTURAS DE DATOS //////////////////////////////////////////////////// typedef struct Arbol NodoArbol; typedef struct Archivo Registro; //////////////////////////////////////////////////// // DECLARACION DE VARIABLES GLOBALES //////////////////////////////////////////////////// int i; NodoArbol *RaizArbol,*Elejido = NULL,*Papito; int bandera; FILE *archi; Registro Ficha;
Puedo guardar el ratón de mi PC en el baúl del coche con el gato del auto.??
Si cuando comí huevos me pateó el hígado, cuando coma hígado... ¿me pateará los huevos?
ALTA DE NODOS EN EL ÁRBOL
Usa una función recursiva que permita insertar los nuevos nodos sin perder su raíz, sobre la que se realizan las operaciones sobre todo el árbol.
//////////////////////////////////////////////////// // BOTON ALTAS //////////////////////////////////////////////////// void __fastcall TMiFormulario::Altas1Click(TObject *Sender) { bandera=0; PanelAltas->Visible=true; BotonGrabar->Visible=true; BotonCambios->Visible=false; BotonEliminar->Visible=false; BotonLimpiar->Visible=true; BoxNombre->ReadOnly=false; BoxEmail->ReadOnly=false; BoxNombre->Clear(); BoxEmail->Clear(); BoxNombre->SetFocus(); } //////////////////////////////////////////////////// // BOTON GRABAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonGrabarClick(TObject *Sender) { NodoArbol *q; q = buscar(BoxNombre->Text.c_str()); if (q == NULL) { BotonGrabar->Enabled= true; agregar_nodo(BoxNombre->Text.c_str(), BoxEmail->Text.c_str()); ShowMessage(" DATOS SE GRABARON"); BoxNombre->Clear(); BoxEmail->Clear(); BoxNombre->SetFocus(); } else { ShowMessage(" EL DATO YA SE ENCUENTRA"); BoxNombre->SetFocus(); } } //////////////////////////////////////////////////// // PROCEDIMIENTO PARA AGREGAR UN NODO EN EL ARBOL //////////////////////////////////////////////////// void agregar_nodo(char Nombre[30], char Email[40] ) { NodoArbol *NodoAuxiliar, *Nodo2Auxiliar; NodoAuxiliar = (NodoArbol *) malloc(sizeof(NodoArbol)); strcpy(NodoAuxiliar->CampoNombre,Nombre); strcpy(NodoAuxiliar->CampoEmail,Email); NodoAuxiliar->borrado = 1; NodoAuxiliar->Izquierda = NULL; NodoAuxiliar->Derecha = NULL; if (RaizArbol == NULL) RaizArbol = NodoAuxiliar; else { Nodo2Auxiliar = RaizArbol; while (Nodo2Auxiliar != NULL) { Papito = Nodo2Auxiliar; if (strcmp(NodoAuxiliar->CampoNombre,Nodo2Auxiliar->CampoNombre) < 0) Nodo2Auxiliar = Nodo2Auxiliar->Izquierda; else Nodo2Auxiliar = Nodo2Auxiliar->Derecha; } if (strcmp(NodoAuxiliar->CampoNombre,Papito->CampoNombre) < 0) Papito->Izquierda = NodoAuxiliar; else Papito->Derecha = NodoAuxiliar; } } //////////////////////////////////////////////////// // PROCEDIMIENTO PARA AGREGAR UN REGISTRO //////////////////////////////////////////////////// void agregar_registro(char Nombre[30], char Email[40]) { archi = fopen("Arbol.dat","a+b"); if (archi != NULL) { strcpy(Ficha.CampoNombre,Nombre); strcpy(Ficha.CampoEmail,Email); fwrite(&Ficha,sizeof(Registro),1,archi); fclose(archi); } } //////////////////////////////////////////////////// // GRABAR EL ARBOL EN EL ARCHIVO //////////////////////////////////////////////////// void cargar_archivo(NodoArbol *r) { if (r != NULL) { cargar_archivo(r->Izquierda); if (r->borrado == 1) agregar_registro(r->CampoNombre,r->CampoEmail); cargar_archivo(r->Derecha); } } //////////////////////////////////////////////////// // CARGAR EL ARBOL //////////////////////////////////////////////////// void cargar_arbol(void) { archi = fopen("Arbol.dat","rb"); RaizArbol = NULL; if (archi != NULL) { fread(&Ficha,sizeof(Registro),1,archi); while(!feof(archi)) { agregar_nodo(Ficha.CampoNombre,Ficha.CampoEmail); fread(&Ficha,sizeof(Registro),1,archi); } } }
Si el congelador de una heladera está a 10 grados bajo
cero, y en el invierno de la Antártida la temperatura ambiente llega a 50 grados bajo cero.
¿No podrían calentarse las personas entrando a los congeladores?
Cuando se hace algo mucho tiempo, se hace cada vez mejor, ¿por qué los taxistas manejan tan mal.??
¿Por qué no hay comida para gatos 'con sabor a ratón'?
VER NODOS DEL ÁRBOL
Se activa una función recursiva de recorrido, que toma como parámetro un nodo, tal lo muestra el siguiente diagrama de flujo. Se pueden usar con este fin los recorridos en Preorden y Postorden .
//////////////////////////////////////////////////// // BOTON CONSULTAS //////////////////////////////////////////////////// void __fastcall TMiFormulario::Consultas1Click(TObject *Sender) { PanelCombo->Visible=true; combo->Clear(); cargar_combo(RaizArbol); BotonCambios->Visible=false; BotonEliminar->Visible=false; BoxNombre->ReadOnly=true; BoxEmail->ReadOnly=true; } //////////////////////////////////////////////////// // PROCEDIMIENTO PARA BUSCAR UN NODO DEL ARBOL //////////////////////////////////////////////////// NodoArbol *buscar(char Nombre[20]) { NodoArbol *busca, *encontrado; bandera = 0; busca = RaizArbol; while(busca != NULL && bandera == 0) { if (strcmp(Nombre,busca->CampoNombre) == 0 && busca->borrado == 1) bandera = 1; else { if (strcmp(Nombre,busca->CampoNombre) < 0) busca = busca->Izquierda; else busca = busca->Derecha; } } if (bandera == 1) encontrado = busca; else encontrado = NULL; return encontrado; }
¿Hasta dónde se lavan la cara los pelados?
¿Por qué apretamos más fuerte los botones del control remoto cuando tiene poca batería??
BORRAR NODO
PROCEDIMIENTO PARA ELIMINAR UN NODO DEL ARBOL
//////////////////////////////////////////////////// // PROCEDIMIENTO PARA ELIMINAR UN NODO DEL ARBOL //////////////////////////////////////////////////// void eliminar(char Nombre[30], char Email [40]) { NodoArbol *busca; busca = buscar(Nombre); busca->borrado = 0; } //////////////////////////////////////////////////// // BOTON ELIMINAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonEliminarClick(TObject *Sender) { int respuesta; respuesta=Application->MessageBox("Confirme eliminacion de datos","Eliminar??",MB_OKCANCEL); if (respuesta==IDOK) { eliminar(BoxNombre->Text.c_str(),BoxEmail->Text.c_str()); BoxNombre->Clear(); BoxEmail->Clear(); } } //////////////////////////////////////////////////// // BOTON BAJAS //////////////////////////////////////////////////// void __fastcall TMiFormulario::Bajas1Click(TObject *Sender) { PanelCombo->Visible=true; combo->Clear(); cargar_combo(RaizArbol); BotonEliminar->Visible=true; BoxNombre->ReadOnly=true; BoxEmail->ReadOnly=true; }
¿Por qué la luz negra no es negra?
¿Por qué los Kamikazes usaban cascos.??
CAMBIAR NODOS
MODIFICAR: Recuerda que puedes modificar todos los campos del nodo, excepto el campo llave.
//////////////////////////////////////////////////// // BOTON MODIFICAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::Modificaciones1Click(TObject *Sender) { PanelCombo->Visible=true; combo->Clear(); cargar_combo(RaizArbol); BotonCambios->Visible=true; BotonEliminar->Visible=false; BoxNombre->ReadOnly=false; BoxEmail->ReadOnly=false; } //////////////////////////////////////////////////// // BOTON CAMBIOS //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonCambiosClick(TObject *Sender) { strcpy(Elejido->CampoNombre,BoxNombre->Text.c_str()); strcpy(Elejido->CampoEmail,BoxEmail->Text.c_str()); }
Al mundo redondo lo llamamos planeta. Si fuese plano... ¿lo llamaríamos redondeta.??
Si un abogado enloquece... ¿pierde el juicio?
TAREA INICIAL
ACTIVAR EL FORMULARIO
//////////////////////////////////////////////////// // ACTIVAR EL FORMULARIO //////////////////////////////////////////////////// __fastcall TMiFormulario::TMiFormulario(TComponent* Owner) : TForm(Owner) { } //////////////////////////////////////////////////// // BOTON SALIR //////////////////////////////////////////////////// void __fastcall TMiFormulario::Salir1Click(TObject *Sender) { int opcion; opcion=Application->MessageBox("¿Quieres cerrar este programa?","Salir", MB_OKCANCEL+MB_ICONQUESTION); if (opcion== IDOK) { Close(); } } //////////////////////////////////////////////////// // BOTON RETORNAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonRetornarClick(TObject *Sender) { PanelVisualizar->Visible = false; } //////////////////////////////////////////////////// // CARGAR EL FORMULARIO //////////////////////////////////////////////////// void __fastcall TMiFormulario::FormCreate(TObject *Sender) { RaizArbol = NULL; cargar_arbol(); } //////////////////////////////////////////////////// // CERRANDO EL ARCHIVO //////////////////////////////////////////////////// void __fastcall TMiFormulario::FormClose(TObject *Sender, TCloseAction &Action) { archi = fopen("Arbol.dat","wb"); fclose(archi); cargar_archivo(RaizArbol); } //////////////////////////////////////////////////// // CERRANDO PANEL DEL COMBO //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonCerrarClick(TObject *Sender) { PanelCombo->Visible=false; } //////////////////////////////////////////////////// // BOTON ACEPTAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonAceptarClick(TObject *Sender) { Elejido=buscar(combo->Text.c_str()); if (Elejido != NULL) { PanelCombo->Visible=false; BotonGrabar->Visible=false; BotonLimpiar->Visible=false; PanelAltas->Visible=true; BoxNombre->Text = Elejido->CampoNombre; BoxEmail->Text = Elejido->CampoEmail; } } //////////////////////////////////////////////////// // BOTON ORDENAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::Ordenar1Click(TObject *Sender) { Application->MessageBox("Se Ordenarán los Elementos de la Lista","ORDENAR",MB_ICONEXCLAMATION+MB_OKCANCEL); } //////////////////////////////////////////////////// // BOTON LIMPIAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonLimpiarClick(TObject *Sender) { BoxNombre->Clear(); BoxEmail->Clear(); BoxNombre->SetFocus(); } //////////////////////////////////////////////////// // BOTON REGRESAR //////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonRegresarClick(TObject *Sender) { PanelAltas->Visible = false; }
¿Los infantes disfrutan la infancia tanto como los adultos el adulterio.??
PREPARA TU IMPRESORA
No olvides cargar papel en tu impresora
//////////////////////////////////////////////////// // BOTON IMPRIMIR //////////////////////////////////////////////////// void __fastcall TMiFormulario::Imprimir1Click(TObject *Sender) { int respuesta; { respuesta=Application->MessageBox("Tu impresora esta prendida?","Atencion",MB_OKCANCEL); if (respuesta==IDOK) PrintDialog->Execute(); } }
Si el pez nada... ¿la vaca todo..???
¿Qué tiempo verbal es "no debería haber pasado"?... ¿preservativo imperfecto.??
TE OFREZCO UN COMBO..!!
Pero para simplificar tu vida
//////////////////////////////////////////////////// // PROCEDIMIENTO PARA CARGAR EL COMBO //////////////////////////////////////////////////// void cargar_combo(NodoArbol *r) { if (r != NULL) { cargar_combo(r->Izquierda); if (r->borrado == 1) MiFormulario->combo->Items->Add(r->CampoNombre); cargar_combo(r->Derecha); } }
Si la piscina es honda, ¿el mar es Toyota.???
¿Debería cortarme las venas o dejármelas largas.??
DATOS POR GRILLA
Este vendría a ser otro combo programático..!!!
//////////////////////////////////////////////////// // DATOS POR GRILLA //////////////////////////////////////////////////// void __fastcall TMiFormulario::Visualizacion1Click(TObject *Sender) { PanelVisualizar->Visible=true; Grilla->Cells[0][0]="CampoNombre"; Grilla->Cells[1][0]="CampoEmail"; i = 1; cargar_grilla(RaizArbol); } //////////////////////////////////////////////////// // PROCEDIMIENTO PARA CARGAR LA GRILLA //////////////////////////////////////////////////// void cargar_grilla(NodoArbol *r) { if (r != NULL) { cargar_grilla(r->Izquierda); if (r->borrado == 1) { MiFormulario->Grilla->Cells[0][i] = r->CampoNombre; MiFormulario->Grilla->Cells[1][i] = r->CampoEmail; i++; } cargar_grilla(r->Derecha); } while ( MiFormulario->Grilla->Cells[0][i+1]!="") { MiFormulario->Grilla->Cells[0][i+1]=""; MiFormulario->Grilla->Cells[1][i+1]=""; } }
Cuando se 'reproduce' un disco... ¿queda 'encinta'?