Programa en C para Gestionar un Inventario de Motos con Listas Enlazadas: Código Comentado

Informática y Telecomunicaciones9,72 KB

Librerías necesarias

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <stdbool.h>
#include <windows.h>
#include <string.h>

Definición de constantes y variables globales

Definimos una variable para la dimensión de las cadenas de texto:

#define DIM 50

Fichero que vamos a utilizar para almacenar los datos:

FILE *Datos;

Estructura de datos

struct producto {
char marca[DIM];
char modelo[DIM];
int unidades;
float precio;
int carnet;
};
struct Nodo {
struct producto datos;
struct Nodo *sig;
};

Punteros globales utilizados para recorrer y gestionar la lista enlazada:

struct Nodo *cabecera;
struct Nodo *fin;
struct Nodo *aux;
struct Nodo *nuevo;
struct Nodo *borrador;
struct producto moto;

Función menú

int menu() {
int respuesta;
system("cls");
// Imprimo el menú con las opciones disponibles
printf("Aquí le mostramos las opciones que se pueden llevar a cabo:\n");
printf("1. Mostrar la lista de todos los productos.\n");
printf("2. Inserción de un nuevo producto.\n");
printf("3. Consulta de los datos de alguno de los productos.\n");
printf("4. Modificación de los datos de algún producto (se buscará por el nombre de modelo).\n");
printf("5. Borrado de algún producto de la lista.\n");
printf("6. Guardar la lista actualizada en disco.\n");
printf("7. Recuperar datos de la lista guardada en el disco.\n");
printf("8. Salir.\n");
// Leo la respuesta del usuario
scanf("%d", &respuesta);
while (respuesta > 8 || respuesta < 1) {
printf("Parece que ha seleccionado una opción no disponible.\n");
printf("Por favor, seleccione una opción disponible:\n");
scanf("%d", &respuesta);
}
return respuesta;
}

Función mostrar

void mostrar() {
int i = 1;
aux = cabecera;
if (cabecera != NULL) {
while (aux != NULL) {
printf("\nMoto %d\n", i);
printf("Marca: %s\n", aux->datos.marca);
printf("Modelo: %s\n", aux->datos.modelo);
printf("Unidades: %d\n", aux->datos.unidades);
printf("Precio: %.2f\n", aux->datos.precio);
printf("Carnet (1 = True y 0 = False): %d\n", aux->datos.carnet);
aux = aux->sig;
Sleep(1500);
i++;
}
} else {
printf("ERROR --> No existe nada que mostrar.\n");
}
}

Función insertar

void insertar() {
nuevo = malloc(sizeof(struct Nodo));
nuevo->sig = NULL;
if (fin == NULL) {
fin = nuevo;
printf("Creamos el primer contenedor.\n");
Sleep(1000);
} else {
fin->sig = nuevo;
fin = nuevo;
printf("Creamos otro contenedor.\n");
Sleep(1000);
}
if (cabecera == NULL) {
cabecera = nuevo;
printf("Cabecera == NULL.\n");
Sleep(1000);
}
system("cls");
fflush(stdin);
if (cabecera != NULL) {
printf("Preguntamos por la moto.\n");
Sleep(1000);
printf("Marca: ");
scanf("%s", nuevo->datos.marca);
printf("\nModelo: ");
scanf("%s", nuevo->datos.modelo);
printf("\nUnidades: ");
scanf("%d", &nuevo->datos.unidades);
printf("\nPrecio: ");
scanf("%f", &nuevo->datos.precio);
printf("\nCarnet necesario (0 = false y 1 = true): ");
scanf("%d", &nuevo->datos.carnet);
fin = nuevo;
}
}

Función consultar

void consultar() {
aux = cabecera;
char nombremodelo[DIM];
printf("Introduzca el modelo que quiere consultar:\n");
scanf("%s", nombremodelo);
while (aux != NULL && strcmp(nombremodelo, aux->datos.modelo) != 0) {
aux = aux->sig;
}
if (aux == NULL) {
printf("El modelo que ha especificado no está disponible.\n");
printf("Por favor, inténtelo de nuevo.\n");
Sleep(1500);
} else {
printf("-----%s\n", aux->datos.marca);
printf("-----%s\n", aux->datos.modelo);
printf("-----%d\n", aux->datos.unidades);
printf("-----%.2f\n", aux->datos.precio);
printf("-----%d\n", aux->datos.carnet);
Sleep(2000);
}
}

Función modificar

void modificar() {
int opm;
char nombremodelo[DIM];
printf("Introduzca el modelo que quiere modificar: ");
scanf("%s", nombremodelo);
aux = cabecera;
while (aux != NULL && strcmp(nombremodelo, aux->datos.modelo) != 0) {
aux = aux->sig;
}
if (aux == NULL) {
printf("El modelo que ha especificado no está disponible.\n");
printf("Por favor, inténtelo de nuevo.\n");
Sleep(1000);
} else {
// Pregunto qué modificaciones desea realizar el usuario
printf("¿Qué desea modificar?\n");
printf("1. Marca.\n");
printf("2. Modelo.\n");
printf("3. Unidades.\n");
printf("4. Precio.\n");
printf("5. Carnet.\n");
// Leo la respuesta de la modificación
scanf("%d", &opm);
switch (opm) {
case 1:
printf("Introduzca la nueva marca: ");
scanf("%s", aux->datos.marca);
break;
case 2:
printf("Introduzca el nuevo modelo: ");
scanf("%s", aux->datos.modelo);
break;
case 3:
printf("Introduzca las nuevas unidades: ");
scanf("%d", &aux->datos.unidades);
break;
case 4:
printf("Introduzca el nuevo precio: ");
scanf("%f", &aux->datos.precio);
break;
case 5:
printf("Introduzca el nuevo carnet (0 = false y 1 = true): ");
scanf("%d", &aux->datos.carnet);
break;
}
}
}

Función borrar

void borrar() {
char nombremodelo[DIM];
printf("Introduzca el modelo que quiere borrar: ");
scanf("%s", nombremodelo);
aux = cabecera;
if (aux != NULL && strcmp(aux->datos.modelo, nombremodelo) == 0) {
cabecera = aux->sig;
free(aux);
} else {
while (aux->sig != NULL && strcmp(nombremodelo, aux->sig->datos.modelo) != 0) {
aux = aux->sig;
}
if (aux->sig != NULL && strcmp(nombremodelo, aux->sig->datos.modelo) == 0) {
borrador = aux->sig;
aux->sig = borrador->sig;
free(borrador);
} else {
printf("No existe el modelo que ha especificado.\n");
printf("Por favor, inténtelo de nuevo.\n");
Sleep(1000);
}
}
}

Función guardar

void guardar() {
int k = 1;
aux = cabecera;
Datos = fopen("carpeta.dat", "wb");
if (Datos == NULL) {
printf("Error al intentar abrir el fichero para guardar los datos.\n");
Sleep(1500);
system("cls");
} else {
while (aux != NULL) {
fwrite(&aux->datos, sizeof(struct producto), 1, Datos);
printf("Se ha guardado correctamente la información de la moto: %d.\n", k);
Sleep(1500);
aux = aux->sig;
k++;
}
fclose(Datos);
printf("Se ha cerrado correctamente el fichero.\n");
Sleep(500);
}
}

Función recuperar

void recuperar() {
aux = cabecera;
int i = 0;
char nomfich[DIM];
printf("Introduce el nombre del fichero del cual leer datos (.dat): ");
scanf("%s", nomfich);
Datos = fopen(nomfich, "rb");
while (Datos == NULL) {
printf("Ha habido un error al intentar abrir el fichero de lectura.\nPor favor, inténtelo de nuevo: ");
scanf("%s", nomfich);
Datos = fopen(nomfich, "rb");
}
printf("Se ha abierto correctamente el fichero de entrada.\n");
Sleep(750);
while (!feof(Datos)) {
fread(&aux->datos, sizeof(struct producto), 1, Datos);
i++;
}
printf("Se han recuperado %d registros del fichero.\n", i);
Sleep(750);
fclose(Datos);
}

Función salir

void salir() {
printf("El programa se cerrará.\n");
printf("Gracias por confiar en nosotros.\n");
Sleep(1500);
system("cls");
}

Función principal

int main() {
int opc;
cabecera = NULL;
fin = cabecera;
opc = menu();
while (opc != 8) {
switch (opc) {
case 1:
mostrar();
opc = menu();
break;
case 2:
insertar();
opc = menu();
break;
case 3:
consultar();
opc = menu();
break;
case 4:
modificar();
opc = menu();
break;
case 5:
borrar();
opc = menu();
break;
case 6:
guardar();
opc = menu();
break;
case 7:
recuperar();
opc = menu();
break;
}
}
salir();
return 0;
}

Descargar

PDF Word HTML