// // Diccionario sensible a las tres primeras letras de la palabra. // // Programado por: // Mois‚s 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 #include #include #include #include #include #include #include #include // ************************************************************************** // **** **** // **** 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 m‚todos."); 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 hab‚is 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 ingl‚s 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,"Mois‚s Virumbrales Cuenca"); outtextxy(170,320,"Mois‚s 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 (i0){ 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 (i0){ 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){ } } } } }*/