[ Foro de C ]
Tengo bastantes errores en el programa, pero no sé como solucionarlos ¿Alguien podrÃa ayudarme o decirme como es el programa correctamente?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <time.h>
#include <ctype.h> // para toupper e isdigit
#define max 1000 //mil desde el 000 al 999
struct amigo_str
{
char nombre[26];
char apellido1[21];
char apellido2[21];
char telefono[10];
int dia;
int mes;
int agno;
int clave ;
} ;
void Espagnol();
// teclado y pantalla para idioma español
void PulsaIntro();
// presenta mensaje pulsa intro para continuar
int Pregunta();
// si es s/S devuelve 0, para otra letra devuelve 1
int agnoactual() ;
void MensajeBienvenida();
void MensajeDespedida();
void MenuPrincipal( int , struct amigo_str * ) ;
// 1º número de amigos // 2º datos de amigos
void MostrarMenuPrincipal(int *);
// 1º Opcion elegida
void LimpiaCadena ( int , char * );
// 1º tamaño de la cadena // 2º puntero a la cadena
// limpia el /n y lo cambia por /0 en la cadena
int ValidaTelefono ( int , char * );
int ValidarNumero (int , int );
int LeeDatos( int * , struct amigo_str * ) ;
// 1º número de amigos // 2º datos amigos //
// devuelve 0 si terminacion con exito
void Muestra (int , struct amigo_str *) ;
int Agniadir ( int * , struct amigo_str * ) ;
int Eliminar ( int * , struct amigo_str * ) ;
int Modificar ( int , struct amigo_str * ) ;
int Buscar ( int , struct amigo_str * ) ;
int Guardar ( int , struct amigo_str * ) ;
int OrdenaNombreAscendente(int ,struct amigo_str *);
int OrdenaNombreDescendente(int ,struct amigo_str *);
int OrdenaAgnoAscendente(int ,struct amigo_str *);
int OrdenaAgnoDescendente(int ,struct amigo_str *);
int genera_clave(int , struct amigo_str *,char * , int ) ;
void Salir(int *) ;
// 1º Opcion elegida
int main()
{
int num ; // número de amigos
struct amigo_str amigo[max] ;
Espagnol();
MensajeBienvenida();
LeeDatos(&num,amigo);
MenuPrincipal(num,amigo) ;
MensajeDespedida();
return 0;
}
//-------------------------------------------------------------------------
void Espagnol()
{
setlocale(LC_ALL,"spanish");
system("chcp 1252 >> nul");
}
//-------------------------------------------------------------------------
void PulsaIntro()
{
printf("\n\tPulsa intro para continuar.");
fflush(stdin); getchar() ; fflush(stdin);
}
//-------------------------------------------------------------------------
int Pregunta()
{
char letra='n' ;
fflush(stdin);scanf("%c",&letra);fflush(stdin);
if(letra=='s' ||letra=='S' ){ return 0 ;}
else { return 1 ;}
}
//-------------------------------------------------------------------------
void LimpiaCadena (int tam , char *s)
{
int i=0 ;
for (i=0;i<tam;i++){ if( s[i]=='\n') {s[i]='\0'; break;} }
}
//-------------------------------------------------------------------------
int agnoactual()
{
char fechahora[128];
time_t tiempo = time(0);
struct tm *tlocal = localtime(&tiempo);
strftime(fechahora,128,"20%y",tlocal);
//printf("---%s\n",fechahora);PulsaIntro();
return atoi(fechahora);
}
//-------------------------------------------------------------------------
int ValidaTelefono(int tam , char *s)
{
int i=0 ;
for (i=0;i<tam-1;i++)
{
if( isdigit(s[i])!= 1) { return 1 ; }
}
return 0 ;
}
//-------------------------------------------------------------------------
int LeeDatos( int *num , struct amigo_str amigo[] )
{
int i , j , tamagno ;
char cadena[1024];char auxcadena[1024];
char auxfecha[3];
char *punt ; char delimitador1[2]=";" ; char delimitador2[2]="-";
FILE *fp ;
fp = fopen( "bdamigos.csv" , "rt" );
if ( fp == NULL)
{
printf("\n ¡No encuentro el fichero 'bdamigos.csv'!\n");
printf("\n ¿Es la primera vez que ejecuta el programa en este equipo? (s/n): ");
if(Pregunta()==0)
{
printf("\n -Si es la primera vez que ejecuta el programa, \n");
printf(" este, creará la Base de Datos y estará vacia.\n\n");
PulsaIntro();
system("cls");
*num=0 ;
return 0 ;
}
else
{
printf("\n -Asegúrese de que el fichero 'bdamigos.csv' y \n ");
printf(" el ejecutable están en la misma carpeta.\n ");
printf("\n -En caso de persistir el problema \n ");
printf(" póngase en contacto con nuestro servicio técnico.\n ");
printf("\n Este programa terminará ahora.\n\n");
PulsaIntro();
system("cls");
exit (1) ;
}
}
else
{
*num=0 ;
while (fgets(cadena,1024,fp) != NULL)
{
*num=*num+1;
}
if( *num > max )
{
printf("\tSolo puedo leer los primeros %d amigos.\n",max);
PulsaIntro();
*num = max ;
}
//printf("---%d---",*num);
//PulsaIntro();
rewind(fp);
for (i=0 ; i < *num ; i++)
{
fgets(cadena,1024,fp);
LimpiaCadena(sizeof(cadena),cadena) ;
strcpy(auxcadena,cadena);
punt=strtok(auxcadena,delimitador1);
punt=strtok(NULL,delimitador1);
punt=strtok(NULL,delimitador1);
punt=strtok(NULL,delimitador1);
punt=strtok(NULL,delimitador2);
punt=strtok(NULL,delimitador2);
if(punt==NULL) {
system("cls");
printf("\n -Error Grave de formato en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -No se leerá ningun amigo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
*num=0 ;
exit (1) ;}
punt=strtok(cadena,delimitador1);
tamagno=sizeof(amigo[i].nombre) ;
if( strlen(punt) > tamagno-1 ){*(punt+tamagno-1)='\0';}
strcpy(amigo[i].nombre,punt);
amigo[i].nombre[0]=toupper(amigo[i].nombre[0]);
punt=strtok(NULL,delimitador1); //punt= strtok(0,";");
tamagno=sizeof(amigo[i].apellido1) ;
if( strlen(punt) > tamagno-1 ){*(punt+tamagno-1)='\0';}
strcpy(amigo[i].apellido1,punt);
amigo[i].apellido1[0]=toupper(amigo[i].apellido1[0]);
punt=strtok(NULL,delimitador1); //punt= strtok(0,";");
tamagno=sizeof(amigo[i].apellido2) ;
if( strlen(punt) > tamagno-1 ){*(punt+tamagno-1)='\0';}
strcpy(amigo[i].apellido2,punt);
amigo[i].apellido2[0]=toupper(amigo[i].apellido2[0]);
punt=strtok(NULL,delimitador1); //punt= strtok(0,";");
tamagno=sizeof(amigo[i].telefono) ;
if( strlen(punt) > tamagno-1 ){*(punt+tamagno-1)='\0';}
strcpy(amigo[i].telefono,punt);
if( ValidaTelefono (tamagno , amigo[i].telefono) != 0 )
{
system("cls");
printf("\n -Error Grave de formato en el campo 'teléfono' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
punt=strtok(NULL,delimitador2); //punt= strtok(0,"-");
if( strlen(punt) > 2 ){*(punt+2)='\0';}
strcpy(auxfecha,punt);
for(j=0;j<2;j++)
{
if( isdigit(auxfecha[j]) != 1 )
{
system("cls");
printf("\n -Error Grave de formato en el campo 'dÃa' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
}
amigo[i].dia=atoi(auxfecha);
if( (amigo[i].dia < 1 ) || (amigo[i].dia > 31 ) )
{
system("cls");
printf("\n -Error en el número en el campo 'dÃa' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
punt=strtok(NULL,delimitador2); //punt= strtok(0,"-");
if( strlen(punt) > 2 ){*(punt+2)='\0';}
strcpy(auxfecha,punt);
for(j=0;j<2;j++)
{
if( isdigit(auxfecha[j]) != 1 )
{
system("cls");
printf("\n -Error Grave de formato en el campo 'mes' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
}
amigo[i].mes=atoi(auxfecha);
if( (amigo[i].mes < 1 ) || (amigo[i].mes > 12 ) )
{
system("cls");
printf("\n -Error en el número en el campo 'mes' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
punt=strtok(NULL,delimitador2); //punt= strtok(0,"-");
if( strlen(punt) > 2 ){*(punt+2)='\0';}
strcpy(auxfecha,punt);
for(j=0;j<2;j++)
{
if( isdigit(auxfecha[j]) != 1 )
{
system("cls");
printf("\n -Error Grave de formato en el campo 'año' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
}
amigo[i].agno=atoi(auxfecha);
if( ( 2000+amigo[i].agno) > agnoactual() )
{
system("cls");
printf("\n -Error Grave en el campo 'año' en linea %d del fichero bdamigos.csv\n",i+1);
printf(" Año superior al año actual. \n");
printf(" Corregir el error e intentar leer de nuevo. \n ");
printf("\n -Este programa será abortado aquÃ. \n ");
exit (1) ;
}
}
fclose(fp);
}
return 0;
}
//-------------------------------------------------------------------------
void Muestra ( int num , struct amigo_str amigo[] )
{
int i,j,huecos;
if (num==0) {
printf("\n\tNo hay amigos que mostrar.\n");
}
else
{
printf("\n\t-----------------------------------------\n");
printf("\tNúmero de amigos mostrados %.3d\n",num);
printf("\t-----------------------------------------\n");
printf("\n\tNum Nombre ");
printf("Apellido 1º ");
printf("Apellido 2º ");
printf("Teléfono ");
printf("Fecha de alta\n");
printf("\t--- ------------------------- ");
printf("-------------------- ");
printf("-------------------- ");
printf("--------- ");
printf("-------------\n");
for (i=0 ; i < num ; i++)
{
printf("\t%.3d ",i);
printf("%s",amigo[i].nombre);
huecos=sizeof(amigo[i].nombre)-strlen(amigo[i].nombre);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].apellido1);
huecos=sizeof(amigo[i].apellido1)-strlen(amigo[i].apellido1);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].apellido2);
huecos=sizeof(amigo[i].apellido2)-strlen(amigo[i].apellido2);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].telefono);
huecos=sizeof(amigo[i].telefono)-strlen(amigo[i].telefono);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%.2d-",amigo[i].dia) ;
printf("%.2d",amigo[i].mes) ;
printf("-20%.2d\n",amigo[i].agno) ;
}
}
}
//-------------------------------------------------------------------------
void MuestraUno(int i , struct amigo_str amigo[] )
{
int j , huecos ;
printf("\n\tNum Nombre ");
printf("Apellido 1º ");
printf("Apellido 2º ");
printf("Teléfono ");
printf("Fecha de alta\n");
printf("\t--- ------------------------- ");
printf("-------------------- ");
printf("-------------------- ");
printf("--------- ");
printf("-------------\n");
printf("\t%.3d ",i);
printf("%s",amigo[i].nombre);
huecos=sizeof(amigo[i].nombre)-strlen(amigo[i].nombre);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].apellido1);
huecos=sizeof(amigo[i].apellido1)-strlen(amigo[i].apellido1);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].apellido2);
huecos=sizeof(amigo[i].apellido2)-strlen(amigo[i].apellido2);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%s",amigo[i].telefono);
huecos=sizeof(amigo[i].telefono)-strlen(amigo[i].telefono);
for (j=0; j < huecos ; j++){ printf(" "); }
printf("%.2d-",amigo[i].dia) ;
printf("%.2d",amigo[i].mes) ;
printf("-20%.2d\n",amigo[i].agno) ;
}
//-------------------------------------------------------------------------
void MensajeBienvenida()
{
system("cls");
printf( "\t\t*****************************\n");
printf( "\t\t** Bienvenido al Programa. **\n");
printf( "\t\t*****************************\n");
printf( "\tEste programa gestiona la base de datos de tus amigos\n");
printf( "\ty sus telefonos.\n");
printf( "\n\tRequisitos de funcionamiento:\n");
printf( "\n\t-Consola del Sistema Operativo Windows.\n");
printf( "\n\t-En la ventana de la consola hacer click en el icono\n");
printf( "\t de la esquina superior izquierda'.\n");
printf( "\t Seleccionar: [Propiedades] [Fuente] en 'Consolas',\n");
printf( "\t para poder visualizar acentos y ñ en español.\n\n");
printf( "\t-Fijar el ancho y alto de la ventana en un mÃnimo de 120 columnas y 80 filas.\n\n\n");
PulsaIntro();
system("cls");
}
//-------------------------------------------------------------------------
void MensajeDespedida()
{
system("cls");
printf( "\t\t********************************************\n");
printf( "\t\t** Gracias por utilizar nuestro programa. **\n");
printf( "\t\t********************************************\n\n");
printf("\n\tPulsa intro para terminar.");
fflush(stdin); getchar() ; fflush(stdin);
system("cls");
}
//-------------------------------------------------------------------------
void MenuPrincipal(int num , struct amigo_str amigo[])
{
int opcion;
do {
MostrarMenuPrincipal(&opcion);
switch(opcion)
{
case 1: OrdenaNombreAscendente(num,amigo);
printf("\n\tOrden Ascendente por el campo Nombre.");
Muestra(num,amigo);
PulsaIntro();
break;
case 2: OrdenaNombreDescendente(num,amigo);
printf("\n\tOrden Descendente por el campo Nombre.");
Muestra(num,amigo);
PulsaIntro();
break;
case 3: OrdenaAgnoAscendente(num,amigo);
printf("\n\tOrden Antigüedad Ascendente.");
Muestra(num,amigo);
PulsaIntro();
break;
case 4: OrdenaAgnoDescendente(num,amigo);
printf("\n\tOrden Antigüedad Descendente.");
Muestra(num,amigo);
PulsaIntro();
break;
case 5: Agniadir(&num,amigo);
PulsaIntro();
break;
case 6: Eliminar(&num,amigo);
PulsaIntro();
break;
case 7: Buscar(num,amigo);
PulsaIntro();
break;
case 8: Modificar(num,amigo);
break;
case 9: Guardar(num,amigo);
PulsaIntro();
break;
case 0: Salir(&opcion);
break;
}
} while(opcion != 0);
}
//-------------------------------------------------------------------------
void MostrarMenuPrincipal(int *opcion)
{
do
{
system("cls");
printf( " \t------------------------------------\n");
printf( " \t Amigos y teléfonos. \n");
printf( " \t------------------------------------\n");
printf( " 1.-Mostrar amigos ordenados por nombre (Ascendente). (1 Punto) \n");
printf( " 2.-Mostrar amigos ordenados por nombre (Descendente). (1 Punto) \n");
printf( " 3.-Mostrar amigos ordenados por Antigüedad (Ascendente).(1 Punto) \n");
printf( " 4.-Mostrar amigos ordenados por Antigüedad (Descendente).(1 Punto) \n");
printf( " 5.-Añadir amigo. (1 Punto) \n");
printf( " 6.-Eliminar amigo.(1 Punto) \n");
printf( " 7.-Buscar amigo. (1 Punto) \n");
printf( " 8.-Modificar amigo. (1 Punto) \n");
printf( " 9.-Guardar.\n");
printf( " 0.-Salir\n" );
printf(" \tIntroduzca Opción: ");
fflush(stdin);scanf("%d",& *opcion ); fflush(stdin) ;
system("cls");
if (( *opcion<0) || (*opcion>9)){
printf("Error: Opcion no valida.\n\n");
PulsaIntro() ;
}
} while ((*opcion<0) || (*opcion>9));
}
//-------------------------------------------------------------------------
void Salir(int *opcion)
{
printf("\t------------------------------------------------------------\n");
printf("\tAseguresé de haber guardado la Base de Datos antes de salir.\n");
printf("\t------------------------------------------------------------\n\n");
printf("¿Está seguro de querer salir del programa? (s/n): ");
if(Pregunta()!=0){ *opcion=1;}
}
//-------------------------------------------------------------------------
int Guardar ( int num , struct amigo_str amigo[] )
{
// Comprueba que puede escribir en el disco.
// Escribe la base de datos,
// por último, cierra el fichero
int i ;
if (num==0) {
printf("\n\tNo hay amigos que guardar.\n");
return 1 ;
}
FILE *fp;
fp=fopen("bdamigos.csv","wt");
if ( fp == NULL)
{
printf("¡No puedo guardar el fichero 'libreria.dat'!\n");
printf("\n -Asegúrese de que el disco no esté \n");
printf(" protegido contra escritura.\n\n");
return 1;
}
else
{
for (i=0 ; i < num ; i++)
{
fprintf(fp,"%s",amigo[i].nombre) ;
fprintf(fp,";") ;
fprintf(fp,"%s",amigo[i].apellido1) ;
fprintf(fp,";") ;
fprintf(fp,"%s",amigo[i].apellido2) ;
fprintf(fp,";") ;
fprintf(fp,"%s",amigo[i].telefono) ;
fprintf(fp,";") ;
fprintf(fp,"%.2d",amigo[i].dia) ;
fprintf(fp,"-") ;
fprintf(fp,"%.2d",amigo[i].mes) ;
fprintf(fp,"-") ;
fprintf(fp,"%.2d",amigo[i].agno) ;
fprintf(fp,"\n") ;
}
fclose(fp);
}
printf("\n");
printf("\t------------------------------------------\n");
printf("\tLa Base de Datos se ha guardado con exito.\n");
printf("\t------------------------------------------\n\n");
return 0;
}
//-------------------------------------------------------------------------
int OrdenaNombreAscendente( int num , struct amigo_str amigo[] )
{
struct amigo_str aux_amigo[1];
int i , j ; int cont1 , cont2 ;
if(num<=1) { return 0; }
for (cont1=1 ; cont1<=num-1 ; cont1++)
{
i=0 ; j=1 ;
for (cont2=1 ; cont2<=num-1 ; cont2++)
{
if( strcmp(amigo[i].nombre,amigo[j].nombre) > 0 )
{
aux_amigo[0]=amigo[i] ;
amigo[i]=amigo[j] ;
amigo[j]=aux_amigo[0];
}
i=i+1 ;
j=j+1 ;
}
}
return 0;
}
//-------------------------------------------------------------------------
int OrdenaNombreDescendente( int num , struct amigo_str amigo[] )
{
struct amigo_str aux_amigo[1];
int i , j ; int cont1 , cont2 ;
if(num<=1) { return 0; }
for (cont1=1 ; cont1<=num-1 ; cont1++)
{
i=0 ; j=1 ;
for (cont2=1 ; cont2<=num-1 ; cont2++)
{
if( strcmp(amigo[i].nombre,amigo[j].nombre) < 0 )
{
aux_amigo[0]=amigo[i] ;
amigo[i]=amigo[j] ;
amigo[j]=aux_amigo[0];
}
i=i+1 ;
j=j+1 ;
}
}
return 0;
}
//-------------------------------------------------------------------------
int OrdenaAgnoAscendente( int num , struct amigo_str amigo[] )
{
int i , j ; int cont1 , cont2 ;
struct amigo_str aux_amigo[1] ;
char aux_fecha[7]; int numfecha[num] ; int aux_numfecha[1] ;
if(num<=1){ return 0 ; }
for(i=0;i<num;i++) {
sprintf(aux_fecha,"%.2d%.2d%.2d",amigo[i].agno,amigo[i].mes,amigo[i].dia);
numfecha[i]=atoi(aux_fecha) ;
}
for (cont1=1 ; cont1<=num-1 ; cont1++)
{
i=0 ; j=1;
for (cont2=1 ; cont2<=num-1 ; cont2++)
{
if( numfecha[i] > numfecha[j] )
{
aux_numfecha[0]=numfecha[i];
aux_amigo[0]=amigo[i];
numfecha[i]=numfecha[j];
amigo[i]=amigo[j] ;
numfecha[j]=aux_numfecha[0];
amigo[j]=aux_amigo[0];
}
i=i+1 ; j=j+1 ;
}
}
return 0;
}
//-------------------------------------------------------------------------
int OrdenaAgnoDescendente( int num , struct amigo_str amigo[] )
{
int i , j ; int cont1 , cont2 ;
struct amigo_str aux_amigo[1] ;
char aux_fecha[7]; int numfecha[num] ; int aux_numfecha[1] ;
if(num<=1){ return 0 ; }
for(i=0;i<num;i++) {
sprintf(aux_fecha,"%.2d%.2d%.2d",amigo[i].agno,amigo[i].mes,amigo[i].dia);
numfecha[i]=atoi(aux_fecha) ;
}
for (cont1=1 ; cont1<=num-1 ; cont1++)
{
i=0 ; j=1;
for (cont2=1 ; cont2<=num-1 ; cont2++)
{
if( numfecha[i] < numfecha[j] )
{
aux_numfecha[0]=numfecha[i];
aux_amigo[0]=amigo[i];
numfecha[i]=numfecha[j];
amigo[i]=amigo[j] ;
numfecha[j]=aux_numfecha[0];
amigo[j]=aux_amigo[0];
}
i=i+1 ; j=j+1 ;
}
}
return 0;
}
//-------------------------------------------------------------------------
int Agniadir ( int *num , struct amigo_str amigo[] )
{
int i ; //int clave_encontrada=0;
int L_R=0 ;
//int contador_libros=0 ; int contador_revistas=0 ;
char clavegenerada[6] ;
int secnum;
if( *num==max)
{
printf("\n ¡AGENDA LLENA!\n");
printf("\n -Antes de añadir, debe eliminar \n ");
printf(" algún contacto de la agenda.\n\n");
return 1;
}
do
{
system("cls") ;
printf("\t---------------\n");
printf("\tAÑADIR CONTACTO\n");
printf("\t---------------\n");
printf(" 1. Añadir contacto.\n");
printf(" 0. Volver.\n");
printf("\t Introduce opción: ");
fflush(stdin);scanf("%d",&i); fflush(stdin) ;
system("cls") ;
} while( i<0 || i>2 ) ;
secnum=*num;
if(i==0) { return 1 ;}
if(i==1) {
L_R=1;
GeneraClave( *num , amigo , clavegenerada , L_R ) ;
//printf(" [%.3d]=",*num) ;
//printf("%s\n",clavegenerada) ;
strcpy(amigo[*num].clave,clavegenerada);
printf("Introduce nombre:\n");
fflush(stdin);
fgets(amigo[*num].nombre);
fflush(stdin);
//printf("%s\n",libreria[*num].elemento.libro.titulo);
printf("Introduce apellido:\n");
fflush(stdin);
fgets(amigo[*num].apellido1);
fflush(stdin);
//printf("%s\n",libreria[*num].elemento.libro.autor);
printf("Introduce segundo apellido: \n");
fflush(stdin);
scanf("%d",&amigo[*num].apellido2);
fflush(stdin);
//printf("%d\n",agnoactual());
printf("Introduce año: \n",agnoactual());
fflush(stdin);
scanf("%d",&amigo[*num].agno);
fflush(stdin);
printf("Introduce número de teléfono:\n");
fflush(stdin);
fgets(amigo[*num].telefono,stdin);
fflush(stdin);
}
if(i==2)
{L_R=2;
GeneraClave( *num , amigo , clavegenerada , L_R ) ;
//printf(" [%.3d]=",*num) ;
//printf("%s\n",clavegenerada) ;
strcpy(amigo[*num].clave,clavegenerada);
return 0;
}
//-------------------------------------------------------------------------
int Eliminar( int *num , struct amigo_str amigo[] )
{
int i ; int clave_encontrada=0; int L_R=0 ;
int contador_contactos=0 ;
char auxclave[6] ;
if( *num==0)
{
printf("\n\tNo hay ningún libro o revista que eliminar.\n");
return 1;
}
do
{
system("cls") ;
printf("\t---------------\n");
printf("\tELIMINAR CONTACTO\n");
printf("\t---------------\n");
printf(" 1. Eliminar Libro.\n");
printf(" 0. Volver.\n");
printf("\t Introduce opción: ");
fflush(stdin);scanf("%d",&i); fflush(stdin) ;
system("cls") ;
} while( i<0 || i>2 ) ;
if(i==0) { return 1 ;}
//OrdenaClaveAscendente(*num,libreria);
if(i==1) {L_R=1;}
if(i==2) {L_R=2;}
for(i=0;i<*num;i++)
{
if( amigo[i].clave[0]=='L') {contador_contactos=contador_contactos+1;}
}
if(contador_contactos==0 && L_R==1)
{
printf("\n\tNo hay contactos que eliminar.\n");
return 1;
}
if (L_R==1){Muestra(0,*num,amigo,1);}
printf("Introduzca la clave del contacto que desea eliminar:\n");
fflush(stdin);
fgets(auxclave,sizeof(auxclave),stdin);
LimpiaCadena(sizeof(auxclave),auxclave);
fflush(stdin);
printf("%s\n",auxclave);
if (L_R==1 && auxclave[0]=='R'){system("cls");
printf("\n\t¡Debe ser una Clave de un contacto!\n\n");
return 1;}
for (i=0 ;i<*num;i++)
{
if( strcmp(auxclave,amigo[i].clave) == 0 )
{
clave_encontrada=0;
break;
}
else
{
clave_encontrada=1;
}
}
system("cls");
if( clave_encontrada == 1 ){ printf("\n\t¡Clave no encontrada!\n\n");
return 1; }
if( clave_encontrada == 0 )
{
if(L_R==1) { Muestra(i,i+1,amigo,1); }
//MuestraSoloUno(i,jugador);
//printf("\n");
printf("\n -Se dispone a eliminar un contacto.\n");
printf(" ¿Está seguro? (s/n) ");
if (Pregunta()==0){ amigo[i].clave[2]='X';
OrdenaNumeroClaveAscendente(*num,amigo);
//Muestra(0,*num,libreria,0);
*num=*num-1;
//Muestra(0,*num,libreria,0);
printf("\n¡Contacto eliminado!\n\n");
}
else {printf("\n¡El contacto NO ha sido eliminado!\n\n");}
}
return 0;
}
//-------------------------------------------------------------------------
int ValidarNumero (int aux_num, int num)
{
if ( (aux_num <0) || (aux_num >= num) )
{
printf("\tNúmero no válido. Introduzca un número válido.\n") ;
return 1 ;
}
return 0 ;
}
//-------------------------------------------------------------------------
int Buscar( int num , struct amigo_str amigo[] )
{
char cadena_buscada[44];
int i , j , coincidencia ;
char *pstr1 , *pstr2 ;
struct amigo_str auxamigo[max] ;
printf("\n");
printf("introduzca la cadena a buscar: \n\n\t ");
fflush(stdin);
fgets(cadena_buscada,sizeof(cadena_buscada),stdin);
fflush(stdin);
for(i=0;i<1024;i++)
{
if (cadena_buscada[i]=='\n') {cadena_buscada[i]='\0'; break; }
}
//printf("\n%s ",cadena_buscada); getchar();
j=0; coincidencia=0;
for(i=0;i<num;i++)
{
//printf("\n%s ----",cadena_buscada); getchar();
pstr1 = strstr(amigo[i].nombre,cadena_buscada);
pstr2 = strstr(libro[i].número,cadena_buscada);
if( (pstr1 != NULL) || (pstr2 != NULL) )
{
auxamigo[j]=amigo[i] ;
j=j+1;
coincidencia=1;
}
}
if (coincidencia==1) { Muestra (j,auxamigo); }
else{ printf("\n\t No encontré ninguna coincidencia.\n\n\t");
PulsaIntro(); }
return 0;
//-------------------------------------------------------------------------
int Modificar( int num , struct amigo_str amigo[] )
{
int i ; int clave_encontrada=0; int L_R=0 ;
int contador_contactos=0 ;
char auxclave[6] ;
if( num==0)
{
printf("\n\tNo hay ningún contacto que modificar.\n");
return 1;
}
do
{
system("cls") ;
printf("\t---------------\n");
printf("\tMODIFICAR contacto\n");
printf("\t---------------\n");
printf(" 1. Modificar contacto.\n");
printf(" 0. Volver.\n");
printf("\t Introduce opción: ");
fflush(stdin);scanf("%d",&i); fflush(stdin) ;
system("cls") ;
} while( i<0 || i>2 ) ;
if(i==0) { return 1 ;}
//OrdenaClaveAscendente(*num,libreria);
if(i==1) {L_R=1;}
for(i=0;i<num;i++)
{
if( amigo[i].clave[0]=='L') {contador_contactos=contador_contactos+1;}
}
if(contador_contactos==0 && L_R==1)
{
printf("\n\tNo hay contactos que modificar.\n");
return 1;
}
if (L_R==1){Muestra(0,num,amigo,1);}
printf("Introduzca la clave del contacto que desea modificar:\n");
fflush(stdin);
fgets(auxclave,sizeof(auxclave),stdin);
LimpiaCadena(sizeof(auxclave),auxclave);
fflush(stdin);
if (L_R==1 && auxclave[0]=='R'){system("cls");
printf("\n\t¡Debe ser una Clave de un contacto!\n\n");
return 1;}
printf("%s\n",auxclave);
for (i=0 ;i<num;i++)
{
if( strcmp(auxclave,amigo[i].clave) == 0 )
{
clave_encontrada=0;
break;
}
else
{
clave_encontrada=1;
}
}
system("cls");
if( clave_encontrada == 1 ){ printf("\n\t¡Clave no encontrada!\n\n");
return 1; }
int opcion=1;
if( clave_encontrada == 0 )
{
if(L_R==1)
{
do {
system("cls");
Muestra(i,i+1,libreria,1);
printf(" 1. Modificar nombre.\n");
printf(" 2. Modificar apellido1.\n");
printf(" 3. Modificar apellido2.\n");
printf(" 4. Modificar número.\n");
printf(" 5. Modificar año.\n");
printf(" 0. Volver al menú principal.\n");
printf("\n \tIntroduzca Opción: ");
fflush(stdin);scanf("%d",&opcion ); fflush(stdin) ;
switch(opcion)
{
case 1: printf("\nValor actual del nombre: '%s'\n",amigo[i].nombre);
printf("\nIntroduce nuevo nombre:\n");
fflush(stdin);
fgets(amigo[i].nombre,44,stdin);
fflush(stdin);
LimpiaCadena(sizeof(amigo[i].nombre),amigo[i].nombre);
break;
case 2: printf("\nValor actual del apellido1: '%s'\n",amigo[i].apellido1);
printf("\nIntroduce nuevo apellido1:\n");
fflush(stdin);
fgets(amigo[i].apellido1,33,stdin);
fflush(stdin);
LimpiaCadena(sizeof(amigo[i].apellido1),amigo[i].apellido1);
break;
case 3: printf("\nValor actual del apellido2: '%s'\n",amigo[i].apellido2);
printf("\nIntroduce nuevo apellido2:\n");
fflush(stdin);
fgets(amigo[i].apellido233,stdin);
fflush(stdin);
LimpiaCadena(sizeof(amigo[i].apellido2),amigo[i].apellido2);
break;
case 4:
printf("%d\n",amigo[i].agno);
do
{
printf("\nIntroduce nuevo año : %d\n",agnoactual());
fflush(stdin);
scanf("%d",&amigoi].agno);
fflush(stdin);
}while( amigo[i].agno > agnoactual() || amigo[i].agno < 1970 );
break;
case 0: return 0;
break;
}
} while(opcion != 0);
}
}
return 0;
}
//-------------------------------------------------------------------------
int GeneraClave(int num,struct amigo_str amigo[],char clavegenerada[],int L_R)
{
char *punt ; char delimitador[2]="-";
int i ,j ; int cont1 , cont2 ;
char aux[max][6]; char num_aux[max][4]; int N[max] ; int Naux ;
int num_buscado;
char cadena_buscada[4]="000" ;char auxcadena_buscada[4];
for(i=0;i<num;i++)
{
strcpy(aux[i],amigo[i].clave);
punt=strtok(aux[i],delimitador);
punt=strtok(NULL,delimitador); //punt= strtok(0,";");
strcpy(num_aux[i],punt) ;
N[i]=atoi(num_aux[i]);
}
/* num=3 ;
N[0]=0 ;
N[1]=1 ;
N[2]=4 ; */
if(num==0){ num_buscado=0; }
if(num==1)
{
if( N[0]==max ) { num_buscado=max-1; } //sin ordenar!!
else { num_buscado=N[0]+1 ;}
}
if(num>1)
{
// Ordenamos ascendente
for (cont1=1 ; cont1<=num-1 ; cont1++)
{
i=0 ; j=1 ;
for (cont2=1 ; cont2<=num-1 ; cont2++)
{
if( N[i]>N[j])
{
Naux = N[i] ;
N[i]= N[j] ;
N[j]= Naux ;
}
i=i+1 ;
j=j+1 ;
}
}
//fin ordenar
// Buscamos el numero
for (i=0;i<num-1;i++)
{
if( (N[i+1]-N[i])>1 ) { num_buscado=N[i+1]-1 ; break ; }
else {
if(N[i+1]<max ) {num_buscado=N[i+1]+1;}
if(N[i+1]==max ){num_buscado=N[i+1]-num;}
}
}
// Fin de la busqueda
}
for(i=0;i<num;i++)
{
printf("%.3d\n",N[i]) ;
}
printf("num_buscado=%.3d\n",num_buscado) ;
// convierto el numero en cadena
itoa(num_buscado,auxcadena_buscada,10);
printf("auxcadena_buscada=%s\n",auxcadena_buscada) ;
// relleno con 0 por la izquierda
for(i=0;i<strlen(auxcadena_buscada);i++)
{
cadena_buscada[i+strlen(cadena_buscada)-strlen(auxcadena_buscada)] = auxcadena_buscada[i];
}
printf("cadena_buscada=%s\n",cadena_buscada) ;
if(L_R==1)
{
strcpy(clavegenerada,"L-");
strcat(clavegenerada,cadena_buscada);
}
}
printf("clavegenerada='%s'\n",clavegenerada) ;
return 0 ;
}
1. No hace falta que pongas la pregunta 4 veces. Aunque la publiques como usuario anónimo, se aprobará al cabo de un rato o de unas horas.
2. Un programa de 1184 líneas es imposible que funcione a la primera, especialmente en lenguaje C. Se va haciendo cada trozo, probando y ampliando.
3. Los mensajes de error son tus amigos. Por ejemplo:
main.c:740:8: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
main.c:766:8: warning: too many arguments for format [-Wformat-extra-args]
main.c:773:1: error: too few arguments to function ‘fgets’
main.c:825:19: error: subscripted value is neither array nor pointer nor vector
main.c:835:13: error: too many arguments to function ‘Muestra’
main.c:923:20: error: ‘libro’ undeclared (first use in this function)
main.c:923:30: error: stray ‘\303’ in program
main.c:1025:27: error: ‘libreria’ undeclared (first use in this function)
(...)
Todos ellos te van avisando de qué está mal y donde. Por ejemplo, estás usando mal "fgets", también "strcpy", también tu propia función "Muestra", nombras variables que no has declarado, tienes variables cuyo nombre tiene acentos...
hola lily
nacho tiene toda la razon, lo normal es que tengas el programa en diferentes archivos, y vayas probando a medida que vas haciendo asi detectaras errores en un pequeño trozo de codigo con lo que sera mas facil encontrar el fallo
por ej creas toda la parte de menus y cuando te funcione correctamente pasas a implementar las acciones mas basicas del menu, asi podras hacer una pregunta sobre un error concreto y sera para todos mas facil solucionarlo
suerte ;)
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)