Ler 10 números e dizer o maior e o menor

36 respostas Resolvido
visualg
C

Comecei semana passada com o Visualg, e já estou dando cabeçada.
Peguei esse exercício na web:
“Escreva um programa que solicita 10 números ao usuário, através de um laço while, e ao final mostre qual destes números é o maior.”
E escrevi isso:

algoritmo "semnome"
// Função :
// Autor :
// Data : 30/05/2019
// Seção de Declarações 
var
num,cont,maior,menor:inteiro
inicio
// Seção de Comandos
cont<-1
enquanto cont<10 faca
         escreval("Digite 10 números aleatoriamente")
         leia(num)
         maior<-num
         menor<-num
         cont<-cont+1
         escreval("Digite 10 números aleatoriamente")
         leia(num)
                  se num>maior entao
                  maior<-num
                  fimse
                  se num<menor entao
                  menor<-num
                  fimse
         cont<-cont+1
fimenquanto
escreval("O número maior é ",maior," e o número menor é ",menor)
fimalgoritmo

Testei digitando de 1 a 10.
A parte do número maior até que funcionou, mas o número menor está dando o 9.
Simplesmente não consigo entender porque não está dando certo.

36 Respostas

G

Você não pode fazer o maior<-num e nem menor<-num porque na hora do teste “se” ele vai testar por exemplo 9 > 9 e 9 < 9 entao as variaveis maior e menor irão conter o valores digitados

C

@guilherme-borges
Não entendi.
Na entrada do processamento, com o primeiro número digitado, as variáveis “maior” e “menor” vão receber o mesmo valor, porque é o primeiro número, não tem com o que comparar.
A partir do segundo número digitado, é feita uma comparação, se o número digitado for maior que a variável “maior” então essa variável assume esse valor (o do número digitado).
A mesma coisa com a variável “menor”.
Ainda não consegui entender o meu erro.

G

Faça o teste começando com o valor 10 e vai até 1 você vai perceber que a variavel a maior irá receber o valor do ultimo número digitado ou seja 1, então você não pode no começo do “enquanto” sobreescrever a variável com o valor digitado porque você quer guardar o maior valor independente da ordem.

C

Hummm …
Então acho que entendi.
Se fosse um intervalo fechado, eu colocaria os dois extremos.
Dessa forma, “menor” começaria com 0 e “maior” começaria com 10, por exemplo.
Bom acho que entendi o erro, agora falta achar a solução.
Valeu, obrigado pela força.
Um abraço!

J
Solucao aceita

Tente assim:

escreval("Digite 10 números aleatoriamente")    
cont<-1
    enquanto cont<10 faca                              	
    	leia(num)
    	
    	se cont=1 entao
    		maior<-num
    		menor<-num
    	fimse
    	
    	se num>maior entao
    		maior<-num
    	fimse
    	
    	se num<menor entao
    		menor<-num
    	fimse
    	
    	cont<-cont+1
    fimenquanto
G

Agora tu entregou a paçoca devia ter deixado ele quebrar a cabeça kkk

C

@guilherme-borges
kkk … “entregou a paçoca” é ótimo, to passando mal de tanto rir aqui.
Mas vou te dizer, eu sou tão cabeçudo que nem com o cara escrevendo pra mim eu ainda não sei se entendi.
Mas vou, como você disse, quebrar a cabeça até entender.
Valeu, gente!

C

Sem querer ser chato, mas não conseguindo evitar de ser porque eu já nasci assim.
Mas o seu algorítimo não diz qual é o maior e qual é o menor.
Vou tentar completar ele aqui e ver se dá certo.

C

Beleza!
Funcionou!
Tanto crescente quanto decrescentemente.
Valeu!

J

Boa colocação kkkk

J

Tu viu que só modifiquei uma parte do algoritmo né?! (que é a que coloque na resposta)

Não ia refazer o algoritmo todo pra você, ajustei o ponto em que você estava fazendo errado!

C

