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
#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;
}
Fatmf44 ya posteaste lo mismo en otro hilo (http://foro.elhacker.net/programacion_cc/ayuda-t296972.0.html;msg1471080#msg1471080). 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 (http://foro.elhacker.net/programacion_cc/reglas_del_subforo-t251603.0.html)
Saludos
Cerrado