Files
Borland-C/CPP/DICCIO.CPP

1338 lines
48 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Diccionario sensible a las tres primeras letras de la palabra.
//
// Programado por:
// Moiss Virumbrales Cuenca
// Juan L¢pez Fern ndez
//
// Fecha: 04-05-1999
// éltima modificaci¢n: 13-06-1999
// Versi¢n: 1.0
//
// **************************************************************************
// **** ****
// **** Librer¡as incluidas ****
// **** ****
// **************************************************************************
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include <dos.h>
#include <a:\gui.h>
#include <a:\libre.h>
#include <a:\iconos.h>
// **************************************************************************
// **** ****
// **** Declaraci¢n de las Estructuras ****
// **** ****
// **************************************************************************
struct def{ // Estructura en la que se guarda la palabra
char palabra[20]; // y la definici¢n de la misma.
char definicion[100];
struct def *sig;
};
struct letra3{ // Estructura que forma la tercera letra indexada
char l3; // del  rbol.
struct letra3 *sig;
struct def *lista;
};
struct letra2{ // Estructura que forma la segunda letra indexada
char l2; // del  rbol.
struct letra2 *sig;
struct letra3 *nivel3;
};
struct letra1{ // Estructura que forma la primera letra indexada
char l1; // del  rbol.
struct letra1 *sig;
struct letra2 *nivel2;
};
struct temporal{ // Para que no de problemas a la hora de grabarlo y
char palabra[20]; // cargarlo del fichero.
char definicion[100];
};
// NO PUEDEN SER TODAS LAS ESTRUCTURAS DE LAS LETRAS IGUALES, YA QUE CUANDO
// AVANZAMOS EN PROFUNDIDAD POR EL µRBOL, LAS ESTRUCTURAS A LAS QUE
// APUNTAN SON DIFERENTES.
// **************************************************************************
// **** ****
// **** Inizializaci¢n de Funciones ****
// **** ****
// **************************************************************************
struct letra1* inicializar(); // Inicializa el  rbol del diccionario.
void cargar_diccio(struct letra1 *); // Carga el diccionario del fichero.
void guardar_arbol(struct letra1 *);// Guarda el diccio en el fichero.
void nueva_palabra(struct letra1 *); // Agrega una nueva palabra al diccio.
void modif_palabra(struct letra1 *); // modif la def de una palabra del diccio
void listar(struct letra1*,int);//Lista las palabras del diccio.
void listar_sen(struct letra1*, int, char*, char [10][20]); // Lista sensible.
void imprime_def(char *);// Imprime la def con el algor¡tmo de abrir l¡neas.
void limpiar_nodo(struct def **); // limpia el nodo reservado.
void limpiar(struct temporal *); // limpia la estructura auxiliar.
struct def* buscar(struct letra1 *, struct temporal *); // busca la palabra en el diccio.
void buscar_palabra(struct letra1 *,int); // El padre de buscar con sus ventanas.
void busca_sen(struct letra1 *);// busca por las tres primeras letras.
int huge detectEGA(void); // devuelve la resoluci¢n de la pantalla.
void checkerrors(void); // mira si hay fallos al inizializar el modo gr fico.
void rectangulo(int); // dibuja el rectangulo de los botones.
void menu(); // pinta el menu general.
void base(); // pinta el fondo con t¡tulo y barra inferior.
void menu_buscar(); // pinta el menu de b£squeda.
void acerca_de(); // informaci¢n de los creadores.
void intro_letras(int, int, char[], int, int, int, int, int); // introducci¢n la palabra.
void introdef(int, int, char[], int, int, int, int, int);// intro al definici¢n.
void intro_sen(int, int, char[], int, int, int);// intro las tres 1¦ letras de la palabra.
// **************************************************************************
// **** ****
// **** Variables Globales ****
// **** ****
// **************************************************************************
struct temporal fichero; // tiene temporalmente los datos de un nodo.
// **************************************************************************
// **** ****
// **** El cuerpo del Programa ****
// **** ****
// **************************************************************************
void main(){
// **************************************************************************
// **** Variables Locales al Main ****
// **************************************************************************
// Bienvenido al mundo de los punteros :-).
struct letra1 *diccio; // Es el puntero m s grande.
int sw=1, pos=1; // el sw para saber cuando elige una opci¢n y pos la
int tecla=0; // posici¢n en el menu, tecla son los cursores.
// **************************************************************************
// **** Inizializaci¢n del modo gr fico ****
// **************************************************************************
installuserdriver("SVGA256", detectEGA); // instala el controlador de 256c.
int Gd = DETECT, Gm;
checkerrors(); // mira a ver si hay errores.
initgraph(&Gd, &Gm, "c:\\tc\\bgi");// inicializa el modo gr fico.
checkerrors(); // mira a ver si hay errores.
// **************************************************************************
// **** El programa ****
// **************************************************************************
base(); // fondo y t¡tulo.
settextstyle(2,0,5);
ventana(125,200,475,300,"Cargando...",0,0);// dibujamos una ventana.
boton(133,265,467,275,1,"",0,0);
setcolor(0);
settextstyle(2,0,5);
outtextxy(136,235,"Cargando el diccionario, espere porfavor...");// texto de la ventana.
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Cargando..."); // informaci¢n de la barra inferior.
diccio=inicializar();//Inicializamos el  rbol del diccionario.
cargar_diccio(diccio);// carga el diccio del fichero.
base();// limpiamos pantalla
menu();// ponemos el menu general.
rectangulo(pos);// el recuadro de los botones
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");// informaci¢n de la barra inferior.
while (sw){ // bucle general del menu general.
tecla=getch();// a ver que pulsa
if (tecla==0){// es tecla especial.
tecla=getch();// a ver cual es
switch(tecla){ // que flecha es
case 72: // flecha arriba.
if (pos!=1){// no est  en el primer boton
menu();// el menu principal
pos--;// subimos por el menu
setcolor(0);rectangulo(pos);// cambia el rectangulo
}// fin if primer boton
else{// est  en el primer boton
menu();// lo dibujamos igual
pos=5;// se va al £ltimo boton
setcolor(0);rectangulo(pos);// donde esta el rectangulo
}// fin else
break;// le rompemos al switch
case 80: // flecha abajo.
if (pos!=5){// si no est  en el £ltimo.
menu();// ¨qu pintamos?
pos++;// bajamos por los botones
setcolor(0);rectangulo(pos);// idem
}// fin if
else{// est  en el £ltimo
menu();// que pasa
pos=1;// le subimos al primero
setcolor(0);rectangulo(pos);// eeeeee
}//fin else
break;// que quiebro
}// fin del switch tecla
switch(pos){// miramos en que boton esta
case 1:// Buscar palabra.
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// limpiamos barra inferior
settextstyle(2,0,4);setcolor(0);// informaci¢n inferior.
outtextxy(30,460,"B£squeda de una palabra mediante varios mtodos.");
break;// le ha roto
case 2:// Introducir nueva palabra.
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// igual no idem
settextstyle(2,0,4);setcolor(0);// parecidillo
outtextxy(30,460,"Introducci¢n de palabras nuevas para la base de datos del diccionario.");
break;// toma y van cuatro
case 3: // Modificacion de palabras
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// lo pispo
settextstyle(2,0,4);setcolor(0);// lo que
outtextxy(30,460,"Modificaci¢n de la definici¢n de una palabra de la base de datos del diccionario.");
break;// es un poco fragil
case 4:// Acerca de...
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// lo pispo de lo pispo
settextstyle(2,0,4);setcolor(0);// que donde trabajas
outtextxy(30,460,"Informaci¢n de los creadores del programa.");
break;// se ha hecho pedacitos
case 5:// Salir.
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// lo pispo de lo pispo...
settextstyle(2,0,4);setcolor(0);// escribiendo comentarios
outtextxy(30,460,"Salir del programa.");// informaci¢n corta :-)
break;// no me quedan calificativos, es lo peor.
}// fin del switch de la informaci¢n inferior.
}// fin del if de la tecla especial
else{// no es especial, bua!
if (tecla==13){// se ha cansado de moverse por los botones
switch(pos){// a ver..
case 1: // buscar una palabra.
base();// limpiando...
menu_buscar();// un nuevo men£
int sw2=1, donde=1;// necesitamos ayuda
int opcion=0;// un poquito m s
rectangulo(donde);// adonde estamos en los botones
setcolor(0);
settextstyle(2,0,4);// informaci¢n inferior.
outtextxy(30,460,"Elige una opci¢n del men£ de b£squeda.");
while (sw2){// bucle del menu secundario.
opcion=getch();// aver que nos pulsa aqu¡
if (opcion==0){// es especial!
opcion=getch();// cual es?
switch(opcion){// vamos a descubrirlo
case 72: // flecha arriba.
if (donde!=1){// igual que el principal
menu_buscar();
donde--;
setcolor(0);rectangulo(donde);
}
else{
menu_buscar();
donde=4;
setcolor(0);rectangulo(donde);
}
break;
case 80: // flecha abajo.
if (donde!=4){
menu_buscar();
donde++;
setcolor(0);rectangulo(donde);
}
else{
menu_buscar();
donde=1;
setcolor(0);rectangulo(donde);
}
break;
}// fin del switch opcion
switch(donde){// a ver que informaci¢n imprimimos?
case 1:// Buscar palabra.
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);// todo igualisimo que
outtextxy(30,460,"B£squeda de una palabra mediante la introducci¢n de la misma y se muestra la definici¢n.");
break;
case 2:// Busqueda sensible
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);// el general.
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Introducci¢n de las tres primeras letras y elegir de la lista la palabra que se quiera.");
break;
case 3:// Acerca de...
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Informaci¢n de los creadores del programa. Por si en el men£ general no lo habis visto.");
break;
case 4:// Volver.
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Vuelve al men£ general del programa.");
break;
}// fin del switch donde
}// fin de la tecla especial
else{// se nos cansa
if (opcion==13){// a tomado su primera decisi¢n
switch(donde){// a donde la ha tomado?
case 1: // Buscar palabra.
buscar_palabra(diccio,0);// buscamos la palabra.
getch();// e ver si le da tiempo de ver la definici¢n.
base();menu_buscar();rectangulo(donde);// repintamos la
setcolor(0);settextstyle(2,0,4);// situaci¢n anterior.
outtextxy(30,460,"Elige una opci¢n del men£ de b£squeda.");
break;
case 2: // Busqueda sensible a teclado.
busca_sen(diccio);// buscamos con mucha sensibilidad.
base();menu_buscar();rectangulo(donde);// reconstruimos
setcolor(0);settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£ de b£squeda.");
break;
case 3: // Acerca de...
acerca_de();// ­LE INTERESAMOS! ¢ se a confundido?
base();menu_buscar();rectangulo(donde);// reconstructor
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");
break;
case 4: // volver.
base();// volviendo para el yeneral
menu();
rectangulo(pos);
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");
sw2=0;
break;
}// Fin del switch(donde).
}// Fon del if (opcion==13).
}// Fin del else tocho.
}// Fin del while(sw2).
break;// le rompemos que ya ha tenido bastante con est  opci¢n.
case 2: // a¤adir una palabra.
nueva_palabra(diccio);// a ver que nos mete el pill¡n
base();menu();rectangulo(pos);// reconstructor 2 el retonno
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");
break;
case 3: // modificar una palabra.
modif_palabra(diccio);// esas manazas!!!!
base();menu();rectangulo(pos);// reconstructor 3 quiz s vuelva...
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");
break;
case 4: // acerca de...
acerca_de();// ­­SIII, LE INTERESAMOS DE VERDAD!!!
base();menu();rectangulo(pos);// reconstructor 4 y continuar ...
settextstyle(2,0,4);
outtextxy(30,460,"Elige una opci¢n del men£.");
break;
case 5: // salir
guardar_arbol(diccio);// vamos a guardar los cambios.
sw=0;// nos las piramos.
break;
}// fin del switch(pos)
}// fin del if (tecla=13)
}// fin del else de tecla=0.
}// fin del while(sw)
closegraph();// se acab¢ el chiringuito.
}// fin del main.
// **************************************************************************
// **** ****
// **** Inicializar µrbol ****
// **** ****
// **************************************************************************
struct letra1* inicializar(){
// Variables locales a la funci¢n.
char letra=97;//Es la a.
struct letra1 *dic,*p1,*aux; // Un mar de punteros para ver si lo conseguimos
struct letra2 *p2,*aux2; // inicializar bien. :-/
struct letra3 *p3,*aux3; // Dic es el amago de boss, px es el que tiene
// el nuevo nodo, y aux/auxX tiene el £ltimo
// nodo insertado en cada nivel.
// Bucle de la primera letra.
for(;letra<123;letra++){//La 90 es la z.
if ((p1=(struct letra1 *) malloc(sizeof(struct letra1)))==NULL){
closegraph();
printf("No hay memoria suficiente.");getch();// Mal rollo.
exit(1);
}
else{
if (letra==97){ //Solamente la primera vez, ya que es un caso especial.
p1->l1=letra;p1->sig=NULL;
p1->nivel2=NULL;
dic=p1;aux=p1; // Hay que direcionar al boss.
}
else{ // El resto de los casos son iguales.
p1->l1=letra;p1->sig=NULL;
p1->nivel2=NULL;
aux->sig=p1;
aux=aux->sig;
}
// Bucle de la segunda letra.
for (char letra2=97;letra2<123;letra2++){
if ((p2=(struct letra2 *) malloc(sizeof(struct letra2)))==NULL){
closegraph();
printf("No hay memoria suficiente.");getch();// Mal rollito.
exit(1);
}
else{
if (letra2==97){ // Igual que el anterior.
p2->l2=letra2;p2->sig=NULL;
p2->nivel3=NULL; // Aqu¡ igual que el boss, pero con la letra
aux->nivel2=p2;aux2=p2; // correspondiente.
}
else{ // Igual que el anterior.
p2->l2=letra2;p2->sig=NULL;
p2->nivel3=NULL;
aux2->sig=p2;
aux2=aux2->sig;
}
// Bucle de la tercera letra.
for (char letra3=97;letra3<123;letra3++){
if ((p3=(struct letra3 *) malloc(sizeof(struct letra3)))==NULL){
closegraph();
printf("No hay memoria suficiente.");// De mal en peor.
getch();
exit(1);
}
else{
if (letra3==97){// Por el mismo motivo que los anteriores.
p3->l3=letra3;p3->sig=NULL;
p3->lista=NULL; // Igual que 2, pero con la letra
aux2->nivel3=p3;aux3=p3; // correspondiente.
}
else{// Idem.
p3->l3=letra3;p3->sig=NULL;
p3->lista=NULL;
aux3->sig=p3;
aux3=aux3->sig;
}
}
}//Fin del bucle de la tercera letra.
}
}// Fin del bucle de la segunda letra.
}
}// Fin del bucle de la primera letra.
return(dic); // Devolvemos el amago de boss, par aque el boss se quede con
// la direcci¢n del  rbol.
}// Fin de la funci¢n inicializar el  rbol.
// **************************************************************************
// **** ****
// **** Listado del µrbol ****
// **** ****
// **************************************************************************
void listar(struct letra1 *dic, int max){ // Lista las n palabras especificadas
int con=0, y=245;
setcolor(0);settextstyle(2,0,4);
for(struct letra1 *n1=dic;n1!=NULL;n1=n1->sig){
for (struct letra2 *n2=n1->nivel2;n2!=NULL;n2=n2->sig){
for (struct letra3 *n3=n2->nivel3;n3!=NULL;n3=n3->sig){
if (n3->lista!=NULL)
for (struct def *n4=n3->lista;n4!=NULL && max>con;n4=n4->sig,con++,
y+=12){
outtextxy(200,y,n4->palabra);
}
}
}
}
}// fin de la funci¢n listar.
void listar_sen(struct letra1 *dic, int max, char *letra,
char lista[10][20]){ // Lista las que sean = que las 3 1¦ letras
int con=0, y=245;
struct letra1 *n1=NULL;
struct letra2 *n2=NULL;
struct letra3 *n3=NULL;
setcolor(0);settextstyle(2,0,4);
for(n1=dic;n1!=NULL && n1->l1!=letra[0];n1=n1->sig){}// buscamos la 1¦
n2=n1->nivel2;// pasamos a la segunda
if (letra[1]!=NULL)// a ver si existe
for(;n2!=NULL && n2->l2!=letra[1];n2=n2->sig){}// la buscamos la 2¦
n3=n2->nivel3;// pasamos a la tercera
if (letra[2]!=NULL)// a ver si existe
for(;n3!=NULL && n3->l3!=letra[2];n3=n3->sig){}// buscamos la 3¦
while (max>con && n1!=NULL){// para imprimir las que entran en el cuadro.
for(;n1!=NULL;n1=n1->sig){
if (y!=245 || letra[1]==NULL)// por si se acaban los de una letra y hay que seguir.
n2=n1->nivel2;
for (;n2!=NULL;n2=n2->sig){
if (y!=245 || letra[2]==NULL)// idem
n3=n2->nivel3;
for (;n3!=NULL;n3=n3->sig){
if (n3->lista!=NULL)
for (struct def *n4=n3->lista;n4!=NULL && max>con;n4=n4->sig,con++,
y+=12){
if(y==245){// si es la primera palabra le pintamos el fondo en azul.
setcolor(1);
rectangle(195,y,400,y+11);
setfillstyle(1,1);floodfill(201,y+1,1);
setcolor(30);outtextxy(200,y,n4->palabra);
setcolor(0);
}
else// si no no tiene derecho.
outtextxy(200,y,n4->palabra);
strcpy(lista[con],n4->palabra);// la copiamos a la lista.
}
}// fines de todo lo que se a abierto alguna vez
}
}
}
}// fin de la funci¢n listar_sen.
void imprime_def(char *def){ // imprime la definici¢n con su algor¡tmo.
char aux[2];aux[1]=NULL;// la letra que se pinta
int xaux=200, yaux=245;// las posiciones
settextstyle(2,0,4);setcolor(0);
for (int pos=0;pos<=37 && def[pos]!=NULL;// primera l¡nea
pos++,xaux+=6){
aux[0]=def[pos];
outtextxy(xaux,yaux,aux);
}
if (def[pos]!=NULL){// si no se ha acabado
yaux=yaux+12;xaux=200;// siguiente l¡nea
for (;pos<=75 && def[pos]!=NULL;pos++,xaux+=6){// 2¦ l¡nea
aux[0]=def[pos];
outtextxy(xaux,yaux,aux);
}
}
if (def[pos]!=NULL){// idem
yaux=yaux+12;xaux=200;// idem
for (;pos<=100 && def[pos]!=NULL;pos++,xaux+=6){// 3¦ l¡nea
aux[0]=def[pos];
outtextxy(xaux,yaux,aux);
}
}
}// fin de la funci¢n imprimir definici¢n.
void limpiar_nodo(struct def **puntero){// limpia el nodo reservado por si
for(int n=0;n<20;n++)
(*puntero)->palabra[n]=NULL;
for (n=0;n<100;n++)
(*puntero)->definicion[n]=NULL;
}// fin de la funci¢n limpiar nodo.
void limpiar(struct temporal *p){// limpia la estructura multiusos.
for(int n=0;n<20;n++)
p->palabra[n]=NULL;
for (n=0;n<100;n++)
p->definicion[n]=NULL;
}// fin de la funci¢n limpiar la estructura temporal.
void cargar_diccio(struct letra1 *dic){// cargamos el diccionario.
FILE *f=NULL, *aux=NULL;// los ficheros que necesitamos.
int con=0, x=0, veces=0, numero=0, cuantos=0, conaux=0;// para el algor¡tmo de los cuadraditos del comienzo.
if ((f=fopen("k:\\files\\diccio.bsd","r+b"))!=NULL){// abriendo
aux=fopen("k:\\files\\diccio.cfg","r+b");//idem
struct def *p=NULL,*help4=NULL;// lo necesitamos
struct letra1 *help1=NULL;
struct letra2 *help2=NULL;
struct letra3 *help3=NULL;
fread(&con,2,1,aux);// leemos cuantas palabras hay en el diccio
fclose(aux);// se acab¢ con este fichero.
fseek(f,25,0);// nos saltamos el encabezado
limpiar(&fichero);// limpieza
fread(&fichero,sizeof(struct temporal),1,f);// leemos el primer registro.
if(con==1 || con==0){// si solo hay una o cero palabras
cuantos=14;
for(veces=cuantos,x=136;x+8<464 && veces>0;x+=11,veces--)
icon11(x,267);// pintamos los cuadraditos
delay(500);// espera un poquito.
}
else{// tiene m s
numero=28/con;// a ver cuantos cuadrados hay que pintar
if (numero==0){// es m s que el m ximo de los cuadrados
numero=con/28;// cuanto m s
conaux=numero;// cuantos registros tienen que pasar para pintar uno
cuantos=1;// los pintamos de uno en uno
}
else{// no es mas del m ximo
conaux=1;cuantos=numero;// tiene que pasar un registro y se pintan x
}
x=136;// la posici¢n donde empieza a pintar
}
while(!feof(f)){// mientras que no se acabe el fichero
if ((p=(struct def *) malloc(sizeof(struct def)))==NULL){
closegraph();// recogemos el chiringuito que viene la poli.
printf("No hay memoria suficiente.");getch();// Mal rollo.
exit(1);// nos vamos por patas
}
else{
limpiar_nodo(&p);// limpiamos el nuevo nodo.
strcpy(p->palabra,fichero.palabra);// copiando del temporal al nuevo
strcpy(p->definicion,fichero.definicion);// idem
p->sig=NULL;// no tienes siguiente
help1=dic;// no toquemos el diccionario
for(;help1->l1!=p->palabra[0];help1=help1->sig){}// buscamos la 1¦
help2=help1->nivel2;
for(;help2->l2!=p->palabra[1];help2=help2->sig){}// la 2¦
help3=help2->nivel3;
for(;help3->l3!=p->palabra[2];help3=help3->sig){}// la 3¦
if (help3->lista==NULL){// no hay palabras
help3->lista=p;help4=p;p->sig=NULL;// eres la primera palabra
}
else{// hay m s palabras
help4=help3->lista;
if (strcmp(p->palabra,help4->palabra)>0){// comparando...
for(;help4->sig!=NULL && strcmp(p->palabra,(help4->sig)->palabra)>0;
help4=help4->sig){}// encontrando su posici¢n...
p->sig=help4->sig;// enlazando...
help4->sig=p;help4=help4->sig;
}
else{// sitio encontrado
p->sig=help4;help3->lista=p;help4=help3->lista;// enlazando...
}
}
}
limpiar(&fichero);// limpiando la temporal
fread(&fichero,sizeof(struct temporal),1,f);// nuevo registro.
conaux--;// ya hemos le¡do uno
if (conaux==0){// nos toca pintar
for(veces=cuantos;x+8<464 && veces>0;x+=11,veces--)
icon11(x,267);// pintando...
delay(250);// esperamos
if (28/con==0)// reconstrucci¢n del contador
conaux=numero;
else
conaux=1;
}
}// fin del while final de fichero.
if (x+8<464){// si nos falta por pintar y ya hemos terminado.
for(;x+8<464;x+=11)
icon11(x,267);// lo pintamos
}
}
fclose(f);// cerramos el fichero
delay(500);// mira que binito a quedado el comienzo.
}// fin de la funci¢n cargar diccionario.
void nueva_palabra(struct letra1 *dic){// introducir nueva letra
struct letra1 *aux=NULL;//Puntero auxiliar del tipo 1, dic es el semiboss.
struct letra2 *aux2=NULL;//Puntero auxiliar del tipo 2. Y ya van 3 :-(.
struct letra3 *aux3=NULL;//Puntero auxiliar del tipo 3. Son 4 :-|.
struct def *p4=NULL, *aux4=NULL;//Punteros auxiliares del tipo 4.
if ((p4=(struct def *) malloc(sizeof(struct def)))==NULL){
closegraph();// recogiendo...
printf("No hay memoria suficiente. El programa debe terminar.");getch();
exit(1);// Mal rollo.
}
else{
limpiar_nodo(&p4);// limpiando...
limpiar(&fichero);
base(); // limpiamos pantalla
settextstyle(2,0,5);
ventana(75,125,550,390,"Nueva palabra",0,0);
setcolor(0);
outtextxy(100,190,"Palabra:");
boton(190,190,420,210,1,"",0,30);
setcolor(0);
outtextxy(100,240,"Definici¢n:");
boton(190,240,450,370,1,"",0,28);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Introduce la palabra (longitud m xima 20 letras).");
icon2(85,193);
intro_letras(200,195,fichero.palabra,19,0,2,4,30);// introduce la palabra
strlwr(fichero.palabra);
boton(190,190,420,210,1,"",0,28);
setcolor(0);
outtextxy(200,195,fichero.palabra);
if (buscar(dic,&fichero)==NULL){// si no est 
boton(190,240,450,370,1,"",0,30);
icon8(85,193);
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Introduce la definici¢n de la palabra (longitud m xima 100 caracteres).");
icon2(85,243);
introdef(200,245,fichero.definicion,100,0,2,4,30);// introduce la def
icon8(85,243);
strlwr(fichero.palabra);// la copiamos en min£sculas
strcpy(p4->palabra,fichero.palabra);//copiando...
strcpy(p4->definicion,fichero.definicion);
p4->sig=NULL;
aux=dic;
for(;aux->l1!=p4->palabra[0];aux=aux->sig){}// la colocamos
aux2=aux->nivel2;
for(;aux2->l2!=p4->palabra[1];aux2=aux2->sig){}
aux3=aux2->nivel3;
for(;aux3->l3!=p4->palabra[2];aux3=aux3->sig){}
if (aux3->lista==NULL){
aux3->lista=p4;aux4=p4;p4->sig=NULL;
}
else{
aux4=aux3->lista;
if (strcmp(p4->palabra,aux4->palabra)>0){
for(;aux4->sig!=NULL && strcmp(p4->palabra,(aux4->sig)->palabra)>0;
aux4=aux4->sig){}
p4->sig=aux4->sig;
aux4->sig=p4;aux4=aux4->sig;
}
else{
p4->sig=aux4;aux3->lista=p4;aux4=aux3->lista;
}
}
}
else{// ya existe al palabra
sound(1000);delay(50);nosound();
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
icon10(5,455);
settextstyle(2,0,4);setcolor(4);
outtextxy(30,460,"La palabra introducida ya existe. Pulse ENTER para volver al men£.");
free(p4);getch();
}
}
}// fin de la funci¢n de la nueva palabra.
void modif_palabra(struct letra1 *dic){// midificamos la definici¢n.
struct letra1 *aux=NULL;//Puntero auxiliar del tipo 1, dic es el semiboss.
struct letra2 *aux2=NULL;//Puntero auxiliar del tipo 2. Y ya van 3 :-(.
struct letra3 *aux3=NULL;//Puntero auxiliar del tipo 3. Son 4 :-|.
struct def *p4=NULL, *aux4=NULL;//Punteros auxiliares del tipo 4.
buscar_palabra(dic,1);// la buscamos la palabra.
if ((p4=buscar(dic,&fichero))!=NULL){// si est  la palabra
int resp=0;// la respuesta
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Pulse ENTER para modificar la definici¢n o ESC para volver al men£.");
while(resp!=27 && resp!=13)// mientra no se ESC o ENTER
resp=getch();
if (resp==13){// es enter
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Introduce la nueva definici¢n de la palabra (longitud m xima 100 caracteres).");
char tmp[20]={NULL};
boton(190,190,420,210,1,"",0,28);
boton(190,240,450,370,1,"",0,30);
setcolor(0);
outtextxy(200,195,fichero.palabra);
strcpy(tmp,fichero.palabra);// le sacamos de paseo a la palabra
limpiar(&fichero);
strcpy(fichero.palabra,tmp);// vuelve a casa
icon2(85,243);
introdef(200,245,fichero.definicion,100,0,2,4,30);// introduce la def
strlwr(fichero.palabra);// idem todo el bloque
strcpy(p4->palabra,fichero.palabra);
p4->sig=NULL;
aux=dic;
for(;aux->l1!=p4->palabra[0];aux=aux->sig){}
aux2=aux->nivel2;
for(;aux2->l2!=p4->palabra[1];aux2=aux2->sig){}
aux3=aux2->nivel3;
for(;aux3->l3!=p4->palabra[2];aux3=aux3->sig){}
if (aux3->lista==NULL){
aux3->lista=p4;aux4=p4;p4->sig=NULL;
}
else{
aux4=aux3->lista;
if (strcmp(p4->palabra,aux4->palabra)!=0){
for(;aux4!=NULL && strcmp(p4->palabra,aux4->palabra)!=0;
aux4=aux4->sig){}
strcpy(aux4->definicion,fichero.definicion);// solo copiamos la nueva def
}
else{
strcpy(aux4->definicion,fichero.definicion);// solo copiamos la nueva def
}//fin else palabra =
}// fin else lista =null
}// fin if resp=13
}// fin if busca=1
}// fin de la funci¢n modificar definici¢n
struct def* buscar(struct letra1 *dic, struct temporal *cad){// busca una palabra
struct letra1 *aux=NULL;//Puntero auxiliar del tipo 1, dic es el semiboss.
struct letra2 *aux2=NULL;//Puntero auxiliar del tipo 2. Y ya van 3 :-(.
struct letra3 *aux3=NULL;//Puntero auxiliar del tipo 3. Son 4 :-|.
struct def *aux4=NULL;//Punteros auxiliares del tipo 4.
int sw=0;
aux=dic;
for(;aux->l1!=cad->palabra[0];aux=aux->sig){}// la busca
aux2=aux->nivel2;
for(;aux2->l2!=cad->palabra[1];aux2=aux2->sig){}
aux3=aux2->nivel3;
for(;aux3->l3!=cad->palabra[2];aux3=aux3->sig){}
if (aux3->lista==NULL){// no est 
sw=0;
}
else{// puede que est
aux4=aux3->lista;
if (strcmp(cad->palabra,aux4->palabra)!=0){
for(;aux4->sig!=NULL && strcmp(cad->palabra,aux4->palabra)!=0;
aux4=aux4->sig){}
if (strcmp(cad->palabra,aux4->palabra)==0){// est 
strcpy(cad->definicion,aux4->definicion);
sw=1;
}
else// falsa alarma
sw=0;
}
else{// est 
strcpy(cad->definicion,aux4->definicion);
sw=1;
}
}
if(sw)
return(aux4);// donde est 
else
return(NULL);// no est 
}// fin de la funci¢n buscar.
void buscar_palabra(struct letra1 *dic,int op){// funci¢n pader de buscar.
limpiar(&fichero);
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
if (op==0){// la opci¢n de buscar.
outtextxy(30,460,"Introduce la palabra a buscar (longitud m xima 20 letras).");
settextstyle(2,0,5);
ventana(75,125,550,390,"Buscar una palabra",0,0);
}
if (op==1){// la opci¢n de modificar
outtextxy(30,460,"Introduce la palabra a modificar (longitud m xima 20 letras).");
settextstyle(2,0,5);
ventana(75,125,550,390,"Modificar una palabra",0,0);
}
setcolor(0);
outtextxy(100,190,"Palabra:");
boton(190,190,420,210,1,"",0,30);
setcolor(0);
outtextxy(100,240,"Definici¢n:");
boton(190,240,450,370,1,"",0,28);
icon2(85,193);
intro_letras(200,195,fichero.palabra,19,0,2,4,30);
strlwr(fichero.palabra);
icon8(85,193);
if(buscar(dic,&fichero)!=NULL){// existe la palabra
imprime_def(fichero.definicion);
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
if (op==0)// opci¢n buscar
outtextxy(30,460,"Para volver al menu de b£squeda pulse una tecla.");
}
else{// no est  la palabra
setcolor(0);settextstyle(2,0,4);
outtextxy(200,245,"La palabra introducida no est  en la base");
outtextxy(200,257,"de datos del diccionario.");
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Para introducir la palabra, seleccione nueva palabra en el men£ general.");
}
}// fin de la funci¢n buscar palabra.
void busca_sen(struct letra1 *dic){// busca las tres primeras letras
char cad[2];cad[0]=NULL;cad[1]=NULL;// la letra en s¡
char lista[10][20]={NULL};// la lista de las palabras que hay en la ventana.
limpiar(&fichero);
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Introduce la palabra a buscar (longitud m xima 20 letras).");
settextstyle(2,0,5);
ventana(75,125,550,390,"Buscar una palabra (sensible al teclado)",0,0);
setcolor(0);
outtextxy(100,190,"Palabra:");
boton(190,190,420,210,1,"",0,30);
setcolor(0);
outtextxy(100,240,"Lista:");
boton(190,240,450,370,1,"",0,28);
icon2(85,193);
listar(dic,10);// lista las 10 primeras del diccionario.
intro_sen(200,195,cad,0,2,4);// introduce la letra sensiblemente
if (cad[0]!=27){// si no quiere irse
fichero.palabra[0]=cad[0];// la copiamos
fichero.palabra[1]=NULL;
strlwr(fichero.palabra);
boton(190,240,450,370,1,"",0,28);
listar_sen(dic,10,fichero.palabra,lista);// la listamos
intro_sen(206,195,cad,0,2,4);// introducimos la segunda
if (cad[0]!=27){// si no se va
fichero.palabra[1]=cad[0];// idem
fichero.palabra[2]=NULL;
strlwr(fichero.palabra);
boton(190,240,450,370,1,"",0,28);
listar_sen(dic,10,fichero.palabra,lista);
intro_sen(212,195,cad,0,2,4);
if (cad[0]!=27){// idem
fichero.palabra[2]=cad[0];
fichero.palabra[3]=NULL;
strlwr(fichero.palabra);
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Elige con los cursores la palabra para ver la definici¢n.");
settextstyle(2,0,5);
ventana(75,125,550,390,"Buscar una palabra (sensible al teclado)",0,0);
setcolor(0);
outtextxy(100,190,"Palabra:");
boton(190,190,420,210,1,"",0,28);
setcolor(0);
settextstyle(2,0,5);
outtextxy(100,240,"Lista:");
boton(190,240,450,370,1,"",0,30);
settextstyle(2,0,4);
listar_sen(dic,10,fichero.palabra,lista);// lis definitiva
icon2(85,243);
setcolor(0);settextstyle(2,0,4);
outtextxy(200,195,lista[0]);
int sw3=1, flecha=0, cual=0;// refuerzos
while (sw3){// mientras no eliga o se quiera ir
flecha=getch();// lo de siempre
if (flecha==0){
flecha=getch();
switch(flecha){// se va combiando el fondo azul de las palabras.
case 72: // flecha arriba.
if (cual>0){
boton(190,240,450,370,1,"",0,30);
cual--;
for (int n=0,y=245;n<10;n++, y+=12){
if (n==cual){
setcolor(1);
rectangle(195,y,400,y+11);
setfillstyle(1,1);
floodfill(201,y+1,1);
setcolor(30);
outtextxy(200,y,lista[n]);
boton(190,190,420,210,1,"",0,28);
setcolor(0);
outtextxy(200,195,lista[n]);
}// fin if n=cual
else{
setcolor(0);
outtextxy(200,y,lista[n]);
}// fin else n=cual
}// fin for
}//fin if cual>0
break;
case 80: // flecha abajo.
if (cual<9){
boton(190,240,450,370,1,"",0,30);
cual++;
for (int n=0,y=245;n<10;n++, y+=12){
if (n==cual){
setcolor(1);
rectangle(195,y,400,y+11);
setfillstyle(1,1);
floodfill(201,y+1,1);
setcolor(30);
outtextxy(200,y,lista[n]);
boton(190,190,420,210,1,"",0,28);
setcolor(0);
outtextxy(200,195,lista[n]);
} // fin if n==cual
else{
setcolor(0);
outtextxy(200,y,lista[n]);
}// fin else n=cual
}// fin del for
}// fin if cual<10
break;
}// fin switch flecha
}// fin if flecha 0
else{
if (flecha==13){// a elegido una
strcpy(fichero.palabra,lista[cual]);
buscar(dic,&fichero);// la buscamos
boton(190,240,450,370,1,"",0,28);
icon8(85,243);
settextstyle(2,0,5);setcolor(7);
outtextxy(100,240,"Lista:");
setcolor(0);
outtextxy(100,240,"Definici¢n:");
imprime_def(fichero.definicion);// le imprimimos la def
sw3=0;// se acab¢
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
settextstyle(2,0,4);setcolor(0);
outtextxy(30,460,"Pulse cualquier tecla para volver al men£ de b£squeda.");
getch();// mira bien la def
} // fin if flecha 13
else
if (flecha==27)// se quiere ir
sw3=0;// pues vete
}// fin else flecha 0
}// fin while sw3
}// fin de los if de control del ESC.
}// idem
}// idem
}// fin de la funci¢n buscar sen.
void guardar_arbol(struct letra1 *dic){// guarda el  rbol.
struct letra1 *aux=NULL;//Puntero auxiliar del tipo 1, dic es el semiboss.
struct letra2 *aux2=NULL;//Puntero auxiliar del tipo 2. Y ya van 3 :-(.
struct letra3 *aux3=NULL;//Puntero auxiliar del tipo 3. Son 4 :-|.
struct def *aux4=NULL;//Punteros auxiliares del tipo 4.
FILE *fich=NULL, *f=NULL;// los ficheros
int con=0;// haber cuantas palabras hay.
if ((fich=fopen("k:\\files\\diccio.bsd","w+b"))==NULL){
printf ("No se puede guardar el diccionario.");getch();
}
else{
fwrite("Fichero del diccionario",23,1,fich);// encabezado
fwrite("\n",2,1,fich);
for(aux=dic;aux!=NULL;aux=aux->sig)// grabaci¢n
for (aux2=aux->nivel2;aux2!=NULL;aux2=aux2->sig)
for (aux3=aux2->nivel3;aux3!=NULL;aux3=aux3->sig){
if (aux3->lista!=NULL)
for (aux4=aux3->lista;aux4!=NULL;aux4=aux4->sig){
limpiar(&fichero);
strcpy(fichero.palabra,aux4->palabra);
strcpy(fichero.definicion,aux4->definicion);
fwrite(&fichero,sizeof(struct temporal),1,fich);// grabando...
con++;// uno m s
}
}
}
fclose(fich);// cerrando
f=fopen("k:\\files\\diccio.cfg","w+b");// abrimos el otro
fwrite(&con,sizeof(int),1,f);// metemos cuantos hay
fclose(f);// se cierra
}// fin de la funci¢n guardar el diccionario.
int huge detectEGA(void){// la resoluci¢n de la pantalla
return(2);// 640x480
}// fin de la funci¢n de la resoluci¢n.
void checkerrors(void){// comprueba los errores
int errorcode;
/* read result of last graphics operation */ // no sepo ingls
errorcode = graphresult();
if (errorcode != grOk){
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}// fin de la funci¢n de los errores de la inicializaci¢n.
void menu(){// pinta el men£ general
settextstyle(2,0,6);
boton(180,150,430,175,0," Buscar una palabra",16,0);
boton(180,195,430,220,0," A¤adir una palabra",16,0);
boton(180,240,430,265,0," Modificar una palabra",16,0);
boton(180,285,430,310,0," Acerca de...",16,0);
boton(180,330,430,355,0," Salir",16,0);
}// fin de la funci¢n que pinta el men£ general.
void menu_buscar(){// pinta el men£ de buscar
settextstyle(2,0,6);
boton(180,150,430,175,0," Buscar palabra",16,0);
boton(180,195,430,220,0,"Buscar palabra con lista",16,0);
boton(180,240,430,265,0," Acerca de...",16,0);
boton(180,285,430,310,0," Volver",16,0);
}// fin de la funci¢n que pinta el men£ de buscar.
void acerca_de(){// pinta la ventana de informaci¢n de los creadores.
base();
settextstyle(2,0,5);
ventana(125,100,525,400,"Acerca de... ;-)",0,0);
setcolor(0);settextstyle(2,0,4);
outtextxy(30,460,"Creadores del Diccionario Interactivo DICSEN.");
settextstyle(7,1,6);
setcolor(26);
outtextxy(430,133,"PROSOFT");
settextstyle(2,0,5);
setcolor(0);
outtextxy(150,140,"Programadores:");
outtextxy(150,250,"Dise¤adores Gr ficos:");
setcolor(15);
line(140,158,500,158);
line(140,268,500,268);
setcolor(8);
line(140,157,500,157);
line(140,267,500,267);
icon2(150,173);
icon2(150,283);
icon2(150,213);
icon2(150,323);
setcolor(0);
outtextxy(170,170,"Moiss Virumbrales Cuenca");
outtextxy(170,320,"Moiss Virumbrales Cuenca");
outtextxy(170,210,"Juan L¢pez Fern ndez");
outtextxy(170,280,"Juan L¢pez Fern ndez");
settextstyle(2,0,4);
outtextxy(180,190,"E-mail:");
outtextxy(180,230,"E-mail:");
outtextxy(180,300,"E-mail:");
outtextxy(180,340,"E-mail:");
setcolor(1);outtextxy(230,190,"moisesvcuenca@hotmail.com");
outtextxy(230,340,"moisesvcuenca@hotmail.com");
outtextxy(230,230,"juanlf@hotmail.com");
outtextxy(230,300,"juanlf@hotmail.com");
setcolor(0);settextstyle(2,0,3);
outtextxy(150,370,"Este programa est  realizado para PROSOFT Software. Esta prohibida la reproducci¢n total o");
outtextxy(150,380,"parcial del programa sin la autorizaci¢n expresa de PROSOFT Software.");
settextstyle(2,0,4);
outtextxy(435,380,"Copyright 1999");
getch();// mirala bien
}// fin de la funci¢n de la ventana de los creadores.
void rectangulo(int pos){// funci¢n que pinta el rectangulo de los botones.
setlinestyle(1,0,2);
switch (pos){// Ahora pintamos un recuadro al bot¢n seleccionado.
case 1:
rectangle(185,154,425,171);
setlinestyle(0,0,2);rectangle(180,150,430,175);
break;
case 2:
rectangle(185,199,425,216);
setlinestyle(0,0,2);rectangle(180,195,430,220);
break;
case 3:
rectangle(185,244,425,261);
setlinestyle(0,0,2);rectangle(180,240,430,265);
break;
case 4:
rectangle(185,289,425,306);
setlinestyle(0,0,2);rectangle(180,285,430,310);
break;
case 5:
rectangle(185,334,425,351);
setlinestyle(0,0,2);rectangle(180,330,430,355);
break;
} // fin del switch-case(pos).
setlinestyle(0,0,0); // volvemos a poner el estilo de l¡nea normal.
}// fin de la funci¢n que pinta el recuadro.
void base(){// pinta el fondo y el t¡tulo y la barra inferior.
line (0,0,getmaxx(),getmaxy());
setfillstyle(1,125);
bar(0,0,getmaxx(),getmaxy());
boton(0,0,getmaxx(),50,0,"",16,124);
setcolor(0);
settextstyle(5,0,4);
outtextxy(60,0,"Diccionario Interactivo");
settextstyle(7,0,5);
outtextxy(400,0,"DICSEN");
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
}// fin de la funci¢n que pinta la base.
void intro_letras(int x, int y, char cad[], int a,
int c, int s, int t, int col) {// introduce la palabra.
int i;
for (i=0;i<=a-1;) {
if (i<a-1){
cad[i]=getche();
if (cad[i]==8){
if (i>0){
setcolor(col);settextstyle(s,0,t);outtextxy(x,y,cad);
cad[i-1]=NULL;i-=2;
}
else{
sound(1000);delay(50);nosound();i--;
}
}
if ((cad[i]!=13 && cad[i]!=8) && (cad[i]<65 || (cad[i]>90 && cad[i]<97)
|| cad[i]>122)){
cad[i]=NULL;
sound(1000);delay(50);nosound();i--;
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
icon10(5,455);
settextstyle(2,0,4);setcolor(4);
outtextxy(30,460,"Solo se pueden introducir letras, no se puede introducir cualquier otro car cter (ni letras acentuadas).");
}
setcolor(c);settextstyle(s,0,t);outtextxy(x,y,cad);
}
else {
if (i==a-1 && cad[i]!=13){
cad[i]=getche();
if (cad[i]!=13 && cad[i]!=8){
sound(1000);delay(50);nosound();
}
else{
if (cad[i]==8 && i>=0){
setcolor(col);settextstyle(s,0,t);outtextxy(x,y,cad);
cad[i-1]=NULL;i--;
setcolor(c);settextstyle(s,0,t);outtextxy(x,y,cad);
}
}
i--;
}
}
if (cad[i]==13 && i>0)
break;
else
if (cad[i]==13 && i==0)
i--;
if (cad[0]!=NULL)
i++;
if (i==-1)
i++;
}
cad[i]=NULL;
}// fin de la funci¢n de introducir la palabra.
void introdef(int x, int y, char cad[], int a,
int c, int s, int t, int col) {// introduce la def.
int i, posx=x,posy=y+10;// algor¡tmo del cursor demasiado complicado.
setcolor(0);line(x,y+10,x+4,y+10);// cursor de posici¢n. Fue idea feliz.
for (i=0;i<=a-1;) {
if (i<a-1){
cad[i]=getche();
if (cad[i]==8){
if (i>0){
setcolor(30);line(posx,posy,posx+4,posy);// cursor de posici¢n.
setcolor(col);settextstyle(s,0,t);
char aux[2];aux[1]=NULL;
int xaux=x, yaux=y;
for (int pos=0;pos<=37 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=75 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=100 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
setcolor(0);line(xaux,yaux+10,xaux+4,yaux+10);// cursor de posici¢n.
posx=xaux;posy=yaux+10;
cad[i-1]=NULL;i-=2;
}
else{
sound(1000);delay(50);nosound();i--;
}
}
setcolor(30);line(posx,posy,posx+4,posy);// cursor de posici¢n.
char aux[2];aux[1]=NULL;
int xaux=x, yaux=y;
setcolor(c);settextstyle(s,0,t);
for (int pos=0;pos<=37 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=75 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=100 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
setcolor(0);line(xaux,yaux+10,xaux+4,yaux+10);// cursor de posici¢n.
posx=xaux;posy=yaux+10;
}
else {
if (i==a-1 && cad[i]!=13){
cad[i]=getche();
if (cad[i]!=13 && cad[i]!=8){
sound(1000);delay(50);nosound();
}
else{
if (cad[i]==8 && i>=0){
char aux[2];aux[1]=NULL;
int xaux=x, yaux=y;
setcolor(col);settextstyle(s,0,t);
for (int pos=0;pos<=37 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=75 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=100 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
cad[i-1]=NULL;i--;
setcolor(30);line(posx,posy,posx+4,posy);// cursor de posici¢n.
setcolor(c);settextstyle(s,0,t);
for (pos=0;pos<=37 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=75 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
if (cad[pos]!=NULL){
yaux=yaux+12;xaux=x;
for (;pos<=100 && cad[pos]!=NULL;pos++,xaux+=6){
aux[0]=cad[pos];
outtextxy(xaux,yaux,aux);
}
}
setcolor(0);line(xaux,yaux+10,xaux+4,yaux+10);// cursor de posici¢n.
posx=xaux;posy=yaux+10;
}
}
i--;
}
}
if (cad[i]==13 && i>0)
break;
else
if (cad[i]==13 && i==0)
i--;
if (cad[0]!=NULL)
i++;
if (i==-1)
i++;
}
cad[i]=NULL;
}// fin de la funci¢n de introducir la definici¢n.
void intro_sen(int x, int y, char cad[], int c, int s, int t){// intro las 3 1¦
int i=0, sw=1;
while (sw){
cad[i]=getch();
if(cad[i]!=27 && (cad[i]<65 || (cad[i]>90 && cad[i]<97) || cad[i]>122)){
cad[i]=NULL;
sound(1000);delay(50);nosound();
boton(0,450,getmaxx(),getmaxy(),0,"",0,0);
icon10(5,455);
settextstyle(2,0,4);setcolor(4);
outtextxy(30,460,"Solo se pueden introducir letras, no se puede introducir cualquier otro car cter (ni letras acentuadas).");
}
else {
setcolor(c);settextstyle(s,0,t);outtextxy(x,y,cad);sw=0;
}
}
cad[i+1]=NULL;
}// fin de la funci¢n de introducci¢n de las tres 1¦
/*void borrar_arbol(struct letra1 *dic){ // Pinta el  rbol.
for(struct letra1 *n1=dic;n1!=NULL;n1=n1->sig){
for (struct letra2 *n2=n1->nivel2;n2!=NULL;n2=n2->sig){
for (struct letra3 *n3=n2->nivel3;n3!=NULL;n3=n3->sig){
if (n3->lista!=NULL)
for (struct def *n4=n3->lista;n4!=NULL;n4=n4->sig){
}
}
}
}
}*/