AYUDA POR FAVOR .UN PROBLEMILLA.ES URGENTE

yomisma21
04 de Septiembre del 2004
queremos realizar un funcion llamada categorias donde que los participantes de un torneo queden clasificados segun la edad.
y nos lo visualize por pantalla.este es el codigo pero se nos raya .haber si alguien nos puede explicar que nos falla.
struct datos
{
char nombre[51];
char apellidos[50];
int fecha;
char domicilio[51];
int DNI ;
int num_equip;
char categoria;
struct datos *sig,*ant;
};
/* Variables Globales */
struct dato *p; /* puntero auxiliar */
struct datos * ultimo=NULL; /* puntero al final de la lista */
struct datos *cabecera=NULL; /* puntero al inicio de la lista */
int guardado = 0; /* revisa si se ha modificado la lista */
int nleidos = 0; /* cantidad de elementos en la lista */
int elimina_sm = 0; /* elimina el archivo creado si no se han hecho modificaciones */

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

void libera(void);
void insertar(struct datos *p); /* inserta registros ordenadamente en la lista */
void visualizar();
void guardar();
void agregar(void);/*pide los datos del registro nuevo*/
void guardar(char *fname); /* guarda la lista en el archivo */
void menu(char *fname);/* menu para crear,listar y eliminar registros */
void buscar();
void categoria();
void elimina(struct datos *aux);
void salir();
void menu_prin(void); /* menu principal crear o cargar archivo */
void carga(char *fname); /* lee el archivo y crea la lista enlazada si existen registros guardados */
void cargar(int clave); /* menu en donde se introduce el nombre de archivo */

/* ------------------VISUALIZA LOS PARTICIPANTES POR CATEGORIAS-----------*/
void categoria()
{

int i=0;
fflush(stdin);
struct datos *np,*nu;
np=cabecera;
ultimo=NULL;
nu=ultimo,i=0;
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==9)||(np->fecha==10))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoriap: %c n",np->categoria);
np=np->sig;

}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==11)||(np->fecha==12))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}


for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==13)||(np->fecha==14))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==15)||(np->fecha==16))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==17)||(np->fecha==18))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha>=19)||(np->fecha<=39))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha>=40)||(np->fecha<=60))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}
for(np=cabecera;np!=NULL;np=np->sig)
{
if (np->fecha>60)
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoria: %c n",np->categoria);
}
}

return ;
}
estamos trabajando con listas

ana
04 de Septiembre del 2004
Creo que lo que os pasa es que teneis varias llamadas a ini_cateq (la incialización del array) y vais borrando lo que vais almacenando. Debeis tenes SOLO UNA llamada en el main

Saludos

ana
04 de Septiembre del 2004
Bueno chicas, me voy de vacaciones unos días. Espero que os vaya bien con la práctica y que aprobeis. Si alguna vez necesitais algo, ya sabeis mi dirección de e_mail

ana
04 de Septiembre del 2004

No entiendo muy bien que quieres decir con que "el código se raya". Podías aclarar si lo que hace es meterse en bucle y comprobar en cual de ellos es.

¿En el campo fecha estás almacenando la fecha de nacimiento, la edad, ....? ¿Qué formato estás usando para almacenar este dato (si es fecha con formato dd, o ddmmaa, ddmmaaaa)? Es importante a la hora de hacer comparaciones.

Si tienes que sacar los datos ordenados por fecha, tal y como parece que estás haciendo, lo normal sería que al insertar un elemento lo colocaras en tu lista ordenado por este campo. De esta forma categoria() sólo tendrían que hacer un while

np = cabecera;

while (np!= NULL)
{
// sacas el nombre y la categoría
np = np->sig;
}


Y mirando tu código, el primer for

for(np=cabecera;np!=NULL;np=np->sig)
{
if ((np->fecha==9)||(np->fecha==10))
{
printf ("Nombre: %s n",np->nombre);
printf ("CAtegoriap: %c n",np->categoria);
np=np->sig; // ¿para qué tienes esta sentencia?

}
}

np=np->sig; // ¿para qué tienes esta sentencia, si ya lo has puesto en el for?

De todas formas no es muy normal usar for para recorrerlas, lo más frecuente es usar el while.

Si puedes, pon el código de tu función insertar(), hay que ver si tu puntero cabecera está colocado de forma correcta.

ana
04 de Septiembre del 2004
Te he enviado por correo electrónico la solución a tu práctica. Si no te llegase, dímelo y te lo pongo en esta página.

