ESTRUCTURAS.c



// MANEJO DE ESTRUCTURAS
//  PERMITE INTRODUCIR DATOS
//    - SI NO EXISTE, QUE LO GUARDE
//    - SI SI EXISTE que lo borre  --- MEJOR QUE NO LO BORRE
//  PERMITA MOSTRAR LOS DATOS ALMACENADOS
/*
1.- Compras
2.- Ventas
3.- Mostrar inventario
0.- Salir

COMPRAS
Si se selecciona "Compras", deberá de pedir los siguientes datos:
	Area
	Título
	Páginas
	Precio
	Cantidad
La clave, será generada de manera automática considerando
	tamaño de 6 caracteres
		las 2 primeras para el área
		las 2 segundas para el título
		las 2 últimas para un número progresivo

VENTAS
Si se selecciona la opción de ventas:
	que pida la clave
	y la cantidad que se vende
	y de manera automática, se actualiza el inventario
	- si la existencia es de cero, que indique el error

MOSTRAR INVENTARIO
Deberá mostrarse las existencias actuales de manera ALINEADA, por ejemplo:
==============================================================================
Clave	Area		Titulo		Páginas	Precio		Existencias
==============================================================================
maca0	matematicas	calculo		234	120.45		25
matr1	matematicas	trigonometria	456	0.76		12


SALIR
Si es la opción cero -salir- se termina la ejecución del programa
*/
//===========================================

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


// a cada columna se le llama CAMPO
// a cada renglón (conjunto de campos) se le llama REGISTRO
struct Libros
{
	char *Area;
	char *Titulo;
	int Paginas;
	float Precio;
	char *Clave;	// (6)==> (2)Area(2)Titulo(2)#progresivo
};

struct Libros vector[20];
int NumProg=0;

void menu(int n, char *cad) { printf("%i.- %s\n", n, cad); }

int opcion(int a, int b)
{
	int n=0;
	printf("¿Opción? (%i a %i) ", a, b);
	scanf("%i", &n);
	return n;
}

int Existe (char *T)
{
	int k=0;
	int ok=0;

	while ( k < NumProg )
	{
		if ( !strcmp(T, vector[k].Titulo) )
		{
			strcpy(vector[k].Area, "");
			strcpy(vector[k].Titulo, "");
			strcpy(vector[k].Clave, "");
			vector[k].Paginas = 0;
			vector[k].Precio = 0.0;
			printf("\nYA EXISTIA ... SE BORRÓ\n\n");
			ok = 1;
		}
		k++;
	}
	return ok;
}

char *GeneraClave(char *A, char *T)
{
	char *Clave = (char*)malloc(10);
	char *aux = (char*)malloc(3);
	strcpy(Clave, "");	// inicializando la cadena
	strncpy(Clave, A, 2); strncpy(aux, T, 2);
	sprintf(Clave, "%s%s%i", Clave, aux, NumProg);
	return Clave;
}

void PedirDatos()
{
	int Paginas;
	float Precio;
	char *Area = (char*)malloc(80);
	char *Titulo = (char*)malloc(80);

	printf("\nIntroduzca los datos del nuevo libro ... {%i}\n", NumProg);
	printf("===========================================\n");
	printf("\nTítulo del libro: "); scanf("%s",Titulo);
	if ( !Existe(Titulo) )
	{
		printf("Area a la que pertenece: "); scanf("%s", Area);
		printf("\nNúmero de páginas: "); scanf("%i", &Paginas);
		printf("\nPrecio: "); scanf("%f", &Precio);
		// SE ALMACENA EN EL VECTOR
		vector[NumProg].Area = (char*)malloc(80);
		vector[NumProg].Titulo = (char*)malloc(80);
		vector[NumProg].Clave = (char*)malloc(80);
		strcpy(vector[NumProg].Area, Area);
		strcpy(vector[NumProg].Titulo, Titulo);
		strcpy(vector[NumProg].Clave, GeneraClave(Area, Titulo) );
		vector[NumProg].Paginas = Paginas;
		vector[NumProg].Precio = Precio;
		NumProg++;
	}
}

void MostrarDatos ()
{
	int k=0;

	printf("\n=====================================================\n");
	printf("Clave\tArea\tTitulo\tPáginas\tPrecio\tExistencias\n");
	printf("=====================================================\n");

	while( k < NumProg )
	{
		printf("%s\t%s\t%s\t%i\t%f\t---\n", vector[k].Clave, vector[k].Area, vector[k].Titulo, vector[k].Paginas, vector[k].Precio);
		k++;
	}
	printf("=====================================================\n\n\n");
}


void procesar(int n)
{	switch (n)
	{ case 1: PedirDatos(); break; case 2: MostrarDatos(); }
}

void Inicio()
{
	int opc=0;

	while(1)
	{
		menu(1, "Pedir datos");
		menu(2, "Mostrar datos");
		menu(0, "Salir");
		if ( opc = opcion(0,2) )
			procesar(opc);
		else break;
	}
}


int main(int n, char **a)
{ Inicio(); system("clear"); }