You are on page 1of 5

#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #include <stdlib.

h> #define BD_OK 1 #define BD_ERROR 0 typedef unsigned char byte; typedef unsigned int word; struct REGISTRO { word Indice; char Nombre[64]; byte Edad; byte Notas[3]; }; word NumeroRegistros (FILE *BaseDatos) { word Indice; fseek(BaseDatos,0,SEEK_SET); fread(&Indice,sizeof(word),1,BaseDatos); return Indice; } word AbrirBaseDatos (char *NombreBaseDatos,FILE **BaseDatos) { word Indice= 0; *BaseDatos= fopen(NombreBaseDatos,"rb+"); if (!(*BaseDatos)) { *BaseDatos= fopen(NombreBaseDatos,"wb+"); if (*BaseDatos) fwrite(&Indice,sizeof(word),1,*BaseDatos); else return BD_ERROR; } return BD_OK; } void CerrarBaseDatos (FILE *BaseDatos) { fclose(BaseDatos); } word AgregarRegistro (FILE *BaseDatos,REGISTRO *Registro) { word Indice= NumeroRegistros(BaseDatos); Registro->Indice= Indice; fseek(BaseDatos,0,SEEK_END); fwrite(Registro,sizeof(REGISTRO),1,BaseDatos);

Indice++; fseek(BaseDatos,0,SEEK_SET); fwrite(&Indice,sizeof(word),1,BaseDatos); return BD_OK; } word ActualizarRegistro (FILE *BaseDatos,REGISTRO *Registro) { word Indice= NumeroRegistros(BaseDatos); if (Registro->Indice>=Indice) return BD_ERROR; fseek(BaseDatos,Registro->Indice*sizeof(REGISTRO)+sizeof(word),SEEK_SET); fwrite(Registro,sizeof(REGISTRO),1,BaseDatos); return BD_OK; } word RecuperarRegistro (FILE *BaseDatos,REGISTRO *Registro) { word Indice= NumeroRegistros(BaseDatos); if (Registro->Indice>=Indice) return BD_ERROR; fseek(BaseDatos,Registro->Indice*sizeof(REGISTRO)+sizeof(word),SEEK_SET); fread(Registro,sizeof(REGISTRO),1,BaseDatos); return BD_OK; } word BuscarRegistro (FILE *BaseDatos,REGISTRO *Registro,char *Nombre) { word Indice= NumeroRegistros(BaseDatos); word n; for (n=0;n<Indice;n++) { fread(Registro,sizeof(REGISTRO),1,BaseDatos); if (strcmp(Registro->Nombre,Nombre)==0) return BD_OK; } return BD_ERROR; } char MenuPrincipal (word NumeroRegistros) { char Tecla; clrscr(); printf("\nMANEJO DE ARCHIVOS DE ACCESO DIRECTO\n\n"); printf("LA BASE DE DATOS CONTIENE %u ALUMNOS REGISTRADOS\n\n",NumeroRegistros); printf ("[A]\tAgregar Alumnos\n"); printf ("[B]\tAsentar Calificaciones\n"); printf ("[C]\tDesplegar Lista de Alumnos Registrados\n\n"); printf ("[X]\tSalir del Programa\n"); do{ Tecla= toupper(getch()); }while ((Tecla!='A')&&(Tecla!='B')&&(Tecla!='C')&&(Tecla!='X')); return Tecla; }