Un saludo

yomisma21
04 de Septiembre del 2004
no me ha llegado nada enviamelo aki
gracias y saludos.

yomisma21
04 de Septiembre del 2004
Aqui te mando de nuevo la practica hemos implementado lo qeu tu nos mandastes y el problema que tenemos es que no nos lo visualiza.ni la categoria ni el nu,mero de equipo no se si sera por la funcion de visualizar pq no llamo bien a la variable para que nos lo visualize.

que significa strcop,strcpyque nos la pones en la funcion ini_cateq()

hemos kitado (&p)& pk nosotros lo declaramos * pero aun asi si poniamos (*p)tpc lo coge x eso lo hemos dejado en p


respecto a tu pregunta somos de valencia y estudiamos en la florida es un modulo superior de administracion de sistemas informaticos.

bueno aqui te la dejamos por si pudieras hecharle un vistazo, seguimos pendientes de listar las categorias y los equipos con un solo participante.

un saludo y gracias

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.c>
#include <ctype.h>
#include <dos.h>
#define l 721690/*el año 2004 del 2 de septiembre pasado a dias*/

typedef /* estructura que se utiliza para almacenar los registros */
struct categ_equip
{
int min;
int max;
char categoria;
int cont_eq;
int elem_eq;
char nom_cat[30];
};categ_equip cat_eq[7];



struct dato {
char nombre[50];
char apellidos[50];
int fecha;
char categoria;
int num_equip;
char DNI;
char domicilio[80];

struct dato *sig;
struct dato *ant;
};

/* Variables Globales */
struct dato *aux;
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 la lista */
int nleidos = 0; /* cantidad de elementos en la lista */
int elimina_sm = 0; /* elimina el archivo creado si no se han hecho modificaciones */
char *fname;
int mostrar=0;
/* -----------------------PROTOTIPO DE LAS FUNCIONES----------------------*/
void buscar(void); /* pide el DNI 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 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); /* lista por pantalla todos los participantes */
void menu_prin(void); /* menu principal 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 salir(); /* sale de la ejecucion*/
void elimina(struct dato *aux); /*elimina los participantes de la lista*/
void categorias(); /* lista por categorias los partipantes*/
struct dato *localiza();
void ini_cateq();
void asignar_cat( struct dato *p);

/*----------------------------INICIALIZAR CATEGORIA------------------------*/

void ini_cateq()
{

int i = 0;

cat_eq[i].min = 9;
cat_eq[i].max = 10;
cat_eq[i].categoria = 'b';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "benjamin");


i++;

cat_eq[i].min = 11;
cat_eq[i].max = 12;
cat_eq[i].categoria = 'a';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "alevin");

i++;

cat_eq[i].min = 13;
cat_eq[i].max = 14;
cat_eq[i].categoria = 'i';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "infantil");

i++;

cat_eq[i].min = 15;
cat_eq[i].max = 16;
cat_eq[i].categoria = 'j';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "juvenil");

i++;

cat_eq[i].min = 17;
cat_eq[i].max = 18;
cat_eq[i].categoria = 'o';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "otro");

i++;

cat_eq[i].min = 19;
cat_eq[i].max = 39;
cat_eq[i].categoria = 'p';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "penfinal");

i++;

cat_eq[i].min = 40;
cat_eq[i].max = 60;
cat_eq[i].categoria = 's';
cat_eq[i].cont_eq = 1;
cat_eq[i].elem_eq = 0;
strcpy(cat_eq[i].nom_cat, "senior");

i++;

return;

}
/*------------------------------ASIGANR CATEGORIA---------------------*/
void asignar_cat( struct dato *elemen)
{
int i=0;
int edad_p;
edad_p=elemen->fecha;

for ( i=0; i<7; i++)
{

if (edad_p >= cat_eq[i].min && edad_p <= cat_eq[i].max)
{

elemen->categoria = cat_eq[i].categoria;
elemen->num_equip = cat_eq[i].cont_eq;

if (mostrar)
{

}

cat_eq[i].elem_eq++;

if (cat_eq[i].elem_eq == 2)
{
cat_eq[i].elem_eq = 0;
cat_eq[i].cont_eq++;
}

break;

} // if

else
{
//error: la edad no está entre los valores permitidos
}

} //for

}



/*----------------------------INSERTA DATOS----------------------*/
void insertar_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*/
{
asignar_cat(p);
inicio =p;
p->sig = inicio;
p->ant=final;
final=p;

final->ant= p;


}else

for (;;)
{
//te inserta ordenadamente por edad y por nombre alfabeticamente
if((aux!=NULL && aux->fecha <p->fecha)||(strcmp(p->nombre, aux->nombre) < 0))

{
if (aux == inicio) /* insertar registro al principio de la lista */
{
asignar_cat(p);
p->sig = aux;
p->ant = final;
aux->ant = p;
inicio =p;
final->sig = p;
return;
}
else
{
asignar_cat(p);
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*/
{
asignar_cat(p);
aux->sig = p;
p->sig = inicio;
inicio->ant = p;
p->ant = aux;
final = p;
return;
}
aux = aux->sig;

} /* fin de for() */

} /* fin de la funcion */



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

void carga(char *fname)
{
FILE *f;


p = final = inicio = NULL;
f = fopen(fname,"rb"); /*abre un fichero para lectura*/

nleidos = 0;
for (;;)
{
aux = (struct dato *) malloc (sizeof(struct dato));/*reserva memoria*/
if (fread(aux,sizeof(struct dato),1,f) != 1)
break;
nleidos++;
insertar_reg(aux); /*llamada a la funcion*/
} /*termina el for*/
fclose(f);
if (nleidos == 0)
p = final = inicio = NULL;
}


/* --------------------PIDE LOS DATOS DEL REGISTRO NUEVO----------------- */
void agregar()

{

struct dato *p,*aux;

int y,x;

int i,j=0,k=0,opc,dorsal,opcion,res,edad;

int s;



char *fname;

int marcatotal;

int marca,total,a=0,b=0,v=0,w=0,ju=0,se=0,in=0,ca;

int anyo=0, mes=0, dia=0;

aux=inicio;

y = 7;

x = y + 2;



guardado = 1;

nleidos++;

fflush(stdin); /* vac¡a el buffer del archivo stdin */

p=(struct dato *) malloc(sizeof(struct dato));

clrscr();

textcolor(14);

gotoxy(30,1);

cprintf("INSERTAR REGISTROS");

gotoxy(x,3);

cprintf(" nombre: ");

gets(p->nombre);

gotoxy(x,6);

cprintf("Apellidos:");

gets(p->apellidos);

gotoxy(x,9);

cprintf("Domicilio:");

gets(p->domicilio);

gotoxy(x,12);

cprintf("fecha: ");



do

{

printf("n");

gotoxy(x,13);

cprintf("Anyo:",anyo);

scanf("%d",&anyo);



if ((anyo<0)||(anyo>2004))



cprintf("INTRODUZCA EL ANYO CORRECTO");



}while(anyo<0 || anyo>2004);

do

{

gotoxy(x,15);

cprintf("Meses:",mes);

scanf("%d", &mes);



if ((mes<0)||(mes>12))



cprintf("INTRODUZCA BIEN LOS MESES");



}while(mes<0 || mes>12);

do

{

gotoxy(x,17);

cprintf("Dia:",dia);

scanf("%d",&dia);



if ((dia<0)||(dia>31))



cprintf("INTRODUZCA BIEN LOS DIAS");



}while(dia<0 || dia>31);



marca=anyo*360+mes*31+dia;

marcatotal=l-marca;

edad=marcatotal/360;

p->fecha=edad;

gotoxy(x,20);

printf("SU EDAD ES:%d",edad);



printf("nn");

gotoxy(x,23);


mostrar = 1; //pongo mostrar = 1 para que asignar_cat() saque la categoría del elemento insertado
//he quitado la asignación de la categoría y el num_equip;

gotoxy(x,26);

cprintf("DNI:");
scanf("%c",&p->DNI);

gotoxy(x,29);

p->sig=NULL;

insertar_reg(p);

mostrar = 0; //para asegurarnos de que no saldrá a pantalla la categoría cuando no lo deseemos


} /* fin de la funcion */





/* ----------LISTA LOS REGISTROS Y ELIMINA------------ */

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

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

p = inicio;
for (;;)
{
clrscr();
if (nleidos == 0)
{
gotoxy(18,10);
printf(" SE HAN ELIMINADO TODOS LOS REGISTROS ");
gotoxy(80,25);
getch();
inicio = p = final = NULL;
return;
}


clrscr();
textcolor(14);
gotoxy(30,1);
cprintf("PARTICIPANTE:");
textcolor(WHITE);
gotoxy(15,5);
cprintf("Nombre: %s",p->nombre);
gotoxy(15,7);
cprintf("Apellidos: %s",p->apellidos);
gotoxy(15,9);
cprintf("Domicilio: %s",p->domicilio);
gotoxy(15,11);
cprintf("fecha: %d",p->fecha);
gotoxy(15,13);
cprintf("categoria: %c",p->categoria);
gotoxy(15,15);
cprintf("numero equipo: %d",p->num_equip);
gotoxy(15,17);
cprintf("DNI: %c",p->DNI);
gotoxy(15,19);
textcolor(RED);
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--;

break;
} else
if (resp == 'n')
break;
}
} break;
case 'E': return;

} /* fin de switch */
} /* fin de while */

} /* fin de listar() */
/* -----------------ELIMINA UN REGISTRO DE LA LISTA---------------------- */
void elimina(struct dato *aux)
{

struct dato *q;
struct dato *borrar = aux;

q = aux->ant;
q->sig = aux->sig;
aux->sig->ant = q;

p = q->sig;

free(borrar);

}



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

