ayuda con explicacion de codigo

Iniciado por Fatmf44, 23 Junio 2010, 23:51 PM

0 Miembros y 1 Visitante están viendo este tema.

Fatmf44

hola a todos me podrian dar una pequeña clase y explicar las lineas d codigos de este pequeño fragemento de codigos.
gracias de antemano
saludos cordiales


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <iostream>
#define MAXSTR 0xFF

using namespace std;

typedef struct ClaseAlumno{
   int matricula;
   char* nombre;
}Alumno;

int comparar_alumno (const void *alumno1, const void *alumno2);
void imprimir_alumno (Alumno *alumno);
Alumno* agregar_alumno (Alumno *alumnos, Alumno *alumno, int *n);
char* leer_linea    (const char *mensaje);
char* leer_cadena   (const char *mensaje, char *cadena);
int   leer_entero   (const char *mensaje, int menor, int mayor);
float leer_real     (const char *mensaje);
char  leer_caracter (const char *mensaje);
int   leer_campo (FILE *archivo, char *cadena);

int main(){
   Alumno alumno, *alumnos = NULL, *p;
   int opcion, n=0, i;
   char cadena[MAXSTR], *ruta = "D:\\alumnos.txt";
   FILE *archivo;
   archivo = fopen(ruta, "r");
   if (archivo!=NULL)
   {
       while (leer_campo(archivo, cadena))
       {
alumno.matricula = atoi(cadena);
           leer_campo(archivo, cadena);
           alumno.nombre = strdup (cadena);
           alumnos = agregar_alumno(alumnos, &alumno, &n);
       }
       fclose(archivo);
   }
   do{
       system ("cls");
       cout<<endl
<<"MENU DEL SISTEMA DE MATRICULA DE ALUMNOS"<<endl
<<"1.- Agregar nuevo alumno"<<endl
<<"2.- Consultar un alumno"<<endl
<<"3.- Modificar un alumno"<<endl
<<"4.- Eliminar un alumno"<<endl
<<"5.- Reporte de todos los alumnos"<<endl
<<"6.- Salir del sistema"<<endl
<<endl;
       opcion = leer_entero("Seleccione una opcion: ", 1, 6);
       if(opcion<5)
       {
           alumno.matricula=leer_entero("Ingrese el matricula del alumno: ", 0, INT_MAX);
           p = n==0? NULL:(Alumno*) bsearch(&alumno, alumnos, n, sizeof(Alumno), comparar_alumno);
           if(p!=NULL)
               imprimir_alumno (p);
       }
       if(p!=NULL && opcion==1)
           cout<<"El alumno ya existe"<<endl;
       else if (p==NULL && opcion>=2 && opcion<=4)
           cout<<"Alumno no encontrado"<<endl;
       else switch(opcion)
       {
           case 1:
               alumno.nombre = leer_linea("Ingrese el nombre: ");
               alumnos = agregar_alumno (alumnos, &alumno, &n);
               cout<<"Registro agregado correctamente"<<endl;
               break;
           case 3:
               free(p->nombre);
               p->nombre = leer_linea("Ingrese el nombre: ");        
               cout<<"Alumno actualizado correctamente"<<endl;
               break;
           case 4:
               free(p->nombre);
               if (p!=&alumnos[n-1])
                   memcpy (p, &alumnos[n-1], sizeof(Alumno));
               n--;
               alumnos=(Alumno*) realloc(alumnos, sizeof(Alumno) * n);
               qsort(alumnos, n, sizeof(Alumno), comparar_alumno);
               cout<<"Alumno borrado correctamente"<<endl;
               break;
           case 5:
               for (i=0; i<n; i++)
                   imprimir_alumno (&alumnos[i]);
               break;
       }
       if(opcion<6 && opcion>=1)
       {
           system("pause");
       }
   } while(opcion!=6);
   archivo=fopen(ruta, "w");
   if(archivo!=NULL)
   {
       for (i=0; i<n; i++)
           fprintf (archivo, "%d,%s\n", alumnos[i].matricula, alumnos[i].nombre);
       fclose(archivo);
   }
   return EXIT_SUCCESS;
}

int comparar_alumno(const void *alumno1, const void *alumno2)
{
   return((Alumno*)alumno1)->matricula-((Alumno*)alumno2)->matricula;
}

void imprimir_alumno(Alumno *alumno)
{
   printf("matricula: %d\n", alumno->matricula);
   printf("nombre   : %s\n", alumno->nombre);
}

Alumno* agregar_alumno(Alumno *alumnos, Alumno *alumno, int *n)
{
   *n = *n + 1;
   alumnos=(Alumno*)realloc(alumnos, sizeof(Alumno)*(*n));
   memcpy(&alumnos[(*n)-1], alumno, sizeof(Alumno));
   qsort(alumnos, *n, sizeof(Alumno), comparar_alumno);
   return alumnos;
}

char *leer_linea(const char *mensaje)
{
   char linea[MAXSTR];
   leer_cadena(mensaje, linea);
   return strdup(linea);
}

char* leer_cadena(const char *mensaje, char *cadena)
{
   char *salto;
   cout<<mensaje;
   fgets(cadena, MAXSTR, stdin);
   salto=strchr(cadena, '\n');
   if(salto!=NULL)
       *salto = '\0';
   return cadena;
}

int leer_entero(const char *mensaje, int menor, int mayor)
{
   int valor;
   do {
       valor =(int)leer_real (mensaje);
       if (valor<menor || valor>mayor)
           cout<<"Numero no valido"<<endl;
   } while(valor<menor || valor>mayor);
   return valor;
}

float leer_real(const char *mensaje)
{
   char cadena[MAXSTR];
   leer_cadena(mensaje, cadena);
   return atof(cadena);
}

char leer_caracter(const char *mensaje)
{
   char linea[MAXSTR];
   leer_cadena(mensaje, linea);
   return linea[0];
}

int leer_campo(FILE *archivo, char *cadena)
{
   fscanf(archivo, "%[^,\n\r]", cadena);
   if(feof(archivo))
return 0;
   fgetc(archivo);
return 1;
}


Littlehorse

Fatmf44 ya posteaste lo mismo en otro hilo. Lee nuevamente las respuestas que te dieron en el, y en el caso que tengas alguna duda puntual, la realizas allí.

Recuerda que en esta sección no se hacen tareas, dale una leída a las reglas

Saludos

Cerrado
An expert is a man who has made all the mistakes which can be made, in a very narrow field.