Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

henriquerick

maior menor entre 4 numeros

Recommended Posts

Boa noite pessoal


Estou cursando Ciência da computação e já no segundo dia de aula o professor lançou um desafio: imprimir o maior e menor entre 4 números, mas não pode utilizar nenhum comando de seleção (IF, SWITCH, condição ternária) ou repetição (FOR, WHILE, DO..WHILE). Alguém tem uma ideia de como pode ser feito isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nestas condições só me ocorre a Mãe Dinah ...

 

Nem IF ...

 

Algum operador matemático talvez ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode usar recursividade para substituir o for, se estiver usando o c++ é mais fácil, pois existe uma função max que compara dois elementos, você compara os dois e o resultado do elemento com o próximo a medida que vai recebendo os valores.

 

algo parecido com:

 

int resultado = -32768;
int numero_lido = 0;


// Faz a leitura do primeiro número e armazena em numero_lido
resultado = max(resultado, numero_lido );


 

// Faz a leitura do segundo número e armazena em numero_lido resultado = max(resultado, numero_lido ); // Faz a leitura do terceiro número e armazena em numero_lido
resultado = max(resultado, numero_lido );

// Faz a leitura do quarto número e armazena em numero_lido
resultado = max(resultado, numero_lido );

 

 

Em C o buraco é bem mais embaixo, não sei exatamente se funciona, pois não tem como comparar, você pode ao invés de ler o número ao inves de como um inteiro, ler como um vetor de char, manter uma largura de casas decimais fixas e preencher com zero todo o espaço não utilizado.

 

 

Sabemos que vai precisar de 7 char para armazenar um inteiro de 16bits, pois o maior comprimento seria para o número -32768, ou seja 6 caracteres, mais 1 para o \0.

 

 

em seguida pode usar o strcmp para poder verificar qual o maior número. Contudo o strcmp, para essa situação se comporta mal, pois ele não devolve -1, 0, 1 e sim menor que zero, zero e maior que zero, se fosse -1, 0, 1, poderia criar um vetor com quatro posições e colocar os números na posição um numero na posição 1 e 2 e o outro na posição três e ao retorno da função strcmp somar dois. Assim teria as seguintes saídas:

 

 

para o retorno -1, 2+-1 = 1, recuperaria o elemento da posição 1

para o retorno 0, 2+0 = 2, recuperaria o elemento da posição 2 (o mesmo que estaria na posição 1, pois se for zero, os números são iguais)

para o retorno 1, 2+1= 3, recuperaria o elemento da posição 3.

 

Com isso teria sempre o número maior como retorno, e bastaria alimentar com o retorno, novamente uma das saídas, se usar bitwise acredito que será possível fazer com que seja zero se aplicar uma mascara de & para zerar os números de posição diferente de 1, mas seria necessário fazer operação de | caso o retorno fosse um número negativo par, mas essa parte de bitwise, não tenho uma lógica para escrever agora.

 

Atenção, nenhuma das lógica apresentadas, foram testadas por mim, são apenas sugestões, nem sei se são realmente válidas.

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <limits.h>

#define max(x, y)           (((x)+(y)+((!(((x)-(y)) & INT_MIN) * 2 - 1) * ((x)-(y))))/2)

int main(int argc, char **argv)
{
    printf("%d\n", max(max(-2, -1), max(2, 1)));
    return 0;
}

Ainda não testei. Qualquer dúvida de como funciona basta perguntar. Há outras formas, mas acredito que esta é a mais fácil de entender. Utilizei muitos parênteses propositalmente, transforme em uma função para ficar mais compreensível. O menor é por sua conta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a demora, mas estava bem ocupado e não tive como fazer o algoritmo antes, com base no que eu havia falado anteriormente eu escrevi o algoritmo segundo sua especificação está bem simples, usei o for para poupar o trabalho de escrever 4 scanf que deve ser o comando que você usa para ler as variáveis e não criar varias variáveis, mas se quiser excluir o for pode fazer isso, pois não muda o algoritmo.

A solução é bem simples.

 

#include <stdlib.h>
#include <string.h>#include <stdio.h>


