Problema con el metodo BubbleSort

Iniciado por Jesusinfo, 1 Octubre 2016, 18:18 PM

0 Miembros y 3 Visitantes están viendo este tema.

Jesusinfo

Cita de: dato000 en  2 Octubre 2016, 22:36 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.

dato000

Cita de: Jesusinfo en  2 Octubre 2016, 22:59 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 (cpp) [Seleccionar]

//Funcion que indica la n cantidad de estudiantes y sus notas ----------------------------
void llenar (int notas [], string nombreEstudiante){
system("clear");
//cout << "INDIQUE EL NUMERO DE ESTUDIANTES A UTILIZAR EN EL PROGRAMA: ";
//cin >> num;  cout<<endl;
    //for(int i=0; i<num; i++){
cout << "\nDame el primer nombre del estudiante "; //<< i+1 <<endl;
cin >> nombreEstudiante;//[posicionesEstudiante];
cout << endl << nombreEstudiante << endl;
//getline (cin, nombreEstudiante);

//cout << "ESTUDIANTE " << i+1 <<endl;
//for (int x=0; x<asignatura; x++){
// cout<<"\nNOTA "<< x+1 <<": ";
// cin>>notas[5*i+x];
//}
        posicionesEstudiante++;
        cout<<endl<<endl;
//}

    cin.get();
    cin.get();
}

//Funcion para imprimir la n cantidad de estudiantes junto a sus notas ----------------------------
void imprimir (int notas [], string nombreEstudiante){
    system("clear");
    cin.get();
    cout<<"LOS ESTUDIANTES Y SUS NOTAS\n"<<endl;
    cout << " EL ESTUDIANTE: ";
    //for(int i=0; i<caracteresNombres; i++){
        cout << nombreEstudiante;//[i]<<endl<<endl;
//}

//cout << "NOTAS:" << endl;
//for(int i=0; i<caracteresNombres; i++){
    //    cout<<notas[i]<< " - ";
//}

    cin.get();
    cin.get();
}


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:



4dr14n31t0r

Cita de: dato000 en  2 Octubre 2016, 22:36 PMotra 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.

dato000

Cita de: 4dr14n31t0r en  3 Octubre 2016, 09:58 AM
¿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

Cita de: 4dr14n31t0r en  3 Octubre 2016, 09:58 AM
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++.

Cita de: 4dr14n31t0r en  3 Octubre 2016, 09:58 AM
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??



Jesusinfo

Cita de: dato000 en  3 Octubre 2016, 18:39 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

dato000

Cita de: Jesusinfo en  3 Octubre 2016, 19:43 PM
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??



4dr14n31t0r

#16
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:
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.

Jesusinfo

Cita de: 4dr14n31t0r en  4 Octubre 2016, 20:47 PM

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.