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

Publicado por Fernando Krein Pinheiro em 01/04/2011

[ Hits: 17.513 ]

 


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

Função recursiva para inverter um vetor de caracteres

Melhor Controle de Memória de Strings em C

Sobrecarregamento de operadores

Limpando a "sujeirinha" no buffer do teclado

Utilizando funções em C++

  

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