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...
[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.