Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#781
Cuando operas dos variables de tipo <int>, el resultado resulta de tipo <int> aunque lo guardes en un <double/float>. Por ejemplo:
Código (cpp) [Seleccionar]

int a = 5, b = 2;
double res = a / b;
cout << res;

Este trozo de código te mostraría por pantalla "2". Esto es porque divides (int)5 / (int)2 entonces el resultado es (int)2. Entonces aunque luego lo guardes en un <double> es como hacer <double res = 2>.

Para evitar esto se puede cambiar el tipo al menos a uno de los operandos, una operación entre dos variables numéricas distintas devuelve el resultado con el tipo más grande de los dos operandos:
- <int> / <int> = <int>
- <double> / <int> = <double> (y al revés igual)

Para no modificar el tipo puedes hacer un casting justo antes de la operación, quedaría algo así:
Código (cpp) [Seleccionar]

int a = 5, b = 2;
double res = (double)a / b; // o a / (double)b el resultado es el mismo

Así conviertes la variable <a> en <double> pero sólo para hacer esa operación, después de hacer la división seguirá siendo de tipo <int>.

PD: Los últimos métodos de tu clase (los de comparación) tienen el mismo problema, prueba a comparar dos racionales que uno sea menor que otro pero por menos de una unidad, por ejemplo 1/3 < 1/2, el operador < te va a decir que el primero no es menor que el segundo (porque va a comparar 0 < 0, no 0.3 < 0.5). Suerte :-X
#782
Código (cpp) [Seleccionar]

typedef struct tnodo *pnodo;
// ...
void push_stack(tpila &pila, pnodo nuevo)

El parámetro que mandas es <pnodo> y <pnodo> es un puntero a <tnodo>. Al final, lo que estás mandando es un puntero, pero en vez de ser un puntero a una variable es un puntero a un objeto pero no deja de ser un puntero.

Si tus funciones en vez de recibir un <pnodo> (puntero a <tnodo>)  como parámetro, recibiesen un <tnodo> entonces si tendrías que pasarlo por referencia si lo quieres modificar.
#783
No estoy del todo seguro pero si se trata de punteros creo que no es necesario pasarlo por referencia. Esto es porque un puntero contiene una dirección de memoria, no un dato como tal (variable u objeto).
Si se trata de una variable/objeto hay que pasarlo por referencia porque sino se crea una copia al pasarlo por valor y lo que modificamos es la copia, no el original. Pero al tratarse de punteros, estamos pasando una dirección de memoria, entonces aunque se cree una copia del parámetro y se trabaje sobre la copia, la copia es una dirección de memoria (la misma que el puntero original y por esto es que también funciona). Si se quiere reservar memoria sobre un puntero entonces sí hay que pasarlo por referencia.

Por otra parte el tema de que para un BST se pase por referencia es porque así evitas que la función copie todo el BST por valor. Muchas veces se aprovecha el paso por referencia cuando se trabaja con objetos de gran tamaño para evitar que se haga una copia y así ahorrar espacio en memoria. Por eso hay funciones que reciben objetos constantes por referencia, que parece una tontería ya que al ser constante no se puede modificar pero se hace sólo para evitar que la función ocupe el doble de memoria haciendo una copia del objeto. Para objetos pequeños o variables sencillas es indiferente ya que el gasto de memoria es pequeño pero también podría hacerse. Lo más común es hacer esto con objetos que son muy grandes o que son dinámicos por si llegan a ser muy grandes.
#784
Programación C/C++ / Re: Mi programa no responde!
22 Diciembre 2018, 13:54 PM
El código entre etiquetas de código GeSHi porque cuando usas la i como índice entre corchetes se convierte todo el mensaje de ahí en adelante en cursiva y la i y los corchetes no se ven y no se puede corregir bien el código.

