#include <stdlib.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <iomanip.h> #include <fstream.h> #include <conio.h>
// Nombre del archivo fisico const char princ[] = "registro.dat";
const int ap = 21; // Longitud maxima del apellido const int nom = 16; // Longitd maxima del nombre
// Prototipos void eliminar(); void altas(); void retocar(char); void imprimir(); int existe(char[],char[], int &, long &);
/**********************************************/ /* ================= main() ==================*/ /**********************************************/
void main() { char opcion; clrscr(); cout << "\n PEQUENO SISTEMA DE CALIFICAcIONES "; cout << "\n echo en c++ 3.0 "; cout << "\n Estas son las operaciones disponibles: "; do { cout <<endl <<endl; cout << " A. PONER CALIFICACION A UN NUEVO ALUMNO\n"; cout << " B. BORRAR UN REGISTRO\n"; cout << " C. CAMBIAR UNA CALIFICACION\n"; cout << " D. IMPRIMIR EL ARCHIVO\n"; cout << " X. ELIMINAR EL ARCHIVO DE DATOS\n"; cout << " F. FIN\n"; cout << "\n Escriba su opcion: "; if (!cin.get(opcion)) break; // Para atrapar EOF cin.ignore(80, '\n'); // Ingnorar el resto del renglon opcion = toupper(opcion); // Unificar todo a mayusculas switch (opcion) { case 'A': altas(); break; case 'B': retocar('b'); break; case 'C': retocar('c'); break; case 'D': imprimir(); break; case 'X': eliminar(); break; case 'F': break; default: cout << "\n Opcion desconocida\n"; } } while (opcion != 'F'); cout << "\n Adios."; } // Fin del main
/**************************************************/ /* ================= eliminar() ==================*/ /**************************************************/
//Eliminar el archivo de datos
void eliminar() { clrscr(); char c; ifstream prueba; prueba.open(princ, ios::nocreate); prueba.close(); if (prueba) { cout << "\n\n\n Seguro? (s/n): "; cin.get(c); cin.ignore(80, '\n'); c = toupper(c); if (c == 'S') { if (remove(princ)) // La funcion devuelve 0 si lo hizo cout << "\n No se pudo eliminar el archivo."; else cout << " Archivo eliminado.\n"; } else ; // Enunciado nulo, imprescindible en este caso. } else cout << "\n El archivo no existe.\n"; } // eliminar
/********************************************/ /* Estructura global de un registro de datos*/ /********************************************/
struct registro { char apellido[ap]; char nombre[nom]; int calif; }; char marca = '\177'; // Caracter especial de "borrado"
/***********************************************/ /* ================= altas() ==================*/ /***********************************************/
// Da de alta nombres y calificaciones en el archivo en disco void altas() { clrscr(); int i = 1; int x; // Parametro auxiliar; aqui solo ocupa un espacio long y; // Parametro auxiliar; aqui solo ocupa un espacio
// Definicion de una variable tipo "registro" registro alumno = {0}; ifstream prueba; ofstream disco; //Abrir el archivo de datos, o crearlo si no existe prueba. open(princ, ios::nocreate); prueba.close(); if (!prueba) { cout << "\n\nEl archivo no existe; se crea ahora.\n"; disco.open(princ); disco.close(); } // Lectura inicial cout << endl; cout.width(3); // Alinear a la derecha el contador cout << "Registro numero " << i << "\n\n\nApellido, o presione 0 para terminar: "; if (!cin.getline(alumno.apellido,ap)) return; // Cuidar EOF // Continuar si no fue el ultimo while (alumno.apellido[0] != '0') { cout << "\nNombre: "; if (!cin.getline(alumno.nombre,nom)) return; //Cuidar EOF // Cuidado con datos duplicados if (!existe(alumno.apellido, alumno.nombre, x, y)) { do { cout << "\nCalificacion (10-70): "; cin >> alumno.calif; cin.ignore(80, '\n'); //Ignorar el resto del renglon } while (alumno.calif < 10 || alumno.calif > 70); disco.open(princ, ios::app); disco.write((char *)&alumno, sizeof(registro)); disco.close(); i++; } else cout << "\n ERROR: esa persona ya existe.\n"; cout << endl; cout.width(3); cout << "\nApellido, o presione 0 para terminar: "; cin.getline(alumno.apellido,ap); } cout << "\n El total de alumnos dados de alta es: " << i-1 << endl; disco.close(); } // Fin de altas
/******************************************************/ /* ================= retocar (modo) ==================*/ /******************************************************/
//Borrar (modo='b') o cambiar (modo='c') datos del archivo void retocar(char modo) { int i = 1; int calif; // Variable temporal long reg; // Contador de registros registro alumno = {0};
//Verificar si existe el archivo ifstream prueba; ofstream disco; prueba.open (princ, ios::nocreate); prueba.close(); if (prueba) { // Lectura inicial cout << endl; cout.width(3); cout << i << " Apellido del alumno "; if (modo =='b') cout << "a borrar, "; else cout << "a quien se desea cambiar la calificacion,\n"; cout << "o un 0 para terminar: "; if (!cin.getline(alumno.apellido,ap)) return; // Cuidar EOF // Continuar si no fue el último while (alumno.apellido[0] != '0') { cout << "Nombre: "; if (!cin.getline(alumno.nombre,nom)) return; // ¿EOF? if (existe(alumno.apellido, alumno.nombre, calif, reg)) { if (modo == 'b') // Marcarlo como borrado e inutilizarlo alumno.apellido[0] = marca; else { // Cambios cout << "\nSu calificacion anterior es " << calif << endl; do { cout << " Nueva calificacion (10-70): "; cin >> alumno.calif; cin.ignore(80, '\n'); // Ignorar el resto del renglón if (calif == alumno.calif) { cout << " Es la misma...\n"; i--; } } while (alumno.calif < 10 || alumno.calif > 70); } disco.open(princ, ios::ate); // Va directo a ese registro disco.seekp(reg*sizeof(registro), ios::beg); disco.write((char *)&alumno, sizeof(registro)); disco.close(); i++; if (modo == 'b') cout << "\n Borrado.\n"; else if (calif != alumno.calif) cout << "\n Cambiada.\n"; } else cout << "\nERROR: esa persona no esta registrada.\n"; cout << endl; cout.width(3); cout << i << " Apellido del alumno "; if (modo == 'b') cout << "a borrar, "; else cout << "a quien se desea cambiar la calificacion,\n"; cout << "o un 0 para terminar: "; if (!cin.getline(alumno.apellido,ap)) return; // ¿EOF? } if (modo == 'b') cout << "\n Total de alumnos borrados: " << i-1 << endl; else cout << "\n Total de calificacion cambiadas: " << i-1 << endl; } else cout << "\n El archivo no existe:\n" << " aún no se han dado de alta alumnos.\n"; } // retocar
/**************************************************/ /* ================= imprimir() ==================*/ /**************************************************/ // Muestra los contenidos del archivo en disco void imprimir() { clrscr(); int i = 0; float suma = 0.0; registro alumno = {0};
ifstream prueba; ifstream disco;
// Verificar si existe el archivo prueba.open(princ, ios::nocreate); prueba.close(); if (prueba) { // Leer los datos del disco disco.open(princ, ios::beg); cout << "\n REPORTE DE CALIFICACIONES\n"; disco.read((char *)&alumno, sizeof(registro)); // Lectura inicial while(!disco.eof()) { if (alumno.apellido[0] != marca) { i++; cout << endl; cout.width(3); cout << i << " "; cout << alumno.apellido << " "; cout << alumno.nombre; cout.width(ap+nom-strlen(alumno.apellido)- strlen(alumno.nombre)); cout << alumno.calif; suma += alumno.calif; } disco.read((char *)&alumno, sizeof(registro)); } if (i > 0) { cout << endl << endl; cout.width(ap+nom+3); cout << "Promedio: "; cout.precision(2); cout.setf(ios::fixed); cout.width(6); cout << suma/i << endl; } else cout << "\nEl archivo esta vacio.\n"; } else cout << "\n El archivo no existe: " << " aun no se han dado de alta alumno.\n\n"; } // imprimir
/************************************************/ /* ================= existe() ==================*/ /************************************************/ // Localizar un registro en el archivo int existe(char cad1[], char cad2[], int &calif, long ®) { int ya = 0; registro temp ={0}; ifstream disco; disco.open(princ); reg = 0L; disco.seekg(reg, ios::beg); // Colocarse al inicio del archivo disco.read((char *)&temp, sizeof(registro)); // Lectura inicial calif = temp.calif; // La usar el modulo retocar ('c') while ((!disco.eof()) && !ya) // strcmp devuelve 0 si las cadenas son iguales if (strcmp(temp.apellido, cad1) || strcmp(temp.nombre, cad2)) { disco.read((char *)&temp, sizeof(registro)); // Siguiente calif = temp.calif; reg++; // Lleva cuenta del numero de registros leidos } else ya = 1; // Si fue return ya; disco.close(); } // Fin existe |