#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_AUTORES 100
#define MAX_OBRAS 100
#define NOMBRE_MAX 50
#define TITULO_MAX 100
typedef struct {
char titulo[TITULO_MAX];
} Obra;
typedef struct {
char nombre[NOMBRE_MAX];
Obra obras[MAX_OBRAS];
int num_obras;
} Autor;
Autor lista_autores[MAX_AUTORES];
int num_autores = 0;
void agregar_autor() {
if (num_autores >= MAX_AUTORES) {
printf("No se pueden agregar más autores.\n");
return;
}
printf("Ingrese el nombre del autor: ");
scanf(" %[^\n]", lista_autores[num_autores].nombre);
lista_autores[num_autores].num_obras = 0;
num_autores++;
printf("Autor agregado exitosamente.\n");
}
void agregar_obra() {
char nombre_autor[NOMBRE_MAX];
printf("Ingrese el nombre del autor: ");
scanf(" %[^\n]", nombre_autor);
for (int i = 0; i < num_autores; i++) {
if (strcmp(lista_autores.nombre, nombre_autor) == 0) {
if (lista_autores[i].num_obras >= MAX_OBRAS) {
printf("No se pueden agregar más obras a este autor.\n");
return;
}
printf("Ingrese el título de la obra: ");
scanf(" %[^\n]", lista_autores[i].obras[lista_autores[i].num_obras].titulo);
lista_autores[i].num_obras++;
printf("Obra agregada exitosamente.\n");
return;
}
}
printf("Autor no encontrado.\n");
}
void buscar_autor_por_obra() {
char titulo[TITULO_MAX];
printf("Ingrese el título de la obra: ");
scanf(" %[^\n]", titulo);
for (int i = 0; i < num_autores; i++) {
for (int j = 0; j < lista_autores[i].num_obras; j++) {
if (strcmp(lista_autores[i].obras[j].titulo, titulo) == 0) {
printf("El autor de la obra '%s' es: %s\n", titulo, lista_autores[i].nombre);
return;
}
}
}
printf("Obra no encontrada.\n");
}
void eliminar_obra() {
char nombre_autor[NOMBRE_MAX], titulo[TITULO_MAX];
printf("Ingrese el nombre del autor: ");
scanf(" %[^\n]", nombre_autor);
printf("Ingrese el título de la obra a eliminar: ");
scanf(" %[^\n]", titulo);
for (int i = 0; i < num_autores; i++) {
if (strcmp(lista_autores[i].nombre, nombre_autor) == 0) {
for (int j = 0; j < lista_autores[i].num_obras; j++) {
if (strcmp(lista_autores[i].obras[j].titulo, titulo) == 0) {
// Mover las obras restantes hacia adelante
for (int k = j; k < lista_autores[i].num_obras - 1; k++) {
lista_autores[i].obras[k] = lista_autores[i].obras[k + 1];
}
lista_autores[i].num_obras--;
printf("Obra eliminada exitosamente.\n");
return;
}
}
printf("Obra no encontrada.\n");
return;
}
}
printf("Autor no encontrado.\n");
}
void eliminar_autor() {
char nombre_autor[NOMBRE_MAX];
printf("Ingrese el nombre del autor a eliminar: ");
scanf(" %[^\n]", nombre_autor);
for (int i = 0; i < num_autores; i++) {
if (strcmp(lista_autores[i].nombre, nombre_autor) == 0) {
// Mover los autores restantes hacia adelante
for (int j = i; j < num_autores - 1; j++) {
lista_autores[j] = lista_autores[j + 1];
}
num_autores--;
printf("Autor y sus obras eliminados exitosamente.\n");
return;
}
}
printf("Autor no encontrado.\n");
}
void mostrar_menu() {
printf("\nMenu:\n");
printf("1. Agregar Autor\n");
printf("2. Agregar Obra\n");
printf("3. Buscar Autor por Obra\n");
printf("4. Eliminar Obra\n");
printf("5. Eliminar Autor\n");
printf("6. Salir\n");
}
int main() {
int opcion;
do {
mostrar_menu();
printf("Seleccione una opción: ");
scanf("%d", &opcion);
switch (opcion) {
case 1:
agregar_autor();
break;
case 2:
agregar_obra();
break;
case 3:
buscar_autor_por_obra();
break;
case 4:
eliminar_obra();
break;
case 5:
eliminar_autor();
break;
case 6:
printf("Saliendo del programa.\n");
break;
default:
printf("Opción no válida. Intente de nuevo.\n");
}
} while (opcion != 6);
return 0;
}