[Curso] Introducción a la programación en C (VIII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
hiddenotebook
Experto
Experto
Mensajes: 634
Registrado: 28 Dic 2009, 14:56
Ubicación: En un lugar de la mancha...

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por hiddenotebook »

arisma escribió:
Spoiler:
Estoy intentando ver en qué pagina has colgado el codigo o cual es el ultimo codigo que estás usando pero mientras tanto->

Código: Seleccionar todo

  if (!( (numero % 2 == 0) && (numero > 10)))
        printf("No es par ni mayor que 10\n");

(23 > 10) && (23 % 2 == 0) -> V && F -> F
(24 > 10) && (24 % 2 == 0) -> V && V -> V
(2 > 10) && (2 % 2 == 0) -> F && V -> F


A ver chicos, que nos hemos de fijar en la negación. Si el resultado es false, y le pones la negación...

El problema es, que cualquiera de las 2 condiciones puede hacer falsa el resultado.


Si yo me fijo yo entiendo que si pongo '!' y luego 'numero > 10'
el printf debería ser ("Este numero es menor de 10")
hasta hay llego pero si lees bien mi mensaje lo que no entiendo con esto:

Código: Seleccionar todo

  if (!( (numero % 2 == 0) && (numero > 10)))
        printf("No es par ni mayor que 10\n");

Es que si pongo un 23 me imprime el printf en cambio si pongo un 26 NO
haz tu lo mismo ves a la primera pagina y prueba el ejemplo si le doy un 2
me dice printf("No es par ni mayor que 10\n"), ¿creo que no me entendéis? :cry:

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

A ver, hiddenotebook. Fíjate en la corrección de arisma respecto a &&. Es &&, no & (igual que == y =).

Volviendo al eterno tema del 23 (o cualquier impar > 10). Te voy a dejar la regla de De Morgan, que creo que aclará el asunto. La enuncio y luego vemos cómo la aplicamos a este caso concreto:

Código: Seleccionar todo

!(a && b) = !a || !b

adicionalmennte (aunque en este caso no nos interesa):

Código: Seleccionar todo

!(a || b) = !a && !b

¿Por qué? Veamos todas las posibilidades:

Código: Seleccionar todo

a = F; b = F
!(F && F) = !F = V = !F || !F = V || V

a = F; b = V
!(F && V) = !F = V = !F || !V = V || F

a = V; b = F
!(V && F) = !F = V = !V || !F = F || V

a = V; b = V
!(V && V) = !V = F = !V || !V = F || F

siendo evidentemente V = verdad y F = falso.

En el caso concreto de nuestro código:

Código: Seleccionar todo

!((numero % 2 == 0) && (numero > 10))

Esto NO es, según pareces pensar hiddenotebook, igual a

Código: Seleccionar todo

!(numero % 2 == 0) && !(numero > 10)

sino

Código: Seleccionar todo

!(numero % 2 == 0) || !(numero > 10) -> (numero % 2 != 0) || (numero <= 10)

Es decir, la condición se cumple cuando numero es impar O numero es menor o igual a 10. Por tanto, con el 23 se cumple la condición, ya que cumple que es impar, y finalmente se imprime el texto.

Algunas veces estas sentencias lógicas pueden resultar un poco mareo y dolor de cabeza, pero mi consejo es pensarlo bien, sobre todo ponerse ejemplos, ir sustituyendo en la condición y calcular tranquilamente el resultado. Eso nos ayudará a entenderlas mejor ;)
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por arisma »

A ver, te entiendo perfectamente, pero no he sido capaz de que me entiendas tú.

Vamos a ceñirnos a esos 2 casos.

Código: Seleccionar todo

if (!( (numero % 2 == 0) && (numero > 10)))
        printf("No es par ni mayor que 10\n");


1) 23

numero %2 == 0 -----> false numero > 10 -----> false &&-----> false !false---->true(es decir lo visualiza)

2) 26

numero %2 == 0 -----> true numero > 10 -----> true &&-----> true !true---->false(NO lo visualiza)


P.D: Jefe te has adelantado, por la llamada(estoy en el trabajo jeje)

