Registro de personas [YA RESUELTO!!!!]

Iniciado por Principios en C, 23 Octubre 2011, 03:57 AM

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

Principios en C

Hola...

Bueno tengo una mega duda sobre los apuntadores, ya lei demasiado sobre ello pero son muy dificiles de manejar o al menos a mi se me dificultan y no les entiendo. El mayor problema de esto es que tengo que hacer una base de datos de alumnos de una escuela. El programa debe constar de:
  • Cada alumno debe tener datos personales, como: apellidos, nombre, edad, carrera, año de ingreso y 5 calificaciones.
  • Con el llamado de una funcion se debe calcular el promedio de calificaciones por materia segun la carrera (Existen digamos tres carreras en la escuela y algunas materias son tronco comun)
  • Con el llamado de otra funcion se debera calcular el numero de alumnos y alumnas por carrera
  • Con el llamado de una funcion se tiene que clasificar a los alumnos por el año de ingreso

Lo que se me ha ocurrido (y talvez no significa mucho) es crear un arreglo de 7 o mas entradas, debido a los datos que deba poner al alumno ... bueno mejor lo escribo, seria algo asi como:

char*reg_alumno[7]

hago que apunte a un char ya que los datos son de tipo distinto y como no me dejan usar estructuras... Pero no entiendo apuntadores, una mega ayudisima, por favor!!


naderST

Que tal una estructura? te vendría mejor, por lo que veo la "base de datos" tiene que estar en memoria para eso simplemente reserva la cantidad de elementos que necesites y luego los vas aumentando o disminuyendo de acuerdo a las necesidades del programa. Busca sobre malloc(), calloc() y realloc()

Principios en C

Eso pensaba o, porque a las estructuras si les entiendoo, Pero no me dejan usarlas!! todo debe ser con apuntadores... por ello pido que echen una mano, porfis!!!!

naderST

Puedes tener apuntadores a estructuras no veo el problema...

Principios en C

Cita de: naderST en 23 Octubre 2011, 23:49 PM
Puedes tener apuntadores a estructuras no veo el problema...

Eso imagine pero no puedo avanzar ya que no se manejar los apuntadores, se me hacen muy laboriosos..

Me podran ayudar con el esqueleto del programa y ya asi darme una idea?? por fa, es que en serio que no se manejar apuntadores... lo que regularmente hago es subir lo que llevo trabajado del codigo y aqui me hacen el favor de decirme mis errores y ayudarme pero esta vez no tengo naditititita... :(

do-while

¡Buenas!

Siempre puedes simular los struct con punteros y vectores. Por ejemplo el siguiete struct:

struct cosa
{
   char letra;
   int numero;
   char cadena[10];
};


Puedes pasarlo a un vector asi:

char cosa[sizeof(char) + sizeof(int) + 10 * sizeof(char)]

de esta forma tienes espacio para almacenar todos los datos del struct.

Ahora si quieres acceder a los distintos datos, solo tendras que desplazarte dentro de la memoria hasta la posicion en la que se encuentran. Para acceder a la cadena, suponiendo que el orden que hemos elegido dentro del vector sea letra, numero y cadena, lo harias de la siguiente manera:

strcpy(cosa + (sizeof(char) + sizeof(int)) , otra_cadena);

strcpy(&cosa[sizeof(char) + sizeof(int)] , otra_cadena);

printf("%s",cosa + sizeof(char) + sizeof(int));

printf("%d",cosa[sizeof(char)]);

memcpy(cosa + sizeof(char) , &un_entero , sizeof(int));


¡Espero que te sirva!

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: Principios en C en 24 Octubre 2011, 01:01 AMEso imagine pero no puedo avanzar ya que no se manejar los apuntadores, se me hacen muy laboriosos..
Puedes empezar declarando un montón de arrays, uno por cada campo de la estructura que no te dejan utilizar: apellidos, nombre, etc. También necesitas un array de arrays de NxM donde N es el numero de alumnos y M es 5 (sus calificaciones).

Una vez lo tengas funcionando correctamente puedes sustituir los arrays por reservas dinámicas de memoria cortesía de la función malloc.

----

Cita de: do-while en 24 Octubre 2011, 02:34 AMSiempre puedes simular los struct con punteros y vectores. Por ejemplo el siguiete struct:
struct cosa
{
    char letra;
    int numero;
    char cadena[10];
};


Puedes pasarlo a un vector asi:
char cosa[sizeof(char) + sizeof(int) + 10 * sizeof(char)]
de esta forma tienes espacio para almacenar todos los datos del struct.
Quiero recalcar que lo digo buen plan: esa aproximación tiene sus problemas. Cuando utilizamos una estructura no debemos preocuparnos de los bytes de relleno para cumplir los requisitos de alineación de los diferentes campos, eso es tarea del compilador.

Pero si es una implementación manual como en este caso tal vez funcione o tal vez no (ese es el problema). Si "cosa + 1" cumple con los requisitos de alineación del tipo int no hay problema pero si no es así ...

Cita de: do-while en 24 Octubre 2011, 02:34 AMprintf("%d",cosa[sizeof(char)]);
Esa linea imprime el valor numérico del carácter "cosa[1]", para tratarlo como un int se debe utilizar:
printf("%d", *(int *)(cosa + 1));

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

do-while

Cita de: rir3760 en 24 Octubre 2011, 03:46 AM
Esa linea imprime el valor numérico del carácter "cosa[1]", para tratarlo como un int se debe utilizar:
printf("%d", *(int *)(cosa + 1));

Cierto, se me ha pasado.  :xD

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Principios en C

Mas o menos entendí, no les voy a mentir sigo medio perdido con esto.... Otra duda que me surgió es como hacer la funcion que me calcule el promedio por materia no por alumno....
No tendrán un ejemplo en el cual me pueda guiar porque ya me desespere... Y ya intente mucho pero no puedo.

Principios en C

Hola...

Bueno después de un tiempo quedo hecho un registro de alumnos...

me faltaron unas cosillas pero lo compense con un histograma para contar el numero de alumnos...

ojala les sirva y supongo esta bien:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 5
#define A 7
#define M 20

void alumnos(char*[N][A]);
void histograma(char*[N][A]);
void clasificacion(char*[N][2]);

main()
{
        int j,i,suma=0;
        char *Todoptr[N][A],Dato1[N][M],Dato2[N][M],Dato3[N][M];
        char *ING[N][2],Dato4[N][M],Dato5[N][M],Dato6[N][M],Dato7[N][M],Dato8[N][M];

printf("Esta es una base de datos para estudiantes de la fac. de ciencias, por favor sigas las reglas\n\n");
       for(i=0;i<N;i++)
       {
              printf("\nDame el nombre del alumno %d\n",i+1);
              scanf("%s",Dato1[i]);
              printf("\nDame el apellido paterno del alumno %d\n",i+1);
              scanf("%s",Dato2[i]);
              printf("\nDame el apellido materno del alumno %d\n",i+1);
              scanf("%s",Dato3[i]);
              printf("\nAhora dame el sexo del alumno %d (solo pon Masculino o Femenino)\n",i+1);
              scanf("%s",Dato4[i]);
              printf("\nDame el numero de cuenta del alumno %d\n",i+1);
              scanf("%s",Dato5[i]);
              printf("\nDame la edad del alumno %d, recuerda que como son alumnos regulares", i+1);
              printf(" estan entre 18 y 22 años de edad (solo pon el numero)\n");
              scanf("%s",Dato6[i]);
              printf("\nDame la carrera del alumno %d (solo pon Actuaria, Matematicas, Fisica, Biologia, Tierra", i+1);
              printf(" o Computacion), segun sea el caso\n");
              scanf("%s",Dato7[i]);
              printf("\nAhora dame el año de ingreso del alumno %d (recuerda que solo te pudiste inscribir",i+1);
              printf(" durante los años 2007, 2008, 2009, 2010 o 2011\n");
              scanf("%s",Dato8[i]);
       }

       for(i=0;i<N;i++)
       {
              ING[i][0]=Dato1[i];
              ING[i][1]=Dato8[i];]*/
       }     
       for(i=0;i<N;i++)
       {
              Todoptr[i][0]=Dato1[i];
              Todoptr[i][1]=Dato2[i];
              Todoptr[i][2]=Dato3[i];
              Todoptr[i][3]=Dato4[i];
              Todoptr[i][4]=Dato5[i];
              Todoptr[i][5]=Dato6[i];
              Todoptr[i][6]=Dato7[i];
       }


       printf("\n\nLa informacion quedo de la sig. manera\n");
       for(i=0;i<N;i++)
       {
            printf("\n");
            for(j=0;j<A;j++)
                   printf("%11s",*(Todoptr[i]+j));
            }
       }

