2
« en: Lunes 31 de Mayo de 2004, 22:31 »
HOLA:
he hexo una prac de una asociacion de vecinos. en principio no tengo errores, pero el visual c no me deja ejecutarlo, me pone errores si me podeis ayudar. aki el kodigo:
#include <stdio.h> // printf, scanf, fprintf, fscanf, fopen, fclose, gets, fflush.
#include <stdlib.h> // malloc, free, system.
#include <string.h>
#include <conio.h> // getch, getche, getchar.
//Declaración estructuras
typedef struct
{
int dia,mes,año;
}fecha_nacimiento;
typedef struct nodo
{
char nombre[20],apedido1[20],apedido2[20],tipo[10],actividades[70];
int DNI, num_socio;
fecha_nacimiento fecha;
struct nodo *siguiente;
}socio;
//Declaración de constantes
#define datos "datos.txt"
#define max_list_pant 4
//Declaración de funciones
void abir_lista(socio *);
void cerrar_lista (socio *);
void mostrar_menu(int, socio *);
void altas(int, socio *);
void bajas(int, socio *);
void modificaciones(int, socio*);
void consultas(int, socio*);
void salir (socio *);
socio *crear_lista();
int existe_elemento(socio *, int );
int inserir_elemento(socio **, socio );
int eliminar_elemento (socio **, int );
socio leer_elemento (socio *, int );
int actualitzar_elemento (socio *, socio );
void consulta_por_apedido (socio *, socio );
int guardar_elementos (socio *);
void inicio(char info[50]);
void mensaje (char info[50], char mensaje[50]);
void barra ();
/////////////////////////////////////////////////////////////////////////////////////////////////
// Función que abre el arxivo i introduce los datos en la lista
void abre_lista (socio *primero) {
socio *nuevo, *aux;
FILE *fichero;
fichero = fopen (datos, "r");
while (!feof(fichero)) {
nuevo = (socio*) malloc (sizeof(socio));
fscanf (fichero, "%s %s %s %d %d %d %d %d %s %s\n", nuevo->nombre, nuevo->apedido1,
nuevo->apedido2, &nuevo->DNI, &nuevo->num_socio, &nuevo->fecha.dia, &nuevo->fecha.mes,
&nuevo->fecha.año, neuvo->tipo, nuevo->actividades);
nuevo->siguiente = NULL;
if (primero == NULL) {
primero = nuevo;
aux = primero;
} else {
aux->siguiente = nuevo;
aux = aux->siguiente;
}
}
fclose (fichero);
}
///////////////////////////////////////////////////////////////////////////////////////////////
// Función que guarda los datos de la lista al archivo i lo cierra
void cierra_lista (socio *primero) {
socio *aux, *index;
FILE *fichero;
fichero = fopen (datos, "w");
for (index = primero; index != NULL; aux = index, index = index->siguiente,
free(aux))
fprintf (fichero, "%s %s %s %d %d %d %d %d %s\n", index->nombre,
index->apedido1, index->apedido2, index->DNI, index->num_socio, index->fecha.dia,
index->fecha.mes, index->fecha.año, index->tipo,index->actividades);
fclose (fichero);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Función que muestra las opciones del programa
void mostrar_menu (int opcion, socio *primero) {
if ((opcion<6) && (opcion>0))
printf ("\t\t\t Has vuelto al menu");
else
printf ("\t\t\t Bienvenido al programa");
printf ("\n\t\t Porfavor escoge una de las siguientes opciones\n\n");
printf ("\t\t\t\t 1- Altas");
printf ("\n\t\t\t\t 2- Bajas\n");
printf ("\t\t\t\t 3- Modificaciones\n");
printf ("\t\t\t\t 4- Consultas\n");
printf ("\t\t\t\t 5- Salir\n");
barra ();
printf ("\n\t\t\t\t(1/2/3/4/5):\n\n \t\t\t\t");
scanf ("%d", &opcion);
switch (opcion) {
case 1:
altas (opcion, primero);
break;
case 2:
baixes (opcion, primero);
break;
case 3:
modificaciones (opcion, primero);
break;
case 4:
consultas (opcion, primero);
break;
case 5:
sortir (primero);
break;
default:
mostrar_menu (opcion, primero);
break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
// Función que introduce un elemento a la lista
void altas (int opcion, socio *primero) {
char seguro;
socio vecino;
inicio ("\t\t\t Inserir nuevo socio");
printf ("\n\t\t\tNombre: "); gets (vecino.nombre);
printf ("\t\t\tPrimer apedido: "); gets (vecino.apedido1);
printf ("\t\t\tSegundo apedido: "); gets (vecino.apedido2);
printf ("\t\t\tDNI: "); scanf ("%d", &vecino.DNI);
printf ("\t\t\tNumero de socio: "); scanf ("%d", &vecino.num_socio);
printf ("\t\t\tDia nacimiento: "); scanf ("%d", &vecino.fecha.dia);
printf ("\t\t\tMes nacimiento: "); scanf ("%d", &vecino.fecha.mes);
printf ("\t\t\tAño nacimientot: "); scanf ("%d", &vecino.fecha.año);
printf ("\t\t\tTipo socio:(escoja una de las siguientes opciones)\n ");
printf ("\t\t\tInfantil(0-10años), Junior(11-17años)\n\t\t\tAdulto(18-65años) i Senior(+ de 65 añoss)\n\t\t\t");
gets (vecino.tipo);
printf ("\t\t\tEscoja hasta 5 actividades con las podria estar interessado:\n ");
printf ("Juegos de rol, bailes de de salon, dominó, manualidades, billar, futbol, pintura, astronomia, danza del vientre i cocina xina\n ");
gets (vecino.actividades);
barra();
printf ("\n\t\t Esta seguro que quiere crear el socio?\n");
do {
inicio ("\t\t\t\t (s/n): ");
scanf ("%c", &seguro);
} while ((seguro != 's') && (seguro != 'n'));
if (seguro == 's') {
if (existe_elemento (primero, vecino.DNI)) { mensaje ("\t\t\t Inserir nuevo socio", "\t\t\t\tDNI duplicado");
altas (opcion, primero);
} else {
if (inserir_elemento (&primero, vecino)) {
guardar_elementos (primero);
mensaje ("\t\t\t Inserir nuevo socio", "\t\t\t Socio dado de alta");
mostrar_menu (opcion, primero);
} else {
mensaje ("\t\t\t Inserir nuevo socio", "\t\t\tNo se ha podido inserir el socio");
altas (opcion, primero);
}
}
} else mostrar_menu (opcion, primero);
}
// Función que inserta un elemento a la llista
int inserir_elemento (socio **primero, socio vecino) {
socio *nuevovecino, *ant, *act;
nuevovecino = (socio *) malloc (sizeof(socio));
if (nuevovecino == NULL) {
return 0;
} else {
*nuevovecino = vecino;
if (*primero == NULL) {
*primero = nuevovecino;
nuevovecino->siguiente = NULL;
} else if ((*primero)->DNI > vecino.DNI) {
nuevovecino->siguiente = *primero;
*primero = nuevovecino;
} else {
act = ant = *primero;
while ((act->DNI < vecino.DNI) && (act->siguente != NULL)) {
ant = act;
act = act->siguiente;
}
if (act->DNI < vecino.DNI) ant = act;
nuevovecino->ssiguente = ant->siguiente;
ant->siguiente = nuevovecino;
}
return 1;
}
}
// Función que guarda la lista al archivo
int guardar_elementos (socio *primero) {
socio *index;
FILE *fichero;
if (fichero = fopen (datos, "w")) {
for (index = primero; index != NULL; index = index->siguiente)
fprintf (fichero, "%s %s %s %d %d %d %d %d %s\n", index->nombre,
index->apedido1, index->apedido2, index->DNI, index->num_socio, index->fecha.dia,
index->fecha.mes, index->fecha.año, index->tipo, index->actividades);
return 1;
} else return 0;
fclose (fichero);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Función que elimina un elemento de la lista
void bajas (int op, socio *primero) {
int DNI=0;
char seguro='n';
inicio ("\t\t\t\tEliminar socios");
printf ("\n\t\t\t Introduzca el DNI: ");
scanf ("%d", &DNI);
if (existe_elemento (primero, DNI)) {
barra();
printf ("\n\t\t Esta seguro que quiere eliminar el socio?\n");
do {
printf ("\t\t\t\t (s/n): ");
scanf ("%c", &seguro);
} while ((seguro != 's') && (seguro != 'n'));
if (seguro == 's') {
if (eliminar_elemento (&primero, DNI)) {
guardar_elementos (primero);
mensaje ("\t\t\t\tEliminar socios", "\t\t\t Socio dado de baja");
mostrar_menu (op, primero);
} else {
mensaje ("\t\t\t\tEliminar socios", "\t\t\tNo se ha podido elminar el socio");
bajas (op, primero);
}
} else {
mostrar_menu (op, primero);
}
} else {
mensaje ("\t\t\t\tEliminar socios", "\t\t\t El DNI no existe");
bajas (op, primero);
}
}
// Función que comprueba si el dni del elemento introducido existe
int existe_elemento (socio *primero, int DNI) {
socio *aux;
int encontrado;
aux = primero;
econtrado = 0;
while ((aux != NULL) && (!encontrado)) {
if (aux->DNI == DNI) encontrado = 1;
else aux = aux->siguiente;
}
return encontrado;
}
// Función que elimina un elemento de la lista buscado por dni
int eliminar_elemento (socio **primero, int DNI) {
socio *ant, *act;
int encontrado;
ant = NULL;
act = *primero;
encontrado = 0;
while ((act != NULL) && (!encontrado)) {
if (act->DNI == DNI)
encontrado = 1;
else {
ant = act;
act = act->siguiente;
}
}
if (encontrado) {
if (ant != NULL)
ant->siguiente = act->siguiente;
else *primero = act->siguiente;
free (act);
return 1;
} else return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void modificaciones (int op, socio *primero) {
socio vecino;
int camp;
inicio ("\t\t\t Modificar un socio");
printf("\n\t\t Introduzca el DNI del vecino a modificar: ");
scanf("%d",&vecino.DNI);
if (existe_elemento(primero,vecino.DNI)){
vecino = leer_elemento(primero,vecino.DNI);
inicio ("\t\t\t Modificar un socio");
printf("\n\t\t\tCampo a modificar?\n");
printf("\n\t\t\t1- Nom: %s",vecino.nombre);
printf("\n\t\t\t2- Primer apedido: %s",vecino.apedido1);
printf("\n\t\t\t3- Segon apedido: %s",vecino.apedido2);
printf("\n\t\t\t4- Numero de socio: %d",vecino.num_socio);
printf("\n\t\t\t5- Dia nacimiento: %d",vecino.fecha.dia);
printf("\n\t\t\t6- Mes de nacimiento: %d",vecino.fecha.mes);
printf("\n\t\t\t7- Año de nacimiento: %d",vecino.fecha.año);
printf("\n\t\t\t8- Tipo de socio: %s",vecino.tipo);
printf("\n\t\t\t9- Actividades: %s",vecino.actividades);
printf("\n\t\t\t10- Salir");
printf ("\n");
barra();
printf("\n\t\t\t(1/2/3/4/5/6/7/8/9): ");
scanf("%d",&camp);
switch (camp){
case 1:
printf("\nIntroduzca otro nombre: ");
scanf("%s",&vecino.nombre);
break;
case 2:
printf("Introduzca otro 1r apedido: ");
scanf("%s",&vecino.apedido1);
break;
case 3:
printf("Introduzca otro 2n apedido: ");
scanf("%s",&vecino.apedido2);
break;
case 4:
printf("Introduca otro numero de socio: ");
scanf("%d",&vecino.num_socio);
break;
case 5:
printf("Introduzca otro dia de nacimiento: ");
scanf("%d",&vecino.fecha.dia);
break;
case 6:
printf("Introduzca otro mes de naixement: ");
scanf("%d",&vecino.fecha.mes);
break;
case 7:
printf("Introduzca otro año de nacimiento: ");
scanf("%d",&vecino.fecha.año);
break;
case 8:
printf("Introduzca otro tipo de socio : ");
scanf("%",&vecino.tipo);
break;
case 9:
printf("Introduzca otras actividades : ");
scanf("%",&vecino.actividades);
break;
case 10:
printf(" sino quieres realizar ninguna operacion volvemos al menu");
break;
default:
modificaciones (op,primero);
break;
}
if (actualitzar_elemento(primero,vecino)){
guardar_elementos(primero);
mensaje ("\t\t\t\tModificar socios", "\t\t\t Socio modificado");
mostrar_menu(op,primero);
} else {
mensaje ("\t\t\t\tModificar socios", "\t\t\t Socio no modificado");
modificaciones (op,primero);
}
} else {
mensaje ("\t\t\t\tModificar socios", "\t\t\t El DNI no existe");
modificaciones (op,primero);
}
}
socio leer_elemento (socio *primero, int DNI) {
socio *aux;
aux=primero;
while(aux->DNI!=DNI) {
aux=aux->siguiente;
}
return (*aux);
}
int actualitzar_elemento (socio *primero, socio vecino) {
socio *aux;
aux=primero;
while(aux->DNI!=vecino.DNI) {
aux=aux->siguiente;
}
*aux = vecino;
if (aux->DNI==vecino.DNI) return (1);
else return(0);
}
//////////////////////////////////////////////////////////////////////////////////////////
void consultas (int op, socio *primero) {
int consultas;
socio vecino;
printf("\n\t\t\tMenú de consultas");
printf("\n\t\t\t1-Consulta por DNI");
printf("\n\t\t\t2-Consulta por primer apedido");
printf("\n\t\t\t3-Sortir\n\t\t\t");
scanf("%d",&consulta);
switch (consulta) {
case 1:
printf("\n\t\t\tIntroduzca el DNI: ");
scanf("%d",&vecino.DNI);
if (existe_elemento(primero,vecino.DNI)) {
vecino = leer_elemento(primero,vecino.DNI);
printf("\n\t\t\tNombre: %s",vecino.nombre);
printf("\n\t\t\t1r Apedido: %s",vecino.apedido1);
printf("\n\t\t\t2n Apedido: %s",vecino.apedido2);
printf("\n\t\t\tNumero de socio: %d",vecino.num_socio);
printf("\n\t\t\tDia de nacimiento: %d",vecino.fecha.dia);
printf("\n\t\t\tMes de nacimiente: %d",vecino.fecha.mes);
printf("\n\t\t\tAño de nacimiento: %d",vecino.fecha.año);
printf("\n\t\t\tTipo de socio: %s",vecino.tipo);
printf("\n\t\t\tActividades: %s",vecino.actividades);
} else {
mensaje ("\t\t\t\tModificar socios", "\t\t\t El DNI no existe");
consultas(op,primero);
}
break;
case 2:
printf("\n\t\t\tIntroduzca el Primer apedido: ");
scanf("%s",&vecino.apedido1);
consulta_por_apedido(primero, vecino);
break;
case 3:
printf("\t\t\tSi noquiere realizar nignuna consulta volvamos al menu principal");
break;
default:
consultas(op,primero);
break;
}
getch();
mostrar_menu(op,primero);
}
//funcion encargada de buscar socios con el mismo apedido i mostralos
void consulta_por_apedido (socio *primero, socio vecino)
{
socio *aux;
int contador;
aux=primero;
contador=0;
while(aux!=NULL)
{
if (strcmp(aux->apedido1,vecino.apedido1)==0)
{
printf("\n\t\t\tDNI: %d",aux->DNI);
printf("\n\t\t\tNombre: %s %s %s",aux->nombre, aux->apedido1,aux->apedido2);
printf("\n\t\t\tNumero de socio: %",aux->num_socio);
printf("\n\t\t\tFecha de nacimiento: %d/%d/%d",aux->fecha.dia,aux->fecha.mes,aux->fecha.año);
printf("\n\t\t\tTipo de socio: %s",aux->tipo);
contador=contador + 1;
if (contador>=max_list_pant) {
contador=0;
printf("\n\t\tPulse una tecla para ver la siguiente pagina\n");
getch();
}
}
aux=aux->siguiente;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
// Función que inserta elementos a la llista i finaliza el programa
void salir (socio *primero) {
cierra_lista (primero);
inicio ("\t\t\t Salir del programa");
printf ("\n\t\t\t ");
}
///////////////////////////////////////////////////////////////////////////////////////////////
// Función que muestra el inicio del entorno
void inicio(char info[50]) {
system("cls");
fflush(stdin);
printf ("\n");
barra();
printf ("\t\t\t Programa Associacion de Vecinos");
barra();
printf ("%s", info);
barra();
}
// Función que muestra un mensaje
void mensaje (char info[50], char mensaje[50]) {
system ("cls");
inicio (info);
printf ("\n %s\n", mensaje);
barra();
printf ("\n\t\t\t Pulsa una tecla para continuar");
getch();
fflush(stdin);
}
// Función que dibuja las barras
void barra() {
printf ("\n\t |--------------------------------------------------------|\n");
}
main ()
{
socio *primero;
primero = crea_lista ();
abre_lista (primero);
mostrar_menu (0, primero);
}
// Función que inicializa primero
socio *crea_lista() {
socio *primero;
primero = NULL;
return primero;
}