int main(int argc, char **argv) {


    int major = -32768;
    int iterator = 4;
    int p[2];
    int i;


    for (i = 0; i != iterator; i++) {
        p[0] = major;
        /**
         * 
         */
        fprintf(stderr, "digite um número\n");
        scanf("%d", &p[1]);
        major = p[!(p[0] > p[1])];
    }


    fprintf(stderr, "maior: %d", major);




    return EXIT_SUCCESS;
}

O exemplo sem for na integra.

 

int main(int argc, char **argv) {


    int major = -32768;
    int p[2];




    /**
     * Recupera o primeiro número
     */
    p[0] = major;
    fprintf(stderr, "digite um número\n");
    scanf("%d", &p[1]);
    major = p[!(p[0] > p[1])];


    /**
     * Recupera o segundo número
     */
    p[0] = major;
    fprintf(stderr, "digite um número\n");
    scanf("%d", &p[1]);
    major = p[!(p[0] > p[1])];


    /**
     * Recupera o terceiro número
     */
    p[0] = major;
    fprintf(stderr, "digite um número\n");
    scanf("%d", &p[1]);
    major = p[!(p[0] > p[1])];


    /**
     * Recupera o quarto número
     */
    p[0] = major;
    fprintf(stderr, "digite um número\n");
    scanf("%d", &p[1]);
    major = p[!(p[0] > p[1])];




    fprintf(stderr, "maior: %d", major);




    return EXIT_SUCCESS;
}

Testei e funcionou aqui, abraços, espero ter ajudado!


Não vi que era maior e menor, o seguinte código serve para maior e menor:

 

int main(int argc, char **argv) {


    int major = -32768;
    int minor = 32768;
    int iterator = 4;
    int maior[2];
    int menor[2];
    int i;


    
    for (i = 0; i != iterator; i++) {
        maior[0] = major;
        menor[0] = minor;
        /**
         * 
         */
        fprintf(stderr, "digite um número\n");
        scanf("%d", &maior[1]);
        menor[1] = maior[1];
        
        major = maior[!(maior[0] > maior[1])];
        minor = menor[!(menor[0] < menor[1])];
    }


    fprintf(stderr, "maior: %d\nmenor: %d", major , minor);




    return EXIT_SUCCESS;
}


Se quiser pode remover o for como no exemplo anterior, Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é a melhor solução, é uma solução, pode ser implementado de diversas formas, a forma acima está usando o conceito de proposição e vetor, mas pode se fazer por operação matemática, através da diferença. Como no exemplo abaixo, devem ter outras formas se parar para pensar sobre o assunto, mas as soluções aqui já estão de bom tamanho, a nível didático.

Com "for"

 



#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/*
 * 
 */
int main(int argc, char** argv) {




    int numero;
    int maior = -32768;
    int menor = 32768;
    int i;
    for (i = 0; i < 4; i++) {
        fprintf(stdout, "Digite um numero:\t");
        scanf("%d", &numero);
        maior = (abs(maior - numero) + (maior + numero)) / 2;
        menor = (abs(menor - numero) - (menor + numero)) / 2;


    }
    fprintf(stdout, "\nmaior: %d\nmenor: %d", maior, menor);
    return 0;


}

 

Para compilar esse código inclua -lm a linha de compilação, devido a biblioteca matemática para pegar o valor absoluto

 

Sem for



#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/*
 * 
 */
int main(int argc, char** argv) {




    int numero;
    int maior = -32768;
    int menor = 32768;


    fprintf(stdout, "Digite um numero:\t");
    scanf("%d", &numero);
    maior = (abs(maior - numero) + (maior + numero)) / 2;
    menor = (abs(menor - numero) - (menor + numero)) / 2;


    fprintf(stdout, "Digite um numero:\t");
    scanf("%d", &numero);
    maior = (abs(maior - numero) + (maior + numero)) / 2;
    menor = (abs(menor - numero) - (menor + numero)) / 2;


    fprintf(stdout, "Digite um numero:\t");
    scanf("%d", &numero);
    maior = (abs(maior - numero) + (maior + numero)) / 2;
    menor = (abs(menor - numero) - (menor + numero)) / 2;


    fprintf(stdout, "Digite um numero:\t");
    scanf("%d", &numero);
    maior = (abs(maior - numero) + (maior + numero)) / 2;
    menor = (abs(menor - numero) - (menor + numero)) / 2;


    fprintf(stdout, "\nmaior: %d\nmenor: %d", maior, menor);
    return 0;


}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.