printf("\nClasificación de alumnos por carrera/sexo\n");
alumnos(Todoptr);

printf("\n\nHistograma por edades\n\n");
histograma(Todoptr);

printf("\n\nAhora vamos a ver la siguiente clasificacion ");
clasificacion(ING);

printf("\n");

getch();
}


void alumnos(char *Todoptr[N][A])
{
       char *mascuPtr="Masculino", *femePtr="Femenino", *ActuariaPtr="Actuaria";     
       char *FisicaPtr="Fisica",*MatePtr="Matematicas",*BioPtr="Biologia";
       char *CompuPtr="Computacion",*TierraPtr="Tierra";
       int sumaA=0,actuarios=0,actuarias=0,sumaF=0,fisicos=0,fisicas=0,sumaM=0;
       int matematicos=0,matematicas=0,sumaB=0,biologos=0,biologas=0,sumaC=0;
       int computologos=0,computologas=0,sumaT=0,tierros=0,tierras=0,i;
       
                       
for(i=0;i<N;i++)
{
       if(*ActuariaPtr==*Todoptr[i][6])
       {
              sumaA=sumaA+1;
              if(*femePtr==*Todoptr[i][3])
              actuarias=actuarias+1;
              if(*mascuPtr==*Todoptr[i][3])
              actuarios=actuarios+1;
       }
       
       if(*FisicaPtr==*Todoptr[i][6])
       {
              sumaF=sumaF+1;
              if(*femePtr==*Todoptr[i][3])
              fisicas=fisicas+1;
              if(*mascuPtr==*Todoptr[i][3])
              fisicos=fisicos+1;
       }

       if(*MatePtr==*Todoptr[i][6])
       {
             sumaM=sumaM+1;
             if(*femePtr==*Todoptr[i][3])
             matematicas=matematicas+1;
             if(*mascuPtr==*Todoptr[i][3])
             matematicos=matematicos+1;
       }

       if(*BioPtr==*Todoptr[i][6])
       {
              sumaB=sumaB+1;
              if(*femePtr==*Todoptr[i][3])
              biologas=biologas+1;
              if(*mascuPtr==*Todoptr[i][3])
              biologos=biologos+1;

       if(*CompuPtr==*Todoptr[i][6])
       {
              sumaC=sumaC;
              if(*femePtr==*Todoptr[i][3])
              computologas=computologas+1;
              if(*mascuPtr==*Todoptr[i][3])
              computologos=computologos+1;
       }

       if(*TierraPtr==*Todoptr[i][6])
       {
              sumaT=sumaT;
              if(*femePtr==*Todoptr[i][3])
              tierras=tierras+1;
              if(*mascuPtr==*Todoptr[i][3])
              tierros=tierros+1;
       }
}
                 
printf("\nNumero de personas inscritos en Actuaria: %d\n",sumaA);
       if(actuarias==1)
       {
              printf("Hay solo una actuaria\n\n");
       }
       if(actuarios==1)
       {
              printf("Hay solo un actuario\n\n");
       }
       else
       {
              printf("%d son actuarias y %d son actuarios\n\n",actuarias,actuarios);
       }

printf("\nNumero de personas inscritos en Fisica: %d\n",sumaF);
       if(fisicas==1)
       {
              printf("Hay solo una fisica\n\n");
       if(fisicos==1)
       {
              printf("Hay solo un fisico\n\n");
       }
       else
       {
              printf("%d son fisicas y %d son fisicos\n\n",fisicas,fisicos);
       }

printf("\nNumero de personas inscritos en Matematicas: %d\n",sumaM);
       if(matematicas==1)
       {
              printf("Hay solo una matematica\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un matematico\n\n");
       }
       else
       {
              printf("%d son matematicas y %d son matematicos\n\n",matematicas,matematicos);
       }

printf("\nNumero de personas inscritos en Biologia: %d\n",sumaB);
       if(biologas==1)
       {
              printf("Hay solo una biologa\n\n");
       }
       if(biologos==1)
       {
              printf("Hay solo un biologo\n\n");
       }
       else
       {
              printf("%d son biologas y %d son biologos\n\n",biologas,biologos);
       }

printf("\nNumero de personas inscritos en Ciencias de la Computacion: %d\n",sumaC);
       if(matematicas==1)
       {
              printf("Hay solo una computologa\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un computologo\n\n");
       }
       else
       {
              printf("%d son computologas y %d son computologos\n\n",computologas,computologos);
       }
       
printf("\nNumero de personas inscritos en Ciencias de la Tierra: %d\n",sumaT);
       if(matematicas==1)
       {
              printf("Hay solo una tierra\n\n");
       }
       if(matematicos==1)
       {
              printf("Hay solo un tierro\n\n");
       }
       else
       {
              printf("%d son tierras y %d son tierros\n\n",tierras,tierros);
       }

}


void histograma(char *Todoptr[N][A])
{
       int diocho=0,dinueve=0,veinte=0,veintiuno=0,veintidos=0,i;
       int edades[N];
       
       for(i=0;i<N;i++)
       {
              edades[i]=atoi(Todoptr[i][5]);
              if(edades[i]==18)
              {diocho=diocho+1;}
              if(edades[i]==19)
              {dinueve=dinueve+1;}
              if(edades[i]==20)
              {veinte=veinte+1;}
              if(edades[i]==21)
              {veintiuno=veintiuno+1;}
              if(edades[i]==22)
              {veintidos=veintidos+1;}
       }

printf("\n\n");
printf("e\n");
printf("d   18| ");
for(i=1;i<=diocho;i++)
{printf("*");}
printf("\n");
printf("a   19| ");
for(i=1;i<=dinueve;i++)
{printf("*");}
printf("\n");
printf("d   20| ");
for(i=1;i<=veinte;i++)
{printf("*");}
printf("\n");
printf("e   21| ");
for(i=1;i<=veintiuno;i++)
{printf("*");}
printf("\n");
printf("s   22| ");
for(i=1;i<=veintidos;i++)
{printf("*");}
printf("\n       --------------------------------------");
printf("\n              cantidad de alumnos(*)       ");
}

void clasificacion(char *ING[N][2])
{ int ingreso[N],i;
  char *unoptr[N],*dosptr[N],*tresptr[N],*cuatroptr[N],*cincoptr[N];
  int a=0,b=0,c=0,d=0,e=0;
 
for(i=0;i<N;i++)
{
       ingreso[i]=atoi(ING[i][1]);
       if(ingreso[i]==2007)
       { unoptr[i]=ING[i][0];
       a=a+1;}
       if(ingreso[i]==2008)
       { dosptr[i]=ING[i][0];
       b=b+1;}
       if(ingreso[i]==2009)
       { tresptr[i]=ING[i][0];
       c=c+1;}
       if(ingreso[i]==2010)
       { cuatroptr[i]=ING[i][0];
       d=d+1;}
       if(ingreso[i]==2011)
       { cincoptr[i]=ING[i][0];
       e=e+1;}
}   
   
if(a>0)
{
       printf("\nEstos son los alumnos que ingresaron en el 2007\n");
       for(i=0;i<N;i++)
       {
            printf("%s",unoptr[i]);
            printf("\n");
       }


else
printf("\nNo hay alumnos ingresados en el 2007\n");
printf("\n\n");

if(b>0)
{
       printf("Estos son los alumnos que ingresaron en el 2008\n");
       for(i=0;i<N;i++)
       {
              printf("%s",dosptr[i]);
              printf("\n");
       }
}

else
printf("No hay alumnos ingresados en el 2008");
printf("\n\n");

if(c>0)
{
       printf("Estos son los alumnos que ingresaron en el 2009\n");
       for(i=0;i<N;i++)
       {
              printf("%s",tresptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2009");
printf("\n\n");         

if(d>0)
{
       printf("Estos son los alumnos que ingresaron en el 2010\n");
       for(i=0;i<N;i++)
       {
              printf("%s",cuatroptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2010");
printf("\n\n");

if(e>0)
{
       printf("Estos son los alumnos que ingresaron en el 2011\n");
       for(i=0;i<N;i++)
       {
              printf("%s",cincoptr[i]);
              printf("\n");}
}

else
printf("No hay alumnos ingresados en el 2011");
}