Ir ao conteúdo

Posts recomendados

Postado

Boa noite, pessoal. Estou com dúvida onde está o erro neste código. O usuário fornece 15 números e o programa volta qual é o maior dentre esta lista.

#include <iostream>
#include <locale>

using namespace std;

int main(){

    setlocale(LC_ALL, "");

    int num, i, aux = 0;

    for(i = 1; i < 16; i++){
        cout << "\nDigite o número " << i << ":";
        cin >> num;


        if(num >= aux){
            num = aux;
        }
        else{
            aux = aux;
        }
    }


    cout << "O maior número da lista é: " << aux << ".";

    return 0;
}

 

 

 

  • Amei 1
Postado

@kampa896    Opa ,  essas linhas aqui não vão muito bem não , 

    }
    else{ // - - - - -| 
        //aux = aux; -|--->  esse trecho é desnecessário  
    }  //  - - - - - -|  é igual . . .  !  no açude .
}

e também um errinho .

if(num >= aux){
    //num = aux;  // erro , variáveis invertidas .
    aux = num ;  
}

mas o Resto não tem nenhum erro , está tudo certo !

  • Curtir 1
Postado
2 horas atrás, devair1010 disse:

mas o Resto não tem nenhum erro , está tudo certo !

 

1 hora atrás, kampa896 disse:

Obrigado pela ajuda, @devair1010! Deu certo, meu amigo.

 

ok ok

 

tudo certo até entrar com 15 números negativos e seu programa dizer que o maior é zero...

 

Um int é isso, um inteiro entre -2147483648 e +2147483647 no caso de 4 bytes...

 

está errado ainda.

 

O que pretendia com essa linha?

            aux = aux;

fiquei curioso

  • Curtir 1
  • Obrigado 1
Postado

@arfneto mas se eu digitar 15 números negativos, o maior não é o zero? O exercício não pede número em módulo.

Agora que entendi o raciocínio correto, não sei te explicar o que eu quis dizer antes, amigo.

 

Mas você disse que ainda está errado, poderia me ajudar? Estou no primeiro ano de faculdade, sou bem iniciante em programação.

  • Obrigado 1
Postado
11 horas atrás, kampa896 disse:

o maior não é o zero?

 

Tem toda razão.

 

Mas são 15 números. Aí o cara digita 15 vezes o número -4 por exemplo...


Ele acha que o maior foi... -4. O seu programa diz que foi 0. Só que o zero ele não digitou.

 

Citação

 

Se o programa vai dizer o número por conta própria porque o cara vai perder tempo digitando 15? 

 

Eu ficaria contrariado ...

 

 

14 horas atrás, kampa896 disse:

O usuário fornece 15 números e o programa volta qual é o maior dentre esta lista.

 

Pois é. O zero é maior mas não está na lista.

 

11 horas atrás, kampa896 disse:

se eu digitar 15 números negativos, o maior não é o zero? O exercício não pede número em módulo

 

 

Isso que escreveu não faz sentido: Lendo só a primeira sentença o maior é zero, só que o cara não digitou o zero. Lendo o parágrafo não fica melhor: Se fosse em módulo estaria "mais errado" já que o zero seria claro o menor e NUNCA o maior. Sabe o que é módulo, então... todos seriam positivos.

 

Como resolver?

 

Modo 1:

 

Uma maneira eu te disse já. O menor número possível é  -2147483648. Basta iniciar a série por esse valor. Onde eu arrumei esse valor? No livro. Você não tem um livro? Um manual? 
 

C tem um arquivo chamado limits.h que você pode incluir em seu programa e tem esses valores bem convenientemente disponíveis.

 

Basta usar

#include "limits.h" // em seu programa. 

E declarar ao invés de 

    int aux = -2147483648; 

a constante 

    int aux = INT_MIN;


Afinal os menores números que o cara pode digitar são 15 desses e mesmo assim seu programa vai dizer o menor certinho.

 

Eis um pedaço de limits.h, copiado de https://www.tutorialspoint.com/c_standard_library/limits_h.htm

 

image.png.e7afd925a851f9c91708eb0c576c53a3.png

 

Modo 2:

 

Mais ingênuo mas sem chance de errar: leia o primeiro número em aux antes do loop.

 

Fazendo o simples, lê o primeiro número em aux e os outros 14 em num... E no loop usa os índices certos já: é mais legível ler os números até <= 15 do que <16. Porque deixar o cara que está lendo o programa fazer uma subtração de cabeça se pode ser mais claro no texto?

int main(){

    setlocale(LC_ALL, "");
    int num = 0;
    int maior = 0;
    cout << "\nDigite o primeiro número: ";
    cin >> maior;
    for(int i = 2; i <= 15; i++)
    {
        cout << "\nDigite o número " << i << ":";
        cin >> num;

        if(num > maior) maior = num;
    }

    cout << "O maior número da lista é: " << aux << ".";
    return 0;
}

Uma nota

 

Sobre esse if em seu programa

      if(num >= aux){
            num = aux;
        }
        else{
            aux = aux;
        }

Acho que escreveu a meiga linha 

    aux = aux 

porque queria completar o if e não tinha o que fazer. Então colocou um comando inofensivo.

Está difícil de ler com aquelas chaves todas e essa expressão.

 

E está errado também.
 

Tudo o que você queria escrever era: se o valor lido for maior que os lidos até agora salva o valor em aux. Só isso. Então escreva só isso.

    if (num>aux) aux = num;

E a condição está errada.

