Guest Markito Posted February 15, 2013 at 09:01 PM Report #495484 Posted February 15, 2013 at 09:01 PM (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 February 15, 2013 at 09:05 PM by pmg Falta LP no GeSHi
pmg Posted February 15, 2013 at 09:09 PM Report #495487 Posted February 15, 2013 at 09:09 PM (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 February 15, 2013 at 09:10 PM 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!
HappyHippyHippo Posted February 15, 2013 at 09:10 PM Report #495488 Posted February 15, 2013 at 09:10 PM ! // 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 Portugol Plus
Guest Markito Posted February 16, 2013 at 02:46 PM Report #495556 Posted February 16, 2013 at 02:46 PM (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 February 16, 2013 at 02:54 PM by Opaidacriança
AJBM Posted February 16, 2013 at 03:30 PM Report #495563 Posted February 16, 2013 at 03:30 PM 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.
pokker Posted February 16, 2013 at 03:36 PM Report #495565 Posted February 16, 2013 at 03:36 PM 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
Guest Markito Posted February 16, 2013 at 03:51 PM Report #495566 Posted February 16, 2013 at 03:51 PM (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 February 16, 2013 at 04:00 PM by Opaidacriança
AJBM Posted February 16, 2013 at 04:16 PM Report #495572 Posted February 16, 2013 at 04:16 PM A tua dificuldade é não sabes para que serve o if(i%2), para imprimir os números pares?
pmg Posted February 16, 2013 at 04:46 PM Report #495580 Posted February 16, 2013 at 04:46 PM (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 February 16, 2013 at 04:47 PM 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!
Guest Markito Posted February 16, 2013 at 04:59 PM Report #495581 Posted February 16, 2013 at 04:59 PM 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!
pmg Posted February 16, 2013 at 05:12 PM Report #495586 Posted February 16, 2013 at 05:12 PM 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!
AJBM Posted February 16, 2013 at 06:36 PM Report #495607 Posted February 16, 2013 at 06:36 PM (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 February 16, 2013 at 06:36 PM by AJBM
HappyHippyHippo Posted February 16, 2013 at 07:43 PM Report #495631 Posted February 16, 2013 at 07:43 PM 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 Portugol Plus
Guest Markito Posted February 16, 2013 at 09:06 PM Report #495656 Posted February 16, 2013 at 09:06 PM (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 February 16, 2013 at 09:08 PM by Opaidacriança
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now