Programa en C para Gestionar una Base de Datos de Agencia: Ejemplo con Structs y Ordenación
Programa en C para gestionar una base de datos de agencia
A continuación se presenta un programa en lenguaje C que implementa una pequeña base de datos de una agencia. El programa utiliza una estructura (struct) para almacenar nombre, edad y ficha de cada registro, y ofrece un menú interactivo para introducir, modificar, ordenar, mostrar y guardar los datos.
Declaración de variables y estructuras
FILE *pf;
struct registro {
char nombre[20];
int edad;
int ficha;
};
struct registro reg[6], reg2[1];
Prototipos de funciones
void introducir(void);
void modificar(void);
void orde_nombre(void);
void orde_porficha(void);
void orde_edad(void);
void mostrar(void);
void guardar(void);
Función principal y menú
La función main muestra una pantalla de bienvenida y, a continuación, un menú de opciones que se repite hasta que el usuario pulsa la tecla 8 para salir.
int main(int argc, char *argv[])
{
char op;
gotoxy(20,20);
printf("ESTA ES LA BASE DE DATOS ");
gotoxy(20,22);
printf("pulse cualquier tecla");
gotoxy(50,24);
printf(" --agencia repre--");
getch();
do {
clrscr();
gotoxy(15,5); printf("MENU");
gotoxy(15,6); printf("-------------------");
gotoxy(15,7); printf("1. Introducir datos");
gotoxy(15,8); printf("2. Modificar datos");
gotoxy(15,9); printf("3. Ordenar alfabéticamente");
gotoxy(15,10); printf("4. Mostrar de mayor a menor por ficha");
gotoxy(15,11); printf("5. Ordenar productos por mayor edad");
gotoxy(15,12); printf("6. Mostrar datos");
gotoxy(15,13); printf("7. Guardar datos");
gotoxy(15,14); printf("8. Salir");
gotoxy(15,15); printf("-------------------");
op = getch();
switch (op) {
case '1': { introducir(); break; }
case '2': { modificar(); break; }
case '3': { orde_nombre(); break; }
case '4': { orde_porficha(); break; }
case '5': { orde_edad(); break; }
case '6': { mostrar(); break; }
case '7': { guardar(); break; }
case '8': {
gotoxy(15,5);
printf("adiós");
getch();
break;
}
default: {
gotoxy(15,5);
printf("Pulsa la tecla correcta");
getch();
break;
}
}
} while (op != '8');
}
Introducir datos
La función introducir solicita al usuario el nombre, la edad y la ficha de cada uno de los seis registros.
void introducir(void)
{
clrscr();
int i, ca;
for (i = 1; i < 7; i++) {
clrscr();
gotoxy(15,5); printf("Introduce nombre %d: ", i);
scanf("%s", reg[i].nombre);
gotoxy(15,6); printf("Introduce edad %d: ", i);
scanf("%d", &ca);
reg[i].edad = ca;
gotoxy(15,7); printf("Introduce ficha %d: ", i);
scanf("%d", &ca);
reg[i].ficha = ca;
}
return;
}
Modificar datos
Permite seleccionar un registro existente y actualizar su nombre y edad. Se valida que el número introducido esté en el rango permitido.
void modificar(void)
{
int comp, x, i;
mostrar();
do {
gotoxy(15,5);
printf("¿Qué número deseas modificar?: ");
scanf("%d", &comp);
} while (comp < 0 || comp > 6);
gotoxy(15,6); printf("Introduce nombre %d: ", comp);
scanf("%s", ®[comp].nombre);
gotoxy(15,7); printf("Introduce edad de \"%s\": ", reg[comp].nombre);
scanf("%d", ®[comp].edad);
}
Ordenar alfabéticamente
La función orde_nombre aplica el método de ordenación por burbuja comparando los nombres con strcmp. Al intercambiar nombres se intercambian también la edad y la ficha, manteniendo coherente cada registro.
void orde_nombre()
{
clrscr();
int i, j, com, a;
char aux[20];
for (i = 1; i < 7; i++) {
for (j = i + 1; j < 7; j++) {
com = strcmp(reg[i].nombre, reg[j].nombre);
if (com > 0) {
strcpy(aux, reg[i].nombre);
strcpy(reg[i].nombre, reg[j].nombre);
strcpy(reg[j].nombre, aux);
a = reg[i].edad;
reg[i].edad = reg[j].edad;
reg[j].edad = a;
a = reg[i].ficha;
reg[i].ficha = reg[j].ficha;
reg[j].ficha = a;
}
}
}
for (i = 1; i < 7; i++) {
gotoxy(15, 5 + i);
printf(" %s: %d %d euros", reg[i].nombre, reg[i].edad, reg[i].ficha);
}
getch();
return;
}
Ordenar por ficha
La función orde_porficha sigue la misma lógica de comparación, pero ordena los registros según el valor de la ficha, de mayor a menor.
void orde_porficha(void)
{
clrscr();
int i, j, a;
char nom[20];
for (i = 1; i < 7; i++) {
for (j = i + 1; j < 7; j++) {
if (reg[i].ficha < reg[j].ficha) {
// intercambio de registros (completar según el código original)
}
}
}
}
Observaciones
- El código utiliza
gotoxy,clrscrygetch, funciones de la bibliotecaconio.hpropia de compiladores como Turbo C. - Se recomienda incluir las cabeceras
<stdio.h>y<string.h>para el correcto funcionamiento deprintf,scanfystrcmp. - En la función
modificarse usa®[comp].nombreen el documento original; al tratarse de un array de caracteres, basta conreg[comp].nombre.