Avatar de Usuario
finfantasy
Habitual
Habitual
Mensajes: 153
Registrado: 15 Oct 2009, 19:00

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por finfantasy »

El problema yo creo que está en la interpretación de la frase que se imprime por pantalla, si tu dices que un número no es par ni mayor que 10, con el 23 deberia ser cierto (es mayor que 10, aunque no sea par).

Yo creo que para que la frase quiera expresar lo mismo que el !(n%2 == 0 && n > 10) deberia ser: "No es par Y mayor que 10", porque si dices "No es par ni mayor que 10" estas queriendo decir lo mismo que "No es par y tampoco es mayor que 10".

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

finfantasy escribió:deberia ser: "No es par Y mayor que 10", porque si dices "No es par ni mayor que 10" estas queriendo decir lo mismo que "No es par y tampoco es mayor que 10".

Totalmente de acuerdo. Pero si te fijas, él dice aquí:

Spoiler:
hiddenotebook escribió:Hasta aquí quería llegar yo señor profe, si yo pongo en una frase:

No es par ni mayor que 10
o
No es par y mayor que 10

usando este ejemplo que pusiste:

Código: Seleccionar todo

    if (!( (numero % 2 == 0) && (numero > 10)))
        printf("No es par ni mayor que 10\n");


Si no se cumple alguna de las 2 el programa deveria no imprimir el mensaje no? lo que pasa es que si pongo un 23 si lo imprime mira:

Código: Seleccionar todo

Introduce un número: 23
No es un nueve
Es mayor o igual que 10
Es multiplo de 5 ó es menor o igual a 100
No es par ni mayor que 10
/* vale par no es, pero si que es mayor que 10 si cambio la frase da igual porque si pongo, no es par Y mayor que 10 me pasa lo mismo pero al contrario si pongo un 1 me dice que es mayor que 10 en vez de ignorar ese printf*/


Pero al contrario si pongo un 26 ignora este printf mira:

Código: Seleccionar todo

Introduce un número: 26
No es un nueve
Es mayor o igual que 10
Es multiplo de 5 ó es menor o igual a 100
26 25 24 23 22 21 20 19 18 17 16 15 14 13


23 es ambas cosas: mayor que 10 e impar. Por tanto 23 no es par y mayor que 10 (no cumple las 2 condiciones). 24 sería mayor que 10, pero par. 2 sería par, pero menor que 10.

Para que me entiendas mejor, esto no es un Y coloquial, que usamos cuando hablamos, es un Y lógico: dadas 2 expresiones lógicas A y B (que pueden ser verdaderas o falsas), A && B sólo es verdad en el caso en que ambos A y B sean verdad, siendo falso en cualquier otro caso. Con los ejemplos arriba citados:

(23 > 10) && (23 % 2 == 0) -> V && F -> F
(24 > 10) && (24 % 2 == 0) -> V && V -> V
(2 > 10) && (2 % 2 == 0) -> F && V -> F


Todo lo que me cuentas aquí lo entiendo perfectamente, lo que no entiendo es que si una de las dos es Falsa porque imprime el mensaje en pantalla, porque que me diga que 23 no es mayor que 10 no puede ser.

PD: y ya de paso mi primer ejercicio.

Código: Seleccionar todo

#include <stdio.h>

int main (int argc, char *argv[])

   {
   int numero;

      system("clear");
      printf("Introduce un número entre 0 y 20... ");
      scanf("%d", &numero);

   if (numero % 2 == 0 & numero < 20)
           printf("Es par menor que 20\n ");

   if (numero % 2 == 0 & numero == 20)
      printf("Es par igual que 20\n");

   if (numero % 2 == 1 &numero <= 20)
      printf("es impar\n");

   if (numero > 20)
      printf("entre tú y yo ¿sabes leer?\n");

   return 0;

   }   

que no le importa cómo se diga.

Cambiaré la frase en el ejemplo :mrgreen:
Imagen

Avatar de Usuario
hiddenotebook
Experto
Experto
Mensajes: 634
Registrado: 28 Dic 2009, 14:56
Ubicación: En un lugar de la mancha...

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por hiddenotebook »

