(SÓ NERD) Desafio em C [RESOLVIDO]

1. (SÓ NERD) Desafio em C [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 13/02/2015 - 22:08h

Criei este e outros desafios para alunos meus na disciplina de Algoritmos III. Hoje, colocando como brincadeira para os moderadores, resolvi colocar no VOL.

Não basta dizer o que faz, pois esta parte é fácil (basta executar o código). Tem que dizer "COMO FAZ". Explicar a "bizarrice" do código.

Quem se habilita?


#include <stdio.h>

int main()
{
int v[2]={0x504D4920,0x00005241};
int n=0;

printf("%s\n",scanf("%d", &n)?(char*)v+1+(!(n&1)<<1):"ERRO");

printf ("\n Num = %d\n", n);
}



  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 15/02/2015 - 12:48h

O programa lê um número e diz se ele é par ou impar. Como o retorno de scanf é possivelmente 1 ele executará a parte verdadeira do if. Daí vai andar 1 byte para direita (pc little endian), isso para evitar imprimir " IMPAR" com um espaço, esse é o (char *)v, (char *)v+1 é o "IMPAR". Agora para imprimir PAR é preciso deslocar o ponteiro mais 2 bytes para se ter a palavra "PAR", pois em todo !(n&1)<<1 com "n" sendo par dará 2 ou em bits 00000010. Para imprimir IMPAR o ponteiro precisa ficar onde está, ou seja, ser apenas (char *)v + 1, pois todo número impar tem o primeiro bit igual a 1 e todo !(n&1)<<1 sempre dá zero para todo "n" impar. Supondo agora que tenha algum erro na leitura de scanf daí "n" continuaria sendo 0 e a mensagem imprimida seria "ERRO" seguido de "Num = 0".
Ah, e o v[0] é " IMP" e o v[1] é "AR".


3. Perfeito

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 15/02/2015 - 15:58h

Muito bom Sam. A tua descrição, em detalhes, foi perfeita. Parabéns.


Sam L. escreveu:

O programa lê um número e diz se ele é par ou impar. Como o retorno de scanf é possivelmente 1 ele executará a parte verdadeira do if. Daí vai andar 1 byte para direita (pc little endian), isso para evitar imprimir " IMPAR" com um espaço, esse é o (char *)v, (char *)v+1 é o "IMPAR". Agora para imprimir PAR é preciso deslocar o ponteiro mais 2 bytes para se ter a palavra "PAR", pois em todo !(n&1)<<1 com "n" sendo par dará 2 ou em bits 00000010. Para imprimir IMPAR o ponteiro precisa ficar onde está, ou seja, ser apenas (char *)v + 1, pois todo número impar tem o primeiro bit igual a 1 e todo !(n&1)<<1 sempre dá zero para todo "n" impar. Supondo agora que tenha algum erro na leitura de scanf daí "n" continuaria sendo 0 e a mensagem imprimida seria "ERRO" seguido de "Num = 0".
Ah, e o v[0] é " IMP" e o v[1] é "AR".







4. Re: (SÓ NERD) Desafio em C [RESOLVIDO]

Fábio Berbert de Paula
fabio

(usa Debian)

Enviado em 15/02/2015 - 22:50h

Samuel é o cara, orgulho de tê-lo como membro ativo no VOL!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts