Ir ao conteúdo
  • Cadastre-se
Kepler Piaggi

Algoritmo dando erro

Recommended Posts

Ola galera, sou novo aqui no forum e estou começando a aprender programação.

Estou criando um algoritmo que eu coloque o nome do aluno, com suas duas notas, dando a media das duas notas.

Até ai tudo bem, porém quero que no final ele me diga qual o aluno com a maior media e qual a maior media.

Segue algoritmo:

algoritmo "melhoralunodasala"
var
      aluno, aluno_top: caractere
      nota, nota2, cont2, media, media2: real
      sala, cont: inteiro
inicio
      cont <- 1
      cont2 <- 0

      Escreval ("----------------------------------------------------------")
      Escreval ("                    Escola Santa Nota                     ")
      Escreval ("----------------------------------------------------------")
      Escreval ("Quantos alunos tem na sala? ")
      Leia (sala)
           Enquanto (cont <= sala) faca
                    Escreval ("--------------------------------------------")
                   Escreval ("Aluno", cont)
                   Escreval ("Qual o nome do aluno? ")
                   Leia (aluno)
                   Escreval ("Qual a primeira nota de ", aluno, "?")
                   Leia (nota)
                   Escreval ("Qual a segunda nota de ", aluno, "?")
                   Leia (nota2)
                   media <- (nota + nota2) / 2)
                   Escreval ("A média do ", aluno, " foi de ", media)
                   cont <- cont + 1

           FimEnquanto
           media2 <- 9999999
                  Se (media2 > media) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

      Escreval ("O melhor aproveitamento foi do aluno ", aluno_top, "com a media ", media2)

fimalgoritmo

No final onde deveria aparecer a maior media, esta aparecendo a ultima media digitada, já tentei de varias formas e não vai.

 

Agradeço, antes de mais nada.

Obrigado

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Kepler Piaggi

 

Esse trecho deve estar antes do enquanto:

media2 <- 9999999

Se você quer mostrar a maior média, media2 deveria receber o menor valor e não o maior.

Ficaria assim:

media2 <- -1

 

 

E esse trecho deve ficar dentro do enquanto:

Se (media2 > media) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

 

Pois não tem como ele testar todas as médias fora do laço de repetição.

 

Eu também mudaria esse trecho:

Se (media > media2) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
24 minutos atrás, Math.Pi disse:

@Kepler Piaggi

 

Esse trecho deve estar antes do enquanto:


media2 <- 9999999

Se você quer mostrar a maior média, media2 deveria receber o menor valor e não o maior.

Ficaria assim:


media2 <- -1

 

 

E esse trecho deve ficar dentro do enquanto:


Se (media2 > media) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

 

Pois não tem como ele testar todas as médias fora do laço de repetição.

 

Eu também mudaria esse trecho:


Se (media > media2) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

 

 

Obrigado @Math.Pi , consegui, porém tive que declarar a variavel media2 em 1.

Ficou assim:

inicio
      cont <- 1
      media2 <- 1
      Escreval ("----------------------------------------------------------")
      Escreval ("                    Escola Santa Nota                     ")
      Escreval ("----------------------------------------------------------")
      Escreval ("Quantos alunos tem na sala? ")
      Leia (sala)
           Enquanto (cont <= sala) faca
                   Escreval ("--------------------------------------------")
                   Escreval ("                Aluno", cont, "             ")
                   Escreval ("Qual o nome do aluno? ")
                   Escreva ("R: ")
                   Leia (aluno)
                   Escreval ("Qual a primeira nota de ", aluno, "?")
                   Leia (nota)
                   Escreval ("Qual a segunda nota de ", aluno, "?")
                   Leia (nota2)
                   media <- (nota + nota2) / 2)
                   Escreval ("A média do ", aluno, " foi de ", media)
                   cont <- cont + 1
                        Se (media > media2) então
                           media2 <- media
                           aluno_top <- aluno
                           FimSe

           FimEnquanto
      Escreval ("--------------------------------------------")
      Escreval ("O melhor aproveitamento foi do aluno ", aluno_top, " com a media ", media2)