void AgregarAlumno (FILE *BaseDatos) { word n; char Temporal[64]; REGISTRO Registro; clrscr(); printf("\nMANEJO DE ARCHIVOS DE ACCESO DIRECTO\n\n"); printf("AGREGAR UN ALUMNO A LA BASE DE DATOS\n\n"); printf("\n\nDatos del Alumno\nApellido: "); scanf("%s",&Temporal); printf("Nombre: "); scanf("%s",&(Registro.Nombre)); strcat(Registro.Nombre," "); strcat(Registro.Nombre,Temporal); printf("Edad: "); scanf("%u",&(Registro.Edad)); for (n=0;n<3;n++) Registro.Notas[n]= 0; AgregarRegistro(BaseDatos,&Registro); printf("\n\Alumno Agregado - Presione Cualquier Tecla para Continuar..."); getch(); } void ListarAlumnos (FILE *BaseDatos) { word n,m; word Indice= NumeroRegistros(BaseDatos); REGISTRO Registro; clrscr(); printf("\nMANEJO DE ARCHIVOS DE ACCESO DIRECTO\n\n"); printf("LA BASE DE DATOS CONTIENE %u ALUMNOS REGISTRADOS\n\n",Indice); printf("DESPLEGAR LA LISTA DE ALUMNOS REGISTRADOS EN LA BASE DE DATOS\n\n"); for (n=0;n<Indice;n++) { Registro.Indice= n; RecuperarRegistro(BaseDatos,&Registro); printf("\nNombre:\t%s\n",Registro.Nombre); printf("Edad:\t%u aos\n",Registro.Edad); for (m=0;m<3;m++) { printf("Nota %u:\t",m+1); if (Registro.Notas[m]==0) printf("Sin Asentar\n"); else printf("%u puntos\n",Registro.Notas[m]); } } printf("\n\nPresione Cualquier Tecla para Continuar..."); getch(); } void AsentarCalificacion (FILE *BaseDatos) { word n,m; word Indice= NumeroRegistros(BaseDatos);

REGISTRO Registro; clrscr(); printf("\nMANEJO DE ARCHIVOS DE ACCESO DIRECTO\n\n"); printf("LA BASE DE DATOS CONTIENE %u ALUMNOS REGISTRADOS\n\n",Indice); printf("ASENTAR CALIFICACIN\n\n\n"); for (n=0;n<Indice;n++) { Registro.Indice= n; RecuperarRegistro(BaseDatos,&Registro); printf("[%u] %s\t",n+1,Registro.Nombre); } printf("\n\nSeleccione el Estudiante al cual le Asignar Calificaciones"); do{ m= getch()-'0'; } while ((m<1)&&(m>Indice)); Registro.Indice= m-1; RecuperarRegistro(BaseDatos,&Registro); printf("\n\nEstudiante Seleccionado\n\n"); printf("Nombre:\t%s\n",Registro.Nombre); printf("Edad:\t%u aos\n",Registro.Edad); for (m=0;m<3;m++) { printf("Nota %u:\t",m+1); if (Registro.Notas[m]==0) printf("Sin Asentar\n"); else printf("%u puntos\n",Registro.Notas[m]); } printf("\nIndique el Nmero de Calificacin a Asentar: "); do{ m= getch()-'0'; } while ((m<1)&&(m>3)); putchar(m+'0'); printf("\nIndique la Nota correspondiente a la Calificacin %u: ",m); scanf("%u",&(Registro.Notas[m-1])); ActualizarRegistro(BaseDatos,&Registro); printf("\n\nRegistro Actualizado\n\n"); printf("Nombre:\t%s\n",Registro.Nombre); printf("Edad:\t%u aos\n",Registro.Edad); for (m=0;m<3;m++) { printf("Nota %u:\t",m+1); if (Registro.Notas[m]==0) printf("Sin Asentar\n"); else printf("%u puntos\n",Registro.Notas[m]); } printf("\n\nPresione Cualquier Tecla para Continuar..."); getch();

} void main (void) {FILE *BD; word NR,n,m; word NumeroAlumnos; AbrirBaseDatos("c:\\ca\\ejemplo.db",&BD); NumeroAlumnos= NumeroRegistros(BD); do { switch (MenuPrincipal(NumeroAlumnos)) { case 'A': AgregarAlumno(BD); break; case 'B': AsentarCalificacion(BD); break; case 'C': ListarAlumnos(BD); break; case 'X': CerrarBaseDatos(BD); printf("\n\nEl Programa va a Terminar - Presione Cualquier Tecla"); getch(); clrscr(); exit(0); } } while(1); }

You might also like