Demorou mas agora eu acho que entendi.
A lógica é a seguinte, eu não estava amarrando as comparações ao primeiro número digitado, dessa forma, como o meu amigo Guilherme tentou me explicar, mas eu sou muito burro pra entender, os números acabavam sendo comparados com eles mesmos.
Dessa forma, o maior número seria sempre o último número digitado e o menor seria sempre o penúltimo.
Acho que é isso, né?

Bloco de citação
Tu viu que só modifiquei uma parte do algoritmo né?

Eu sou meio lerdo pra entender as paradas, achei que vinha o algorítimo inteiro, só pra eu rodar e ver se deixo de ser burro e aprendo.

Valeu, gente, vou encerrar esse post.
Abraço a todos os envolvidos.

E

Também estava com esse deafio, só fui conseguir resolver quando procurei a resposta. :frowning: kkkk

C

Cara, nem lembrava mais dessa parada.
Já se passaram 2 anos e eu não aprendi nada de programação … kkk

Agora, falando sério, aconteceu de tudo na minha vida nesses últimos anos.
Mas vou retomar essa ideia.

VLW!

E

Eu tinha começado um curso técnico de desenvolvimento de sistema no começo do ano passado, mas por conta da pandemia eu tive que trancar, e preferir estudar por conta no youtube. https://www.youtube.com/watch?v=8mei6uVttho&list=PLHz_AreHm4dmSj0MHol_aoNYCSGFqvfXV

C

Eu também estou tentando aprender a programar pelo YouTube.
Só que eu estou que nem cego no meio de um tiroteio, estou atirando pra todos os lados mas não estou acertando nada.
Isso se chama desespero.
Preciso me acalmar e me concentrar em uma direção.
Estava seguindo essa playlist:

Vou voltar a seguir e retomar esse curso.
Boa sorte!

G

Galera não estou entendendo o pq funciona o menor e o maior com esse codigo?
sem ele funciona só o maior… eu faço a leitura dele mas não consigo encaixar na logica… se cont for igual a 1 então o maior recebe o numero e o menor recebe o numero tbm…

se cont=1 entao
maior<-num
menor<-num
fimse

J

Simples!

Quando o programa inicia, ainda não existe maior e menor, correto?

Logo o primeiro número informado, ou seja (cont = 1), passa a ser considerado ao mesmo tempo sendo o maior número e também o menor número, afinal, só existe ele até então!

Quando mais números são informados na sequência, ou seja (cont > 1), fazemos a verificação se o número que foi informado é maior que o número que foi considerado como maior anteriormente, e da mesma forma fazemos esta verificação para o menor.

Sacou?

R

Eu estava com a mesma dúvida o porque ele não aceitava o menor, aceitava apenas o maior e essa explicação simples me fez entender que o primeiro número é os dois, vlw

R

Vou ressuscitar esse post pq tenho uma dúvida ainda kkkkkk…

Nesse caso eu estou adicionando uma condicional para que ele funcione

se cont=1 entao
    		maior<-num
    		menor<-num
    	fimse

Mas será que eu consigo fazer sem essa condicional apenas usando o Senão?
Ex.

cont <- 1
      S <- 0
      Enquanto (cont <= 5) faça
        Escreva ("Digite o ", cont, "º. valor: ")
        Leia (N)
        Se (N > maior) então
           maior <- N
        Senão
           menor <- N
        Fimse
        S <- S + N
        cont <- cont + 1
      FimEnquanto
      Escreval ("Terminei de contar!")
      Escreval ("O resultado da soma dos valores é: ", S)
      Escreval ("E o maior valor digitado foi: ", maior)
      Escreva ("E o menor valor digitado foi: ", menor)
fimalgoritmo
J

Depende do cenário, a condicional existe porquê o número lido pode ser positivo ou negativo, e neste caso não existe uma forma de saber os valores estabelecendo um parâmetro base, por isso a primeira iteração do usuário quando ele fornece o primeiro número o consideramos como sendo o maior e menor já lido, à partir disso vai sendo atualizado com os valores subsequentes!

Por isso precisa ser da forma como foi estruturado, saca?

Agora, vamos supor que o algorítimo só permita serem lidos números inteiros positivos, neste caso os valores de maior e menor poderiam ser inicializados em zero e à partir daí irem sendo atualizados com os subsequentes, pois neste caso existe um critério mínimo.

