AGENDA.c



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