elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 4,715 veces)
Principios en C

Desconectado Desconectado

Mensajes: 34


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

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 am por Principios en C » En línea

naderST


Desconectado Desconectado

Mensajes: 625



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

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 pm »

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: 625



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

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 am »

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: 1.276


¿Habra que sacarla de paseo?


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

¡Buenas!

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

Puedes pasarlo a un vector asi:
Código
  1. char cosa[sizeof(char) + sizeof(int) + 10 * sizeof(char)]
  2.  
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
  1. strcpy(cosa + (sizeof(char) + sizeof(int)) , otra_cadena);
  2.  
  3. strcpy(&cosa[sizeof(char) + sizeof(int)] , otra_cadena);
  4.  
  5. printf("%s",cosa + sizeof(char) + sizeof(int));
  6.  
  7. printf("%d",cosa[sizeof(char)]);
  8.  
  9. memcpy(cosa + sizeof(char) , &un_entero , sizeof(int));
  10.  

¡Espero que te sirva!

¡Saludos!
En línea

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


Desconectado Desconectado

Mensajes: 1.639


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

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
  1. struct cosa
  2. {
  3.    char letra;
  4.    int numero;
  5.    char cadena[10];
  6. };

Puedes pasarlo a un vector asi:
Código
  1. 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
  1. printf("%d", *(int *)(cosa + 1));

Un saludo
En línea

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


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


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

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

Cierto, se me ha pasado.  :xD

¡Saludos!
En línea

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

Desconectado Desconectado

