Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Principios en C en 23 Octubre 2011, 03:57 am



Título: Registro de personas [YA RESUELTO!!!!]
Publicado por: Principios en C 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!!



Título: Re: Base de datos con apuntadores
Publicado por: naderST 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()


Título: Re: Base de datos con apuntadores
Publicado por: Principios en C 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!!!!


Título: Re: Base de datos con apuntadores
Publicado por: naderST en 23 Octubre 2011, 23:49 pm
Puedes tener apuntadores a estructuras no veo el problema...


Título: Re: Base de datos con apuntadores
Publicado por: Principios en C 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... :(


Título: Re: Base de datos con apuntadores
Publicado por: do-while 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!


Título: Re: Base de datos con apuntadores
Publicado por: rir3760 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


Título: Re: Base de datos con apuntadores
Publicado por: do-while 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!


Título: Re: Base de datos con apuntadores
Publicado por: Principios en C 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.


Título: Re: Base de datos con apuntadores
Publicado por: Principios en C 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.