Desarrollo de un Sistema de Gestión de Estrellas en C: Funcionalidades Esenciales
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 11,51 KB
Introducción al Sistema de Gestión de Estrellas en C
Este documento detalla la implementación de un sistema básico de gestión de datos para 'estrellas' utilizando el lenguaje de programación C. El sistema permite realizar operaciones fundamentales como mostrar, insertar, consultar, modificar, borrar, guardar y recuperar información de estrellas, todo ello a través de una interfaz de consola.
Estructura General del Programa
El programa se organiza en varias funciones, cada una encargada de una tarea específica. La gestión de los datos se realiza mediante una estructura de lista que almacena la información de las estrellas en memoria, y se incluye funcionalidad para persistir estos datos en un archivo binario.
Función main
(Sin Punteros)
La función main
es el punto de entrada principal del programa. Se encarga de inicializar la lista de estrellas y de controlar el flujo de la aplicación mediante un bucle que presenta un menú de opciones al usuario hasta que este decide salir.
int main (void) {
int opcion = 0;
lista.cursor = 0;
while (opcion != 8) {
opcion = mostrarMenu();
switch (opcion) {
case 1:
Mostrar_estrellas();
break;
case 2:
Intro_estrellas();
break;
case 3:
Consul_estrellas();
break;
case 4:
Mod_estrellas();
break;
case 5:
Borrar_estrellas();
break;
case 6:
Guardar_estrellas();
break;
case 7:
Recuperar_estrellas();
break;
case 8:
printf("Saliendo del programa...\n");
break;
default:
printf("Opción no válida.\n");
break;
}
}
return 0;
}
Función mostrarMenu
(Sin Punteros)
Esta función es responsable de presentar las opciones disponibles al usuario y de validar la entrada. Limpia la pantalla, muestra el menú y solicita una opción, repitiendo la solicitud si la opción ingresada no es válida.
int mostrarMenu(void) {
int opcion;
do {
system("cls");
printf("1. Mostrar lista de Estrellas \n");
printf("2. Insertar Nueva Estrella \n");
printf("3. Consultar una Estrella \n");
printf("4. Modificar una Estrella \n");
printf("5. Borrar una Estrella \n");
printf("6. Guardar lista de estrellas en disco \n");
printf("7. Recuperar lista de estrellas desde disco \n");
printf("8. Salir \n");
printf("Seleccione una opción: ");
scanf("%d", &opcion);
if (opcion < 1 || opcion > 8) { // Corrección de la condición de validación
printf("Opción no válida. Por favor, intente de nuevo.\n");
system("pause");
}
} while (opcion < 1 || opcion > 8); // Corrección de la condición de bucle
return opcion;
}
Función Mostrar_estrellas
La función Mostrar_estrellas
se encarga de listar todas las estrellas almacenadas en la estructura de datos. Si la lista está vacía, informa al usuario. De lo contrario, itera sobre las estrellas y muestra sus detalles.
void Mostrar_estrellas() {
system("cls");
if (lista.cursor == 0) {
printf("No hay estrellas en la lista. \n");
} else {
for (int i = 0; i < lista.cursor; i++) { // Corrección de la condición del bucle
printf("Estrella #%d\n", i + 1);
printf("Nombre: %s\n", lista.vector[i].nombre);
printf("Galaxia: %s\n", lista.vector[i].galaxia);
printf("Planetas: %d\n", lista.vector[i].planetas);
printf("Posibilidad de vida: %s\n\n", lista.vector[i].vida == 1 ? "Sí" : "No");
}
}
system("pause");
}
Función Consul_estrellas
(Sin Punteros)
Esta función permite al usuario buscar y consultar los detalles de una estrella específica por su nombre. Si la estrella es encontrada, se muestran sus atributos; de lo contrario, se notifica que no fue hallada.
void Consul_estrellas() {
system("pause");
char nombre_estrella[Maximo_1];
int encontrada = -1;
printf("Introduce el nombre de la estrella que se desea consultar: ");
fflush(stdin); // Nota: fflush(stdin) es comportamiento indefinido en C estándar.
gets(nombre_estrella); // Nota: gets() es inseguro y obsoleto. Se recomienda usar fgets().
for (int i = 0; i < lista.cursor; i++) { // Corrección de la condición del bucle
if (strcmp(lista.vector[i].nombre, nombre_estrella) == 0) {
encontrada = i;
break;
}
}
if (encontrada != -1) {
printf("Nombre: %s\n", lista.vector[encontrada].nombre);
printf("Galaxia: %s\n", lista.vector[encontrada].galaxia);
printf("Planetas: %d\n", lista.vector[encontrada].planetas);
printf("Posibilidad de vida: %s\n", lista.vector[encontrada].vida == 1 ? "Sí" : "No");
} else {
printf("Estrella no encontrada.\n");
}
system("pause");
}
Función Mod_estrellas
(Sin Punteros)
La función Mod_estrellas
permite al usuario modificar los atributos de una estrella existente. Primero, busca la estrella por su nombre y, si la encuentra, presenta un submenú para seleccionar qué campo desea actualizar.
void Mod_estrellas () {
system("cls");
char nombre_estrella[Maximo_1];
int encontrada = -1;
printf("Introduce el nombre de la estrella que se desea modificar: ");
fflush(stdin); // Nota: fflush(stdin) es comportamiento indefinido en C estándar.
scanf("%[^
]s", nombre_estrella); // Nota: scanf con %[^
]s puede dejar el newline en el buffer.
for (int i = 0; i < lista.cursor; i++) { // Corrección de la condición del bucle
if (strcmp(lista.vector[i].nombre, nombre_estrella) == 0) {
encontrada = i;
break;
}
}
if (encontrada != -1) {
int opcion;
do {
system("cls");
printf("Modificar los datos de la estrella %s: \n", lista.vector[encontrada].nombre); // Muestra el nombre de la estrella a modificar.
printf("1. Nombre\n");
printf("2. Galaxia\n");
printf("3. Número de planetas\n");
printf("4. Posibilidad de vida\n");
printf("5. Salir\n");
printf("Seleccione qué desea modificar: ");
scanf("%d", &opcion);
switch (opcion) {
case 1:
printf("Nuevo nombre: ");
fflush(stdin); // Nota: fflush(stdin) es comportamiento indefinido en C estándar.
scanf("%[^
]s", lista.vector[encontrada].nombre);
printf("Nombre cambiado con éxito.\n");
break;
case 2: // Modificar la galaxia de la estrella.
printf("Nueva galaxia: ");
fflush(stdin); // Limpia el buffer de entrada.
scanf(" %[^
]s", lista.vector[encontrada].galaxia); // Lee el nuevo nombre de la galaxia.
printf("Galaxia modificada con éxito.\n");
break;
case 3: // Modificar el número de planetas que orbitan la estrella.
printf("Nuevo número de planetas: ");
scanf("%d", &lista.vector[encontrada].planetas); // Lee el nuevo número de planetas.
printf("Número de planetas modificado con éxito.\n");
break;
case 4: // Modificar la posibilidad de vida en los planetas de la estrella.
printf("Nueva posibilidad de vida (1 = Sí, 0 = No): ");
scanf("%d", &lista.vector[encontrada].vida); // Lee la nueva posibilidad de vida.
printf("Posibilidad de vida modificada con éxito.\n");
break;
case 5: // Salir del menú.
printf("Saliendo del menú de modificación...\n");
break;
default: // Si el usuario ingresa una opción inválida.
printf("Opción no válida. Intente nuevamente.\n");
break;
}
system("pause");
} while (opcion != 5);
} else {
printf("Estrella no encontrada.\n");
system("cls");
}
}
Función Borrar_estrellas
(Sin Punteros)
Esta función permite eliminar una estrella de la lista. Busca la estrella por su nombre y, si la encuentra, la elimina desplazando los elementos subsiguientes para mantener la contigüidad de la lista.
void Borrar_estrellas (){
system("cls");
char nombre_estrella[Maximo_1];
int encontrada = -1;
printf("Introduce el nombre de la estrella que se desea borrar: ");
fflush(stdin); // Nota: fflush(stdin) es comportamiento indefinido en C estándar.
gets(nombre_estrella); // Nota: gets() es inseguro y obsoleto. Se recomienda usar fgets().
for (int i = 0; i < lista.cursor; i++) { // Corrección de la condición del bucle
if (strcmp(lista.vector[i].nombre, nombre_estrella) == 0) {
encontrada = i;
break;
}
}
if (encontrada != -1) {
for (int i = encontrada; i < lista.cursor - 1; i++) { // Corrección del bucle para desplazamiento
lista.vector[i] = lista.vector[i+1];
}
lista.cursor--;
printf("Estrella eliminada con éxito.\n");
} else {
printf("Estrella no encontrada.\n");
}
system("cls");
}
Función Guardar_estrellas
La función Guardar_estrellas
se encarga de persistir la lista actual de estrellas en un archivo binario llamado Lista_estrellas.dat
. Esto asegura que los datos no se pierdan al finalizar la ejecución del programa.
void Guardar_estrellas() {
int i;
FILE *Estrellas = fopen("Lista_estrellas.dat", "wb"); // Declaración de FILE*
if (Estrellas == NULL) {
printf("Error al crear/abrir el archivo para guardar.\n");
system("pause");
return;
}
for (i = 0; i < lista.cursor; i++) { // Corrección de la condición del bucle
fwrite(&lista.vector[i], sizeof(struct T_estrella), 1, Estrellas);
}
fclose(Estrellas);
printf("Estrellas guardadas con éxito.\n");
system("pause");
}
Función Recuperar_estrellas
(Sin Punteros)
Esta función lee los datos de las estrellas desde el archivo binario Lista_estrellas.dat
y los carga en la estructura de datos en memoria. Si el archivo no existe o hay un error al abrirlo, se informa al usuario.
void Recuperar_estrellas() {
lista.cursor = 0;
FILE *Estrellas = fopen("Lista_estrellas.dat", "rb"); // Declaración de FILE*
if (Estrellas == NULL) {
printf("Error al abrir el archivo o el archivo no existe.\n");
system("pause");
return;
}
while (fread(&lista.vector[lista.cursor], sizeof(struct T_estrella), 1, Estrellas) == 1) {
lista.cursor++;
}
fclose(Estrellas);
printf("Estrellas recuperadas con éxito.\n");
system("pause");
}