[ Foro de C ]

Ayuda con programa en lenguaje c

07-Jun-2020 17:22
Lily Gmez Lpez
2 Respuestas

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 ;
}


 


07-Jun-2020 18:04
Nacho Cabanes (+64)

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...


13-Jun-2020 11:32
Invitado (carlos)

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.)