SE HACEN PROYECTOS FINALES,PRACTICAS, COPILADORES, ETC....

ARKAHE
24 de Agosto del 2005
proyectos finales, practicas, juegos copiladores. , etc.. 1 semana de anticipacion 3 dias para practicas.... mas informacion escribir al correo [email protected]

Jose Carlos
24 de Agosto del 2005
MIRA ESTE ES EL CODIGO QUE TENGO ME FUNCIONA BIEN PERO NECESITO IMPLEMENTAR CLASES, SEGUN EL PROFESOR EN EL AREA DE CREAR LA LISTA Y EN EL MANEJO DE ELLA. TAMBIEN EN EL AREA DEL ARCHIVO NECESITO IMPLEMENTAR UNA CLASE
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>

/* estructura que se utiliza para almacenar los registros */
struct dato {
char nombre[50];
char apellido[50];
char edad[3];
char telf[20];
char direccion[80];
struct dato *sig;
struct dato *ant;
};

/* Variables Globales */
struct dato *p; /* puntero auxiliar */
struct dato *final; /* puntero al final de la lista */
struct dato *inicio; /* puntero al inicio de la lista */
int guardado = 0; /* revisa si se ha modificado cambios en la lista */
int nleidos = 0; /* representa la cantidad de elementos presentes en la lista */
int elimina_sm = 0; /* elimina el archivo creado si no se han hecho modificaciones */
int modo = 1; /* modo del marco */
int color = 2; /* color del marco */

/* -----------------------PROTOTIPO DE LAS FUNCIONES----------------------*/

struct dato *localiza(char nombre[]); /* localiza el nombre a buscar si existe */
void modifica(struct dato *aux); /* modifica el registro buscado */
void buscar(void); /* pide el nombre a buscar e imprime el registro si existe */
void inserta_reg(struct dato *p); /* inserta registros ordenadamente en la lista */
void guardar(char *fname); /* guarda la lista dinámica en el archivo */
void cargar(int clave); /* menu en donde se introduce el nombre de archivo */
void agregar(void); /* pide los datos del registro nuevo */
void listar(void); /* busca o lista los registros que se han creado o leidos */
void menu_prin(void); /* menu principal para la crear o cargar archivo */
void carga(char *fname); /* lee el archivo y crea la lista enlazada si existen registros guardados */
void menu(char *fname); /* menu para crear,modificar,listar y eliminar registros */
void revisa(char *fname); /* revisa si los registros de un archivo se han modificado */
void marco (int x1,int x2,int y1,int y2,int color,int modo); /* marco o ventana decorativa */
char *minus(char nombre[]); /* convierte las mayusculas en minusculas */

/* -----------------------CUERPO DE LAS FUNCIONES------------------------*/



/* ------------------CREA EL MARCO DE LAS VENTANAS----------------------- */

void marco (int x1,int x2,int y1,int y2,int color,int modo)
{
register int i;
char pared_hor; /* pared horizontal del marco */
char pared_ver; /* pared vertical del marco */
char esquina_x1; /* caracter para esquina superior izquierda */
char esquina_x2; /* caracter para esquina superior derecha */
char esquina_y1; /* caracter para esquina inferior izquierda */
char esquina_y2; /* caracter para esquina inferior derecha */

/* 457 ╔ , 461 ═ , 442 ║ , 443 ╗, 444 ╝ , 456 ╚ */

switch (modo)
{
case 1: {
esquina_x1 = '╔';
esquina_x2 = '╗';
esquina_y1 = '╚';
esquina_y2 = '╝';
pared_hor = '═';
pared_ver = '║';
} break;
case 2: {
esquina_x1 = '*';
esquina_x2 = '*';
esquina_y1 = '*';
esquina_y2 = '*';
pared_hor = '-';
pared_ver = '|';
} break;
case 3: {
esquina_x1 = 'Ň';
esquina_x2 = 'Ş';
esquina_y1 = 'ď';
esquina_y2 = 'ż';
pared_hor = '═';
pared_ver = '│';
} break;
case 4: {
esquina_x1 = '┌';
esquina_x2 = '┐';
esquina_y1 = '└';
esquina_y2 = '┘';
pared_hor = '─';
pared_ver = '│';
} break;
} /* fin de switch */
textcolor(color);
gotoxy(x1,y1);
cprintf("%c",esquina_x1);
gotoxy(x2,y1);
cprintf("%c",esquina_x2);
gotoxy(x1,y2);
cprintf("%c",esquina_y1);
gotoxy(x2,y2);
cprintf("%c",esquina_y2);
gotoxy(1,1);
for (i = (x1 + 1); i < x2; i++)
{
gotoxy(i,y1);
cprintf("%c",pared_hor);
gotoxy(i,y2);
cprintf("%c",pared_hor);
}
gotoxy(1,1);
for (i = (y1 + 1); i < y2; i++)
{
gotoxy(x1,i);
cprintf("%c",pared_ver);
gotoxy(x2,i);
cprintf("%c",pared_ver);
}
}