Para que vai copiar um número se foi igual? E inverteu as condições escrevendo num = aux, como @devair1010. te mostrou.

E se é o seu programa e só tem 3 variáveis, porque não chamar de algo mais ilustrativo o tal aux, algo tipo maior, maior_numero, MaiorAteAqui

 

Quanto ao comando if: Não precisa de chaves quando o if só tem uma instrução. Não precisa escrever um else quando ... não precisa fazer nada se a condição for falsa...

 

  • Curtir 2
Postado

@arfneto obrigado pelas explicações!

adicionado 17 minutos depois
3 horas atrás, arfneto disse:

Onde eu arrumei esse valor? No livro. Você não tem um livro? Um manual? 

@arfneto amigo, eu estou usando um material que adquiri na internet, com algumas orientações da faculdade.

Você poderia me indicar um livro sobre C/C++? Pesquisando na internet tempos várias opções, mas eu queria algum que fosse indicado por quem conhece.

  • Curtir 2
Postado

Não precisa saber qual é o menor número possível para o tipo, até porque o tamanho do tipo int varia, pois o int deve ter tamanho de no mínimo 2 bytes, então nesse caso o número menor possível seria −32768, e não -2147483648 (= menor valor possível quando int tem 4 bytes).

 

O melhor método de fazer isso é assumir o primeiro número digitado como o valor máximo inicial, e aí ir comparando os próximos números com o máximo atual e substituir se aparecer um número maior:

#include <iostream>
#include <locale>

using namespace std;

int main(){
    setlocale(LC_ALL, "");
    
    int num, i, aux;
    
    cout << "\nDigite o número 1:";
    cin >> num;
    aux = num;
    
    for(i = 2; i < 16; i++){
        cout << "\nDigite o número " << i << ":";
        cin >> num;
        
        if(num > aux){
            aux = num;
        }
    }
    
    cout << "O maior número da lista é: " << aux << ".";
    
    return 0;
}

 

  • Curtir 2
Postado
    cin >> num;
    aux = num;

Essa é uma construção curiosa.

 

Ao invés de ler num para imediatamente copiar para aux, sugiro usar como descrito no tópico #6 logo acima e usar o simples

    cin >> aux;

Sobre esse loop, 

  for(i = 2; i < 16; i++){
        cout << "\nDigite o número " << i << ":";
        cin >> num;
  

Ao invés de usar <16 prefira o mais óbvio para quem leu o enunciado e está lendo seu programa, e escreva <= 15

 

1 hora atrás, isrnick disse:

Não precisa saber qual é o menor número possível para o tipo, até porque o tamanho do tipo int varia, pois o int deve ter tamanho de no mínimo 2 bytes, então nesse caso o número menor possível seria −32768, e não -2147483648 (= menor valor possível quando int tem 4 bytes)

 

Sobre isso: esta é a razão de existirem as constantes em limits.h, para que nos programas se possa usar sempre as contantes. Se optar por essa solução, como está descrito em outros tópicos acima, use INT_MIN e INT_MAX e tal...

 

adicionado 2 minutos depois

Sobre os livros, eu recomendaria o simples, "A linguagem de programação C" segunda edição, de Kernighan e Ritchie

 

Sua escola não tem uma biblioteca virtual que você pode acessar, tipo https://www.oreilly.com/ ?

 

Muitas escolas assinam esses serviços e aí você pode acessar muitos livros e escolher algo. Você pode assinar por um mês de graça também.

 

Vi agora o que tem a venda na Amazon.com.br mas está tudo muito caro eu achei

  • Curtir 2
Postado
40 minutos atrás, arfneto disse:

    cin >> num;
    aux = num;

Essa é uma construção curiosa.

 

Ao invés de ler num para imediatamente copiar para aux, sugiro usar como descrito no tópico #6 logo acima e usar o simples


    cin >> aux;

 

 

Sim, nesse caso poderia ler diretamente para o aux, mas deixei separado para deixar claro no código o ponto que eu mencionei de assumir o primeiro número como o máximo inicial. O objetivo era ensinar a lógica não fazer o código mais eficiente possível.

 

Entendendo a lógica fica mais fácil adaptar para casos parecidos com alguma diferença, como no caso em que guardaria todos números digitados em um vetor para serem usados posteriormente no código, nesse caso seria melhor não guardar o número diretamente na variável aux, mas sim colocar no vetor primeiro.

 

 

 

40 minutos atrás, arfneto disse:

Sobre esse loop, 


  for(i = 2; i < 16; i++){
        cout << "\nDigite o número " << i << ":";
        cin >> num;
  

Ao invés de usar <16 prefira o mais óbvio para quem leu o enunciado e está lendo seu programa, e escreva <= 15

 

Não faz diferença na prática, mas pode sim ser mais fácil de entender para quem está lendo o enunciado e analisando o código.

 

 

 

40 minutos atrás, arfneto disse:

Sobre isso: esta é a razão de existirem as constantes em limits.h, para que nos programas se possa usar sempre as contantes. Se optar por essa solução, como está descrito em outros tópicos acima, use INT_MIN e INT_MAX e tal...

 

Exato.

 

É bom o programador C saber que os tipos da linguagem são limitados, e aprender sobre as constantes da biblioteca limits.h .

 

Mas essa solução colocando o menor valor int possível como número fixo inicial não é ideal, pois matematicamente isso teria o mesmo problema de colocar o número 0 como valor fixo inicial. É sempre melhor fazer de modo que dependa apenas de comparar os números sendo analisados.

  • Curtir 2

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