Mesmo nas demais atualizações o senão não caberia, pois você só deve atualizar o menor caso o número lido seja menor que o atual valor que ele armazena, percebe que mesmo o número lido não sendo maior que o maior valor armazenado, isso não quer dizer que ele seja menor que menor armazenado.

R

Perfeito mano, muito obrigado pela explicação!

L

Boa tarde amigão.

Se você utilizou a estrutura condicional SE para identificar o maior número, basta finalizar a estrutura com o SENAO também. Segue o exemplo:

var

contador, N, S, maior, menor:inteiro

inicio

contador  1

S  0

Enquanto (contador <=5) faca

EscrevaL ("Digite o ", contador, "º número: ")

Leia (N)

Se (N > maior) entao

maior  N

Senao

menor  N

FimSE

S  S+N

contador  contador +1

FimEnquanto

EscrevaL (A soma de todos os valores foi:, S)

EscrevaL (O maior valor digitado foi:, maior)

EscrevaL (O menor valor digitado foi:, menor)

fimalgoritmo
P

11 meses depois para colocar um algoritmo errado?
O menor vai devolver valor errado.

L

Irmão, bom dia. Se eu coloquei aí é pq foi testado. Você testou ?

L

I

Acho que é a segunda vez que vou comentar algo aqui, mas fala sério.

Só inverte a entrada, digita: 1,2,3,5,10.

E manda o print do resultado…

Obs.: acredito que esse print nunca irá aparecer no fórum…

L

Digitando os números de forma aleatória funciona, em ordem crescente não, mas então qual seria a solução ?

P

Um bocadinho de noção e humildade precisa-se por aí.
Não podes vir ressuscitar tópicos antigos com soluções que não estão totalmente corretas e partir a insultar quem te corrige.
Como já alguém constatou, a tua solução só funciona quando os números estão por ordem crescente. Ora, para isso, não preciso de andar a comparar os números todos, o menor é sempre o primeiro e o maior é o último.

A solução para qualquer caso, já está aqui acima, colocada há quatro anos…

S

Tem que trocar esse seu “se - senão” por dois “se”.

Você está assumindo que se um número não é maior então ele é menor e isso está errado.

A

cara, de fato deu certo. Teria como você explicar o pq da forma em que desenvolvi não da certo ? veja:

var

n,s,maior,menor,inte,c:inteiro

inicio

Escreval ("Digite quantos números serão informados: ")

leia (inte)

s<-0

c<-1

repita

Escreval ("Digite o ",c,"° número: ")

leia (n)

se (n>maior)  entao

maior<-n

fimse

se (n<menor) entao

menor<-n

fimse

s<-s+n

c<-c+1

ate (c>inte)

Escreval ("A soma entre os números é: ", s)

Escreval ("O número maior entre els é: ", maior)

Escreval ("O número menor entre eles é: ",menor)

fimalgoritmo

J

É o mesmo problema da dúvida original do post!

A explicação está algumas respostas acima:

A

deu pra entender perfeitamente, valeu !

A
então, para que o programa execute as condições de maior ou menor, é necessário que ele tenha um valor para ele comparar, certo ? eu fiz outro codigo, so que agora, sem estrura de repetição. Ele deu certo, mas será que não dava para melhorar ele, ou algo do tipo.

var

n1,n2,maior,menor:inteiro

inicio

Escreval ("Digite dois números: ")

leia (n1,n2)

maior<-0

menor <-n2

se (n1>maior) entao

maior <-n1

fimse

se (n2>maior) entao

maior<-n2

fimse

se (n1<menor) entao

menor<-n1

fimse

se (n2<menor) entao

menor<-n2

fimse

escreval (menor)

escreval (maior)

fimalgoritmo

P

Para comparar apenas dois números não precisas de todos esses ifs, simplesmente comparas os dois números:

se (n1 > n2) entao
    maior = n1
    menor = n2
senao
    maior = n2
    menor = n1
fimse
A

verdade, valeu !!

Criado 30 de maio de 2019
Ultima resposta 19 de out. de 2023
Respostas 36
Participantes 12