fimalgoritmo

         

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Kepler Piaggi,
 

Sobre:

4 horas atrás, Kepler Piaggi disse:

Obrigado @Math.Pi , consegui, porém tive que declarar a variavel media2 em 1.

Nesse caso terá problemas, pois "a maior média inicial deverá ser menor que a menor média possível", pois caso contrário pode ocorrer de nunca ser "maior", daí ninguém vai ter a maior média! Ex.: João tem média 0.5 e Maria média 0.!

 

Ou insere um valor menor que o mínimo, como o "-1" já citado (no VisuAlg vai ficar com dois "-", pois um "-" será do comando "<-"), ou a primeira média seria sempre a maior média, até que venha (ou não) ser atualizada por outra... ou poderia fazer de outra forma viável (que conseguir imaginar e implantar...)

 

 

Complementando:

1) Nomenclatura de variáveis

Uma recomendação seria utilizar nomes mais sugestíveis para o contexto da variável. Ex.:

5 horas atrás, Kepler Piaggi disse:

var
      aluno, aluno_top: caractere
      nota, nota2, cont2, media, media2: real
      sala, cont: inteiro

 

 

- A media2 poderia ser algo como media_top (seguindo o raciocínio do nome do aluno) ou algo como maiorMedia. Acho que media2 fica parecendo que um mesmo aluno tem duas médias...

- A variável cont2 não está sendo usada. (eu acho)

- Em vez de sala, poderia ser algo como qtdAlunos.

 

Por ai vai...

 

2) Tratamento da faixa de notas

Inicialmente você pode subentender que sempre o usuário vai digitar notas válidas, como de "0 a 10"... Sendo assim, e corrigindo o que foi citado lá em cima, o programa deve funcionar bem. Mas caso queira, posteriormente, poderia implementar uma lógica para verificar se o número informado está entre a faixa aceitável ou não. Caso não esteja, poderia pedir para inserir novamente. (essa questão pode ser feita para depois... como uma "melhoria")

 

3) Identação de código

Essa é uma questão que sempre tento levantar. No seu caso, o comando enquanto deveria está na mesma coluna do comando anterior, ou seja, o que vai ser identado é o que está "dentro" do enquanto. O mesmo princípio vale para o se. Eles comandos que estão na mesma sequência do comando anterior, o que está dentro do se é que é identado, entende? Imagine as pastas do computador. Cada comando seria uma pasta... (ex.: não tem porque a pasta Windows está uma coluna pra frente da pasta Usuários. O que estaria identado, é a pasta System32, que está dentro da Windows).

Dando uma identação de 3 espaços, a identação poderia ficar assim:

algoritmo "melhoralunodasala"
var
   aluno, aluno_top: caractere
   nota, nota2, cont2, media, media2: real
   sala, cont: inteiro
Inicio
cont <- 1
media2 <- 1
Escreval ("----------------------------------------------------------")
Escreval ("                    Escola Santa Nota                     ")
Escreval ("----------------------------------------------------------")
Escreval ("Quantos alunos tem na sala? ")
Leia (sala)
Enquanto (cont <= sala) faca
   Escreval ("--------------------------------------------")
   Escreval ("                Aluno", cont, "             ")
   Escreval ("Qual o nome do aluno? ")
   Escreva ("R: ")
   Leia (aluno)
   Escreval ("Qual a primeira nota de ", aluno, "?")
   Leia (nota)
   Escreval ("Qual a segunda nota de ", aluno, "?")
   Leia (nota2)
   media <- (nota + nota2) / 2)
   Escreval ("A média do ", aluno, " foi de ", media)
   cont <- cont + 1
   Se (media > media2) então
      media2 <- media
      aluno_top <- aluno
   FimSe //obs.: esse comando poderia ficar alinhado com a linha acima, depende do padrão a seguir