Mensajes: 34


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

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 am »

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
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<conio.h>
  4. #define N 5
  5. #define A 7
  6. #define M 20
  7.  
  8. void alumnos(char*[N][A]);
  9. void histograma(char*[N][A]);
  10. void clasificacion(char*[N][2]);
  11.  
  12. main()
  13. {
  14.        int j,i,suma=0;
  15.        char *Todoptr[N][A],Dato1[N][M],Dato2[N][M],Dato3[N][M];
  16.        char *ING[N][2],Dato4[N][M],Dato5[N][M],Dato6[N][M],Dato7[N][M],Dato8[N][M];
  17.  
  18. printf("Esta es una base de datos para estudiantes de la fac. de ciencias, por favor sigas las reglas\n\n");
  19.       for(i=0;i<N;i++)
  20.       {
  21.              printf("\nDame el nombre del alumno %d\n",i+1);
  22.              scanf("%s",Dato1[i]);
  23.              printf("\nDame el apellido paterno del alumno %d\n",i+1);
  24.              scanf("%s",Dato2[i]);
  25.              printf("\nDame el apellido materno del alumno %d\n",i+1);
  26.              scanf("%s",Dato3[i]);
  27.              printf("\nAhora dame el sexo del alumno %d (solo pon Masculino o Femenino)\n",i+1);
  28.              scanf("%s",Dato4[i]);
  29.              printf("\nDame el numero de cuenta del alumno %d\n",i+1);
  30.              scanf("%s",Dato5[i]);
  31.              printf("\nDame la edad del alumno %d, recuerda que como son alumnos regulares", i+1);
  32.              printf(" estan entre 18 y 22 años de edad (solo pon el numero)\n");
  33.              scanf("%s",Dato6[i]);
  34.              printf("\nDame la carrera del alumno %d (solo pon Actuaria, Matematicas, Fisica, Biologia, Tierra", i+1);
  35.              printf(" o Computacion), segun sea el caso\n");
  36.              scanf("%s",Dato7[i]);
  37.              printf("\nAhora dame el año de ingreso del alumno %d (recuerda que solo te pudiste inscribir",i+1);
  38.              printf(" durante los años 2007, 2008, 2009, 2010 o 2011\n");
  39.              scanf("%s",Dato8[i]);
  40.       }
  41.  
  42.       for(i=0;i<N;i++)
  43.       {
  44.              ING[i][0]=Dato1[i];
  45.              ING[i][1]=Dato8[i];]*/
  46.       }    
  47.       for(i=0;i<N;i++)
  48.       {
  49.              Todoptr[i][0]=Dato1[i];
  50.              Todoptr[i][1]=Dato2[i];
  51.              Todoptr[i][2]=Dato3[i];
  52.              Todoptr[i][3]=Dato4[i];
  53.              Todoptr[i][4]=Dato5[i];
  54.              Todoptr[i][5]=Dato6[i];
  55.              Todoptr[i][6]=Dato7[i];
  56.       }
  57.  
  58.  
  59.       printf("\n\nLa informacion quedo de la sig. manera\n");
  60.       for(i=0;i<N;i++)
  61.       {
  62.            printf("\n");
  63.            for(j=0;j<A;j++)
  64.                   printf("%11s",*(Todoptr[i]+j));
  65.            }
  66.       }
  67.  
  68. printf("\nClasificación de alumnos por carrera/sexo\n");
  69. alumnos(Todoptr);
  70.  
  71. printf("\n\nHistograma por edades\n\n");
  72. histograma(Todoptr);
  73.  
  74. printf("\n\nAhora vamos a ver la siguiente clasificacion ");
  75. clasificacion(ING);
  76.  
  77. printf("\n");
  78.  
  79. }
  80.  
  81.  
  82. void alumnos(char *Todoptr[N][A])
  83. {
  84.       char *mascuPtr="Masculino", *femePtr="Femenino", *ActuariaPtr="Actuaria";      
  85.       char *FisicaPtr="Fisica",*MatePtr="Matematicas",*BioPtr="Biologia";
  86.       char *CompuPtr="Computacion",*TierraPtr="Tierra";
  87.       int sumaA=0,actuarios=0,actuarias=0,sumaF=0,fisicos=0,fisicas=0,sumaM=0;
  88.       int matematicos=0,matematicas=0,sumaB=0,biologos=0,biologas=0,sumaC=0;
  89.       int computologos=0,computologas=0,sumaT=0,tierros=0,tierras=0,i;
  90.  
  91.  
  92. for(i=0;i<N;i++)
  93. {
  94.       if(*ActuariaPtr==*Todoptr[i][6])
  95.       {
  96.              sumaA=sumaA+1;
  97.              if(*femePtr==*Todoptr[i][3])
  98.              actuarias=actuarias+1;
  99.              if(*mascuPtr==*Todoptr[i][3])
  100.              actuarios=actuarios+1;
  101.       }
  102.  
  103.       if(*FisicaPtr==*Todoptr[i][6])
  104.       {
  105.              sumaF=sumaF+1;
  106.              if(*femePtr==*Todoptr[i][3])
  107.              fisicas=fisicas+1;
  108.              if(*mascuPtr==*Todoptr[i][3])
  109.              fisicos=fisicos+1;
  110.       }
  111.  
  112.       if(*MatePtr==*Todoptr[i][6])
  113.       {
  114.             sumaM=sumaM+1;
  115.             if(*femePtr==*Todoptr[i][3])
  116.             matematicas=matematicas+1;
  117.             if(*mascuPtr==*Todoptr[i][3])
  118.             matematicos=matematicos+1;
  119.       }
  120.  
  121.       if(*BioPtr==*Todoptr[i][6])
  122.       {
  123.              sumaB=sumaB+1;
  124.              if(*femePtr==*Todoptr[i][3])
  125.              biologas=biologas+1;
  126.              if(*mascuPtr==*Todoptr[i][3])
  127.              biologos=biologos+1;
  128.  
  129.       if(*CompuPtr==*Todoptr[i][6])
  130.       {
  131.              sumaC=sumaC;
  132.              if(*femePtr==*Todoptr[i][3])
  133.              computologas=computologas+1;
  134.              if(*mascuPtr==*Todoptr[i][3])
  135.              computologos=computologos+1;
  136.       }
  137.  
  138.       if(*TierraPtr==*Todoptr[i][6])
  139.       {
  140.              sumaT=sumaT;
  141.              if(*femePtr==*Todoptr[i][3])
  142.              tierras=tierras+1;
  143.              if(*mascuPtr==*Todoptr[i][3])
  144.              tierros=tierros+1;
  145.       }
  146. }
  147.  
  148. printf("\nNumero de personas inscritos en Actuaria: %d\n",sumaA);
  149.       if(actuarias==1)
  150.       {
  151.              printf("Hay solo una actuaria\n\n");
  152.       }
  153.       if(actuarios==1)
  154.       {
  155.              printf("Hay solo un actuario\n\n");
  156.       }
  157.       else
  158.       {
  159.              printf("%d son actuarias y %d son actuarios\n\n",actuarias,actuarios);
  160.       }
  161.  
  162. printf("\nNumero de personas inscritos en Fisica: %d\n",sumaF);
  163.       if(fisicas==1)
  164.       {
  165.              printf("Hay solo una fisica\n\n");
  166.       if(fisicos==1)
  167.       {
  168.              printf("Hay solo un fisico\n\n");
  169.       }
  170.       else
  171.       {
  172.              printf("%d son fisicas y %d son fisicos\n\n",fisicas,fisicos);
  173.       }
  174.  
  175. printf("\nNumero de personas inscritos en Matematicas: %d\n",sumaM);
  176.       if(matematicas==1)
  177.       {
  178.              printf("Hay solo una matematica\n\n");
  179.       }
  180.       if(matematicos==1)
  181.       {
  182.              printf("Hay solo un matematico\n\n");
  183.       }
  184.       else
  185.       {
  186.              printf("%d son matematicas y %d son matematicos\n\n",matematicas,matematicos);
  187.       }
  188.  
  189. printf("\nNumero de personas inscritos en Biologia: %d\n",sumaB);
  190.       if(biologas==1)
  191.       {
  192.              printf("Hay solo una biologa\n\n");
  193.       }
  194.       if(biologos==1)
  195.       {
  196.              printf("Hay solo un biologo\n\n");
  197.       }
  198.       else
  199.       {
  200.              printf("%d son biologas y %d son biologos\n\n",biologas,biologos);
  201.       }
  202.  
  203. printf("\nNumero de personas inscritos en Ciencias de la Computacion: %d\n",sumaC);
  204.       if(matematicas==1)
  205.       {
  206.              printf("Hay solo una computologa\n\n");
  207.       }
  208.       if(matematicos==1)
  209.       {
  210.              printf("Hay solo un computologo\n\n");
  211.       }
  212.       else
  213.       {
  214.              printf("%d son computologas y %d son computologos\n\n",computologas,computologos);
  215.       }
  216.  
  217. printf("\nNumero de personas inscritos en Ciencias de la Tierra: %d\n",sumaT);
  218.       if(matematicas==1)
  219.       {
  220.              printf("Hay solo una tierra\n\n");
  221.       }
  222.       if(matematicos==1)
  223.       {
  224.              printf("Hay solo un tierro\n\n");
  225.       }
  226.       else
  227.       {
  228.              printf("%d son tierras y %d son tierros\n\n",tierras,tierros);
  229.       }
  230.  
  231. }
  232.  
  233.  
  234. void histograma(char *Todoptr[N][A])
  235. {
  236.       int diocho=0,dinueve=0,veinte=0,veintiuno=0,veintidos=0,i;
  237.       int edades[N];
  238.  
  239.       for(i=0;i<N;i++)
  240.       {
  241.              edades[i]=atoi(Todoptr[i][5]);
  242.              if(edades[i]==18)
  243.              {diocho=diocho+1;}
  244.              if(edades[i]==19)
  245.              {dinueve=dinueve+1;}
  246.              if(edades[i]==20)
  247.              {veinte=veinte+1;}
  248.              if(edades[i]==21)
  249.              {veintiuno=veintiuno+1;}
  250.              if(edades[i]==22)
  251.              {veintidos=veintidos+1;}
  252.       }
  253.  
  254. printf("\n\n");
  255. printf("e\n");
  256. printf("d   18| ");
  257. for(i=1;i<=diocho;i++)
  258. {printf("*");}
  259. printf("\n");
  260. printf("a   19| ");
  261. for(i=1;i<=dinueve;i++)
  262. {printf("*");}
  263. printf("\n");
  264. printf("d   20| ");
  265. for(i=1;i<=veinte;i++)
  266. {printf("*");}
  267. printf("\n");
  268. printf("e   21| ");
  269. for(i=1;i<=veintiuno;i++)
  270. {printf("*");}
  271. printf("\n");
  272. printf("s   22| ");
  273. for(i=1;i<=veintidos;i++)
  274. {printf("*");}
  275. printf("\n       --------------------------------------");
  276. printf("\n              cantidad de alumnos(*)       ");
  277. }
  278.  
  279. void clasificacion(char *ING[N][2])
  280. { int ingreso[N],i;
  281.  char *unoptr[N],*dosptr[N],*tresptr[N],*cuatroptr[N],*cincoptr[N];
  282.  int a=0,b=0,c=0,d=0,e=0;
  283.  
  284. for(i=0;i<N;i++)
  285. {
  286.       ingreso[i]=atoi(ING[i][1]);
  287.       if(ingreso[i]==2007)
  288.       { unoptr[i]=ING[i][0];
  289.       a=a+1;}
  290.       if(ingreso[i]==2008)
  291.       { dosptr[i]=ING[i][0];
  292.       b=b+1;}
  293.       if(ingreso[i]==2009)
  294.       { tresptr[i]=ING[i][0];
  295.       c=c+1;}
  296.       if(ingreso[i]==2010)
  297.       { cuatroptr[i]=ING[i][0];
  298.       d=d+1;}
  299.       if(ingreso[i]==2011)
  300.       { cincoptr[i]=ING[i][0];
  301.       e=e+1;}
  302. }    
  303.  
  304. if(a>0)
  305. {
  306.       printf("\nEstos son los alumnos que ingresaron en el 2007\n");
  307.       for(i=0;i<N;i++)
  308.       {
  309.            printf("%s",unoptr[i]);
  310.            printf("\n");
  311.       }
  312. }  
  313.  
  314. else
  315. printf("\nNo hay alumnos ingresados en el 2007\n");
  316. printf("\n\n");
  317.  
  318. if(b>0)
  319. {
  320.       printf("Estos son los alumnos que ingresaron en el 2008\n");
  321.       for(i=0;i<N;i++)
  322.       {
  323.              printf("%s",dosptr[i]);
  324.              printf("\n");
  325.       }
  326. }
  327.  
  328. else
  329. printf("No hay alumnos ingresados en el 2008");
  330. printf("\n\n");
  331.  
  332. if(c>0)
  333. {
  334.       printf("Estos son los alumnos que ingresaron en el 2009\n");
  335.       for(i=0;i<N;i++)
  336.       {
  337.              printf("%s",tresptr[i]);
  338.              printf("\n");}
  339. }
  340.  
  341. else
  342. printf("No hay alumnos ingresados en el 2009");
  343. printf("\n\n");          
  344.  
  345. if(d>0)
  346. {
  347.       printf("Estos son los alumnos que ingresaron en el 2010\n");
  348.       for(i=0;i<N;i++)
  349.       {
  350.              printf("%s",cuatroptr[i]);
  351.              printf("\n");}
  352. }
  353.  
  354. else
  355. printf("No hay alumnos ingresados en el 2010");
  356. printf("\n\n");
  357.  
  358. if(e>0)
  359. {
  360.       printf("Estos son los alumnos que ingresaron en el 2011\n");
  361.       for(i=0;i<N;i++)
  362.       {
  363.              printf("%s",cincoptr[i]);
  364.              printf("\n");}
  365. }
  366.  
  367. else
  368. printf("No hay alumnos ingresados en el 2011");
  369. }                      
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
retocar personas
Diseño Gráfico
DARKNESS 0 1,847 Último mensaje 16 Febrero 2006, 16:56 pm
por DARKNESS
Sistema de Login - Registro [Usando el registro de Windows]
Programación Visual Basic
ToNy_EsP 2 4,230 Último mensaje 28 Febrero 2009, 18:10 pm
por seba123neo
{Resuelto} [Another Duda VBS] Agregando cosas al registro « 1 2 »
Scripting
xassiz_ 13 6,899 Último mensaje 15 Septiembre 2009, 16:39 pm
por xassiz_
Una de cada 3 personas es gay « 1 2 »
Foro Libre
Azielito 18 9,461 Último mensaje 16 Mayo 2010, 01:40 am
por Draklit
Monitor de archivos y registro en Windows 10 Resuelto
Ingeniería Inversa
Moskito 2 2,913 Último mensaje 10 Julio 2020, 23:52 pm
por karmany
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines