// 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();
}