Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jesusinfo en 19 Octubre 2016, 23:51 pm



Título: Problema con registro y funciones
Publicado por: Jesusinfo en 19 Octubre 2016, 23:51 pm
Buenas amigos, estoy trabajando con estructuras pero la verdad estoy un poco confundido,  ya que quiero llevar mi estructuras a arrays, pero no consigo pasarla por referencia aqui esta el codigo sencillo donde almancena una sola persona y una sola nota:

Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct lista_estudiantes{
  6. string nombres;
  7. int notas;
  8.  
  9. };
  10.  
  11. void llenar (lista_estudiantes& lista){
  12. cout<<"DAME EL NOMBRE: "<<endl;
  13. cin>>lista.nombres;
  14. cout<<"DAME LA NOTA DEL ESTUDIANTE"<<endl;
  15. cin>>lista.notas;
  16. }
  17.  
  18.  
  19.  
  20. void imprimir(lista_estudiantes lista){
  21. cout<<"\nNombre del estudiante: "<<lista.nombres<<endl;
  22. cout<<"NOTA: "<<lista.notas<<endl<<endl;
  23. }
  24.  
  25. int menu (){
  26. int opc;
  27. cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
  28. cin>>opc;
  29. return opc;
  30. }
  31.  
  32. int main(){
  33. struct lista_estudiantes lista;
  34. int opc;
  35.  
  36.  
  37.  
  38.  
  39. do{
  40. opc=menu();
  41. switch (opc){
  42. case 1:
  43. llenar(lista);
  44. break;
  45.  
  46. case 2:
  47. imprimir(lista);
  48. break;
  49.  
  50. case 3:
  51. cout<<"GRACIAS POR ENTRAR AL PROGRAMA "<<endl;
  52. break;
  53. }
  54. }
  55. while(opc !=3);
  56. system ("pause");
  57.  
  58. }
  59.  

Bien ese ejercicio quiere que haga lo siguiente:

1.Almacene N cantidad de estudiante
2. Con 5 notas
3. Y lo imprima

 pero no comprendo como pasar por referencia, lo intente hacer de esta manera

Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int num;
  5.  
  6. struct lista_estudiantes{
  7. string nombres;
  8. int notas;
  9.  
  10. };
  11.  
  12. void llenar (lista_estudiantes& lista){
  13. cout<<"Dame la cantidad de estudiante a insertar"<<endl;
  14. cin>>num;
  15. for(int i=0; i<num; i++){
  16. cout<<"DAME EL NOMBRE: "<<endl;
  17. cin>>lista[i].nombres;
  18. for (int x=0; x<6; x++){
  19. cout<<"DAME LA NOTA DEL ESTUDIANTE"<<endl;
  20. cin>>lista[x].notas;
  21. }
  22. }
  23. }
  24.  
  25.  
  26. void imprimir(lista_estudiantes lista){
  27. for(int i=0;i<num;i++){
  28. cout<<"\nNombre del estudiante: "<<lista[i].nombres<<endl;
  29. for(int x=0;x<6;i++){
  30. cout<<"NOTA: "<<lista[x].notas<<endl<<endl<<endl;
  31. }
  32. }
  33. }
  34. int menu (){
  35. int opc;
  36. cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
  37. cin>>opc;
  38. return opc;
  39. }
  40.  
  41. int main(){
  42. struct lista_estudiantes lista[1000];
  43. int opc;
  44.  
  45.  
  46. do{
  47. opc=menu();
  48. switch (opc){
  49. case 1:
  50. llenar(lista);
  51. break;
  52.  
  53. case 2:
  54. imprimir(lista);
  55. break;
  56.  
  57. case 3:
  58. cout<<"GRACIAS POR ENTRAR AL PROGRAMA "<<endl;
  59. break;
  60. }
  61. }
  62. while(opc !=3);
  63. system ("pause");
  64.  
  65. }

