// SIMULA CON ARCHIVOS LA CREACION DE UNA AGENDA Y PERMITE *, >, <, =, ETC #include <stdio.h> #include <stdlib.h> #include <string.h> void Intro_Datos( void ); void Intro_Materias( int ); void Muestra_Base_Datos( char* ); void Menu(); void BuscaPorNombre(char*, int); void BuscaPorCalificacion( char* ); char *BuscaNumero( char* ); void InsertaDatos( ); void VeArchivo(); #define MAX 10 struct Alumno { char Nombre[80]; char Domicilio[100]; int Edad; int ID; }; struct Materia { int ID; char Nombre[80]; float Calificacion; }; struct Alumno VAlumno[MAX]; struct Materia VMateria[5*MAX][5]; FILE *DATOS; int main(void) { Intro_Datos(); Menu(); return 1; } void Menu(void) { int Ciclo = 1, Opcion=0; while( Ciclo ) { system("clear"); printf("======================\n"); printf("BUSQUEDA POR:\n"); printf("======================\n"); printf("1.- NOMBRE\n"); printf("2.- CALIFICACION\n"); printf("3.- INSERTAR DATOS...\n"); printf("4.- SALIR\n"); printf("======================\n"); printf("Seleccione una opcion (1, 2, 3): "); scanf("%i", &Opcion); if (Opcion != 1 && Opcion != 2 && Opcion != 3 && Opcion != 4) continue; if (Opcion == 1) BuscaPorNombre("Introduzca el nombre del alumno: ", 0); if (Opcion == 2) BuscaPorNombre("Introduce la calificacion a buscar: ", 1); if (Opcion == 3) InsertaDatos( ); if (Opcion == 4) return; } } void BuscaPorCalificacion(char *Calif) { // SE TRABAJA PRIMERO LOS OPERADORES =, >, < char *PosOper = NULL, *NUM=NULL; char Numero[80]; PosOper = strchr( Calif, '>'); if ( !PosOper ) PosOper = strchr( Calif, '<'); if ( !PosOper ) PosOper = strchr( Calif, '='); switch ( PosOper[0] ) { case '>': printf("Es el operador >\n"); strcpy(Numero, BuscaNumero(Calif)); printf("Y el numero es = %s\n", Numero ); break; case '<': printf("Es el operador <\n"); break; case '=': printf("Es el operador =\n"); break; } alto(); } char *BuscaNumero( char *CAD ) { int Pos = 0, x = 0, y=0; char Numero[80]; for (Pos=0; Pos < strlen(CAD); Pos++) if ( isdigit(CAD[Pos] ) ) break; for (y = Pos; y < strlen(CAD); y++) { Numero[x] = CAD[y]; printf("Numero = %c\n", Numero[x]); x++; } Numero[x] = '\0'; printf("Numero TOTAL = %s\n", Numero); alto(); return Numero; } int alto() { int x=0; printf("Teclea un numero"); scanf("%i", &x); return x; } void BuscaPorNombre(char *MESS, int TipoDato) { char *Chavo; printf("%s", MESS); Chavo = (char*)malloc(80); Chavo[0] = '\0'; getchar(); // SOLO PARA VACIAR AL BUFFER -enter- gets(Chavo); ( TipoDato ) ? BuscaPorCalificacion( Chavo ) : Muestra_Base_Datos( Chavo ); } void Intro_Datos( void ) { int x=0; for(x=0; x < MAX; x++) { sprintf( VAlumno[x].Nombre, "Alumno %i", x+1); sprintf( VAlumno[x].Domicilio, "Domicilio %i", x+1); VAlumno[x].Edad = (x+1)*10; VAlumno[x].ID = x; Intro_Materias(x); } strcpy(VAlumno[7].Nombre, "Rafael"); strcpy(VAlumno[8].Nombre, "Ramiro"); strcpy(VAlumno[2].Nombre, "Raul"); strcpy(VAlumno[9].Nombre, "Carlos"); } void Intro_Materias( int ID ) { int x = 0; for(x = 0; x < 5; x++) { VMateria[ID][x].ID = ID; sprintf(VMateria[ID][x].Nombre, "MATERIA %i", x); VMateria[ID][x].Calificacion = 5 + x*.1; } } void Muestra_Base_Datos( char *Nombre ) { int A=0, M=0; // Variables para los ciclos M= MATERIA, A=ALUMNO int ID=0; char VN[100][100]; int VID[100]; int N=0; int LCAD=0; char SUBCAD[80]; printf("=============================================================\n"); printf("NOMBRE\t\tDOMICILIO\tEDAD\n"); printf("=============================================================\n"); if ( strchr(Nombre, '*') ) { LCAD = strlen(Nombre) - 1; // SE LE QUITA EL ASTERISCO strncpy(SUBCAD, Nombre, LCAD); N=0; for(A=0; A < MAX; A++) { if ( !strncmp(VAlumno[A].Nombre, SUBCAD, LCAD )) { VID[N] = A; strcpy( VN[N], VAlumno[A].Nombre ); N++; } } } else { strcpy(VN[0], Nombre); N = 1; } while(N) { for(A=0; A < MAX; A++) { if ( !strcmp(VAlumno[A].Nombre, VN[N-1] )) { ID = A; break; } } printf("%s\t%s\t%i\n", VAlumno[ID].Nombre, VAlumno[ID].Domicilio, VAlumno[ID].Edad); for(M=0; M<5; M++) { printf("\t\t%s\t\t%f\n", VMateria[ID][M].Nombre, VMateria[ID][M].Calificacion); } alto(); N--; } } void VeArchivo() { int x = 1; struct Alumno CHAVO; DATOS = fopen("Alumnos.dat","r"); // ARCHIVO PARA LECTURA if ( DATOS == NULL ) { printf( "Problemas al abrir el archivo.\n" ); } for (x == 1; x <= 5; x++) // while (!EOF) { . . . . } { fread(&CHAVO, sizeof(CHAVO), 1, DATOS); printf("\n%s", CHAVO.Nombre); printf("\n%s", CHAVO.Domicilio); printf("\n%d", CHAVO.Edad); printf("\n%i", CHAVO.ID); printf("\n\n\n"); } fclose(DATOS); } void InsertaDatos( ) { struct Alumno CHAVO; DATOS = fopen("Alumnos.dat","a"); // ARCHIVO PARA ANIADIR if ( DATOS == NULL ) { printf( "Problemas al abrir el archivo.\n" ); } while ( 1 ) { strcpy(CHAVO.Nombre, ""); strcpy(CHAVO.Domicilio, ""); CHAVO.Edad = 0; CHAVO.ID = 0; getchar(); // ELIMINAR EL ENTER printf("\nNombre del alumnno: "); gets(CHAVO.Nombre); if ( !strcasecmp("FIN", CHAVO.Nombre) ) break; else { printf("\nDomicilio: "); gets(CHAVO.Domicilio); printf("\nEdad: "); scanf("%d", &CHAVO.Edad); printf("\nID: "); scanf("%d", &CHAVO.ID); fwrite(&CHAVO, sizeof(CHAVO), 1, DATOS); } } if (fclose( DATOS )!=0) printf( "Problemas al cerrar el archivo destino.txt\n" ); VeArchivo(); alto(); }