Jump to content

[Resolvido] Dúvida no if


Recommended Posts

Posted (edited)

Boas;

estou a ler um pdf de linguagem C de uma certa Universidade. O pdf parece-me muito porreiro e bem estruturado todas as dúvidas que tenho postado aqui resultam deste meu estudo de iniciação á linguagem C.

Tenho mais uma dúvida e agradecia muito a vossa ajuda e a vossa paciência por favor.

O programa é este:

/* Imprime os números pares entre 1 e 100. */
#include <stdio.h>
int main()
{
int i;
for(i=1; i<=100; i++)
if(!(i%2)) printf("%d ",I);
}
/* é invertido pelo ! */

Programa simples e bastante lógico de entender. Ele corre bem, e é suposto imprimir na tela os numeros pares de 1 a 100, o que faz isso com total desenvoltura.

Eu não entendo é esta parte

if(!(i%2))

. Apesar da explicação do comentário no final do programa...

Alguém me pode explicar o significado deste trecho especifico do programa?

Agradeço desde já: Muito Obrigado

Edited by pmg
Falta LP no GeSHi
Posted (edited)

Em C, uma condicao sem operadores logicos, e o mesmo que comparar esse valor diferente de zero

int a = 42;
if (a) printf("YES\n"); // if (a != 0)

O ponto de exclamacao é a negacao

int a = 42;
if (!a) printf("YES\n"); // if (a == 0)

No teu codigo, tens o valor (i % 2) em vez de (a)

if (i % 2)
if (i % 2 != 0)

Mas como esta la o ponto de exclamacao, torna a condicao negativa (ao contrario)

if (!(i % 2))
if (!(i % 2 == 0))
if (i % 2 == 0)
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted
!      // operador unário (um só operando) que troca o valor booleano da expressão
(
 i%2  // operador binário (tem dois operandos) que retorna o resto da divisão inteira entre os dois valores
    )

agora por partes :

resto da divisão inteira

7 / 3 = 2 (resto 1)

logo:

7 % 3 = 1

operador !

em C, o valor de 0 é considerado como falso, todos os outros são considerados como verdadeiro

então o operador é aplicado da seguinte forma:

valor | resultado

-----------------

0 | 1

outro| 0

é este tipo de consideração que é feita pelo if, verdadeiro ou falso, diferente de zero ou zero

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Obrigado pelas explicações. Quase, quase que entendi, já começa a ter lógica... mas falta o quase!

Mas e o que quer dizer particularmente o

 (i%2) 

???

é que até agora tinham-me falado em "coisas" tipo:

scanf("%d%d", &i, &j

ou

("%d",Ch)

O que entendo bem, mas não aquela declaração que nem uma virgula ou um & tem!

Podem-me explicar por favor?

Obrigado

Edited by Opaidacriança
Posted

i%2 é o resto da divisão, por exemplo 2%2=0.

if(!(0)) é a mesma coisa que if(1) é por isso

Se o resultado do resto for 0 o teu printf é executado caso contrario não é executado.

Posted

Se for apenas assim

(i/2 )

entendes?

(i/2 )

significa i dividir por 2, vai-te dar o resultado da divisão

(i%2 )

vai-te dar o resto da divisão por 2, é como o mod que se usa em pascal

/ é o operador divisão

% é o operador que dá o resto da divisão

Posted (edited)

Desculpem a minha burrice mas...

eu sei o que é uma divisão! eu sei o que é um resto de divisão!

eu não entendo é qual é o resto do i se não foi atribuido qualquer valor ao i para começar!

eu sei que aquele trecho do programa por exclusão de partes me está a dizer para contar os numeros de 2 a 2, ou seja os numeros pares de 1 a 100.

Eu não entendo é aquele trecho em si! Terá concerteza toda a lógica, eu é que não estou a ver...

Ou seja, a mim como iniciante se me pesissem para escrever um programa que contasse numeros pares de 1 a 100 eu lembrava-me de tudo, encravava era ali naquele trecho porque não entendo como é que aquela declaração está a dizer para se ler os numeros pares! percebem...

Edited by Opaidacriança
Posted (edited)

eu sei o que é uma divisão! eu sei o que é um resto de divisão!

eu não entendo é qual é o resto do i se não foi atribuido qualquer valor ao i para começar!

O i foi atrubuido um valor na clausula de inicializacao do ciclo for

/*   ***** atribuicao de valor ao i */
for (i = 1; i <= 100; i++)
     if (!(i % 2)) printf("%d ", i);
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

A tua dificuldade é não sabes para que serve o if(i%2), para imprimir os números pares?

Sim! É essa a minha dificuldade, em perceber como esse trecho me diz para contar os pares!

Ajuda-me se faz favor!

O i foi atrubuido um valor na clausula de inicializacao do ciclo for

/*   ***** atribuicao de valor ao i */
for (i = 1; i <= 100; i++)
  if (!(i % 2)) printf("%d ", i);

Ok. Tou a perceber...

O resto de 1%2 será 2? nunca supus que houvesse um resto da divisão entre 1 e 2... é esquisito até considerar uma conta dessas! Parece-me até que não existe resto nenhum!

Ai o meu cérebro que se parte todo!

Posted

1 a dividir por 2 da 0 e resto 1 ... porque 0 * 2 + 1 = 1

em geral, x a dividir por y da n e resto r porque y * n + r = x

17 a dividir por 3 da 5 e resto 2: 3*5+2=17

42 a dividir por 7 da 6 e resto 0: 7*6+0=42

O resto vai ser sempre inferior ao divisor (entre 0 (inclusive) e o divisor propriamente dito (exclusive))

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

Sim! É essa a minha dificuldade, em perceber como esse trecho me diz para contar os pares!

Ajuda-me se faz favor!

Ok. Tou a perceber...

O resto de 1%2 será 2? nunca supus que houvesse um resto da divisão entre 1 e 2... é esquisito até considerar uma conta dessas! Parece-me até que não existe resto nenhum!

Ai o meu cérebro que se parte todo!

Podes fazer como estavas a dizer em cima andar de 2 em dois.

No que ja tens feito os o resto da divisão entre os números pares e 2 da sempre 0, 4%2=0 6%2=0, é por isso que ele faz if(!(i%2))

Edited by AJBM
Posted (edited)

Podes fazer como estavas a dizer em cima andar de 2 em dois.

No que ja tens feito os o resto da divisão entre os números pares e 2 da sempre 0, 4%2=0 6%2=0, é por isso que ele faz if(!(i%2))

Obrigado pelas respostas; penso que esta tua foi a que me fez ter mais luz sobre a minha questão: certamente o resto da divisão entre pares e 2 é sempre 0.

compreendi, muito melhor pelas vossas explicações, o que é o módulo ou resto de uma divisão. Mas sinceramente sinto que ficou algo, - que não depende de vós, mas antes do meu cérebro pouco acostumado a numeros - por entender. Assumo que com o tempo, dedicação e experiência, vou compreender e descomplicar. Não vou pereder mais tempo com este "se".

Muito obrigado, sinceramente e até á minha próxima dúvida!

Cmps 👍 E mais uma vez: Muito obrigado a todos!

Edited by Opaidacriança

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.