/* ---------------CONVIERTE LAS MAYUSCULAS A MINUSCULAS-------------------*/

char *minus(char nombre[])
{
register int i;
register char *temp;

for (i = 0; i <= strlen(nombre) + 1; i++)
temp[i] = tolower(nombre[i]);
return(temp);
}

/* -------------------LIBERA LA MEMORIA UTILIZADA------------------------ */

void libera(void)
{
struct dato *aux;

if (inicio != NULL) /* si realmente existe lista que ocupa espacio */
{
final->sig = NULL;
p = inicio;
do /* mientras que exista memoria ocupada */
{
aux = p->sig;
free(p); /* se libera la memoria ocupada */
p = aux; /* pasa a la siguiente estructura */
} while (p); /* fin de while */
} /* fin de if */
} /* fin de la funcion libera() */

/* ------------INSERTA REGISTROS ORDENADAMENTE EN LA LISTA--------------- */

void inserta_reg(struct dato *p /* nuevo registro a insertar */)
{
struct dato *aux; /* puntero auxiliar */

aux = inicio;
if (inicio == NULL) /* insertar el primer registro de una lista */
{
inicio = p;
inicio->ant = inicio;
final = p;
final->sig = inicio;
} else
for (;;)
{
if (strcmp(p->nombre, aux->nombre) < 0)
{
if (aux == inicio) /* insertar registro al principio de la lista */
{
p->sig = aux;
p->ant = final;
aux->ant = p;
inicio = p;
final->sig = p;
return;
}
else
{
p->ant = aux->ant; /* insertar registros en el medio de la lista */
p->sig = aux;
aux->ant->sig = p;
aux->ant = p;
return;
}
} else
if (aux->sig == inicio) /* insertar registros al final de la lista */
{
aux->sig = p;
p->sig = inicio;
inicio->ant = p;
p->ant = aux;
final = p;
return;
}
aux = aux->sig;
} /* fin de for(;;) */
} /* fin de la función */

/* ------REVISA SI SE HAN HECHO CAMBIOS EN LOS REGISTROS DE LA LISTA----- */

void revisa(char *fname)
{
char op;

for (;;) {
if (guardado == 1)
{
clrscr();
marco(2,66,4,6,4,1);
gotoxy(4,5);
printf("LA LISTA SE HA MODIFICADO, DESEA GUARDAR LOS CAMBIOS ? s/n: ");
op = tolower(getch());
if (op == 's')
guardar(fname); else
if (op == 'n')
{
if (elimina_sm == 1)
remove(fname);
return;
}
}
else
{
if (elimina_sm == 1)
remove(fname);
return;
}
} /* fin de bucle infinito (for(;;)) */
} /* fin de revisar(char *fname) */

/* -----LEE LOS REGISTROS DEL ARCHIVO Y CREA UNA LISTA DOBLE ENLAZADA---- */

void carga(char *fname)
{
FILE *f;
int tam;
struct dato *aux;

p = final = inicio = NULL;
f = fopen(fname,"rb");
rewind(f);
nleidos = 0;
for (;;)
{
aux = (struct dato *) malloc (sizeof(struct dato));
if (fread(aux,sizeof(struct dato),1,f) != 1)
break;
nleidos++;
inserta_reg(aux);
} /* termina for */
fclose(f);
if (nleidos == 0)
p = final = inicio = NULL;
}

/* --------------------PIDE LOS DATOS DEL REGISTRO NUEVO----------------- */

void agregar(void)
{
int y,x;

y = 7;
x = y + 2;

guardado = 1;
nleidos++;
p = new struct dato[(sizeof(struct dato))];
fflush(stdin); /* vacía el buffer del archivo stdin */
clrscr();
marco(1,79,1,17,color,modo);
marco(y,70,2,4,color,modo);
marco(y,70,5,7,color,modo);
marco(y,70,8,10,color,modo);
marco(y,70,11,13,color,modo);
marco(y,70,14,16,color,modo);
textcolor(3);
gotoxy(30,1);
cprintf("INSERTAR REGISTROS");
gotoxy(x,3);
cprintf("Primer nombre: "); gotoxy(x,6);
cprintf("Apellidos: "); gotoxy(x,9);
cprintf("Edad: "); gotoxy(x,12);
cprintf("Telefóno: "); gotoxy(x,15);
cprintf("Dirección: ");
gotoxy(x + 15,3);
gets(p->nombre); gotoxy(x + 11,6);
gets(p->apellido); gotoxy(x + 6,9);
gets(p->edad); gotoxy(x + 10,12);
gets(p->telf); gotoxy(x+ 11,15);
gets(p->direccion);
inserta_reg(p);
} /* fin de la funcion */

/* -----------------ELIMINA UN REGISTRO DE LA LISTA---------------------- */

void elimina(struct dato *aux)
{
struct dato *q;

q = aux->ant;
q->sig = aux->sig;
aux->sig->ant = q;
free(aux);
}

/*LOCALIZA EL NOMBRE A BUSCAR SI SE ENCUENTRA EN LA LISTA, SINO DEVUELVE NULL*/

struct dato *localiza(char pnombre[])
{
struct dato *aux;
char temp2[50];
char temp1[50];

aux = inicio;
strcpy(temp1,minus(pnombre));
do
{
strcpy(temp2,minus(aux->nombre));
int y;
y=strlen(temp2);
if (!stricmp(temp1,temp2),y)
return (aux);
else
aux = aux->sig;
} while (aux != inicio);
return (aux = NULL);
}

/* ------------------BUSQUEDA DE REGISTROS DIRECTAMENTE-------------------*/

void buscar(void)
{
char op;
char nombre[50];
struct dato *aux;
int i;
int color1 = 3;
int color2 = 5;

if (nleidos == 0) /* comprueba que realemnte existe registros */
{
clrscr();
marco(21,60,4,6,color,1);
gotoxy(23,5);
printf("NO SE ENCUENTRAN REGISTROS GUARDADOS");
gotoxy(80,25);
getch();
return;
}

for(;;)
{
clrscr();
marco(1,79,1,25,color,modo);
gotoxy(30,1);
textcolor(3);
cprintf("BUSQUEDA DE REGISTROS");
textcolor(5);
marco(10,70,5,7,color,modo);
gotoxy(12,6);
textcolor(3);
cprintf("Introduzca el nombre de la persona: ");
textcolor(8);
gets(nombre);
textcolor(3);
if (!nombre[0])
return;
/* bloque de busqueda */
aux = localiza(nombre); /* busca el nombre en la lista */
if (aux) /* si coinciden los nombres */
{
marco(9,71,10,23,3,1);
window(10,11,70,22);
gotoxy(4,2); textcolor(color2);
cprintf("Nombre: "); textcolor(color1);
cprintf("%s",aux->nombre);
gotoxy(4,4); textcolor(color2);
cprintf("Apellido: "); textcolor(color1);
cprintf("%s",aux->apellido);
gotoxy(4,6); textcolor(color2);
cprintf("Edad: "); textcolor(color1);
cprintf("%s",aux->edad);
gotoxy(4,8); textcolor(color2);
cprintf("Telefóno: "); textcolor(color1);
cprintf("%s",aux->telf);
gotoxy(4,10); textcolor(color2);
cprintf("Dirección: "); textcolor(color1);
cprintf("%s",aux->direccion);
window(1,1,80,25);
for (;;)
{
gotoxy(2,24);
cprintf("Presione (M) para modificar (Q) para salir u otra tecla para continuar ");
op = toupper(getch());
if (op == 'M')
{
modifica(aux);
break;
} else
if (op == 'Q')
return;
else
break;
}
}
else /* si no se encontró el nombre */
{
marco(17,59,10,12,color,1);
gotoxy(19,11);
printf("NO SE ENCONTRO REGISTROS CON ESE NOMBRE");
getch();
return;
} /* termina if */
} /* termina for(;;) */
} /* termina bloque de busqueda */

/* --BUSCA LOS REGISTROS PARA VER, MODIFICAR, ELIMINAR O VER EL LISTADO-- */