struct dato *localiza()
{
struct dato *aux;
char dnibusc;
aux = inicio;
clrscr();
gotoxy(30,1);
textcolor(9);
cprintf("BUSQUEDA DE REGISTROS");
gotoxy(12,6);
textcolor(WHITE);
cprintf("Introduzca el DNI de la persona: ");
textcolor(RED);
scanf("%c",&dnibusc);
clrscr();
do
{

if((aux->DNI)==(dnibusc))
return (aux);
else
aux = aux->sig;
} while (aux != inicio);
return (aux = NULL);
}
/* ------------------BUSQUEDA DE REGISTROS DIRECTAMENTE-------------------*/

void buscar()
{
char op;
int dnibusc;
int i;
struct dato *aux;
int color1 = WHITE;
int color2 = RED;
int encontrado=0;
if (nleidos == 0) /* comprueba que realemnte existe registros */
{
clrscr();
gotoxy(23,5);
printf("NO SE ENCUENTRAN REGISTROS GUARDADOS");
gotoxy(80,25);
getch();
return;
}

for(aux=inicio;aux!=NULL;aux=aux->sig)

{

if (!dnibusc)
return;
clrscr();
/* bloque de busqueda */
aux = localiza(); /* busca el nombre en la lista */
if (aux) /* si coinciden los DNI*/
{
gotoxy(4,2); textcolor(2);
cprintf("Nombre: "); textcolor(1);
cprintf("%s",aux->nombre);
gotoxy(4,4); textcolor(2);
cprintf("Apellido: "); textcolor(1);
cprintf("%s",aux->apellidos);
gotoxy(4,6); textcolor(2);
cprintf("categoria: "); textcolor(1);
cprintf("%c",aux->categoria);
gotoxy(4,8); textcolor(2);
cprintf("Numero de equipo: "); textcolor(1);
cprintf("%d",aux->num_equip);


for (;;)
{
gotoxy(2,24);
cprintf("Presione (Q) para salir u otra tecla para continuar ");
op = toupper(getch());


if (op == 'Q')
return;

}
}
if(!aux) /* si no se encontr¢ el dni */

gotoxy(19,11);
printf("NO SE ENCONTRO REGISTROS CON ESE DNInn");
textcolor(WHITE);
gotoxy(19,13);
system("PAUSE");
return;



} /* termina for(;;) */

}/* termina la busqueda */





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

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



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

elimina_sm = 0;
for (;;) {
clrscr();
textcolor(WHITE);
gotoxy(4,5);
printf("Introduzca el nombre del archivo a %s: ",cadena);
gets(fname);
strcat(fname,".txt");
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() */

/*------------------------------GUARDA LOS DATOS EN UN REGISTRO----------*/
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();
gotoxy(25,5);
textcolor(WHITE);
cprintf(" SE HAN GUARDADO LOS REGISTROS ");
gotoxy(80,25);
getch();
guardado = 0;
elimina_sm = 0;
}


