elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:02  


Tema destacado: Recuperar cuenta de Google, GMail, Youtube

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Registro de personas [YA RESUELTO!!!!]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Registro de personas [YA RESUELTO!!!!]  (Leído 763 veces)
Principios en C

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Registro de personas [YA RESUELTO!!!!]
« en: 23 Octubre 2011, 03:57 »

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!!



« Última modificación: 11 Noviembre 2011, 00:42 por Principios en C » En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #1 en: 23 Octubre 2011, 18:54 »

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()


En línea
Principios en C

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #2 en: 23 Octubre 2011, 19:47 »

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!!!!
En línea
naderST


Desconectado Desconectado

Mensajes: 467



Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #3 en: 23 Octubre 2011, 23:49 »

Puedes tener apuntadores a estructuras no veo el problema...
En línea
Principios en C

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #4 en: 24 Octubre 2011, 01:01 »

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... :(
En línea
do-while


Desconectado Desconectado

Mensajes: 604


Cuando me afeito, recuerdo porque me dejo barba.


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #5 en: 24 Octubre 2011, 02:34 »

¡Buenas!

Siempre puedes simular los struct con punteros y vectores. Por ejemplo el siguiete struct:
Código
struct cosa
{
   char letra;
   int numero;
   char cadena[10];
};
 

Puedes pasarlo a un vector asi:
Código
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:
Código
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!
En línea

¡¡¡Feliz año nuevo!!!
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #6 en: 24 Octubre 2011, 03:46 »

Eso 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.

----

Siempre puedes simular los struct con punteros y vectores. Por ejemplo el siguiete struct:
Código
struct cosa
{
   char letra;
   int numero;
   char cadena[10];
};

Puedes pasarlo a un vector asi:
Código
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í ...

printf("%d",cosa[sizeof(char)]);
Esa linea imprime el valor numérico del carácter "cosa[1]", para tratarlo como un int se debe utilizar:
Código
printf("%d", *(int *)(cosa + 1));

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
do-while


Desconectado Desconectado

Mensajes: 604


Cuando me afeito, recuerdo porque me dejo barba.


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #7 en: 24 Octubre 2011, 03:58 »

Esa linea imprime el valor numérico del carácter "cosa[1]", para tratarlo como un int se debe utilizar:
Código
printf("%d", *(int *)(cosa + 1));

Cierto, se me ha pasado.  :xD

¡Saludos!
En línea

¡¡¡Feliz año nuevo!!!
Principios en C

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #8 en: 25 Octubre 2011, 17:01 »

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.
En línea
Principios en C

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Base de datos con apuntadores
« Respuesta #9 en: 11 Noviembre 2011, 00:40 »

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:
Código
#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");
}                      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ASM - Registro, Memoria, Registro de Segmento
Programación General
Rentero 3 726 Último mensaje 18 Julio 2004, 23:32
por Ragnarok
retocar personas
Diseño Gráfico
DARKNESS 0 367 Último mensaje 16 Febrero 2006, 16:56
por DARKNESS
Sistema de Login - Registro [Usando el registro de Windows]
Programación Visual Basic
ToNy_EsP 2 1,104 Último mensaje 28 Febrero 2009, 18:10
por seba123neo
{Resuelto} [Another Duda VBS] Agregando cosas al registro
Scripting
xassiz_ 13 1,571 Último mensaje 15 Septiembre 2009, 16:39
por xassiz_
12 o 13 personas?
Foro Libre
Azielito 2 1,622 Último mensaje 12 Noviembre 2009, 07:32
por DarkItachi
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines