Anda di halaman 1dari 11

// Diversas bibliotecas requeridas #include <stdlib.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <iomanip.h> #include <fstream.

h>

// Nombre del archivo fsico const char princ[] = "C2000";

const int ap = 21; // Longitud mxima del apellido const int nom = 16; // Longitd mxima del nombre

// Prototipos void eliminar(); void altas(); void retocar(char); void imprimir(); int existe(char[],char[], int &, long &);

/* ================= main() ==================*/ void main() {

char opcion;

cout << "\n

PEQUENO SISTEMA DE REPORTES C++\n";

cout << "\n Estas son las operaciones disponibles:\n"; 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 rengln opcion = toupper(opcion); // Unificar todo a maysculas 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 Opcon desconocida\n"; } } while (opcion != 'F');

cout << "\n Adios."; } // main

/* ================= eliminar() ==================*/ //Eliminar el archivo de datos void eliminar() { char c;

ifstream prueba; prueba.open(princ, ios::nocreate); prueba.close(); if (prueba) { cout << "\n Seguro? (s/n): "; cin.get(c); cin.ignore(80, '\n'); c = toupper(c); if (c == 'S') { if (remove(princ)) // La funcin 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'; // Carcter especial de "borrado"

/* ================= altas() ==================*/ // Da de alta nombres y calificaciones en el archivo en disco void altas() { int i = 1; int x; // Parmetro auxiliar; aqu slo ocupa un espacio long y; // Parmetro auxiliar; aqu slo ocupa un espacio

// Definicin de una variable tipo "registro" registro alumno = {0};

ifstream prueba; ofstream disco;

//Abrir el archivo de datos, o crearlo si no exista prueba. open(princ, ios::nocreate); prueba.close();

if (!prueba) { cout << "\n\n El archivo no exista; se crea ahora.\n"; disco.open(princ); disco.close(); }

// Lectura inicial cout << endl; cout.width(3); // Alinear a la derecha el contador cout << i << " Apellido, 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; //Cuidar EOF // Cuidado con datos duplicados if (!existe(alumno.apellido, alumno.nombre, x, y)) { do { cout << " Calificacion (0-100): "; cin >> alumno.calif; cin.ignore(80, '\n'); //Ignorar el resto del rengln } while (alumno.calif < 0 || alumno.calif > 100); 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 << i << " Apellido, o un 0 para terminar: "; cin.getline(alumno.apellido,ap); } cout << "\n Total de alumnos dados de alta: " << i-1 << endl; disco.close(); } // 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,\n"; else cout << "a quien\n 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 << "\n Su calificacion anterior es " << calif << endl; do { cout << " Nueva calificacion (0-100): "; cin >> alumno.calif; cin.ignore(80, '\n'); // Ignorar el resto del rengln if (calif == alumno.calif) { cout << " Es la misma...\n"; i--; }

} while (alumno.calif < 0 || alumno.calif > 100); } 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 << "\n ERROR: esa persona no est registrada.\n"; cout << endl; cout.width(3); cout << i << " Apellido del alumno "; if (modo == 'b') cout << "a borrar,\n"; else cout << "a quien\n 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" << " an no se han dado de alta alumnos.\n"; } // retocar

/* ================= imprimir() ==================*/ // Muestra los contenidos del archivo en disco void imprimir() { 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 << "\n El archivo est vaco.\n"; } else cout << "\n El archivo no existe:\n" << " an no se han dado de alta alumno.\n";

} // imprimir

/* ================= existe() ==================*/ // Localizar un registro en el archivo int existe(char cad1[], char cad2[], int &calif, long &reg)

{ 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 mdulo 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 nmero de registros ledos } else ya = 1; // S fue return ya; disco.close(); } //existe

Anda mungkin juga menyukai