En la función <generarVector()> estás usando asignaciones (un igual "=") donde deberías estar usando comparaciones (dos iguales "=="). No he mirado todo el código en profundidad pero la idea para generar un vector sin valores repetidos es:
- Opción 1
Generas un número aleatorio, recorres los valores que ya has introducido en el vector y si ninguno es igual al nuevo valor generado, lo introduces en el vector, si ya está repetido, generas otro número.
- Opción 2
Vas ordenando cada nuevo valor que introduces y así no tienes que compararlo con todo el vector que ya tienes generado.
PD: Las funciones de tipo <void> no hace falta que le pongas <return>, es raro verlo. Suerte :-X
#785
El código del programa ponlo entre etiquetas de código GeSHi, encima del cuadro de texto.

El <while> divide cada número hasta que los dos son 0. Entonces el resultado es 0 * 0 = 0. Además usas un contador <i> que no tiene ninguna utilidad.Si el número tiene que tener dos cifras obligatoriamente, sólo necesitas dividir el número entre 10 una vez.
En un caso general con cualquier número de cifras tienes que hacer un bucle como el que tienes pero fíjate que la primera cifra de cada número se guarda en r1 y r2 respectivamente, no en n1 y n2 (estos valdrán 0). Suerte :-X

PD: Los problemas relacionados con este tipo de ejercicios se solucionan cogiendo un papel y un boli o pensando lo que estás haciendo, no poniendo código sin pensar...
#786
Para que funcione tienes que distinguir 3 casos (te falta 1):
- Si inicio y fin son iguales -> return v[inicio]
- Si la diferencia entre inicio y fin es 1 -> return sumaDyV(v, inicio, inicio) + sumaDyV(v, fin, fin)
- Si la diferencia es mayor que 1 -> return sumaDyV(v, inicio, fin/2) + return sumaDyV(v, fin/2+1, fin)
Suerte. :-X
#787
Si te manda errores, la pregunta correcta no es "qué le falta?" sino "qué le falla". Si tienes un error especifica cual es el problema que tienes, puedes copiar el mensaje de error que te sale o si el programa compila decir en que momento el programa falla.
Sino dudo que alguien vaya a mirar todo ese código para buscar un fallo que no sabemos ni de qué tipo es.  :-X

Y para que podamos ver mejor el programa, modifica el primer mensaje y añade las etiquetas de código GeSHi.
#788
Citar
esto es lo que he avanzado pero no se que mas le falta

Si tienes que hacer un programa que haga una serie de cosas que has comentado y tienes un código hecho simplemente mira que ese código haga todo lo que tiene que hacer tu programa. Si hay una cosa que no hace, eso es lo que te falta... :rolleyes:
Y el código de los programas entre etiquetas de Código GeSHi. Suerte. :-X
#789
Mi pregunta es si es posible definir una función con varios <templates>. Para que se entienda mejor os pongo un ejemplo sencillo, imaginad tener una función que devuelve el tamaño de una pila <stack> de cualquier tipo (sí, ya se que eso ya existe pero para hacer sencillo el ejemplo):
Código (cpp) [Seleccionar]

template <class T>
size_t stackSize(const stack<T> &s){
   return s.size();
}


Hasta aquí todo bien pero si queremos hacer una función que reciba dos pilas de distinto tipo y devuelva el tamaño de la más grande... La idea es algo así, pero tendríamos errores de compilación por un conflicto entre el tipo de la primera pila y el de la segunda si no son iguales.
Código (cpp) [Seleccionar]

template <class T>
size_t biggestStackSize(const stack<T> &st1, const stack<T> &st2){
   size_t size = st1.size();
   if(st2.size() > size)
       size = st2.size();
   return size;
}

Ya sé que en este caso podría hacerse sin tanta función ni <template> pero es posible hacerlo así definiendo dos <template> distintos?? :huh:
#790
Lo único que los dos primeros condicionales son el mismo...   :rolleyes:
Me he dado cuenta después y aunque lo he añadido al mensaje anterior igual lo he puesto demasiado tarde