Sistema de gestión de bibliotecas de diseño de cursos de estructura de datos en lenguaje C
#include
#include
#include
/ /
#define MAXSIZE 100 //El valor máximo se define como 100
#define LIST_INIT_SIZE 100 //El valor máximo para usuarios de tarjetas de biblioteca se define como 100
// Estructura del prestatario
typedef struct Boro//Comportamiento del préstamo
{
char BNum[20];//Número de libro del préstamo
p>char RetDate[8];//Fecha de regreso
struct Boro *next;
}Bor;
typedef struct LinkBook
{
Bor *next; //Comportamiento de préstamo de esta tarjeta de biblioteca
char CNum[20] //Número de tarjeta
int Total; ; //El número de libros prestados
}lend[LIST_INIT_SIZE];//Matriz de prestatarios
//Información de estructura de los libros
typedef struct LNode
{
char CardNum[20];//Número de tarjeta de biblioteca
struct LNode *next;
}LinkList // Prestatario;
typedef struct book
{//Los contenidos que deben registrarse para cada libro incluyen ISBN, título del libro, autor, editorial, inventario total e inventario actual.
char num[20];//número de libro
char nombre[20];//título del libro
char auth[20];//autor
char pub[20];//editorial
int TotNum;//inventario total
int NowNum;//inventario actual
LinkList *next;//Personas que tomaron prestado el libro
}ook[MAXSIZE];
//
int Retotal;//Número de lectores
int total; //Definir variables externas
//
//Inicialización de estructura
void InitBo( ook &boo) //Inicializar información del libro
{
for(int i=0;i { boo[i].NowNum=0; boo[i].TotNum=0; boo[i].next=NULL; } } void InitRe(lend &Lin) //Inicializa la información del prestatario { for(int i=0;i < LIST_INIT_SIZE;i++) Lin[i].next=NULL; } // int mid=0; /Función externa mid, utilizada para devolver la posición encontrada bool BinarySearch(ook boo,char SearchNum[]) //Búsqueda binaria y número de libro de comparación { //Usa la función bool , pero como la función no puede tener dos valores de retorno, se configura una variable externa mid para devolver la posición encontrada int low=0,high=total-1; int found= 0; while(bajo<=alto) { medio=(bajo+alto)/2 //punto medio if(strcmp(boo[mid].num,SearchNum)==0) //Mismo número de libro { found=1; return true; }//Buscar correctamente if(strcmp(boo[mid].num,SearchNum)!=0)//El número de libro es diferente alto=medio-1; else bajo=medio+1; } if(found==0) return false; //Encontrar error } void Buy(ook &boo, char BuyNum[]) {/1. Compre un libro nuevo si el libro ya existe en la cuenta de libros, se aumentará su inventario (incluido el inventario total y el inventario actual). Si el libro no existe, se agrega un libro a la cuenta de libros y el inventario total. y el inventario actual son ambos 1. if(BinarySearch(boo,BuyNum)) //Si este libro está en la biblioteca { boo[mid].TotNum++ //Total; inventario Agregar 1 boo[mid].NowNum++ //Agregar 1 al inventario actual printf("Almacenamiento exitoso.\n"); printf ( "La información del libro en la biblioteca ha sido cambiada. El autor del libro %s con el número %s es %s, el editor es %s, el inventario total actual es %d y el inventario actual es % d.\n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].TotNum,boo[mid].NowNum); } if(!BinarySearch(boo,BuyNum)) { int i; para (i=total;i>mid&&total;i --) //Insertar en la posición apropiada para mantener el orden boo[i]=boo[i-1] //Desocupar la posición de inserción printf("El libro está en No existe en la biblioteca. Para crear un libro nuevo, complete los detalles del libro \n"); strcpy(boo[i ].num,BuyNum); printf(" La cantidad comprada de este libro es: "); scanf(" %d",&boo[i].NowNum); boo[i].TotNum=boo[i ].NowNum; printf("El nombre del libro es:"); scanf( " %s",&boo[i].name); printf("El autor de este libro es:"); scanf(" %s",&boo[i ].auth); printf("La publicación de este libro La empresa es: "); scanf(" %s",&boo[i].pub);/ /Información completa boo[i].next=NULL; total++;//Total +1 printf("Se ha añadido la información del libro. El autor del libro %s con el número %s es %s, el editor es %s y el inventario total actual es %d y el inventario actual es %d. \n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum); printf("Almacenamiento exitoso.\n"); } } void Delete(ook &boo,char DeleteNum[]) {//2. Borrar inventario: cierto tipo de libro no tiene valor de retención y se cancelará de la cuenta del libro. if(BinarySearch(boo,DeleteNum)==false||total==0) //Si no existe tal libro printf("No existe tal libro en el biblioteca.\n" ); if(BinarySearch(boo,DeleteNum))//si es así { if(!boo[mid]. siguiente) { int j; for( j=mid;j boo[j] =boo[j+ 1]; strcpy(boo[j].num,boo[j+1].num); strcpy(boo[j].nombre,boo [j+1 ].nombre); strcpy(boo[j].auth,boo[j+1].auth); strcpy(boo[j].pub ,boo[j +1].pub); boo[j].TotNum=boo[j+1].TotNum; boo[j].NowNum=boo[ j+1] .NowNum; printf("El libro se ha eliminado correctamente.\n"); } else printf("Este libro tiene un prestatario y no se puede eliminar \n"); } } void Borrow(ook &boo,lend &Lin,char BorrowNum[], char CaNum[]) {/3. Préstamo: si el inventario actual de un libro es mayor que cero, preste un libro y reduzca el inventario actual en 1, / /y registrarse para pedir prestado el número de tarjeta de biblioteca del autor y la fecha de devolución. Bor *p,*q; LinkList *m,*n; if(!BinarySearch(boo,BorrowNum)||total==0 ) //Si no se encuentra este libro printf("Este libro no está en la biblioteca. \n");//Si existe este libro if(BinarySearch(boo,BorrowNum)) //Está en la biblioteca { if(boo [mid].NowNum>0) //Comprueba si el inventario actual es mayor que 0 { boo[mid].NowNum--;//Lend un libro, menos de 1 if(boo[mid].next==NULL) //Si la información del libro muestra que el libro aún no ha sido prestado { p> m=(LinkList *)malloc(sizeof(LNode));//Asignación boo[mid].next=m;//El primer nodo de la lista vinculada en el libro información strcpy(m->CardNum,CaNum); m->next=NULL;//El siguiente nodo está vacío } else //Si alguien ya está tomando prestado este libro { m=boo[mid].next; while(m-> next) //Atravesar hasta el último nodo m=m->next; n=(LinkList *)malloc(sizeof(LNode));//Asignar espacio, aumentar por 1 nodo m->next=n; strcpy(n->CardNum,CaNum);//Registra el número de tarjeta n-> siguiente =NULL; } int i=0; for(i=0;i { if(!strcmp(Lin[i].CNum,CaNum))//Si ya tienes la información de la tarjeta de la biblioteca { p =Lin[i].next; while(p->next)p=p->next;//Atravesar hasta el último nodo q=(Bor *) malloc(sizeof(Boro));//Asignar espacio p->next=q; strcpy(q->BNum,BorrowNum); //Registrar número de libro p > printf("Ingrese la fecha de regreso:"); scanf("%s",&q->RetDate); q->next=NULL; printf("Préstamo exitoso.\n"); break; //Salir del bucle cuando se encuentre el certificado } p> } if(i==Retotal)//Si no hay información sobre este certificado { strcpy(Lin[i ].CNum,CaNum); / /Registra el número de certificado p=(Bor *)malloc(sizeof(Boro)); //Asigna espacio Lin[i]. next=p; strcpy(p->BNum,BorrowNum); printf("Ingrese la fecha de regreso:"); scanf(" %s",&p->RetDate); p->next=NULL; Retotal++ //Agregue 1 al número total de información del número de tarjeta de préstamo<; /p> printf("Préstamo exitoso.\n"); } } else printf("Préstamo fallido. El libro está actualizado el inventario es 0. \n"); } } void Return(ook &boo,lend &Lin,char ReturnNum[],char BorrowerNum[] ) {/4. Devolución: Cancelar el registro del prestatario y cambiar la cantidad existente del libro. Bor *p,*q; LinkList *m,*n; int flag=0;//Establecer un parámetro if(!BinarySearch(boo,ReturnNum)||!total) //No hay libro printf("No existe tal libro en la biblioteca.\n"); if( BinarySearch(boo,ReturnNum)) //Hay libros { m=boo[mid].next; if(!strcmp (m-> CardNum,BorrowerNum)) //Si lo reembolsa el primer prestatario { boo[mid].NowNum++ //Agrega 1 al inventario actual; boo[mid].next=m->next; //Eliminar nodo free(m); //Liberar el espacio del nodo } p> else { while(m->next) //Encuentra el nodo prestatario del retornante { p> if(!strcmp(m->next->CardNum,BorrowerNum)) //Si se encuentra { n=m->next; se devuelve el nodo de préstamo del prestatario m->next=n->next; //m apunta al siguiente nodo del nodo de préstamo del que regresa free(n); Liberar espacio boo[mid].NowNum++; //Agregar 1 al inventario actual break; } m=m ->next; } } } //Buscar información del prestatario en la tabla de prestatarios for(int i=0;i { if(!strcmp(Lin[i].CNum,BorrowerNum)) //Si se encuentra el prestatario { p=Lin[i].next; if(!strcmp(p->BNum,ReturnNum)) //Si es así El primero se devuelve el libro prestado { Lin[i].next=p->next; //Apunta al siguiente nodo de préstamo free(p) ; //Liberar espacio en el nodo printf("El libro se devolvió exitosamente.\n"); flag=1; break; } else //No encontrado { while(p->next) //Nodo de préstamo de libros encontrado y devuelto { if(!strcmp(p->next->BNum,ReturnNum)) //Si se encuentra { q=p->next; //q es el nodo de préstamo del libro devuelto p->next=q->next; //p apunta al siguiente nodo de préstamo free(q); //Liberar espacio printf("El libro fue devuelto exitosamente.\n"); flag=1; pausa; } p=p->siguiente; } } } } for(int k=0;k if(!Lin[k].next) { int j; for(j=k;j Lin[j]=Lin[j+ 1] ; //Avanzar todo un dígito a partir de entonces, sobrescribiendo la información actual strcpy(Lin[j].CNum," " //Eliminar el número de tarjeta de la biblioteca ); Retotal --; //Disminuir el número de tarjetas de la biblioteca en 1 } //Eliminar información sobre las tarjetas de la biblioteca que no han tomado libros prestados en el estado actual para ahorrar espacio if( flag==0) printf ("No hay información sobre este certificado.\n"); } //5. número de libro, //Buscar por título de libro, buscar por autor. Nota: No es necesario implementar la búsqueda combinada, es decir, una búsqueda combinada de varias condiciones. void SearchByNum(ook &boo,char SeaNum[]) {//BY NUM Búsqueda por número de libro LinkList *p; p=boo[mid].next; if(BinarySearch(boo,SeaNum)==false)printf("Lo sentimos, no se encontró el libro que estaba buscando. \n");//Búsqueda binaria no encontrada else//Si se encuentra { { printf(" ┏ ━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━ ┳ ━━━━━┓\n" ) ; printf("┃ ISBN┃ Título del libro┃ Autor┃ Editor┃ Inventario actual┃ Inventario total┃\n"); printf("┣━━━━━ ━━ ╋━━━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━╋━━━━━ ┫\n"); printf("┃%14s┃%14s┃%16s┃%16s┃%10d┃%10d┃\n",boo[mid].num,boo[mid].nombre,boo[mid].auth, boo[ mid].pub,boo[mid].NowNum,boo[mid].TotNum); printf("┗━━━━━━━┻━━━━━━━┻━ ━━ ━━━━━┻━━━━━━━━┻━━━━━┻━━━━━┛\n"); if(boo[mid].next! =NULL ) { printf("┏━━━━━━━┓\n"); printf("┃ El libro ha sido prestado ┃ \n"); printf("┃ número de tarjeta de biblioteca┃\n"); while(p) { printf("┣━━━━━━━┫\n"); printf("┃%14s┃\n",p->NumTarjeta); p =p->siguiente; } printf("┗━━━━━━━┛\n"); } p> } while(p) { printf(" %s ",p->CardNum); // Pulsa el número del libro La búsqueda. La función también muestra el número de identificación del prestatario que tomó prestado este libro p=p->next; } printf(" \ n"); }//Mostrar información sobre los libros buscados } void SearchByName(ook &boo) {/ /BY NAME Search basado en el título del libro char SeaName[20]; printf("Ingrese el título del libro que desea encontrar:\n"); scanf(" %s",&SeaName); printf("Los detalles del libro que coincide con el título encontrado son los siguientes:\n"); for(int i= 0;i { if(strcmp(SeaName,boo[i].name)==0)//Si los nombres de los libros son iguales { printf("ISBN: %s\nTítulo del libro: %s\nAutor: %s\nEditor: %s\nInventario total: %d\nInventario actual Cantidad: %d \n\n",boo[i].num,boo[i].nombre,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i]. No wNum); }//Muestra información sobre todos los libros que coinciden con la información } } void SearchByAuth(ook &boo ) {// BY AUTH Buscar por autor char SeaAuth[20]; printf("Ingrese el autor del libro que desea encontrar: \n") ; scanf(" %s",&SeaAuth); printf("Los detalles del libro que coincide con este autor se encontraron de la siguiente manera:\n"); for(int i=0;i { if(strcmp(SeaAuth,boo[i].auth)== 0)//Si el autor es el mismo { printf("ISBN: %s\nTítulo del libro: %s\nAutor: %s\nEditorial: %s\nInventario total: % d\nInventario actual: %d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum, boo [i].NowNum); }//Muestra información sobre todos los libros que coinciden con la información } } / /6. Ver: puede ver todos los libros prestados por un prestatario con un determinado número de tarjeta de biblioteca y puede ver todos los libros vencidos. void ViewCard(ook &boo,lend &Lin) {//Ver todos los libros prestados por un prestatario con un determinado número de tarjeta de biblioteca char Num[20 ] ; printf("Ingrese el número de tarjeta de la biblioteca que desea ver:\n"); scanf(" %s",&Num); Bor *p; int qqq=0; for(int i=0;i { if(strcmp(Lin[i].CNum,Num)==0) //Encontrar el certificado { printf("Los libros prestados por este certificado incluyen : \n"); p=Lin[i].siguiente; mientras(p) { printf( " %s ",p->BNum); //Número de libro p=p->siguiente; } printf("\n" qqq=1; romper; } } if(qqq==); 0) printf("Este certificado no existe.\n"); } void ViewBook(ook &boo,lend &Lin) {//Ver todos los libros vencidos char date[8]; Bor *p; printf("Ingrese la fecha ( por favor ingrese en formato 20060605):\n"); scanf(" %s",&date); printf("Todos los libros vencidos son:\n") ; for(int i=0;i { p=Lin[i].next; while(p)//Cuando p no está vacío { if(strcmp(p->RetDate,date)<0) //Excede la fecha { printf("El número de libro es %s, el número de certificado es %s y la fecha de devolución es %s \n",p->BNum,Lin[i].CNum, p->RetDate) ; }//Mostrar información sobre todos los libros vencidos p=p->next; } } } void Menu() //Menú { printf("┏——————— ——— ————————M E N U————————————————┓\n"); printf("│ │\n") ; printf("│ 1. Adquisición y almacenamiento: compre un libro nuevo. Si el libro ya existe en la cuenta de libros, │\n"); printf(" │ luego aumentar su inventario (incluido el inventario total y el inventario actual). │\n"); printf("│ Si el libro no existe, agregue un libro a la cuenta del libro, │\n"); printf("│ El el inventario total y el inventario actual son números ingresados │\n"); printf("│ 2. Borrar inventario: cierto tipo de libro no tiene valor de reserva, elimínelo de la cuenta de libros. Cerrar sesión │\n"); printf("│ 3. Préstamo: si el inventario actual de un libro es mayor que cero, preste un libro y reduzca el inventario actual en 1, │\ n") ; printf("│ Y registre el número de tarjeta de la biblioteca del prestatario y el período de devolución. │\n"); printf("│ 4. Devolución: cancelar el par El registro del prestatario cambia la cantidad existente del libro │\n"); printf("│ 5. Buscar por número de libro. │\n"); printf( "│ 6. Buscar por título del libro │\n"); printf("│ 7. Buscar por autor. │\n"); printf("│ 8 . Ver todos los libros. prestado por un prestatario con un determinado número de tarjeta de biblioteca │\n"); printf("│ 9. Ver todos los libros vencidos. │\n"); printf(" │ 0. Salir del sistema de gestión de biblioteca. │\n"); printf("│ │\n"); printf("┗————————————Por favor elija su Requerido operaciones————————————┛\n"); } void main() { p> ook Bo; prestar Lin; char BNum[20]; char CNum[20]; printf ("----------------------¡Bienvenido al sistema de gestión de bibliotecas!----------------- - ---------\n\n"); int elección=10; int SearchCho=10,ViewCho=10; while(choice!=0) { Menu();//Mostrar menú scanf(" %d",&choice);< / p> switch(choice) { case 1://Recopilar y compilar en la biblioteca printf("Ingrese el número de el libro en la biblioteca ISBN: "); scanf(" %s",BNum); Buy(Bo,BNum); break; case 2://Borrar inventario printf("Ingrese el ISBN del libro que desea borrar:"); scanf(" % s",BNum); Eliminar(Bo,BNum); romper; caso 3://préstamo printf ("Ingrese lo que desea tomar prestado. El ISBN del libro:\n"); scanf(" %s",&BNum); printf("Ingrese el número de tarjeta de biblioteca:"); scanf(" %s",&CNum); Borrow(Bo,Lin,BNum,CNum); break ; caso 4: //Devolver printf("Ingrese el ISBN del libro que desea devolver:\n"); scanf( " %s",&BNum); printf("Por favor, introduzca su número de tarjeta de biblioteca:"); scanf(" %s",&CNum); Return(Bo,Lin,BNum,CNum); break; case 5://Buscar//Buscar por número de libro printf( "Ingrese el número del libro:");//Ingrese el número del libro a buscar p> scanf(" %s",&BNum); SearchByNum(Bo,BNum); break; caso 6:// Buscar por título del libro SearchByName(Bo); break; caso 7://Buscar por autor SearchByAuth(Bo ); break; case 8://Ver todos los libros prestados con una determinada tarjeta de biblioteca ViewCard(Bo,Lin); break; caso 9: //Ver todos los libros vencidos ViewBook(Bo,Lin); break; caso 0:// Salir del sistema exit(0);break; default:printf("¡Error de entrada!\n");exit(0);break; } } }