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

#791
Cita de: Beginner Web en 14 Diciembre 2018, 02:12 AM
se que esto esta mal porque al encontrar la primer condicion que no se cumple ya deberia retornar un false y dejar de verificar las siguientes condiciones

Para dejar de verificar condiciones lo que se suele hacer es incluir que <igual> sea <true> en cada <if>.
Código (cpp) [Seleccionar]

bool iguales(punto_geografico p, punto_geografico q){
bool igual=true;
if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
igual=false;
if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
igual=false;
// asi con todos
return igual;
}


Sin embargo esto se hace más cuando en vez de <if> tienes un <while> o un <for>. Para un <if> es mejor usando <else>. Así en cuanto se cumpla un <if> el resto se los va a saltar.
Código (cpp) [Seleccionar]

bool iguales(punto_geografico p, punto_geografico q){
bool igual=true;
if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
igual=false;
else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
igual=false;
       else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
               igual=false;
// asi con todos
return igual;
}


Y otra opcion es asignar cada condición dentro de cada <if> a la propia variable <igual> ya que es booleana. En este caso tendrías que hacerlo negándolas, algo así:
Código (cpp) [Seleccionar]

bool iguales(punto_geografico p, punto_geografico q){
bool igual=true;
if(igual)
igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
       if(igual)
igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
       if(igual)
               igual= !(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
// asi con todos
return igual;
}

Un poco raro pero se puede hacer. Puedes elegir la que mejor veas. :-X
PD: Me acabo de dar cuenta de que los dos primeros condicionales son el mismo. :rolleyes:
#792
Hay varios problemas:
- Cuando indicas grado 3, tienes que meter los coeficientes {0,1,2,3}, es decir, 4 coeficientes.
Código (cpp) [Seleccionar]

for(int i = 0; i < 3; i++)

Ese bucle se repite 3 veces, no 4. Te faltaría añadir el igual en la comparación, es decir, "i <= 3".
- Cuando introduces coeficientes, introduces el primero y lo guardas. Pero el <while> va en el siguiente orden: primero cambias coeficiente, después pides coeficiente. Entonces el último que ingreses no se va a guardar.
- En el método de sumar tienes que crear un polinomio nuevo de tamaño igual al mayor de los dos polinomios que sumas. En tu método, modificas el primero y la suma solo se hace hasta el grado más alto del primer polinomio, si el segundo es mayor, se pierden esos coeficientes. Debes retornar el nuevo polinomio que has creado que es donde has ido almacenando la suma.

No he mirado más código. Personalmente creo que es mejor guardarlo al revés. En la posición 0, el coeficiente de grado 0, en la posición 1, el coeficiente de grado 1, etc... Es más fácil de imaginar y si quieres añadir un grado más grande, puedes hacerlo sin mover todos los elementos que ya tienes dentro.
Para mostrar un polinomio añade el signo si el coeficiente es negativo, nada y si es positivo añade un "+". Es muy complicado ver bien el polinomio cuando se muestra, si de momento no quieres gastar tiempo en eso añade al menos un espacio entre monomios. Suerte :-X
#793
Programación C/C++ / Re: Consulta - Punteros
13 Diciembre 2018, 20:51 PM
Si tienes que buscar el mayor de un array de enteros, es simple:
Código (cpp) [Seleccionar]

int BuscaMayor(int *array, int size){
    int mayor = array[0];
    for(int i = 1; i < size; i++)
        if(array[i] > mayor)
            mayor = array[i]
    return mayor;
}

Pero esto es porque para saber si un número es mayor que otro basta con el operador ">". Sin embargo cuando comparas estructuras tú decides que campo indica que objeto es mayor que otro. Entonces ya no sirve usar el operador ">", tienes que usar una función que haga lo mismo que ese operador, es decir, que de dos objetos te diga cual es mayor.
Imagina un stuct de persona, con nombre y edad:
Código (cpp) [Seleccionar]

struct Persona{
    string nombre;
    int edad;
    int dni;
};

Nosotros decidimos cuando una persona es mayor que otra, lo más lógico es con la edad, entonces hacemos una función que reciba dos personas y devuelva un entero positivo (1) si el primero es mayor, un entero negativo (-1) si el primero es menor y un 0 si son iguales...
Código (cpp) [Seleccionar]

int compararPorEdad(Persona p1, Persona p2){
    int comparacion = 0;
    if(p1.edad > p2.edad)
        comparacion = 1;
    else if(p1.edad < p2.edad)
        comparacion = -1;
    return comparacion;
}


Entonces ahora para buscar el mayor de un array de personas sería algo así:
Código (cpp) [Seleccionar]

Persona mayorPersona(Persona *personas, int size){
    Persona mayor = personas[0];
    for(int i = 1; i < size; i++)
        if(compararPersonas(personas[i], mayor) == 1)
            mayor = personas[i];
    return mayor;
}

Aquí en vez de usar el operador ">" hemos tenido que usar la función que hemos creado porque si usas el operador ">" con dos estructuras, el programa no sabe cual es mayor (a no ser que sobrecargues ese operador, que eso lo estudiarás más adelante).

Entonces si tienes más de un criterio de ordenación, por ejemplo quieres que el mayor sea e que tiene el DNI más alto. Entonces tendrías una función como <int compararPorEdad(Persona p1, Persona p2)> pero que será <int compararPorDni(Persona p1, Persona p2)>.

El objetivo es que puedas usar la función <Persona personaMayor(Persona *personas, int size)> con el criterio que quieras. Entonces ese criterio lo pasas como tercer parámetro, pasas la función que compara.
Código (cpp) [Seleccionar]

Persona personaMayor(Persona *personas, int size, int (*comparacion)(Persona p1, Persona p2));

Y usas la función <int comparacion(Persona p1, Persona p2)> para comparar cada dos personas del array. Suerte :-X
#794
Programación C/C++ / Re: ordenamieno burbuja
13 Diciembre 2018, 00:12 AM
El código entre etiquetas GeSHi. Se seleccionan encima del cuadro de texto que aparece cuando escribes un mensaje, donde pone "Código GeSHi".
Después igual podemos ayudarte... :-X
#795
<variable> y <variable2> van a terminar con el mismo valor. Además:
Código (cpp) [Seleccionar]

int variable = 10, variable2 = 3;
double probabilidad = variable / variable2;
// probabilidad vale 3, no 3'3

Si haces una división de dos enteros, el resultado se convierte en un entero.
Para que el resultado sea un <double> tienes que hacer al menos uno de los operandos de tipo <double> o hacer un typecast:
Código (cpp) [Seleccionar]

probabilidad = (double)variable / variable2;
#796
Faltan. Piensa que si se cumple el primer <if> entras dentro de ese bloque pero si la segunda condición no se cumple... O si se cumple la segunda también pero la tercera no...
Creo que es una buena práctica crear una variable auxiliar e inicializarla en un valor y así sólo tienes que hacer la mitad de comprobaciones, por ejemplo:
Código (cpp) [Seleccionar]

bool validar_hora(thora hora){
   bool valido = true; // asumimos que la hora es valida
   if(hora.hora < 0 || hora.hora > 23 || hora.min < 0 || hora.min > 59 || hora.segundo < 0 || hora.segundo > 59)
       valido = false; // si algun dato se sale de los limites la hora ya no es valida
   return valido; // usando solo un return podemos controlar mas facil lo que se devuelve
}
#797
Programación C/C++ / Re: Programa no entra en el if
12 Diciembre 2018, 22:37 PM
Para la próxima, en vez de postear dos veces, modifica el primer mensaje y añade lo quieras ahí.

Te recomiendo que pases el parámetro por referencia, así no se copia toda la estructura cada vez que llamas a la función y no necesitas devolver nada. Imagina llamar a la función (copias toda la estructura en memoria), buscas un DNI, este no existe y devuelves toda la estructura... Muy cansado no? Mejor pasar por referencia y si no existe lo que buscas, se acabó, ni hacemos copias ni las devolvemos...
Código (cpp) [Seleccionar]

void modificaDatos(setClientes &variosClientes);

Y por mucho que pongas...
Código (cpp) [Seleccionar]

x = false;
break;

...después de cada <case> no se ejecutan nunca ya que una vez llegas a un <return> la función termina.

Asegúrate de que la función <leer...()> trata correctamente los saltos de línea. Puede que introduzcas como DNI "12345678\n" (el "\n" por el enter del final) y el DNI a comparar es sólo "12345678". Entonces no van a ser iguales. Esto puedes arreglarlo también usando <strncmp()> y ahí puedes especificar cuantos caracteres deben compararse:
Código (cpp) [Seleccionar]

if(strncmp("12345678\n", "12345678", 8) == 0) // para esa instruccion esas dos cadena son iguales


PD: No entiendo para qué sirve <bool x>. Me parece una variable innecesaria, además de que ni el nombre aporta información sobre su uso. Simplifícalo todo con un <if> y un <else>, no te hacen falta condicionales anidados.
Otra cosa, cuando mandes código elige el lenguaje en el desplegable de "código GeSHi" o añade "=cpp" sin las comillas de seguido al "code" de la primera etiqueta. Para que se resalte el código y salgan los números de línea. Es más fácil de ver y de señalar algo en una línea específica. :-X

Suerte. :-X
#798
Con el segundo código, cuando te quede un nodo sólo:
Código (cpp) [Seleccionar]

while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
borrado=lista.inicio; // borrado apunta al ultimo nodo
lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
borrado->sig=NULL;
delete(borrado);
}


Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
#799
Imagina esta función:
Código (cpp) [Seleccionar]

bool funcion(<parametros>){
    if(condicion1)
        if(condicion2)
            return true;
        else
            return false;
}


Situaciones posibles:
- <condicion1 == true> && <condicion2 == true> -> <return true>
- <condicion1 == true> && <condicion2 == false> -> <return false>
- <condicion1 == false>  && <condicion2 == true || condicion2 == false>-> no se ha especificado qué debe devolver la función.

Entonces lo que he podido deducir haciendo pruebas es que cuando ocurre una situación en la que no se ha especificado el valor de retorno, la función devuelve <true> automáticamente.

Este problema al tener 2 condicionales, tiene 2^2=4 posibles situaciones. En 2 de las situaciones tú controlas el valor que se devuelve pero en las otras 2, no. Y en esas 2 que no controlas, se devuelve siempre <true>.

El código que has mandado tú al tener 4 condicionales, tiene 2^4=16 situaciones posibles. En 2 de las situaciones controlas lo que se devuelve, en las otras 14, no. Si ocurre cualquiera de esas 14 situaciones que no has especificado, la función devolverá <true>.

Situaciones que controlas tú:
- En ambas funciones, si se cumplen todas las condiciones, devuelve <true>.
- En la primera función, si no se cumple la primera condición, devuelve <false>.
- En la segunda función, si se cumplen todas las condiciones menos la última, devuelve <false>.

