Sistema de Gestión de Farmacia en C: Listas Enlazadas para Medicamentos
Sistema de Gestión de Farmacia en C
A continuación se presenta el código de un programa en lenguaje C que permite administrar el inventario de medicamentos de una farmacia mediante una lista simplemente enlazada. El programa incluye las operaciones básicas de mostrar, insertar, consultar, modificar, borrar, guardar y recuperar productos.
Funciones principales
- mostrar(): muestra todos los medicamentos registrados.
- insertar(): agrega nuevos medicamentos a la lista.
- consultar(): busca un producto por su nombre.
- modificar(): permite editar los datos de un producto existente.
- borrar(): elimina un producto de la lista.
- guardar(): almacena la lista en el archivo farmacia.dat.
- recuperar(): carga la lista desde el archivo farmacia.dat.
Código fuente
//__________________________________________________________________________________________
int mostrar (void){
system("cls");
aux=primero;
if(aux==0)
{
printf("No hay ningún medicamento");
}else
{
do{
printf("\n");
printf("Nombre del laboratorio: %s\n",aux->datos.laboratorio);
printf("Nombre del producto: %s \n",aux->datos.nombre);
printf("Número de unidades disponibles: %d\n",aux->datos.cantidad);
printf("Precio de venta unitario: %f\n",aux->datos.precio);
printf("El medicamento %s tiene receta\n",aux->datos.receta);
aux=aux->sig;
}while(aux!=NULL);
}
};
//___________________________________________________________________________________________________
int insertar (void){
system("cls");
int bucle=1;
char re[30];
while(bucle!=0) {
nuevo=malloc(sizeof(struct nodo)); /*Crea un espacio en memoria y dirección*/
nuevo->sig=NULL;
printf("Nombre del laboratorio: \n");
fflush(stdin);
gets(nuevo->datos.laboratorio);
printf("Nombre del producto: \n");
fflush(stdin);
gets(nuevo->datos.nombre);
printf("Número de unidades disponibles: \n");
scanf("%d",&nuevo->datos.cantidad);
fflush(stdin);
printf("Precio de venta unitario: \n");
scanf("%f",&nuevo->datos.precio);
fflush(stdin);
printf("¿Seguridad social?: <sí> o <no>\n");
fflush(stdin);
gets(nuevo->datos.receta);
/*Primer elemento creado*/
if(primero == NULL)
{
primero=nuevo;
ultimo=nuevo;
}
else
{
ultimo->sig=nuevo;
ultimo=nuevo;
}
printf("¿Quieres insertar otro producto?: <sí> o <no>\n");
fflush(stdin);
gets(re);
if (strcmp(re,"no" )==0)
{
bucle=0;
}
}
};
//______________________________________________________________________________________
int consultar(void){
char consulta[50];
aux=primero;
fflush(stdin);
printf("\n");
printf("Nombre del producto que desea consultar: \n");
scanf("%s",&consulta);
do{
if (strcmp(consulta,aux->datos.nombre)==0)
{
printf("Nombre del laboratorio: %s \n",aux->datos.laboratorio);
printf("Nombre del producto: %s \n",aux->datos.nombre);
printf("Número de unidades disponibles: %d \n",aux->datos.cantidad);
printf("Precio de venta unitario: %f \n",aux->datos.precio);
printf("El medicamento %s tiene receta \n",aux->datos.receta);
break;
}
aux=aux->sig;
}while(aux!=NULL);
if(aux==NULL)
{
printf("No se ha encontrado el producto \n");
}
};
//________________________________________________________________________________________
void modificar(void){
int salir=0;
aux=primero;
fflush(stdin);
char nombre_modif[60];
int op;
printf("Escribe el nombre del producto que desea cambiar: ");
gets(nombre_modif);
do
{
if (strcmp(nombre_modif,aux->datos.nombre)==0 )
{
printf("¿Qué dato quieres modificar?\n1-Laboratorio \n2-Nombre \n3-Cantidad \n4-Precio \n5-Receta \n6-Terminar\n");
printf("¿Qué quieres modificar?: ");
scanf("%d",&op);
switch (op){
case 1:
fflush(stdin);
printf("Escribe el nombre del laboratorio: ");
gets(aux->datos.laboratorio);
break;
case 2:
fflush(stdin);
printf("Escribe el nombre del producto: ");
gets(aux->datos.nombre);
break;
case 3:
printf("Escribe la cantidad: ");
scanf("%d",&aux->datos.cantidad);
break;
case 4:
printf("Escribe el precio del producto: ");
scanf("%f",&aux->datos.precio);
break;
case 5:
fflush(stdin);
printf("¿Seguridad social?: <sí> o <no>\n");
gets(aux->datos.receta);
break;
case 6:
salir=1;
break;
}
}
aux=aux->sig;
}while(op!=6 && aux!=NULL);
};
//_____________________________________________________________________________-
int borrar(void){
system("cls");
struct nodo *aux2;
char borrar[50];
int c;
fflush(stdin);
aux=primero;
aux2=primero->sig;
printf("Nombre del producto que desea borrar: ");
gets(borrar);
for(c=0;1;c++){
if(strcmp(aux->datos.nombre,borrar)==0 && c==0)
{
primero=primero->sig;
break;
}
else
{
if(strcmp(aux2->datos.nombre,borrar)==0 && aux2->sig!=NULL)
{
aux->sig=aux2->sig;
break;
}
if(strcmp(ultimo->datos.nombre,borrar)==0 && aux2->sig==NULL)
{
ultimo=aux;
ultimo->sig=NULL;
break;
}
}
aux=aux->sig;
aux2=aux2->sig;
};
};
//_____________________________________________________________________________________
int guardar(void){
system("cls");
int c;
aux=primero;
if(fp=fopen("farmacia.dat","wb"))
{
for(c=0;aux!=NULL;c++){
fwrite(&aux->datos,sizeof(aux->datos),1,fp);
printf("Producto %d guardado\n",c+1);
aux=aux->sig;
};
}
else
{
printf("Error\n");
}
fclose(fp);
};
//____________________________________________________________________________
int recuperar(void){
system("cls");
int c;
struct nodo *nuevo;
FILE *fp;
fp=fopen("farmacia.dat","rb");
for(c=0;1;c++){
nuevo=malloc(sizeof(struct nodo));
fread(&ficha,sizeof(ficha),1,fp);
nuevo->datos=ficha;
nuevo->sig=NULL;
if(primero==NULL)
{
primero=nuevo;
ultimo=nuevo;
}
else
{
if(strcmp(ultimo->datos.nombre,nuevo->datos.nombre)==0){
break;
}
ultimo->sig=nuevo;
ultimo=nuevo;
}
}
fclose(fp);
printf("Su lista se ha recuperado\n");
}
//___________________________________________________________________________________________
int main(void){
int op;
int sal=0;
do{
op=menu();
switch(op){
case 1:
mostrar();
break;
case 2:
insertar();
break;
case 3:
consultar();
break;
case 4:
modificar();
break;
case 5:
borrar();
break;
case 6:
guardar();
break;
case 7:
recuperar();
break;
case 8:
sal=1;
printf("Pulse cualquier tecla para salir definitivamente del programa.\n");
break;
}
}while(sal==0);
}
Observaciones de corrección
- Se corrigieron tildes y signos de apertura de interrogación ("Número", "¿Seguridad social?", "¿Quieres...?").
- Se escaparon los caracteres
<y>para que el HTML se muestre correctamente. - Se corrigió el encabezado de la función
modificary se mantuvo el resto del código tal como fue entregado.