void listar(void)
{
char op,resp;
struct dato *p;
int i = 10;
int c = 11;

if (nleidos == 0) {
clrscr();
marco(21,60,4,6,color,1);
gotoxy(23,5);
printf("NO SE ENCUENTRAN REGISTROS GUARDADOS");
gotoxy(80,25);
getch();
return;
}

p = inicio;
for (;;)
{
clrscr();
if (nleidos == 0)
{
marco(17,56,9,11,color,modo);
gotoxy(18,10);
printf(" SE HAN ELIMINADO TODOS LOS REGISTROS ");
gotoxy(80,25);
getch();
inicio = p = final = NULL;
return;
}
marco(1,79,1,25,color,modo);
marco(10,70,3,15,color,modo);
textcolor(3);
gotoxy(15,5);
cprintf("Nombre: %s",p->nombre);
gotoxy(15,7);
cprintf("Apellidos: %s",p->apellido);
gotoxy(15,9);
cprintf("Edad: %s",p->edad);
gotoxy(15,11);
cprintf("Teléfono: %s",p->telf);
gotoxy(15,13);
cprintf("Dirección: %s",p->direccion);
gotoxy(30,1);
textcolor(5);
cprintf("LISTADO DE REGISTROS");
gotoxy(i + 6,20);
textcolor(c); cprintf("(S)");
gotoxy(i+20,20); cprintf("(A)");
gotoxy(i+33,20); cprintf("(D)");
gotoxy(i+46,20); cprintf("(E)");
textcolor(15);
gotoxy(i+10,20); cprintf("SIGUIENTE");
gotoxy(i+24,20); cprintf("ANTERIOR");
gotoxy(i+37,20); cprintf("ELIMINAR");
gotoxy(i+50,20); cprintf("SALIR");
op = toupper(getch());
switch (op)
{
case 'A': p = p->ant; break;
case 'S': p = p->sig; break;
case 'D': {
for (;;)
{
gotoxy(20,22);
cprintf("Seguro que desea eliminar s/n ");
resp = tolower(getch());
if (resp == 's')
{
guardado = 1;
elimina(p);
nleidos--;
p = p->sig;
break;
} else
if (resp == 'n')
break;
}
} break;
case 'E': return;
} /* fin de switch */
} /* fin de while */
} /* fin de listar() */

/* --------------------MODIFICAR REGISTROS DE LA LISTA--------------------*/

void modifica(struct dato *aux)
{
struct dato info;
int tcolor1 = 3;
int tcolor2 = 5;
char op;

fflush(stdin);
clrscr();
marco(4,76,13,15,color,modo);
marco(4,76,3,11,color,modo);
gotoxy(6,5); textcolor(tcolor1);
cprintf("Nombre: "); textcolor(tcolor2);
gets(info.nombre);
gotoxy(6,6); textcolor(tcolor1);
cprintf("Apellidos: "); textcolor(tcolor2);
gets(info.apellido);
gotoxy(6,7); textcolor(tcolor1);
cprintf("Edad: "); textcolor(tcolor2);
gets(info.edad);
gotoxy(6,8); textcolor(tcolor1);
cprintf("Telefóno: "); textcolor(tcolor2);
gets(info.telf);
gotoxy(6,9); textcolor(tcolor1);
cprintf("Direccion: "); textcolor(tcolor2);
gets(info.direccion);
for (;;)
{
gotoxy(6,14);
cprintf("Seguro que desea realizar los cambios s/n ");
op = tolower(getch());
if (op == 's')
{
guardado = 1;
strcpy(aux->nombre,info.nombre);
strcpy(aux->apellido,info.apellido);
strcpy(aux->edad,info.edad);
strcpy(aux->telf,info.telf);
strcpy(aux->direccion,info.direccion);
return;
} else
if (op == 'n')
return;
} /* fin de for(;;) */
} /* fin de la funcion */
/* ------------MENU PARA MANIPULAR LOS REGISTROS DEL ARCHIVO--------------*/

void menu(char *fname)
{
char op;

do {
clrscr();
marco(2,70,1,3,color,modo);
marco(2,70,1,21,color,modo);
textcolor(15);
gotoxy(4,2);
cprintf(" ARCHIVO: %s ------> N° DE PERSONAS REGISTRADAS: %d",fname,nleidos);
gotoxy(4,5);
cprintf(" (1) ------------> INSERTAR REGISTROS"); gotoxy(4,7);
cprintf(" (2) ------------> EXAMINAR REGISTROS"); gotoxy(4,9);
cprintf(" (3) ------------> BUSCAR REGISTROS"); gotoxy(4,11);
cprintf(" (4) ------------> GUARDAR REGISTROS "); gotoxy(4,13);
cprintf(" (5) ------------> SALIR A MENU PRINCIPAL"); gotoxy(4,15);
cprintf(" SELECCIONE OPCION [ ]");
gotoxy(35,15);
op = getch();
switch(op) {
case '1': agregar(); break;
case '2': listar(); break;
case '3': buscar(); break;
case '4': guardar(fname); break;
}
} while (op != '5');
revisa(fname);
libera();
}

/* -------------PIDE EL NOMBRE DEL ARCHIVO A CREAR O CARGAR---------------*/

void cargar(int clave)
{
char fname[20];
char *cadena;
FILE *f;
char eleccion;

cadena = new char[20];

if (clave)
cadena = "cargar"; else
if (!clave)
cadena = "crear";

elimina_sm = 0;
for (;;) {
clrscr();
marco(2,70,4,6,color,modo); /* marco para el nombre del archivo */
marco(2,70,9,13,color,modo); /* marco para comentarios */
textcolor(5);
gotoxy(4,5);
printf("Introduzca el nombre del archivo a %s: ",cadena);
gets(fname);
strcat(fname,".agd");
f = fopen(fname,"rb");
if (f == NULL) /* el archivo no existe */
{
if (!clave) /* si el archivo no existe y se desea crear */
{
f = fopen(fname,"wb");
fclose(f);
elimina_sm = 1;
carga(fname);
menu(fname);
return;
} else
if (clave) /* si el archivo no existe y se desea a cargar */
{
gotoxy(4,10);
printf("El archivo no existe, verifique el nombre . . .");
gotoxy(4,11);
printf("Presione (e) para salir o cualquier tecla para continuar");
eleccion = tolower(getch());
if (eleccion == 'e')
return;
}
} else
if (f != NULL) /* el archivo ya existe */
{
if (!clave) /* si se desea crear archivo y ya existe */
{
do {
gotoxy(4,10);
printf("El archivo ya existe, desea sobreescribirlo s/n: ");
gotoxy(4,11);
printf("Presione (e) si quiere salir");
eleccion = tolower(getch());
if (eleccion == 'e')
return; else
if (eleccion == 's')
{
f = fopen(fname,"wb");
fclose(f);
elimina_sm = 1;
carga(fname);
menu(fname);
return;
} else
if (eleccion == 'n')
break;
} while (eleccion != 's');
} else
if (clave) /* si se desea cargar archivo y el archivo existe */
{
carga(fname);
menu(fname);
return;
}
}
} /* finaliza for (;;) */
} /* finaliza carga() */



/* ----------------------------MENU PRINCIPAL-----------------------------*/

void menu_prin(void)
{
char op;

for (;;) {
clrscr();
marco(17,60,6,18,color,modo);
marco(21,56,4,6,color,modo);
gotoxy(21,6);
printf("╩");
gotoxy(56,6);
printf("╩");
gotoxy(29,5);
textcolor(4);
cprintf("AGENDA PERSONAL 1.02");
textcolor(15);
elimina_sm = 0;
gotoxy(28,8);
cprintf("(1) NUEVO REGISTRO"); gotoxy(28,10);
cprintf("(2) CARGAR REGISTRO"); gotoxy(28,12);
cprintf("(3) SALIR"); gotoxy(28,16);
cprintf("Seleccione una opción: ");
op = getch();
switch (op) {
case '1': cargar(0); break;
case '2': cargar(1); break;
case '3': return;
default: {

}
};
}
}

/* ------ESCRIBE LOS REGISTROS EN EL ARCHIVO PARA SU POSTERIOR USO------- */

void guardar(char *fname)
{
FILE *f;
struct dato *p;
int tam;

tam = sizeof(struct dato);
f = fopen(fname,"wb");
p = inicio;
for (;;)
{
fwrite(p,tam,1,f);
p = p->sig;
if (p == inicio)
break;
}
fclose(f);
clrscr();
marco(24,60,4,6,color,modo);
gotoxy(25,5);
textcolor(3);
cprintf(" SE HAN GUARDADO LOS REGISTROS ");
gotoxy(80,25);
getch();
guardado = 0;
elimina_sm = 0;
}

/* --------------------------FUNCION MAIN()-------------------------------*/

int main()
{
textbackground(1);
clrscr();
menu_prin();
textbackground(1);
clrscr();
return 0;
}