Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jesusinfo en 1 Octubre 2016, 18:18 pm



Título: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 1 Octubre 2016, 18:18 pm
Buenas amigos, tengo un ligero pero tedioso problema con esta función, me compila el programa pero añade valores que no están en el vector que quiero ordenar. Me ordena ciertos valores e introduce valores que no coloque, de manera ordenada pero no son los valores verdaderos. espero haberme explicado lo suficiente, espero su ayuda gracias.

aqui el codigo que estoy usando, tengo la sospecha que el problema tiene que ser en la operacion de desplazamiento 5*posicion+elciclo.

 :-(

Código
  1. int metodoburbuja (int notas[],int pos){
  2.  
  3. int i,j,aux;
  4. pos=pos-1;
  5. for(int x=0;x<5;x++){
  6. for(j=0;j<5;j++){
  7. if(notas[5*pos+j]>notas[5*pos+j+1]){
  8. aux=notas[5*pos+j];
  9. notas[5*pos+j]=notas[5*pos+j+1];
  10. notas[5*pos+j+1]=aux;
  11. }
  12. }
  13. }
  14. cout<<"El estudiante "<<pos<<" tiene sus notas ordenadas de esta manera"<<endl;
  15. for(int x=0;x<5;x++){
  16. cout<<"NOTA "<<x+1<<" : "<<notas[5*pos+x]<<endl;
  17. }
  18. system("pause");
  19. }
  20.  


Título: Re: Problema con el metodo BubbleSort
Publicado por: engel lex en 1 Octubre 2016, 19:46 pm
muestra el codigo que pasas puede que estés armando un offset incorrecto


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 1 Octubre 2016, 20:29 pm
Este es el código completo, no hallo el error

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void llenar (int notas [], string nombres[]);
  5. void imprimir (int notas [], string nombres[]);
  6. int insertar(int notas[]);
  7. int buscar(int b,int notas[]);
  8. int borrar(int pos,int notas[]);
  9. int metodoburbuja (int notas[],int pos);
  10. int menu ();
  11.  
  12. int num;
  13. int asignatura=5;
  14. string nombres[100];
  15. int posicionesEstudiante=0;
  16. //Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------
  17.  
  18. void llenar (int notas [], string nombres[]){
  19. system("cls");
  20. cout<<"INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: "<<endl<<endl;
  21. cin>>num;
  22. cout<<endl;
  23. for(int i=0; i<=num-1; i++){
  24. cout<<"\nDame el primer nombre del estudiante "<<i+1<<endl;
  25. cin>>nombres[posicionesEstudiante];
  26. cout<<"ESTUDIANTE "<<i+1<<endl;
  27. for (int x=0; x<asignatura; x++){
  28. cout<<"\nNOTA "<<x+1<<": ";
  29. cin>>notas[5*i+x];
  30. }
  31. posicionesEstudiante++;
  32. cout<<endl<<endl;
  33. }
  34. system ("pause");
  35. }
  36.  
  37. //Funcion para imprimir la n cantidad de estudiantes junto a sus notas ----------------------------
  38. void imprimir (int notas [], string nombres[]){
  39. system("cls");
  40. cout<<"LOS ESTUDIANTES Y SUS NOTAS\n"<<endl;
  41. for(int i=0; i<=num-1; i++){
  42. cout<<nombres[i]<<" EL ESTUDIANTE "<<i+1<<endl<<endl;
  43. // cout<<estudiantes[i]<<endl<<endl;
  44.  
  45. for (int x=0; x<asignatura; x++){
  46. cout<<"NOTA "<<x+1<<" = "<<notas[5*i+x]<<endl;
  47. }
  48. cout<<endl;
  49. }
  50. system ("pause");
  51. }
  52.  
  53. //Funcion para insertar mas estudiantes-------------------------------------------------
  54. int insertar(int notas[]){
  55.      system("cls");
  56. cout<<"INGRESE LAS NOTAS DEL NUEVO ESTUDIANTE: \n";
  57.        for (int i=0; i<asignatura; i++){
  58.  
  59.        cout<<"\nNOTA "<<i+1<<" : ";
  60.        cin>> notas[5*num+i];
  61.     }
  62.     cout<<endl<<endl;
  63. num++;
  64.        }    
  65.  
  66. //Funcion de Buscar un estudiante con sus 5 notas-----------------------------------------------    
  67. int buscar(int b,int notas[]){
  68. system("cls");
  69.        int i=0, encontrado=0;
  70.        while(i < num && encontrado == 0){
  71.                if(b == i+1){
  72.                     encontrado = 1;
  73.                     }
  74.                     else{
  75.                          i++;
  76.                          }
  77.                }
  78.                if(encontrado == 1){
  79.                     cout<<"EL ESTUDIANTE " << b << " TIENE LAS SIGUIENTES NOTAS: " <<endl<<endl;
  80.                     for (int x=0; x<asignatura; x++){
  81. cout<<"NOTA "<<x+1<<"  =  "<<notas[5*i+x]<<endl;
  82. }
  83. cout<<endl;
  84. }
  85.                     else{
  86.                          cout<<"EL ESTUDIANTE [" << b <<"] NO FUE ENCONTRADO\n\nINTENTE DE NUEVO...\n"<<endl;
  87.                          }
  88.    system("pause");
  89.        }
  90.  
  91. int borrar(int pos,int notas[]){
  92. system("cls");
  93.        int i = pos -1;
  94.  
  95.  
  96.              for (int x=0; x<asignatura; x++){
  97.               notas[5*i+x]=0/* Nota vacia */;
  98.  
  99.  
  100.  
  101.  }
  102. }
  103.  
  104. //------------------METODO DE ORDENAMIENTO----------------------
  105.  
  106. int metodoburbuja (int notas[],int pos){
  107.  
  108. int i,j,aux;
  109. pos=pos-1;
  110. for(int x=0;x<5;x++){
  111. for(j=0;j<5;j++){
  112. if(notas[5*pos+j]>notas[5*pos+j+1]){
  113. aux=notas[5*pos+j];
  114. notas[5*pos+j]=notas[5*pos+j+1];
  115. notas[5*pos+j+1]=aux;
  116. }
  117. }
  118. }
  119. cout<<"El estudiante "<<pos<<" tiene sus notas ordenadas de esta manera"<<endl;
  120. for(int x=0;x<5;x++){
  121. cout<<"NOTA "<<x+1<<" : "<<notas[5*pos+x]<<endl;
  122. }
  123. system("pause");
  124. }
  125.  
  126.  
  127.  
  128. //Menu -------------------------------------------------------------
  129. int menu (){
  130. system("cls");
  131. int opc;
  132. cout<<"MENU DEL PROGRAMA\n-----------------------------------------------\n\n[1] INGRESAR EL NUMERO DE ESTUDIANTES\n\n[2] VISUALIZAR LOS ESTUDIANTES JUNTO A SUS NOTAS\n\n[3] INSERTAR UN NUEVO ESTUDIANTE\n\n[4] BUSCAR LAS NOTAS DE UN ESTUDIANTE\n\n[5] BORRAR O VACIAR LAS NOTAS DE UN ESTUDIANTE\n\n[6] SALIR DEL PROGRAMA\n"<<endl;
  133. cin>>opc;
  134. cout<<"\n";
  135. if(opc>7){
  136. cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl;
  137. system ("pause");
  138. }
  139.  
  140. return opc;
  141. }
  142.  
  143. int main(){
  144.  
  145. int estudiantes[100];
  146. int notas[500];
  147. int opc,buscado, posicion;
  148. do{
  149. opc=menu();
  150. switch (opc){
  151. case 1:
  152. llenar(notas,nombres);
  153. break;
  154.  
  155. case 2:
  156. imprimir(notas, nombres);
  157. break;
  158.  
  159. case 3:
  160. insertar(notas);
  161. break;
  162.  
  163. case 4:
  164. system("cls");
  165. cout<<"INDICA EL ESTUDIANTE QUE DESEAS BUSCAR: "<<endl<<endl;
  166. cin>>buscado;
  167. buscar(buscado, notas);
  168. break;
  169.  
  170. case 5:
  171. system("cls");
  172. cout<<"INDIQUE EL ESTUDIANTE QUE DESEA BORRAR/VACIAR SUS NOTAS: ";
  173. cin>>posicion;
  174. cout<<endl;
  175. borrar(posicion,notas);
  176. break;
  177.  
  178. case 6:
  179. cout<<"Que estudiante deseas que sus notas sean ordenadas: "<<endl;
  180. cin>>posicion;
  181. metodoburbuja (notas, posicion);
  182. break;
  183.  
  184. case 7:
  185. system("cls");
  186. cout<<"\n\nGRACIAS POR USAR NUESTRO PROGRAMA :)\n"<<endl;
  187. break;
  188. }
  189. }
  190. while (opc !=7);
  191. system ("pause");
  192. }
  193.  
  194.  
  195.  
  196.  
  197.  


Título: Re: Problema con el metodo BubbleSort
Publicado por: 4dr14n31t0r en 2 Octubre 2016, 02:31 am
En el metodo insertar, insertas el numero del nuevo alumno y sus notas, pero no su nombre, lo que podra suponer un problema al llamar despues al metodo imprimir, el cual imprime el nombre de los alumnos junto a sus notas. En el metodo borrar pasa mas de lo mismo.

Cada vez que haces un bucle como este:
Código
  1. for(int x = 0; x < asignatura; x++)
accedes al array de notas poniendo
Código
  1. notas[5*i+x]
Es de suponer que ese 5 vale 5 porque es lo que vale asignaturas. Si es asi, ¿Por que no pones directamente asignaturas otra vez? algo como esto:
Código
  1. notas[asignaturas*i+x]
De esta forma, si modificas el valor de la variable asignaturas el programa no fallará.

Si has visto los punteros y la relaccion que existe entre estos y los arrays (Sospecho que no), deberias de entender porque cuando llamas al metodo burbuja y luego al metodo imprimir, estos aparecen modificados. Comento esto porque supongo que el metodo metodoburbuja solo te deberia mostrar los valores ordenados y no dejarlos asi.
En cualquier caso lo que haces en el metodo burbuja es intercambiar 2 valores del array consecutivos cuando el que esta en una posicion menor tiene un valor mayor que el que esta en la posicion siguiente. Utilizas un solo array para guardar TODAS las notas de TODOS los alumnos, de modo que si la ultima nota de un alumno es mayor que la primera nota del alumno siguiente, los valores se modifican resultando en que la primera nota del alumno siguiente sera siempre la mayor de las notas del alumno anterior.


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 2 Octubre 2016, 16:59 pm
Citar
4dr14n31t0r

Pues entendi en su mayoría tu respuesta, pero lo mas importante no lo entendí en realidad, osea la parte del método burbuja. Pues bien ya modifique mi código para que el arreglo string intervenga en todas las funciones y no ocasiones ningún problema a la hora de imprimir, insertar etc, al igual que la variable asignatura. eso lo entendí perfecto. Pero ahora en el método burbuja entiendo que quieres decir con que si la ultima nota del estudiante 1 es mayor a la primera nota del estudiante dos, cambiaría y por ende me alteraría el orden que quiero asignar en mi programa. Pero para eso no seria la operación de desplazamiento:
asignatura*pos+losnumerosdevueltas. osea que me recorra 5 veces la notas de dicha posición que no se salga de esas 5 vueltas, es lo que no logro entender porque altera ciertos valores de las notas si le estoy suministrando la posición desde donde debe de arrancar el ordenamiento burbuja y indicándole que son 5 elementos a ordenar.


Título: Re: Problema con el metodo BubbleSort
Publicado por: dato000 en 2 Octubre 2016, 18:35 pm
Si has visto los punteros y la relaccion que existe entre estos y los arrays (Sospecho que no), deberias de entender porque cuando llamas al metodo burbuja y luego al metodo imprimir, estos aparecen modificados. Comento esto porque supongo que el metodo metodoburbuja solo te deberia mostrar los valores ordenados y no dejarlos asi

Eso depende más del negocio, literalmente el ordenamiento de burbuja debe reordenar el arreglo original, usando un arreglo auxiliar donde se almacena temporalmente cada valor de la posición a modificar comparandola con la siguiente posición del arreglo, pero esta a criterio del desarrollador si se muestra el arreglo ordenado o el auxiliar, en ambos casos, es correcta la forma de la metodología.

Por otra parte, creo que el código solamente funcionaria para un solo estudiante, pues al estar definiendo un arreglo de caracteres, solo almacenaria una cadena que equivaldria a solo un solo estudiante.

Y lo de notas[5*i+x]; no lo termino de entender, porque tiene que ser una posición 5, que pasa si el estudiante es 0 y luego uno, se desperdiciarian 3 posiciones del arreglo y practicamente quedaria en limbo en el ordenamiento de burbuja, pues este solo compara con las posiciones inmedatamente siguientes.

un ejemplo:

estudiante 1: camilo
notas[5*i+x] ---> i=0; x=0;  == notas[0]
notas[5*i+x] ---> i=0; x=1;  == notas[0]
notas[5*i+x] ---> i=1; x=0;  == notas[0]
notas[5*i+x] ---> i=0; x=1;  == notas[5]

WTF!!! cuando va a ubicarse en las posiciones 1,2,3 y 4??? lo mismo sucederia con las demás. Creo deberia replantearse primero la estructura de las notas para un solo estudiante y ejectuar el ordenamiento de las notas de solo un estudiante, y luego implementar una escalabilidad para varios estudiantes después de tener claro el proceso de inserción, guardado, impresión y ordenamiento de cada estudiante y sus notas.

Usar un arreglo de string, bueno, es algo raro, a mi ni siquiera me esta funcionando en linux el primer paso, loco no??


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 2 Octubre 2016, 19:15 pm
Y lo de notas[5*i+x]; no lo termino de entender, porque tiene que ser una posición 5, que pasa si el estudiante es 0 y luego uno, se desperdiciarian 3 posiciones del arreglo y practicamente quedaria en limbo en el ordenamiento de burbuja, pues este solo compara con las posiciones inmedatamente siguientes.

un ejemplo:

estudiante 1: camilo
notas[5*i+x] ---> i=0; x=0;  == notas[0]
notas[5*i+x] ---> i=0; x=1;  == notas[0]
notas[5*i+x] ---> i=1; x=0;  == notas[0]
notas[5*i+x] ---> i=0; x=1;  == notas[5]


No entiendo esa parte, ya que planteas que el estudiante camilo saltaría a otro estudiante cuando dices notas[5*i+x] ---> i=1; x=0;  == notas[0]
ya que i representa los estudiantes, y x el desplazamiento de notas o las vueltas que hará, y 5 el numero de notas que tiene el estudiante. En este caso de la forma que planteo el programa es que por estudiante tendrá 5 notas y ya. Ahora mi problema y mi duda es que si es posible que en un vector que almacena todas las notas puedo ordenar cierta cantidad de notas. algo así [ 10 9 8 7 6 5 4 3 2 1 ] ordenado_ciertacantidad [6 7 8 9 10 5 4 3 2 1] no se si me explico lo suficientemente claro  :-(.


Título: Re: Problema con el metodo BubbleSort
Publicado por: 4dr14n31t0r en 2 Octubre 2016, 19:59 pm
Pues entendi en su mayoría tu respuesta, pero lo mas importante no lo entendí en realidad
Perdona si no me explique bien antes.

Veamos, vamos a suponer que en el programa vamos a meter solo a 2 estudiantes.
Entonces el arreglo con las notas tendra una longitud para almacenar 5*2 valores (5 notas para cada alumno).
Entonces el array de los nombres y de las notas te quedara tal que asi:
Código:
Array de los alumnos:   [nombre1,                      nombre2]
Array de las notas:     [nota1,nota2,nota3,nota4,nota5,nota6,nota7,nota8,nota9,nota10]

Los espacios solo los he puesto para que veas que las 5 primeras notas del array de notas corresponden al alumno1, y los 5 siguientes a los del alumno2.

Ahora bien, en tu metodo burbuja, por lo que veo haces lo siguiente:
Código:
1- Coges el elemento 5*pos+j (que seguramente habrás cambiado a asignaturas*pos+j).
2- Lo comparas con el elemento 5*pos+j+1.
3- Si es mayor intercambias los valores, y si es menor lo dejas tal cual.
4- Repites desde el paso 1 con el siguiente elemento

Bueno pues tu error esta en el paso numero 2, ya que en los arrays que expuse antes:
Código:
Array de los alumnos:   [nombre1,                      nombre2]
Array de las notas:     [nota1,nota2,nota3,nota4,nota5,nota6,nota7,nota8,nota9,nota10]

Suponte que la mayor nota del alumno1 es la nota 5. Entoces el metodo deberia dejar la nota 5 intacta en lugar de intercambiarla. Pero suponte que la nota5 del alumno1 es MAYOR que la nota6 del alumno2. Entonces sucede lo siguiente:

Código:
5*pos+j == 4
notas[5*pos+j] == nota5

5*pos+j+1 == 5
notas[5*pos+j+1] == nota6

nota5 > nota6 == true

Al ser nota5 mayor que nota6 se intercambian los valores, por lo que el valor mas grande del alumno1 pasa a ser la primera nota del alumno2.
¿Lo ves ahora?

La forma de solucionarlo es muy sencilla. Solo tienes que cambiar el numero de iteraciones del bucle de la variable j. En lugar de
Código
  1. for(j=0;j<5;j++)
pon
Código
  1. for(j=0;j<4;j++){

El bucle de la variable x tambien deberia ser
Código
  1. for(x=0;x<4;x++)
pero de todos modos da un poco lo mismo, ya que con que lo recorra al menos 4 veces las demas veces que la recorra no hará nada. Si hubieras puesto
Código
  1. for(x=0;x<200;x++)
Tambien funcionaría.


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 2 Octubre 2016, 21:14 pm

La forma de solucionarlo es muy sencilla. Solo tienes que cambiar el numero de iteraciones del bucle de la variable j. En lugar de
Código
  1. for(j=0;j<5;j++)
pon
Código
  1. for(j=0;j<4;j++){

Muchisimas gracias 4dr14n31t0r Tienes razon y me has dando una gran ayuda has entendido mi problema y yo tu explicacion mejor imposible de verdad gracias, capte perfectamente la idea y como funciona, tiene que ser j<5 porque estoy comparando notas[j] con notas[j+1] ese pequeño detalle no lo capte me falta por desarrollar mas la lógica.

Tengo una duda con respecto a la funcion principal al darle limites al vector notas
yo lo tengo asi para que me reconozca sin ningun error todo:
Código
  1. int main(){
  2.  
  3. int estudiantes[num];
  4. int notas[500];

pero no quiero darle un valor como limite a mi vector notas ya que en un futuro podria crecer o decrecer, quisiera establecerlo con una variable, y lo he intentado de esta manera:

Código
  1. int notas[num*asignatura];
  2.  
me captura todos los estudiante y las notas, pero a la hora de imprimir me salta un error y deja de funcionar el programa. 

El otro que intente fue dejarlo vació  así

Código
  1. int notas[]={};
  2.  


Lo reconoce perfecto todos los estudiante y sus notas pero mayormente el estudiante 1 nota 1 le quita un digito o lo cambia  o varias notas a varios estudiantes el punto es que no da la informacion correctapor ejemplo
Estudiante 1 Nota 1= 20. La imprime como Estudiante 1 Nota 1= 2.
Hay una forma de que el vector vaya creciendo a medida de que vayan aumentando los estudiantes?


Título: Re: Problema con el metodo BubbleSort
Publicado por: dato000 en 2 Octubre 2016, 22:36 pm
Ah creo que ya he captado el funcionamiento de las notas por estudiantes, yo lo estaba viendo como matrices, hay que darle otro enfoque.

Creeria que en el sentido de mejorar el entendimiento de código, lo mejor seria encapsular esas variables de las posiciones de los alumnos.

notas[5*num+i]; ==> notas[(5*num) + 1], en donde podrias añadir un comentario respecto a esa parte que resulta un poco enredada de entender salvo que se entienda el concepto de lo que debe realizarse, como es en el caso, conociendo al estudiante en una determinada posición, equivaldria a ubicar sus notas en el larguisimo arreglo de notas.

otra cosa, tu menú presenta inconsistencias, lo arregle un poco, aunque esta modificado para ejecutarse en linux, tendrias que cambiar las sentencias de system.

Código
  1. //INTERFAZ DE USUARIO
  2. int menu (){
  3. system("clear");
  4. int opc;
  5.  
  6. cout<<"MENU DEL PROGRAMA\n----------------------------------------------- " << endl;
  7. cout<<"[1] INGRESAR EL NUMERO DE ESTUDIANTES" << endl;
  8. cout<<"[2] VISUALIZAR LOS ESTUDIANTES JUNTO A SUS NOTAS" << endl;
  9. cout<<"[3] INSERTAR UN NUEVO ESTUDIANTE" << endl;
  10. cout<<"[4] BUSCAR LAS NOTAS DE UN ESTUDIANTE" << endl;
  11. cout<<"[5] BORRAR O VACIAR LAS NOTAS DE UN ESTUDIANTE" << endl;
  12. cout<<"[6] ORDENAMIENTO BURBUJA" << endl;
  13. cout<<"[7] SALIR DEL PROGRAMA\n" << endl;
  14.  
  15.    cout << "DIGITE SU OPCION:  ";
  16. cin>>opc;
  17. cout<<"\n";
  18. if(opc>7){
  19.        cout<<"LA OPCION ["<<opc<<"] NO EXISTE\n\n"<<endl;
  20.        cin.get();
  21.    }
  22.  
  23. return opc;
  24. }
  25.  
  26. // MENU PRINCIPAL OPCION DE USUARIO
  27. int main(){
  28.  
  29.    int estudiantes[100];
  30.    int notas[500];
  31.    int opc,buscado, posicion;
  32.    do{
  33.        opc=menu();
  34.        switch (opc){
  35.            case 1:
  36.                llenar(notas, nombreEstudiante);
  37.                break;
  38.  
  39.            case 2:
  40.                imprimir(notas, nombreEstudiante);
  41.                break;
  42.  
  43.            case 3:
  44.                insertar(notas);
  45.                break;
  46.  
  47.            case 4:
  48.                system("clear");
  49.                cout<<"INDICA EL ESTUDIANTE QUE DESEAS BUSCAR: "<<endl<<endl;
  50.                cin>>buscado;
  51.                buscar(buscado, notas);
  52.                break;
  53.  
  54.            case 5:
  55.                system("clear");
  56.                cout<<"INDIQUE EL ESTUDIANTE QUE DESEA BORRAR/VACIAR SUS NOTAS: ";
  57.                cin>>posicion;
  58.                cout<<endl;
  59.                borrar(posicion,notas);
  60.                break;
  61.  
  62.            case 6:
  63.                cout<<"Que estudiante deseas que sus notas sean ordenadas: "<<endl;
  64.                cin>>posicion;
  65.                metodoburbuja (notas, posicion);
  66.                break;
  67.  
  68.            case 7:
  69.                system("clear");
  70.                cout<<"\n\nGRACIAS POR USAR NUESTRO PROGRAMA :)\n"<<endl;
  71.                break;
  72.        }
  73.    }
  74.    while (opc !=7);
  75.    cin.get();
  76. }
  77.  

Estoy intentado correr el código correctamente para un solo estudiante en linux, ya que se presentan inconsistencias, una vez las tenga las voy a publicar, puede que ayude un poco.


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 2 Octubre 2016, 22:59 pm

Estoy intentado correr el código correctamente para un solo estudiante en linux, ya que se presentan inconsistencias, una vez las tenga las voy a publicar, puede que ayude un poco.

Gracias por tus respuesta, me parece de utilidad comentar el codigo especificando las funciones de operaciones que puedan llegar a confundir, y si solventas el problema de linux te lo agradecería así aprendemos tanto yo como muchos cosas nuevas nuevamente gracias tu explicación me parece cierta desde el punto de vista que explicaste.


Título: Re: Problema con el metodo BubbleSort
Publicado por: dato000 en 2 Octubre 2016, 23:43 pm
Gracias por tus respuesta, me parece de utilidad comentar el codigo especificando las funciones de operaciones que puedan llegar a confundir, y si solventas el problema de linux te lo agradecería así aprendemos tanto yo como muchos cosas nuevas nuevamente gracias tu explicación me parece cierta desde el punto de vista que explicaste.

no se porque pero el programa no quiere ejecutar correctamente el guardado de la variable string y luego imprimirla como parte de una función por valor, rarisimo eso no lo habia visto o.O.

Ni siquiera funciona para un solo estudiante, sera por el compilador?? ya probe varias combinaciones:

Código
  1. //Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------
  2. void llenar (int notas [], string nombreEstudiante){
  3. system("clear");
  4. //cout << "INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: ";
  5. //cin >> num;  cout<<endl;
  6.    //for(int i=0; i<num; i++){
  7. cout << "\nDame el primer nombre del estudiante "; //<< i+1 <<endl;
  8. cin >> nombreEstudiante;//[posicionesEstudiante];
  9. cout << endl << nombreEstudiante << endl;
  10. //getline (cin, nombreEstudiante);
  11.  
  12. //cout << "ESTUDIANTE " << i+1 <<endl;
  13. //for (int x=0; x<asignatura; x++){
  14. // cout<<"\nNOTA "<< x+1 <<": ";
  15. // cin>>notas[5*i+x];
  16. //}
  17.        posicionesEstudiante++;
  18.        cout<<endl<<endl;
  19. //}
  20.  
  21.    cin.get();
  22.    cin.get();
  23. }
  24.  
  25. //Funcion para imprimir la n cantidad de estudiantes junto a sus notas ----------------------------
  26. void imprimir (int notas [], string nombreEstudiante){
  27.    system("clear");
  28.    cin.get();
  29.    cout<<"LOS ESTUDIANTES Y SUS NOTAS\n"<<endl;
  30.    cout << " EL ESTUDIANTE: ";
  31.    //for(int i=0; i<caracteresNombres; i++){
  32.        cout << nombreEstudiante;//[i]<<endl<<endl;
  33. //}
  34.  
  35. //cout << "NOTAS:" << endl;
  36. //for(int i=0; i<caracteresNombres; i++){
  37.    //    cout<<notas[i]<< " - ";
  38. //}
  39.  
  40.    cin.get();
  41.    cin.get();
  42. }
  43.  

super extraño eso, dentro de cada función, la variable string del nombre del estudiante funciona localmente sin problema, pero cuando ejecuto el llamado de una función a otra, de llenar a imprimir, simplemente no hay ningún valor que imprimir.

Alguien puede explicarme a que se debe?? una ayudita  :silbar: :silbar: :silbar:


Título: Re: Problema con el metodo BubbleSort
Publicado por: 4dr14n31t0r en 3 Octubre 2016, 09:58 am
otra cosa, tu menú presenta inconsistencias
¿En que consisten esas inconsistencias?

Otra cosa: No he probado el codigo de Jesusinfo, pero deberia funcionar perfectamente para un solo alumno. De hecho, el fallo que tendria al principio no deberia afectarle.

En cualquier caso la variable string no se guardará nunca correctamente, ya que el parametro se lo estas pasando por valor y no por referencia. Si no entiendes que es el paso por de parametros por valor y por referencia, bueno tampoco me voy a parar a explicarlo aqui lo miras en internet y yata. Lo que quiero decir es que si en lugar del string le pasas el array de strings y obtienes el primer elemento si deberia guardarlo por el tema de los punteros y tal.


Título: Re: Problema con el metodo BubbleSort
Publicado por: dato000 en 3 Octubre 2016, 18:39 pm
¿En que consisten esas inconsistencias?

Simplemente esta presentando mal las opciones, la opcion 6 presenta en la interfaz la opción de salida y realmente es la opción siete, yo la puli solo para hacerla más entendible

Otra cosa: No he probado el codigo de Jesusinfo, pero deberia funcionar perfectamente para un solo alumno. De hecho, el fallo que tendria al principio no deberia afectarle.

Eso es lo más raro, desde el principio me mostro ese problema, ni con un solo alumno no quiere correr correctamente, averiguando un poco encontre que el compilador gcc a veces tiene problemas en tiempos de pre-compilación con extensiones de c++.

En cualquier caso la variable string no se guardará nunca correctamente, ya que el parametro se lo estas pasando por valor y no por referencia. Si no entiendes que es el paso por de parametros por valor y por referencia, bueno tampoco me voy a parar a explicarlo aqui lo miras en internet y yata. Lo que quiero decir es que si en lugar del string le pasas el array de strings y obtienes el primer elemento si deberia guardarlo por el tema de los punteros y tal.

Gracias no hay tanto dilema, si averiguando para recordar como hacer correctamente el paso por valor y referencia, encontre que es mucho más común usar un arreglo de arrays en funciones que con strings, las cuales se usan directamente dentro de las funciones.

Voy a probar el código en windows, y por ello, pregunto, cual es el IDE y el compilador que estan usando para este código??


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 3 Octubre 2016, 19:43 pm
Voy a probar el código en windows, y por ello, pregunto, cual es el IDE y el compilador que estan usando para este código??

Hasta los momento me hace todas las operaciones que exijo correctamente el programa, en windows, yo paso la variable string como un arreglo string nombres[almacen] y le indico que almacen se incremente almacen++ para que aumente la longitud del vector y por ende me almacene todos los nombres.

El compilador es Dev C++ 5.11


Título: Re: Problema con el metodo BubbleSort
Publicado por: dato000 en 4 Octubre 2016, 00:40 am
Hasta los momento me hace todas las operaciones que exijo correctamente el programa, en windows, yo paso la variable string como un arreglo string nombres[almacen] y le indico que almacen se incremente almacen++ para que aumente la longitud del vector y por ende me almacene todos los nombres.

El compilador es Dev C++ 5.11

Si en efecto, era tema del compilador, voy a tener que actualizar el IDE en linux  :xD :xD

Que tal ha ido la cosa, sigues con el problema??


Título: Re: Problema con el metodo BubbleSort
Publicado por: 4dr14n31t0r en 4 Octubre 2016, 20:47 pm
En un principio, segun el estandar de C++ no se le puede cambiar el tamaño de un array (en un principio, ojo), ya que cuando tu declaras un array, el compilador necesita saber cuanto espacio tiene que reservar en la memoria para ese array. Por ejemplo, si te creas una variable de tipo char, un array de 3 elementos de tipo int y despues una variable de tipo float, el compilador dejara un byte de espacio para el tipo char, 12 para el array de int (3 elementos * 4 bytes que ocupa cada uno) y despues 4 bytes para el tipo float. Quedaria tal que asi:
Código:
bytes:      [1          ][2          ][3          ][4          ][5          ][6          ]
variables:  [char       ][array de int                         ][float      ]
Ahora tu imaginate que le dices al array que en vez de tener 3 elementos va a tener 4. El espacio que viene despues del array ya esta ocupado por un float. Si el array se volviera un elemento mas grande entraria en conflicto con la variable de tipo float. Por lo tanto, en un principio va a ser que no es posible cambiar el tamaño de un array. Sin embargo, si el espacio se lo asignas de forma dinamica (es decir, mientras se ejecuta el programa, no antes de que se ejecute) tendrias que usar punteros. Te voy a explicar lo que es un puntero y la relaccion que existe entre estos y los arrays porque me veo en la obligacion de hacerlo si quiero que entiendas porque lo que estas pidiendo sin usar los punteros es imposible (Te lo explico mas adelante).
Ahora que te he explicado todo esto deberias entender que el tamaño del array debe ser un dato que se pueda conocer antes de ejecutar el programa para que éste pueda ser creado. A esto es a donde queria llegar. El caso es que en un principio no se puede, ya que no forma parte del estándar, pero la mayoria de los compiladores permiten declarar arrays con un tamaño indicado por una variable. Esto es asi porque en realidad los compiladores crean, en lugar de un array, un vector, que funciona muy parecido a un array en muchos aspectos.No me preguntes mucho acerca de los vectores porque en realidad yo tampoco los conozco demasiado bien :P
Ahora vamos con los punteros. Hay variables que almacenan un int, un float, un char, un array de algun dato determinado, etc. Bueno, pues entre ellos hay otro tipo de dato que son los punteros. Son bastante dificiles de entender. El caso es que un puntero es una variable que almacena la ubicacion en la memoria en la que esta otra variable. Del mismo modo que para tu decirle a alguien donde vives le dices el nombre de tu calle y tu barrio, e incluso el nombre de tu provincia y pais si fuera necesario, para saber en que parte de la memoria "viven" las variables (O mejor dicho, donde les ha dicho el compilador que deben de estar) utilizan un numero que cuando lo imprimes se presenta en forma hexadecimal. El hecho de que sea hexadecimal es lo de menos, el caso es que es un numero donde te dice a que parte de la memoria ir cuando haya que averiguar que contiene tal variable. Bueno pues un puntero contiene ese dato, ese numero, y con ellos puedes averiguar que hay en esa ubicacion directamente. OJO A LO QUE HE DICHO: un puntero contiene el numero (este numero se trabaja de una forma especial, asi que no puedes hacer cosas como multiplicarlo con otro numero como lo haces con los int) que te dice donde esta el dato de una variable, pero la variable de tipo puntero que contiene tal numero "vive" en otra parte completamente diferente de la memoria y el numero que dice donde esta ubicado la variable de tipo puntero sera diferente que el que contiene el puntero (el cual es el lugar donde esta ubicada otra variable). El caso es que con un puntero, ademas de almacenar este valor, puedes averigüar el contenido de la variable que esta en ese sitio. Los arrays son punteros que almacenan siempre el mismo valor y que no se le puede cambiar(concretamente, guardan la ubicacion del primer elemento del array). Cuando pones entre corchetes el numero 0, obtienes lo que esta contenido en la ubicacion que contiene el array. Pero si pones entre corchetes el 1, entonces obtienes lo que esta contenido en la siguiente ubicacion del array. En el ejemplo que te expuse antes de la variable char, array de int y variable float, podria decirse que la ubicacion del primer elemento del array es el numero 2 (y por tanto tambien del array mismo), y si haces array[3] accedes al tercer elemento mas alla del primero, es decir, lo que sea que contenga la variable float. Por eso debe reservarse el espacio de un array en tiempo de compilacion antes de crearse el programa, porque los elementos de un array deben estar uno a continuacion de otro para acceder a ellos correctamente.
Ahora tu imaginate que reservamos esos espacios en memoria, y al array, que es un puntero al primer elemento del mismo, le decimos que en vez de guardar la ubicacion del primer elemento del array va a guardar la ubicacion de la variable de tipo char. Entonces corremos el riesgo de que no haya ninguna variable que guarde la ubicacion del primer elemento del array, y por tanto no podamos saber donde empezaba el mismo. Esto es un problema porque despues no habra manera de acceder a el (podriamos acceder al elemento que le sigue al de tipo char, pero en un principio no sabemos si realmente es justo ahi donde esta el primer elemento del array, ya que el compilador puede organizar como se almacenan los datos en la memoria a su manera). Entonces, para evitar ese problema, a los punteros que realmente son los arrays no se les puede cambiar el valor. Asi siempre sabremos donde empieza el array.

Podemos crear arrays cuyo tamaño sea determinado cuando se ejecuta el programa, pero no cambiarlo ni hacer que el array almacene otra ubicacion para no perder de vista donde estaba. Por tanto, no se puede crear un array que cambie de tamaño a medida que vaya necesitando mas(En realidad si, creando los arrays de forma dinamica pero uff, que cansado estoy de escribir. Ya cuando seas mayor veras como se hace eso xDD).

Ahora es cuando tu vienes y me dices: "Pero bueno, ¿Por que no has empezado diciendome directamente que no se puede y asi no me tengo que matar leyendo todo ese tocho de texto?"  :xD



Pero mira, una cosa que si puedes hacer es, en el metodo llenar cuando te dice "INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: " Puedes con una variable crear el array con el tamaño justito y despues mientras que vas introduciendo nombres decir algo como "Dame el primer nombre del estudiante o escribe \"salir\" para dejar de seguir introduciendo datos". El numero que le indicas cuando pide numero seria el total del alumnos que van a estar. Algo es algo.Solo es una sugerencia.



Cita de: dato000 en Ayer a las 18:39
no se porque pero el programa no quiere ejecutar correctamente el guardado de la variable string y luego imprimirla como parte de una función por valor, rarisimo eso no lo habia visto o.O.

Ni siquiera funciona para un solo estudiante, sera por el compilador?? ya probe varias combinaciones
No se si me explique bien antes. En el codigo que presentas en tu comentario en el que usas una variable de string en vez de un array, prueba una cosa: No le pases el nombre por parametro. Crea una variable global de tipo string con el mismo nombre y borra el parametro y lo demas dejalo tal cual. De esta forma la funcion accedera directamente a esa variable y no a la copia que crea al pasarselo por valor por el parametro. Si en vez de pasarle un string por parametro le pasas un array de string dejando el codigo tal cual lo presento jesusinfo, cuando introduzcas un solo elemento al array no deberia darte problemas. Si lo sigue haciendo me rindo.

[MOD] NO se debe hacer triple post.


Título: Re: Problema con el metodo BubbleSort
Publicado por: Jesusinfo en 13 Octubre 2016, 01:56 am

Podemos crear arrays cuyo tamaño sea determinado cuando se ejecuta el programa, pero no cambiarlo ni hacer que el array almacene otra ubicacion para no perder de vista donde estaba. Por tanto, no se puede crear un array que cambie de tamaño a medida que vaya necesitando mas(En realidad si, creando los arrays de forma dinamica pero uff, que cansado estoy de escribir. Ya cuando seas mayor veras como se hace eso xDD).

Ahora es cuando tu vienes y me dices: "Pero bueno, ¿Por que no has empezado diciendome directamente que no se puede y asi no me tengo que matar leyendo todo ese tocho de texto?"  :xD



Pero mira, una cosa que si puedes hacer es, en el metodo llenar cuando te dice "INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: " Puedes con una variable crear el array con el tamaño justito y despues mientras que vas introduciendo nombres decir algo como "Dame el primer nombre del estudiante o escribe \"salir\" para dejar de seguir introduciendo datos". El numero que le indicas cuando pide numero seria el total del alumnos que van a estar. Algo es algo.Solo es una sugerencia.



[MOD] NO se debe hacer triple post.

Mucha gracias por tu respuesta y disculpame por lo tarde de mi respuesta, pero me parece de mucha utilidad tu informacion, es una verdad que lo he leido 2 veces ya y no entiendo NADA jajaja, entiendo tan solo una porción de toda la información pero estamos para eso para aprender y poco a poco tengo que ir agarrando el hilo a la cuestión. y pues iré estudiando punteros porque como bien dices es bastante difícil de entender, agarrare tu sugerencia y probare de esa manera, la cuestión es practicar pues nuevamente gracias estare publicando avances sobre este ejercicios, me han sido de mucha ayuda todos ustedes, son unos pro jaja.