/*------------------------------LISTA POR CATEGORIAS-------------------------*/
void categorias()
{
char op,resp;
struct dato *p;
int i = 10;
int c = 11;
if (nleidos == 0) {
clrscr();
gotoxy(23,5);
printf("NO SE ENCUENTRAN REGISTROS GUARDADOS");
gotoxy(80,25);
getch();
return;
}

p = inicio;
for (;;)
{
clrscr();
if (nleidos == 0)
{
gotoxy(18,10);
printf(" SE HAN ELIMINADO TODOS LOS REGISTROS ");
gotoxy(80,25);
getch();
inicio = p = final = NULL;
return;
}


clrscr();
textcolor(14);
gotoxy(30,1);
cprintf("PARTICIPANTE:");
textcolor(WHITE);
gotoxy(15,5);
cprintf("Nombre: %s",p->nombre);
gotoxy(15,7);
cprintf("Apellidos: %s",p->apellidos);
gotoxy(15,9);
cprintf("categoria: %c",p->categoria);
textcolor(RED);
gotoxy(15,11);
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() */
/*----------------------------MENU PRINCIPAL DEL PROGRAMA-------------------*/
void menu_prin(void)
{
char op;

for (;;) {
clrscr();
gotoxy(33,5);
textcolor(3);
cprintf(" T O R N E O ");
textcolor(13);
elimina_sm = 0;
gotoxy(28,8);
textcolor (10);
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=tolower(getch());
switch (op) {
case '1': cargar(0); break;
case '2': cargar(1); break;
case '3':salir(); return;
default: {
}
};
}
}
/* ------------MENU PARA MANIPULAR LOS REGISTROS DEL ARCHIVO--------------*/
void menu(char *fname)
{
char op;
struct dato p;
do {
clrscr();
textcolor(15);
gotoxy(4,2);
cprintf(" ARCHIVO:------> Nø DE PERSONAS REGISTRADAS: %d",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) ------------> VISUALIZAR POR CATEGORIA "); gotoxy(4,15);
cprintf(" (6) ------------> SALIR A MENU PRINCIPAL"); gotoxy(4,17);
cprintf(" SELECCIONE OPCION [ ]");
textcolor(RED);

printf("nnSI DESEA GUARDAR EL PARTICIPANTE INSERTADO RECURDE PULSAR LA OPCION << 4 >>");
gotoxy(35,17);
op = getch();


switch(op) {
case '1': agregar();

break;
case '2': listar(); break;
case '3': buscar();
break;
case '4': guardar(fname);
break;
case '5': categorias();
break;

}
} while (op != '6');


}


/*------------------------------OPCION SALIR----------------------------*/
void salir()

{
printf("nn");
textbackground(RED);
textcolor(WHITE);
cprintf(" a Gracias ");
textbackground(BLUE);
cprintf("a por ");
textbackground(BLUE);
textcolor(WHITE);
cprintf("a utilizar ");
textbackground(BLUE);
textcolor(WHITE);
cprintf("a este ");
textbackground(RED);
textcolor(WHITE);
cprintf("a programa ");


textcolor(RED);
cprintf("an Dise¤ado por:n a");

textcolor(RED);
cprintf("anJenifer Del Hoyo San Antonio y Ana Cano Otero n a");

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











ana
04 de Septiembre del 2004

Hola, aquí estoy de nuevo.

Os cuento que yo llamé a la función &p porque mi declaración de la función no es igual a la vuestra. Yo la declaré como

void asignar_cat(dato **elemen)

Esto hace que haya que pasar una dirección y eso es lo que hago con &p, aunque p esté declarada como *p. Y dentro de la función accedo a elemen como

(*elemen)->fecha

Es una costumbre al pasar punteros.

Lo he puesto como vosotras y me funciona bien, al recorrer la lista tengo ambos campos rellenos.

Lo que no he visto es donde llamais a la función ini_cateq(), porque si el array no está correctamente inicializado, no se os rellenarán los campos de la lista.

He vuelto a mirar la función de insertar_reg y hay una sentencia que no me parece que esté bien:

if (inicio == NULL) /* insertar el primer registro de una lista*/
{
asignar_cat(p);
inicio =p;
p->sig = inicio; //esta sentencia
p->ant=final;
final=p;

final->ant= p;


}else


inicio =p;
p->sig = inicio; //esta sentencia: si la pones detrás de inicio= p, tanto p como p->sig apuntan al mismo sitio, y lo correcto es que p->sig apunte a NULL. Si las pones delante estaría correcta

inicio =p;
p->sig = inicio;


Decidme si lo habeis solucionado. Un saludo y suerte
Estaré conectada hasta las dos y cuarto. Pero si me dejais alguna duda mañana la miro. A partir de las 7:30 de la mañana puedo dedicarla un rato. Y seguro que vosotras presentais la práctica más tarde.

ana
04 de Septiembre del 2004
Por cierto, lo de la función strcop fue que se me olvidó cambiarla para enviárosla. Es una función mía que uso para el tratamiento de cadenas. Sería efectivamente un strcpy