la verdad estoy muy confundido les agradecería su ayuda. :(


Título: Re: Problema con registro y funciones
Publicado por: eduardo1012 en 20 Octubre 2016, 00:31 am
Código
  1. #include<stdlib.h>
  2. #include<iomanip>
  3. #include<iostream>
  4. #include<conio.h>
  5. using namespace std;
  6. typedef struct{
  7. char nombre[20];
  8. int notas;
  9. }Dato;
  10. void recibe(Dato *,int);
  11. void imprime(Dato *,int);
  12.  
  13. int main(){
  14. int n;
  15. Dato *_dato;
  16. printf("Cantidad de estudiantes: ");
  17. cin>>n;
  18. _dato=(Dato *)malloc(n*sizeof(Dato));
  19. recibe(_dato,n);
  20. imprime(_dato,n);
  21. free(_dato);
  22. getch();
  23. }
  24.  
  25. void recibe(Dato *_dato,int n){
  26. for(int i=0; i<n; i++){
  27.  
  28. cout<<"Nombre del estudiante:";
  29. fflush(stdin);
  30. cin.getline((_dato+i)->nombre,20, '\n');
  31. //gets(_dato[i].nombre);
  32.  
  33. cout<<endl<<"Nota: ";
  34. cin>>(_dato+i)->notas;
  35. //scanf("%d",&_dato[i].edad);
  36. }
  37.  
  38.  
  39. }
  40.  
  41. void imprime(Dato *_dato,int n){
  42. for(int i=0; i<n; i++){
  43. cout<<endl<<(*(_dato+i)).nombre;
  44. cout<<endl<<(*(_dato+i)).notas;
  45. }
  46. }

Buscas hacer es algo asi no?


Título: Re: Problema con registro y funciones
Publicado por: Jesusinfo en 20 Octubre 2016, 01:23 am
Correcto algo asi, pero de verdad, de verdad no entiendo el codigo, aunque se ve tan sencillo no se que hace sentencias como esta

Código
  1.  
  2. _dato=(Dato *)malloc(n*sizeof(Dato));
  3.  
  4. recibe(_dato,n);
  5.  
  6. free(_dato);
  7.  
  8. getch();
  9.  
  10. fflush(stdin);
  11.  
  12. cin.getline((_dato+i)->nombre,20, '\n');
  13.  
  14. cin>>(_dato+i)->notas;
  15.  
  16.  

Disculpa mi falta de conocimiento, no se si es mucho pedir que me explicaras eso porfavor, la verdad todavia no entiendo como transformar mi struct en arrays y pasarlo por referencia a las funciones  :(


Título: Re: Problema con registro y funciones
Publicado por: eduardo1012 en 20 Octubre 2016, 02:17 am
Código
  1.  
  2. _dato=(Dato *)malloc(n*sizeof(Dato));
  3. /*al ser una estructura dinámica, tu tienes que reservar memoria para esta es lo mismo que con los arrays tu tienes un int[5]; declarado, pero esto tu lo defines, no el usuario al reservar memoria es algo similar a int[n], con malloc y realloc asignas la memoria dinámica, no se si me entidas?*/
  4.  
  5. recibe(_dato,n);
  6. /*Esta es una función, que puedes invocar en el main, La función recibe la cantidad de estudiantes a registrar y los registra.*/
  7.  
  8. free(_dato);
  9. /*asi como reservas memoria, la tienes que liberar, y el usuario reservo memoria dinámica para la estructura*/
  10.  
  11. /*Forma parte de la librería conio.h */
  12.  
  13. fflush(stdin);
  14. /*limpia el buffer, para cuando reciba los nombres */
  15.  
  16. cin.getline((_dato+i)->nombre,20, '\n');
  17. /*escaneas nombre la posición de i
  18. es lo mismo que escribir //gets(_dato[i].nombre);*/
  19.  
  20. cin>>(_dato+i)->notas;
  21. /*es lo mismo escaneas notas en la posición de i
  22. es lo mismo que escribir //scanf("%d",&_dato[i].edad); */

No se si me entiendas? Puedo explicarlo mejor si deseas, tu pregunta con confianza.


Título: Re: Problema con registro y funciones
Publicado por: Jesusinfo en 20 Octubre 2016, 03:21 am
Entendi algunas cosas pero dejare donde tengo dudas en realidad amigo

Código
  1. _dato=(Dato *)malloc(n*sizeof(Dato));
  2. /*entendi lo de reservar memoria pero que  funcion hace (n*sizeof(dato)) que funcion hace el *, y el sizeof no entendi enrealidad esto si puedes explicarmelo mejor porfavor?*/
  3.  
  4. recibe(_dato,n);
  5. /*Entiendo que es una funcion pero porque cuando creas la funcion utilizas void recibe(Dato *_dato,int n) en la parte de parametros Dato * _dato y no Dato& _dato?? */
  6.  
  7. free(_dato);
  8. /*se utiliza siempre en la funcion main casi al final?*/
  9.  
  10. fflush(stdin);
  11. /*No entiendo la parte de buffer podrias explicarme mejor esta parte que todavia no comprendo que hace :(  */
  12.  
  13. cin.getline((_dato+i)->nombre,20, '\n');
  14. cin>>(_dato+i)->notas;
  15. /* En estas dos lo que me confunde es el ->notas, podrias explicarme eso */
  16.  

Esas dudas las tengo amigo, y otra pregunta, el ejercicio que intento hacer es necesario las librerías nombradas no se puede hacer con la librería iostream únicamente? y es necesario utilizar las reservas de memorias? como indagando e investigando vi que para  hacer una estructura arrays era de la siguiente forma :

Código
  1. struct variable
  2. {
  3. int dato1;
  4. char dato2;
  5. float dato3;
  6. };
  7.  
  8. variable *_variable = new variable[n];
  9.  

hice unos ejercicios sencillos y funciono el problema es a la hora de utilizar funciones, como pasar por parametros o referencia dicha estructura en forma de arrays, no se si me explico?


Título: Re: Problema con registro y funciones
Publicado por: eduardo1012 en 20 Octubre 2016, 04:09 am
Código
  1. #include<stdlib.h>
  2. #include<iomanip>
  3. #include<iostream>
  4.  
  5. using namespace std;
  6. typedef struct{
  7. char nombre[20];
  8. int notas;
  9. }Dato;
  10.  
  11. int main(){
  12. int n;
  13. Dato *_dato;
  14. cout<<"Cuantos estudiantes ingresaras: ";
  15. cin>>n;
  16. _dato=(Dato *)malloc(n*sizeof(Dato));
  17.  
  18. for(int i=0; i<n; i++){
  19. cout<<"Nombre del estudiante:";
  20. fflush(stdin);
  21. cin.getline((_dato+i)->nombre,20, '\n');
  22. //gets(_dato[i].nombre);
  23. cout<<endl<<"Nota: ";
  24. cin>>(_dato+i)->notas;
  25. //scanf("%d",&_dato[i].edad);
  26. }
  27.  
  28. for(int i=0; i<n; i++){
  29. cout<<endl<<(*(_dato+i)).nombre;
  30. cout<<endl<<(*(_dato+i)).notas;
  31. }
  32.  
  33. free(_dato);
  34.  
  35. }

Se me borro todo lo que escribi ,pero te dejo el código mas simple, para que puedas analizarlo, cualquier cosa mándame mensaje.
Elimina cosas al código, modifícalo para que veas como funciona.


Título: Re: Problema con registro y funciones
Publicado por: MAFUS en 20 Octubre 2016, 12:06 pm
Linea 29 del código original
Código
  1. for(int x=0;x<6;i++){

He visto ese y he parado. Revisa el código no sea que todo sea por errores como ese.



Revisándolo mejor no deberías tener ese for para las notas. Tu estructura es un nombre y una nota, por tanto tal y como haces cin>> lista.nombres debes, sin el for, hacer cin>>lista.notas


Título: Re: Problema con registro y funciones
Publicado por: Jesusinfo en 22 Octubre 2016, 03:30 am
Encontré la manera de pasar la struct como parámetro, osea yo asumo que esta como parámetro y logre hacer lo buscado de manera mas sencilla comparado a lo explicado anteriormente en el post, bueno considero que es mas sencillo ya que trabajo con una sola libreria y lo entiendo pues  :xD, les dejare el código para que me digan su opinión. También quisiera saber como utilizar getline, o alguna manera de captar el [ESPACIO] e imprimirlo o sea me explico cin>>leerV -> 'Fulano de tal'  cout<<leerV. entonces al momento de imprimir, imprima fulano de tal. con los espacios correspondientes.

Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int num;
  6. int cantidad_notas=5;
  7.  
  8. struct lista_estudiantes{
  9. string nombres;
  10. }estudiantes[100];
  11.  
  12. void llenar (lista_estudiantes[], int notas[]){
  13. cout<<"\nDIME LA CANTIDAD DE ESTUDIANTES QUE DESEAS UTILIZAR: "<<endl;
  14. cin>>num;
  15. cout<<endl<<endl;
  16.  
  17. for(int i=0;i<num;i++){
  18. cout<<"DAME EL NOMBRE DEL ESTUDIANTE "<<i+1<<endl<<endl;;
  19. cin>>estudiantes[i].nombres;
  20.  
  21. for(int x=0; x<cantidad_notas; x++){
  22. cout<<"NOTA "<<x+1<<": ";
  23. cin>>notas[5*i+x];
  24. cout<<endl;
  25. }
  26. cout<<endl;
  27. }
  28. }
  29.  
  30. void imprimir(lista_estudiantes[], int notas[]){
  31.  
  32. for(int i=0;i<num; i++){
  33. cout<<"\nNombre del estudiante: "<<estudiantes[i].nombres<<endl;
  34.  
  35. for(int x=0; x<cantidad_notas; x++){
  36. cout<<""<<notas[5*i+x]<<endl;
  37. }
  38. cout<<endl;
  39. }
  40. }
  41.  
  42. void insertar(lista_estudiantes[], int notas[]){
  43. cout<<"Dame el nombre del nuevo estudiante: "<<endl;
  44. cin>>estudiantes[num].nombres;
  45.  
  46. for(int i=0;i<5;i++){
  47. cout<<"NOTA "<<i+1<<": ";
  48. cin>>notas[5*num+i];
  49. }
  50. num++;
  51. }
  52.  
  53. int menu (){
  54. int opc;
  55. cout<<"1.LLENAR\n2.IMPRIMIR\n3.INSERTAR\n4.SALIR"<<endl;
  56. cin>>opc;
  57. return opc;
  58. }
  59.  
  60. int main(){
  61. int notas[500];
  62. int opc;
  63.  
  64. do{
  65. opc=menu();
  66. switch (opc){
  67. case 1:
  68. llenar(estudiantes, notas);
  69. break;
  70.  
  71. case 2:
  72. imprimir(estudiantes, notas);
  73. break;
  74.  
  75. case 3:
  76. insertar(estudiantes, notas);
  77. break;
  78.  
  79. case 4:
  80. cout<<"GRACIAS POR ENTRAR AL PROGRAMA"<<endl;
  81. break;
  82. }
  83. }
  84. while(opc !=4);
  85. system ("pause");
  86.  
  87. }