Ir ao conteúdo
  • Cadastre-se

C Ter 5 numeros e dizer qual deles o maior.


Joel Martins
Ir à solução Resolvido por kgin,

Posts recomendados

Eu estou a tenter fazer um programa que leia 10 numeros e veja qual deles é o maior.

O código é basicamente isto:

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

void main ()
{
    int arr1[10] , i ;
    
    for(i=0 ; i<10 ; i++)
    {
        printf("Insert the value-->");
        scanf("%d", &arr1[i]);
    }
    
    if(arr1[0]<arr1[1])
    {
        if(arr1[1]<arr[2])
        {
            if(arr1[2]<arr1[3])
            {
                if(arr1[3]<arr1[4])
                {
                    if(arr1[4]<arr1[5])
                    {
                        if(arr1[5]<arr1[6])
                        {
                            if(arr1[6]<arr1[7])
                            {
                                if(arr1[7]<arr1[8])
                                {
                                    if(arr1[8]<arr1[9])
                                    {
                                        if(arr1[9]<arr1[10])
                                        {

                                            }
                                            else
                                            {
                                                
                                            }
                                        }
                                        else
                                    }
                                    else
                                }
                                else
                            }
                            else
                        }
                        else
                    }
                    else
                }
                else
            }
            else
        }
        else
        {
        if(arr1[0]<arr1[2])
            {
                if(arr1[3]<arr1[4])
                {
                    if(arr1[4]<arr1[5])
                    {
                        if(arr1[5]<arr1[6])
                        {
                            if(arr1[6]<arr1[7])
                            {
                                if(arr1[7]<arr1[8])
                                {
                                    if(arr1[8]<arr1[9])
                                    {
                                        if(arr1[9]<arr1[10])
                                        {

                                            }
                                            else
                                            {
                                                
                                            }
                                        }
                                        else
                                    }
                                    else
                                }
                                else
                            }
                            else
                        }
                        else
                    }
                    else
                }
                else
            }
        }

Mas ele está uma confusão e enorme.

Qualquer ajuda é bem vinda:))

Link para o comentário
Compartilhar em outros sites

Não faz sentido comparar os valores 1 a 1 se você pode usar um loop pra isso, concorda? Evite usar esse amontoado de "else" também, não é pra isso que ele serve.
A lógica é: pega o primeiro número; compara com os outros (com um loop), quando encontrar algum que seja maior que ele, testa se ele também é maior que "maior numero" (variável definida por você), que inicialmente pode ser zero, se for armazena e segue testando, senão apenas segue testando;  Pega o 2o número, compara com os demais, quando achar um nr maior que ele, testa se ele também é maior que "maior numero", se sim substitui, se não continua testando até o final. Pega o 3o número... E assim por diante. Não é o algoritmo mais rápido nem eficiente (afinal você vai repetir vários testes), mas dá pra escrever usando 10% do código que você usou.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Shaman93 Já tentei fazer mas não funcionou.

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

void main ()
{
    int arr[10] , i ;
    int m=0 ;

    for(i=0 ; i<10 ; i++)
    {
        printf("Insert a value-->");
        scanf("%d", &arr[i]);
    }

    for(i=0 ; i<10 ; i++)
    {
        if(arr[i]>arr[0]){
            m=arr[i];
            if(arr[i]>arr[1]){
                m=arr[i];
                if(arr[i]>arr[2]){
                    m=arr[i];
                    if(arr[i]>arr[3]){
                        m=arr[i];
                        if(arr[i]>arr[4]){
                            m=arr[i];
                            if(arr[i]>arr[5]){
                                m=arr[i];
                                if(arr[i]>arr[6]){
                                    m=arr[i];
                                    if(arr[i]>arr[7]){
                                        m=arr[i];
                                        if(arr[i]>arr[8]){
                                            m=arr[i];
                                            if(arr[i]>arr[9]){
                                                m=arr[i];
                                                if(arr[i]>arr[10]){
                                                    m=arr[i];
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d",m);
}

 

Link para o comentário
Compartilhar em outros sites

@Shaman93 Assim?

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

void main ()
{
    int arr[10] , i ;
    int m=0 , w ;

    for(i=0 ; i<10 ; i++)
    {
        printf("Insert a value-->");
        scanf("%d", &arr[i]);
    }

    for(i=0 ; i<10 ; i++)
    {
        for(w=0 ; w<10 ; w++)
            {
            if(arr[i]>arr[w]){
                    m=arr[i];
            }
    }
    }
    printf("%d",m);
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@Joel Martins Não precisa fazer um bubblesort, faça assim

Spoiler

#include <stdio.h>
#include <limits.h>

#define Q_NUMEROS 5

int main(void)
{
    /* Inicia o menor com o maior valor possivel e inicia o maior com o menor valor possivel */
    /* INT_MAX vale 99999999 e INT_MIN vale 0 */
    int numeros[Q_NUMEROS], menor = INT_MAX, maior = INT_MIN;
    int contador;

    /* Pega 5 numeros */
    for (contador = 0; contador < Q_NUMEROS; contador++) {
        printf("Digite o numero %i\n", contador+1);
        scanf("%i%*c", &numeros[contador]);
    }

    /* Compara qual é o maior e menor */
    for (contador = 0; contador < Q_NUMEROS; contador++) {
        /* Pega o maior numero */
        if (numeros[contador] > maior) {
            maior = numeros[contador];
        }

        /* Pega o menor numero */
        if (numeros[contador] < menor) {
            menor = numeros[contador];
        }
    }

    /* Mostra o maior e o menor numero */
    printf("O menor numero e:%i\n", menor);
    printf("O maior numero e:%i\n", maior);
    getchar();  /* Pausa o programa */
    return(0);
}

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Joel Martins  Quase! Só faltou um teste, pra você dizer que m = arr[i] (ou seja, atualizar o maior valor), você tem que garantir não só que arr[i]>arr[w], mas também precisa testar se arr[i]>m (caso contrário, pode acontecer de você substituir m por um número menor que o que ele já tem, apenas porque arr[i] foi maior que arr[j]). Você só faz m=arr[i] quando arr[i]>arr[w] E arr[i]>m.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

56 minutos atrás, kgin disse:

/* INT_MAX vale 99999999 e INT_MIN vale 0 */

Na verdade não 🤔

Na documentação:

image.png.a2b8153d92a095e8f5e79cdf0a2aa517.png

 

1 hora atrás, kgin disse:

getchar(); /* Pausa o programa */

O propósito de getchar() não é esse, embora eu só veja pessoas a usando para isso...

 

@Joel Martins

Se basta obter o maior número, atribua à uma variável o primeiro elemento do vetor, e compare-a com os demais:

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

int main()
{
    int x[] = {176, -256, 2, 59, 37, 316, -33, -9};
    int sz = sizeof(x)/sizeof(x[0]);
    
    int maior = x[0];
    for(int i = 1; i < sz; i++){
        if(maior < x[i]){
            maior = x[i];
        }
    }
    
    printf("Maior: %d", maior);

    return 0;
}

Tem 1001 formas de fazer isso aliás... Escolha uma e bola pra frente :)

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

8 minutos atrás, Lucca Rodrigues disse:
1 hora atrás, kgin disse:


/* INT_MAX vale 99999999 e INT_MIN vale 0 */

Na verdade não 

Na hora eu estava usando o borland turbo (isso que eu postei eu fiz lá), e na hora que eu dei um print no valor apareceu isso ai.

13 minutos atrás, Lucca Rodrigues disse:

O propósito de getchar() não é esse, embora eu só veja pessoas a usando para isso...

É bem melhor do que usar o system("pause") que no geral no meu compilador não compila tendo isso no código.

 

@Joel Martinsde nada!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, kgin disse:

É bem melhor do que usar o system("pause")

Se quem escreve o código não der um jeito de fazer com que os dados inseridos, por exemplo, via teclado sejam todos consumidos, então de nada serve getchar(), já que seu propósito não é pausar, e system() não deve nem ser usada, é perigosa, ela passa uma string para o sistema rodar.

 

Já foi discutido aqui no fórum a respeito da função wait(), que pausa sem a necessidade de ler, vale a pena conferir a documentação.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Lucca Rodrigues disse:

Se quem escreve o código não der um jeito de fazer com que os dados inseridos, por exemplo, via teclado sejam todos consumidos, então de nada serve getchar(), já que seu propósito não é pausar, e system() não deve nem ser usada, é perigosa, ela passa uma string para o sistema rodar.

No meu caso eu já desisti de inserir dados pelo console já faz tempo, eu geralmente uso uma GUI.

1436365191_Capturadetela_2021-04-24_15-24-49.png.9fcea1c8fd099c01baa51823841c40d8.png

O código para a interface gráfica.

Spoiler

	if (nk_begin(ctx, "Login", nk_rect(0, 0, 400, 300), NK_WINDOW_TITLE|NK_WINDOW_BORDER|NK_WINDOW_MOVABLE)) {
            char *usuario = "admin";
            char *senha = "1234";
            static char b_usuario[256], b_senha[256];
            static int t_usuario = 0, t_senha = 0, logado = 0, erro = 0;
            nk_layout_row_dynamic(ctx, 25, 1);
            nk_label(ctx, "Entre com as informações de usuario.", NK_TEXT_LEFT);

            nk_layout_row_static(ctx, 25, 70, 1);
            nk_label(ctx, "Usuario", NK_TEXT_LEFT);

            nk_layout_row_dynamic(ctx, 25, 1);
            nk_edit_string(ctx, NK_EDIT_SIMPLE, b_usuario, &t_usuario, 256, nk_filter_ascii);

            nk_layout_row_static(ctx, 25, 70, 1);
            nk_label(ctx, "Senha", NK_TEXT_LEFT);

            nk_layout_row_dynamic(ctx, 25, 1);
            nk_edit_string(ctx, NK_EDIT_SIMPLE, b_senha, &t_senha, 256, nk_filter_ascii);

            nk_layout_row_static(ctx, 25, 70, 1);
            if (nk_button_label(ctx, "Entrar")) {
                if ((strcmp(usuario, b_usuario) == 0) && (strcmp(senha, b_senha) == 0)) {
                    logado = 1;
                } else {
                    erro = 1;
                }
            }

            if (logado) {
                if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Logado!", NK_WINDOW_TITLE, nk_rect(40, 40, 200, 120))) {
                    nk_layout_row_dynamic(ctx, 25, 1);
                    nk_label(ctx, "Usuario logado!", NK_TEXT_LEFT);
                    if (nk_button_label(ctx, "Ok!")) {
                        logado = 0;
                        nk_popup_close(ctx);
                    }
                    nk_popup_end(ctx);
                } else {
                    logado = 0;
                }
            }

            if (erro) {
                if (nk_popup_begin(ctx, NK_POPUP_STATIC, "Erro!", NK_WINDOW_TITLE, nk_rect(40, 40, 200, 120))) {
                    nk_layout_row_dynamic(ctx, 25, 1);
                    nk_label(ctx, "Usuario ou senha invalidos!", NK_TEXT_LEFT);
                    if (nk_button_label(ctx, "Ok!")) {
                        erro = 0;
                        nk_popup_close(ctx);
                    }
                    nk_popup_end(ctx);
                } else {
                    erro = 0;
                }
            }
            nk_end(ctx);
        }

Feito com nuklear.

Eu nunca me preocupo se vai haver algo no buffer do teclado e funciona em qualquer sistema operacional que tenha o GCC.

 

1 hora atrás, Lucca Rodrigues disse:

Já foi discutido aqui no fórum a respeito da função wait(), que pausa sem a necessidade de ler, vale a pena conferir a documentação.

Recomendo você esquece o windows, porque no geral ele não vai te ensinar nada de novo nem nada de útil.

Link para o comentário
Compartilhar em outros sites

46 minutos atrás, kgin disse:

Recomendo você esquece o windows, porque no geral ele não vai te ensinar nada de novo nem nada de útil.

Há quem diga que sim.

Há quem diga que programas de console em modo texto são obsoletos e devem ser esquecidos.

Há quem diga que a linguagem C é obsoleta e deve ser esquecida.

 

A gente sempre começa aprendendo pelo obsoleto, avançando em direção ao novo, mas nem tudo é absolutamente obsoleto :)

 

É difícil ver aqui no fórum uma postagem que não seja sobre programas interativos, desses que leem do teclado, e sim, são obsoletos, mas dizer isso não é muito encorajador.

Eu em particular não tenho motivos para sair do básico, já que uso C só para programar microcontroladores.

 

46 minutos atrás, kgin disse:

Recomendo você esquece o windows, porque no geral ele não vai te ensinar nada de novo nem nada de útil.

A API do Windows pode ser útil no contexto de pausar o programa, basta um par flush-wait.

Pode substituir em poucas linhas a tal system() que você havia comentado.

Te permite ler direto do buffer ao invés do teclado.

E isso só com o básico. É útil, e não é nada complexo. Vai te garantir uma nota bacana :D

 

46 minutos atrás, kgin disse:

Eu nunca me preocupo se vai haver algo no buffer do teclado

Basta não inserir dados via teclado 🤪

Link para o comentário
Compartilhar em outros sites

Tem também clássica função: 'inline' tipo maior (param1, param2);

#include <stdio.h>
int big( int param1, int param2 ){
        if( param1 > param2 )return( param1 );return( param2 );
}
int main( ){
        int arr[10] , i ;

        for(i=0 ; i<10 ; i++)
        {
        printf("Insert the value-->");
        scanf("%d", &arr[i]);
        }
        int the_biggest_value=  big( arr[0], 
                                big( arr[1],
                                big( arr[2],
                                big( arr[3],
                                big( arr[4],
                                big( arr[5],
                                big( arr[6],
                                big( arr[7],
                                big( arr[8],
                                     arr[9] )))))))));
    
         printf("\n\nthe biggest value= %d\n\n", the_biggest_value);
}

 

É interessante porque contrasta com a solução de laços.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...