Situaciones que no controlas:
- En la primera función, si se cumple la primera condición pero la segunda no se cumple (por ejemplo). En este caso va a devolver <true>.

No sé si ahora me he explicado mejor o no. Si sigues sin entenderme pregunta lo que no entiendes exactamente a ver si puedo explicar mejor esa parte. :-X
#800
Por qué esto??
Código (cpp) [Seleccionar]

typedef struct ambito{
bool local;
};
typedef struct simbolo{
//...
ambito global;
};

Primero que es más simple directamente crear una variable de tipo <bool> dentro de <simbolo>. Y segundo tal y como está ahí, si asignas <true> a <bool local>; entonces <ambito global> es igual a <true>. Osea a la inversa...

Y si no quieres asignar un <int> a un <bool> comprueba cada caso con <if>.
Código (cpp) [Seleccionar]

do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>auxiliar;
if(auxiliar==0)
nuevo->dato.global.local=true;
else if(auxiliar == 1)
               nuevo->dato.global.local = false;
}while(auxiliar != 0 && auxiliar != 1);

No sé si está bien asignado o es al revés ya que es un lio el "global.local".

PD: Hay un <system("pause")> por ahí que quedaría mejor con un <cin.get()>... :rolleyes:
Y para mí la mayor ventaja de C++ en comparación a C es el uso de <string> en vez de <char*>, así evitas tener que usar <fflush(stdin)> Y coger el valor con un <cin> o <getline()> y no tener que usar <gets()> (y mejor que <gets()> es usar <fgets()>). :-X