Dios.. pues si que me costo entender como funciona :oops: normal mente no soy tan cazurro, muchas gracias chicos ahora si me entro.
Lo del & es porque he estado estudiando por internet y pensé en hacerlo diferente, pero creo que así no me ciño al ejercicio voy a ponerlo como pides profe, así veras que tu esfuerzo por dejarme claro el eterno asunto llego a su fin jajajaja.

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
   int numero;
   system ("clear");

   printf("Dame un número entre 0 y 20 te dire si es par y menor o mayor a 20: ");
   scanf("%d", &numero);

   if ((numero % 2 == 0) && (numero <= 20))
        printf("%d Es un numero par y menor o igual a 20\n", numero);

   if (!((numero % 2 == 0) && (numero <= 20)))
        printf("%d Es un numero impar y menor que 20\n", numero);

  return 0;
}

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

hiddenotebook escribió:Lo del & es porque he estado estudiando por internet y pensé en hacerlo diferente, pero creo que así no me ciño al ejercicio voy a ponerlo como pides profe

& no es &&, es otro operador diferente, que ya veremos más adelante.

Código: Seleccionar todo

   if (!((numero % 2 == 0) && (numero <= 20)))
        printf("%d Es un numero impar y menor que 20\n", numero);

Mal :mrgreen:

Código: Seleccionar todo

printf("%d es un numero impar o mayor que 20\n", numero);
Imagen

Avatar de Usuario
hiddenotebook
Experto
Experto
Mensajes: 634
Registrado: 28 Dic 2009, 14:56
Ubicación: En un lugar de la mancha...

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por hiddenotebook »

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
   //Defino la variable
   int numero;

   //Limpio la pantalla para leer bien el mensaje
   system ("clear");

   //Mensaje de funcionamiento
   printf("Dame un número entre 0 y 20 te diré si es par y menor o mayor a 20: ");

   //Leemos numero
   scanf("%d", &numero);

   //Por si no leíste bien
   if (numero > 20)
      {
        printf("Te pasaste te dije entre 0 y 20 prueba de nuevo\n");
             return 0;//Si te pasas game over.
      }

   //Defino el par y si es menor o igual a 20
   if ((numero % 2 == 0) && (numero <= 20))
        printf("%d Es un numero par y menor o igual a 20\n", numero);

   //Defino el impar por descarte menor
   if (!((numero % 2 == 0) && (numero >= 20)))
        printf("%d Es un numero impar o menor que 20\n", numero);

  return 0;
}


que tal así

Código: Seleccionar todo

if (!((numero % 2 == 0) && (numero >= 20)))
          printf("%d Es un número impar o menor que 20\n", numero)


:juasjuas: Por cierto los ejercicios del VII te están esperando :oki:
Última edición por hiddenotebook el 27 Feb 2010, 03:19, editado 3 veces en total.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

Código: Seleccionar todo

   //Por si no leíste bien           
   if (numero > 20)
           {
        printf("Te pasaste te dije entre 0 y 20 prueba de nuevo\n");
             return 0;//Si te pasas game over.
      }

¿Y esas llaves bailongas? ¡Aquí seriedad! ¡Firmes!

Código: Seleccionar todo

   //Defino el impar, menor a 20
   if (!((numero % 2 == 0) && (numero >= 20)))
        printf("%d Es un número impar o menor que 20\n", numero);

A ver cuando atinamos con ésta :roll:
Imagen

Avatar de Usuario
hiddenotebook
Experto
Experto
Mensajes: 634
Registrado: 28 Dic 2009, 14:56
Ubicación: En un lugar de la mancha...

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por hiddenotebook »

Pues ahora que lo dices no solo son las llaves las que bailaron debió ser al pegar voy a editarlo.

Y a ver jajaja viste la peli de la historia interminable? por lo visto hoy la vemos :lol: fijo.

Código: Seleccionar todo

        //Defino el impar por descarte menor 
   if (!((numero % 2 == 0) && (numero >= 20)))
        printf("%d Es un numero impar o menor que 20\n", numero);


si "! no" es par && "! >= 20" menor que... esta bien,
no??? se supone que ! niega así que si es > lo hace < ¿no?
estoy apunto de tirarme por la ventana

Responder