Fazendo comparações sem o uso de IF, ELSE em C

Publicado por Fernando Krein Pinheiro em 01/04/2011

[ Hits: 16.485 ]

 


Fazendo comparações sem o uso de IF, ELSE em C



A uns dias atrás um membro do VOL postou uma dúvida sobre como fazer um script no qual deveria ler três valores inteiros, compará-los e mostrar o maior e menor valor sem uso de IF, ELSE, e FOR.

Logo que vi o post respondi com esse algoritmo que estou postando para compartilhar com aqueles que estejam iniciando na linguagem C.

Nessa dica vou usar o operador " ? ", chamado de "operador ternário" pois requer três operando. Este pode ser usado para substituir os if-else na linguagem C.

Sua forma de funcionamento é:

Exp1 ? Exp2 : Exp3

Onde "Exp1" é expressão1, "Exp2" é expressão2 e assim por diante. O valor de uma expressão "?" é determinada como segue: "Exp1 é avaliada";

a) se for verdadeira, Exp2 será avaliada e se tornará expressão "?" inteira.
b) se for falsa, entao Exp3 é verdadeira e se torna valor da expressão "?" .

#include <stdio.h>

int maior (int a, int b, int c) {
int nmaior = a;

nmaior = b>maior ? nmaior : b ;
nmaior = c>nmaior? c : nmaior ;

}

int menor(int a, int b, int c)
{
int nmenor = a;
nmenor = b < nmenor ? b : nmenor;
nmenor = c < nmenor ? c : nmenor;
return nmenor;
}

int main(){
int a,b,c;
printf("Digite 3 valores inteiros");
scanf("%d %d %d",&a,&b,&c);

printf("O maior numero é: %d\n",maior(a,b,c));
printf("O menor numero é: %d\n",menor(a,b,c));
return 0;
}

O algoritmo é bem simples de entender. São três funções: uma é a main(), a outra para achar o menor e outra para achar o maior. O operador " ? " pode ser considerado como um IF.

Ex: nmenor = b < nmenor ? b : nmenor;

a) "nmenor" vai receber b se a comparação b < n menor for verdade
b) caso contrário receberá "nmenor" e assim por diante...

Qualquer dúvida não exite em perguntar.
;-))

Outras dicas deste autor

Renomeando extensões de centenas de arquivos de uma só vez

Leitura recomendada

Usando o GCC com pthread

Curso de C em vídeo ambientado no Linux

getch() e getche() não funcionam no ANSI

Exibindo código ASCII das teclas

Instalação do editor xwpe - Debian

  

Comentários
[1] Comentário enviado por fdavid em 01/04/2011 - 21:15h

Eu acho o uso de operador ternario muito clique, mas quando não se conhece e vê isso (como já aconteceu comigo) você não sabe por onde comecar :-)

[2] Comentário enviado por eldermarco em 01/04/2011 - 21:21h

Faz pouco tempo, um usuário postou uma dúvida sobre o uso desse operador no fórum do VOL. Dei uma explicação básica, mas é bom que se tenha alguma dica para apontar. Acho bastante útil em termos de deixar o código até mais legível em vários pontos e não ter de usar um if-else para pouca coisa.

[3] Comentário enviado por Teixeira em 03/04/2011 - 11:15h

Há muitos e muitos anos atrás Sir Clive Sinclair lançou um pequeno computador que vinha com um dialeto Basic muito poderoso e que tinha uma sintaxe semelhante, usando uma comparação booleana:

LET A=(435 .and. B<10)(227 .and. B=10)(345 .and. B>10)

No exemplo acima se B for igual a 10, A assumirá o valor de 435.
Sendo diferente, fará a comparação seguinte, até encontrar uma situação que satisfaça a questão.
No Sinclair Basic essa linha poderia continuar fazendo ainda mais comparações (nunca testei para ver qual o limitação desse recurso, mas dava para fazer bastante coisa).
Porém se nenhuma das condições fosse satisfeita, A não assumiria valor algum. Portanto, teria de ser inicializado com zero antes que fossem feitas as comparações.
Além disso, o programador teria de tomar cuidado para que sempre uma das opções fosse verdadeira.

A dica do colega não fala de "Basic".
No entanto, sempre é possível encontrarmos algum recurso extra, menos óbvio, não documentado ou menos utilizado em qualquer linguagem de programação.
Muitas vezes é extremamente útil conhecer algo fora do "trivial ligeiro". Esse conhecimento por vezes facilita em muito a vida do programador.

[4] Comentário enviado por fernandopinheiro em 04/04/2011 - 15:46h

Obrigado pelos comentários...................E Teixeira muito bom esse seu complemento sobre a comparação Booleana no Basic, não conhecia essa !!!

[5] Comentário enviado por AferVentus em 01/04/2013 - 15:45h

Legal o post, entretanto o IF ternário ainda é um IF.

Se querem mesmo uma função para encontrar o valor máximo entre 2 variáveis sem usar IF basta fazer assim:

function max(a, b) {
return (((a + b) + abs(a - b)) \ 2)
}


se quiser comparar 2 valores, chame:

max(a, b)

se quiser comparar 3 valores, chame:

max(max(a, b), c)

e assim por diante.

Até.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts