elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 [87] 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
861  Programación / Programación C/C++ / Re: Duda de probabilidad de pasarse en: 12 Diciembre 2018, 23:47 pm
<variable> y <variable2> van a terminar con el mismo valor. Además:
Código
  1. int variable = 10, variable2 = 3;
  2. double probabilidad = variable / variable2;
  3. // 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
  1. probabilidad = (double)variable / variable2;
862  Programación / Programación C/C++ / Re: Dudas acerca de cierres de llaves en if, limite de lineas etc en: 12 Diciembre 2018, 23:00 pm
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
  1. bool validar_hora(thora hora){
  2.    bool valido = true; // asumimos que la hora es valida
  3.    if(hora.hora < 0 || hora.hora > 23 || hora.min < 0 || hora.min > 59 || hora.segundo < 0 || hora.segundo > 59)
  4.        valido = false; // si algun dato se sale de los limites la hora ya no es valida
  5.    return valido; // usando solo un return podemos controlar mas facil lo que se devuelve
  6. }
863  Programación / Programación C/C++ / Re: Programa no entra en el if en: 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
  1. void modificaDatos(setClientes &variosClientes);
Y por mucho que pongas...
Código
  1. x = false;
  2. 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
  1. 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
864  Programación / Programación C/C++ / Re: Duda sobre eliminar nodos de una lista doble en: 12 Diciembre 2018, 21:12 pm
Con el segundo código, cuando te quede un nodo sólo:
Código
  1. while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
  2. borrado=lista.inicio; // borrado apunta al ultimo nodo
  3. lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
  4. lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
  5. borrado->sig=NULL;
  6. delete(borrado);
  7. }

Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
865  Programación / Programación C/C++ / Re: Dudas acerca de cierres de llaves en if, limite de lineas etc en: 12 Diciembre 2018, 21:07 pm
Imagina esta función:
Código
  1. bool funcion(<parametros>){
  2.    if(condicion1)
  3.        if(condicion2)
  4.            return true;
  5.        else
  6.            return false;
  7. }

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
866  Programación / Programación C/C++ / Re: consulta asignar enteros a un valor logico en: 12 Diciembre 2018, 19:34 pm
Por qué esto??
Código
  1. typedef struct ambito{
  2. bool local;
  3. };
  4. typedef struct simbolo{
  5. //...
  6. ambito global;
  7. };
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
  1. do{
  2. cout<<"Ingrese ambito local(0)/global(1): ";
  3. cin>>auxiliar;
  4. if(auxiliar==0)
  5. nuevo->dato.global.local=true;
  6. else if(auxiliar == 1)
  7.                nuevo->dato.global.local = false;
  8. }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
867  Programación / Programación C/C++ / Re: Consulta - Punteros en: 12 Diciembre 2018, 18:45 pm
La firma de estas funciones auxiliares sería algo así:
Código:
int funcion(alumno *al_1, alumno *al_2);
Las funciones reciben punteros para no andar copiando estructuras enteras cada vez, por tanto dentro de la función tendrás que usar notación de punteros para acceder a los miembros.

Otra alternativa, ya que el programa es en C++ y no en C es pasar los parámetros por referencia.
Código
  1. int funcion(const alumno &al_1, const alumno &al_2)
Personalmente prefiero usar está opción y evitas usar la notación de punteros. Te lo dejo como alternativa. :-X
868  Programación / Programación C/C++ / Re: Cómo eliminar un elemento de un array dinámico - CONSULTA en: 12 Diciembre 2018, 17:33 pm
Bueno, algunos de tus errores:
- En las líneas 9-10 accedes al array nuevo pero no reservas memoria en él hasta la línea 12.
- Al terminar no sabes cual es el tamaño del nuevo array para poder recorrerlo.

Recomendaciones:
- Pasa el puntero por referencia, cuando tienes el nuevo terminado se lo asignas al original (no sin antes haber liberado la memoria del primero).
- En el <for> de las líneas 4-8 en vez de contar los que son iguales, cuenta los que son distintos (cambiando el "==" por "!=" en el <if>).
- Haz que la función devuelva el nuevo tamaño del array porque sino no puedes recorrerlo (tambien puedes pasar el segundo parámetro por referencia para modifcarlo, pero tendrás que hacerlo al final de la función).

Suerte :-X
869  Programación / Programación C/C++ / Re: Duda sobre eliminar nodos de una lista doble en: 12 Diciembre 2018, 06:09 am
Esto es porque cada nodo al tener dos punteros, la idea es que todos apunten a NULL. Si se usa la segunda función, el <pnodo ant> del primer nodo, no quedaría apuntando a NULL, ya que este no se modifica. Del segundo nodo hasta el penúltimo también obtienes el mismo resultado pero en el primero y en el último, no.
Para el último nodo, <lista.inicio> apunta al último nodo, haces que <borrado> apunte también a él, después <lista.inicio> apunta al siguiente (que es NULL). Si haces:
Código
  1. lista.inicio->ant = NULL;
Ese <ant> no existe, porque ya no estás apuntando a un nodo. :-X
870  Programación / Programación C/C++ / Re: Dudas acerca de cierres de llaves en if, limite de lineas etc en: 12 Diciembre 2018, 06:01 am
Personalmente no me funcionan ninguno de los dos correctamente. Quiero decir, ambos me compilan bien pero no se evalúa correctamente.
Esto es porque hay casos sin especificar:
- En ambos casos, 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>.
Esos son los 3 casos que están especificados. El resto de casos no está explícito lo que va a ocurrir.

Lo he probado con una función que retorna un <int> en vez de un <bool> para ver los casos por defecto.
Código
  1. int funcion(int x){
  2.    if(x == 0)
  3.        if(x == 1)
  4.            if(x == 2)
  5.                return 20;
  6.            else
  7.                return 200;
  8. }

(Ya sé que la función es absurda pero nos sirve :xD) Si provoco alguno de los casos en los que no está especificado el valor de retorno, la función retorna el mismo valor que he introducido (x). Usando tus funciones para cada uno de los casos que no está especificado, la función retorna automáticamente <true>. Esto que comento es de forma experimental, no de forma teórica. :-X
Páginas: 1 ... 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 [87] 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines