Jump to content
Guest Markito

[Resolvido] Dúvida no if

Recommended Posts

Guest Markito

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

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

!      // 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

Share this post


Link to post
Share on other sites
Guest Markito

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

Share this post


Link to post
Share on other sites
AJBM

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.

Share this post


Link to post
Share on other sites
pokker

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

Share this post


Link to post
Share on other sites
Guest Markito

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

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
Guest Markito

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!

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
AJBM

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

123    | 234
----   ----------------
123      0

A
|
resto

1    | 2
----   ----------------
1      0

A
|
resto

3    | 2
----   ----------------
1      1

A
|
resto

achas descabido o resultado ??


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Guest Markito

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 :thumbsup: E mais uma vez: Muito obrigado a todos!

Edited by Opaidacriança

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.