FimEnquanto //esse comando poderia ficar alinhado com a linha acima, depende do padrão a seguir
Escreval ("--------------------------------------------")
Escreval ("O melhor aproveitamento foi do aluno ", aluno_top, " com a media ", media2)
FimAlgoritmo

***
Por ai vai

No aguardo.

 

 

 

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas  entendi a questão do valor da media2, mudei para -1, muito obrigado pela dica.

Em relação a indentação, corrigi.

 

Fiz melhorias no programa, tudo funcionando certinho, de uma olhada como ficou:

algoritmo "melhoralunodasala"
var
aluno, aluno_top: caractere
nota, nota2, media, media2: real
sala, cont: inteiro

inicio
cont <- 1
media2 <- -1

Escreval ("-----------------------------------------------------------------------------------")
Escreval ("                               Escola Santa Nota                     ")
Escreval ("-----------------------------------------------------------------------------------")
Escreval ("Quantos alunos tem na sala? ")
Escreva ("R: ")
Leia (sala)
Enquanto (cont <= sala) faca
   Escreval ("----------------------------------------------------------------------------------------")
   Escreval ("                                    Aluno", cont, "             ")
   Escreval ("Qual o nome do aluno? ")
   Escreva ("R: ")
   Leia (aluno)
   Escreval ("Qual a primeira nota de ", aluno, "?")
   Escreva ("R: ")
   Leia (nota)
   Escreval ("Qual a segunda nota de ", aluno, "?")
   Escreva ("R: ")
   Leia (nota2)
   Escreval (" ")
   media <- (nota + nota2) / 2)
   Escreval ("A média de ", aluno, " foi de ", media, "!")
   Escreval (" ")
   Se (media >= 9) e (media <= 10) então
      Escreval ("Excelente, ", aluno, " tirou nota A! ")
   senao
      Se (media >= 8) e (media <= 8.9) então
         Escreval ("Otimo, ", aluno, " tirou nota B! ")
      Senao
         Se (media >= 6) e (media <= 7.9) então
            Escreval ("Ok, ", aluno, " tirou nota C! ")
         Senao
            Se (media >= 4.9) e (media <= 5.9) então
               Escreval (aluno, " tirou nota C e está de recuperação! ")
            Senao
               Se (media >= 4) e (media <= 4.8) então
                  Escreval (aluno, " tirou nota D e está parcialmente reprovado! ")
               Senao
                  Se (media <= 3.9) então
                     Escreval (aluno, " tirou nota E e está completamente reprovado! ")
                  FimSe
               FimSe
            FimSe
         FimSe
      FimSe
   FimSe
   cont <- cont + 1
   Se (media > media2) então
      media2 <- media
      aluno_top <- aluno

   FimSe
FimEnquanto
Escreval ("-------------------------------------------------------------------------------------")
Escreval (" ")
Escreval ("O melhor aproveitamento foi do(a) aluno(a) ", aluno_top, " com a media ", media2, "!")

fimalgoritmo

Acho que ficou legal por enquanto.

Obrigado mais uma vez.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Só um detalhe:

15 horas atrás, Kepler Piaggi disse:

   Se (media >= 9) e (media <= 10) então
      Escreval ("Excelente, ", aluno, " tirou nota A! ")
   senao
      Se (media >= 8) e (media <= 8.9) então
         Escreval ("Otimo, ", aluno, " tirou nota B! ")

 

As faixas de notas não estão fechadas... tem nota que não entraria.. por ex.: 8.95.

 

Poderia usar assim:

Se (media >= 8) e (media < 9) então


Daí ajustaria as outras condições também...

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Simon Viegas disse:

Olá.

 

Só um detalhe:

As faixas de notas não estão fechadas... tem nota que não entraria.. por ex.: 8.95.

 

Poderia usar assim:


Se (media >= 8) e (media < 9) então


Daí ajustaria as outras condições também...

@Simon Viegas  entendi, valor corrigido.

Obrigado

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×