/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

ayudaaa sistema de calificaciones

 
      Índice del Foro elrincondelc.com -> Acción requerida
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
men_war



Registrado: 25 Nov 2005
Mensajes: 1

MensajePublicado: 25/11/2005 7:41 pm
Título: ayudaaa sistema de calificaciones

weno este programa lo e desarroyado con ayuda de varios mas, lo q ase es guardar el nombre de un alumno, y su nota, promediar las notas de tooo los alumnos, borrar registros de alumnos (tiene un problema), y borrar el fichero de registros. alguen me puede ayudar a mejorarlo antes del miercoles para un examen, lo agradesere, estare atento a una respuesta, intente especificar todo lo q ase cada funcion para q entiendan porq ise o agregue cada cosa.

Código:
#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
Volver arriba
      Índice del Foro elrincondelc.com -> Acción requerida
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com