Ir para o conteúdo
Guest Markito

[Resolvido] Dúvida no if

Mensagens Recomendadas

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

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por Opaidacriança

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Editado por Opaidacriança

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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))

Editado por AJBM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por Opaidacriança

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.