Posted by :
Jason
domingo, 4 de septiembre de 2016
En este programa vamos a crear un MENÚ en el cual se realizaran los siguientes pasos:
1.-Agregar Cédula, Nombre and Apellido.
2.- 2 Notas y calcular automáticamente el promedio .
3.Buscar por Cédula y mostrar todos los datos registrados.
4.-Eliminar por Cédula todos los datos del alumno.
Codigo:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h> /* setlocale */
#include <conio.h>
#define MAX 80
#define VALOR_CENTINELA -1
/* Estructuras */
struct alumno {
int cedula;
char nombre[MAX];
float nota1;
float nota2;
int promedio;
};
typedef struct alumno Estudiante;
/* Opciones del Menú */
void menuPrincipal();
void menuInsertar();
void menuBuscar();
void menuEliminar();
void menuMostrar();
Estudiante *obtenerProductos(int *n);
char existeEstudiante(int cedulaProducto, Estudiante *alumno);
char insertarEstudiante(Estudiante alumno);
char eliminarEstudiante(int cedulaEstudiante);
char eliminacionFisica();
char guardarReporte();
/* Función de lectura de cadenas */
int leecad(char *cad, int n);
char linea[MAX];
int main()
{
setlocale(LC_ALL, "spanish"); /* Permite imprimir caracteres con tilde */
menuPrincipal();
return 0;
}
void menuPrincipal()
{
char repite = 1;
int opcion = -1;
do {
system("cls");
printf("\n\t\t\t\tMENU PRINCIPAL\n");
printf("\n\t\t[1] AGREGAR\n");
printf("\t\t[2] Buscar\n");
printf("\t\t[3] Eliminar\n");
printf("\t\t[4] Mostrar listado de productos\n");
printf("\t\t[5] Salir\n");
printf("\n\t\tIngrese su opcion: [ ]\b\b");
/* Lectura segura de un entero */
leecad(linea, MAX);
sscanf(linea, "%d", &opcion);
switch (opcion) {
case 1:
menuInsertar();
break;
case 2:
menuBuscar();
break;
case 3:
menuEliminar();
break;
case 4:
menuMostrar();
break;
case 5:
repite = 0;
break;
}
} while (repite);
}
void menuInsertar()
{
Estudiante alumno;
int cedulaEstudiante = 0;
char repite = 1;
char respuesta[MAX];
do {
system("cls");
printf("\n\t\t\t==> REGISTRAR ALUMNO <==\n");
printf("\n\tCEDULA: ");
leecad(linea, MAX);
sscanf(linea, "%d", &cedulaEstudiante);
if (!existeEstudiante(cedulaEstudiante, &alumno)) {
alumno.cedula = cedulaEstudiante;
printf("\tNombres: ");
leecad(alumno.nombre, MAX);
printf("\tNota 1: ");
leecad(linea, MAX);
sscanf(linea, "%f", &alumno.nota1);
printf("\tNota 2: ");
leecad(linea, MAX);
sscanf(linea, "%f", &alumno.nota2);
alumno.promedio=(alumno.nota1+alumno.nota2)/2;
printf("\tPromedio: %d",alumno.promedio);
leecad(linea, MAX);
if (insertarEstudiante(alumno)) {
printf("\n\tEl ESTUDIANTE se Registro correctamente\n");
} else {
printf("\n\tOcurrió un error al registrar\n");
printf("\tInténtelo mas tarde\n");
}
} else {
printf("\n\tEl estudiante con cedula %d ya existe.\n", cedulaEstudiante);
printf("\tNo puede registrar dos veces con la misma cedula.\n");
}
printf("\n\tDesea registrar Otro Estudiante? [S/N]: ");
leecad(respuesta, MAX);
if (!(strcmp(respuesta, "S") == 0 || strcmp(respuesta, "s") == 0)) {
repite = 0;
}
} while (repite);
}
void menuBuscar()
{
Estudiante alumno;
int cedulaEstudiante;
char repite = 1;
char respuesta[MAX];
do {
system("cls");
printf("\n\t\t\t==> BUSCAR CEDULA DEL ESTUDIANTE <==\n");
printf("\n\tCEDULA: ");
leecad(linea, MAX);
sscanf(linea, "%d", &cedulaEstudiante);
if (existeEstudiante(cedulaEstudiante, &alumno)) {
printf ("\n\tESTUDINTE ENCONTRADO\n");
printf("\n\tCEDULA: %d\n", alumno.cedula);
printf("\tNombres: %s\n", alumno.nombre);
printf("\tNOTA 1: %.1f \n", alumno.nota1);
printf("\tNOTA 2: %.1f \n", alumno.nota2);
printf("\tPROMEDIO: %d\n", alumno.promedio);
} else {
printf("\n\tEl ESTUDIANTE con cedula %d no existe.\n", cedulaEstudiante);
}
printf("\n\tDesea seguir buscando otra cedula? [S/N]: ");
leecad(respuesta, MAX);
if (!(strcmp(respuesta, "S") == 0 || strcmp(respuesta, "s") == 0)) {
repite = 0;
}
} while (repite);
}
void menuEliminar()
{
Estudiante alumno;
int cedulaEstudiante;
char repite = 1;
char respuesta[MAX];
do {
system("cls");
printf("\n\t\t\t==> ELIMINAR Por CEDULA <==\n");
printf("\n\tCEDULA: ");
leecad(linea, MAX);
sscanf(linea, "%d", &cedulaEstudiante);
if (existeEstudiante(cedulaEstudiante, &alumno))
{
printf("\n\tCEDULA: %d\n", alumno.cedula);
printf("\tNombres: %s\n",alumno.nombre);
printf("\tNOTA 1: %.1f \n", alumno.nota1);
printf("\tNOTA 2: %.1f \n", alumno.nota2);
printf("\tPROMEDIO: %d\n", alumno.promedio);
printf("\n\tSeguro que desea eliminar el Alumno? [S/N]: ");
leecad(respuesta, MAX);
if (strcmp(respuesta, "S") == 0 || strcmp(respuesta, "s") == 0) {
if (eliminarEstudiante(cedulaEstudiante)) {
printf("\n\tEstudiante eliminado satisfactoriamente.\n");
} else {
printf("\n\tEl Estudiante no pudo ser eliminado\n");
}
}
} else {
printf("\n\tEl ESTUDIANTE con cedula %d no existe.\n", cedulaEstudiante);
}
printf("\n\tDesea eliminar otro estudiante? [S/N]: ");
leecad(respuesta, MAX);
if (!(strcmp(respuesta, "S") == 0 || strcmp(respuesta, "s") == 0)) {
repite = 0;
}
} while (repite);
}
void menuMostrar()
{
Estudiante *productos;
int numeroProductos;
int i;
char respuesta[MAX];
system("cls");
productos = obtenerProductos(&numeroProductos);
if (numeroProductos == 0) {
printf("\n\tEl archivo está vacío!!\n");
system("pause>nul");
} else {
printf("\n\t\t ==> ESTUDIANTES REGISTRADOS <==\n");
printf(" ------------------------------------------------------------------------------\n");
printf("%10s\t%-20s%15s%15s%10s\n", "CEDULA", "NOMBRES", "NOTA 1", "NOTA 2", "PROMEDIO");
printf(" ------------------------------------------------------------------------------\n");
for (i = 0; i < numeroProductos; i++) {
if (productos[i].cedula != VALOR_CENTINELA) {
printf("%10d \t%-20.20s%15.1f%15.1f%8d\n", productos[i].cedula, productos[i].nombre, productos[i].nota1, productos[i].nota2, productos[i].promedio);
}
}
printf(" ------------------------------------------------------------------------------\n");
printf("\n\tDesea guardar el registro? [S/N]: ");
leecad(respuesta, MAX);
if (strcmp(respuesta, "S") == 0 || strcmp(respuesta, "s") == 0) {
if (guardarReporte()) {
printf("\n\tEl registro fue guardado con éxito\n");
} else {
printf("\n\tOcurrió un error al guardar el registro\n");
}
system("pause>nul");
}
}
}
Estudiante *obtenerProductos(int *n)
{
FILE *archivo;
Estudiante alumno;
Estudiante *productos;
int i;
/* Abre el archivo en modo lectura */
archivo = fopen("productos.dat", "rb");
if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
*n = 0; /* No se pudo abrir. Se considera n */
productos = NULL;
} else {
fseek(archivo, 0, SEEK_END); /* Posiciona el cursor al final del archivo */
*n = ftell(archivo) / sizeof(Estudiante);
productos = (Estudiante *)malloc((*n) * sizeof(Estudiante));
/* Se recorre el archivo secuencialmente */
fseek(archivo, 0, SEEK_SET); /* Posiciona el cursor al principio del archivo */
fread(&alumno, sizeof(alumno), 1, archivo);
i = 0;
while (!feof(archivo)) {
productos[i++] = alumno;
fread(&alumno, sizeof(alumno), 1, archivo);
}
/* Cierra el archivo */
fclose(archivo);
}
return productos;
}
char existeEstudiante(int cedulaEstudiante, Estudiante *alumno){
FILE *archivo;
char existe;
/* Abre el archivo en modo lectura */
archivo = fopen("productos.dat", "rb");
if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
existe = 0;
} else {
existe = 0;
fread(&(*alumno), sizeof(*alumno), 1, archivo);
while (!feof(archivo)) {
if ((*alumno).cedula == cedulaEstudiante) {
existe = 1;
break;
}
fread(&(*alumno), sizeof(*alumno), 1, archivo);
}
/* Cierra el archivo */
fclose(archivo);
}
return existe;
}
char insertarEstudiante(Estudiante alumno)
{
FILE *archivo;
char insercion;
/* Abre el archivo para agregar datos al final */
archivo = fopen("productos.dat", "ab"); /* Añade datos al final. Si el archivo no existe, es creado */
if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
insercion = 0;
} else {
fwrite(&alumno, sizeof(alumno), 1, archivo);
insercion = 1;
/* Cierra el archivo */
fclose(archivo);
}
return insercion;
}
/* ELiminación lógica de un registro */
char eliminarEstudiante(int cedulaEstudiante)
{
FILE *archivo;
FILE *auxiliar;
Estudiante alumno;
char elimina;
/* Abre el archivo para leer */
archivo = fopen("productos.dat", "r+b"); /* Modo lectura/escritura. Si el archivo no existe, es creado */
if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
elimina = 0;
} else {
/* Se busca el registro que se quiere borrar. Cuando se encuentra, se sitúa en esa posición mediante la
función fseek y luego se modifica el campo clave de ese registro mediante algún valor centinela, eso se logra
con fwrite. Hasta allí se ha logrado una eliminación LÓGICA. Porque el registro sigue ocupando espacio en el archivo físico */
elimina = 0;
fread(&alumno, sizeof(alumno), 1, archivo);
while (!feof(archivo)) {
if (alumno.cedula == cedulaEstudiante) {
fseek(archivo, ftell(archivo) - sizeof(alumno), SEEK_SET);
alumno.cedula = VALOR_CENTINELA;
fwrite(&alumno, sizeof(alumno), 1, archivo);
elimina = 1;
break;
}
fread(&alumno, sizeof(alumno), 1, archivo);
}
/* Cierra el archivo */
fclose(archivo);
}
return elimina;
}
char guardarReporte()
{
FILE *archivo;
char guardado;
Estudiante *productos;
int numeroProductos;
int i;
productos = obtenerProductos(&numeroProductos);
if (numeroProductos == 0) {
guardado = 0;
} else {
/* Abre el archivo en modo texto para escritura */
archivo = fopen("reporte.txt", "w");
if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
guardado = 0;
} else {
fprintf(archivo, "\n\t\t ==> ESTUDIANTES REGISTRADOS <==\n");
fprintf(archivo, " ------------------------------------------------------------------------------\n");
fprintf(archivo, "%8s\t%-20s%15s%15s%10s\n", "CEDULA", "NOMBRES", "NOTA 1", "NOTA 2", "PROMEDIO");
fprintf(archivo, " ------------------------------------------------------------------------------\n");
for (i = 0; i < numeroProductos; i++) {
if (productos[i].cedula != VALOR_CENTINELA) {
fprintf(archivo, "%7d \t%-20.20s%15.1f%15.1f%8d\n", productos[i].cedula, productos[i].nombre, productos[i].nota1, productos[i].nota2, productos[i].promedio);
}
}
fprintf(archivo, " ------------------------------------------------------------------------------\n");
guardado = 1;
/* Cierra el archivo */
fclose(archivo);
}
}
return guardado;
}
int leecad(char *cad, int n)
{
int i, c;
/* 1 COMPROBACIÓN DE DATOS INICIALES EN EL BUFFER */
c = getchar();
if (c == EOF) {
cad[0] = '\0';
return 0;
}
if (c == '\n') {
i = 0;
} else {
cad[0] = c;
i = 1;
}
/* 2. LECTURA DE LA CADENA */
for (; i < n - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
cad[i] = c;
}
cad[i] = '\0';
/*3. LIMPIEZA DEL BUFFER */
/* Finalmente limpiamos el buffer si es necesario */
if (c != '\n' && c != EOF) /* es un caracter */
while ((c = getchar()) != '\n' && c != EOF);
return 1;
}