Ir ao conteúdo
  • Cadastre-se

VisualG Projeto Média da Turma


Posts recomendados

                   Esse projeto visa cadastrar uma prova com 5 questões e 3 alunos. Os alunos realizam as provas e no final é exibido a nota de cada aluno e a média da turma. É um estudo para praticar vetores e o conceito. Gostaria da opinião de vocês sobre. Se ficou legal e tal.  Estou voltando aos estudos e estou animado. Desde já, agradeço.

 

Algoritmo "Prova"

Var
   m: real
   c, i, nota, soma : inteiro
   q: vetor [1..5] de caractere
   a: vetor [1..3] de caractere
   r: vetor [1..5] de caractere
   media: vetor [1..3] de inteiro

procedimento gabarito()
inicio
   escreval("--------------------------------")
   escreval
   escreval(" PASSO 1 - CADASTRO DE GABARITO ")
   escreval
   escreval("--------------------------------")
   escreval
fimprocedimento
procedimento cadastraAluno()
inicio
   escreval ("--------------------------------")
   escreval ("             ALUNO              ")
   escreval ("--------------------------------")
fimprocedimento

procedimento turmaNota()
inicio
   escreval ("--------------------------------")
   escreval ("          NOTA DA TURMA         ")
   escreval ("--------------------------------")

fimprocedimento

procedimento fim()
inicio
   escreval ("--------------------------------")
   escreval ("         MEDIA DA TURMA         ")
   escreval ("--------------------------------")

fimprocedimento

Inicio

   gabarito ()

   para c <-1 ate 5 faca
      escreva("Questão ",c," ")
      leia(q[c])
   fimpara
   limpatela

   para c <-1 ate 3 faca
      cadastraAluno()
      nota <- 0
      escreva("ALUNO ",c,":")
      leia(a[c])
      escreval ("RESPOSTA")
      escreval

      para i <- 1 ate 5 faca

         escreva("Questão ",i,": ")
         leia(r[i])

         se r[i] = q[c] então
            nota <- nota + 2

         senao
         fimse



      fimpara
      limpatela

      media[c] <- nota

   fimpara
   limpatela


   turmaNota()

   para i<- 1 ate 3 faca

      escreval(a[i],": ",media[i])

   fimpara

   fim()

   para i<- 1 ate 3 faca

      soma <- media[i] + soma

   fimpara

   m <- soma/3

   escreva("A Média da Turma é: ",m:2)


Fimalgoritmo

 

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

@JeffGanorh O nome das variáveis podem ser mais significativos. Chamar de "m", "q", "a" não ajuda na leitura do código. Então podiam ser Media, Gabarito, etc.

 

No caso dos procedimentos achei desnecessário nesse caso. As informações pode ficar no escopo principal.

 

Acho que poderia usar constantes. Uma para a quantidade de questões e outra para a de alunos. Isso facilita a identificação do propósito do loop e caso queira acrescentar mais alunos e respostas é só mudar o valor da constante. Outro recurso que pode usar é o Registro, p.ex,

 

Algoritmo "Notas"

Const
   GMAX  = 5
   AMAX  = 3

Tipo
   TAluno = Registro
      Nome: Caractere
      Nota: Real
   FimRegistro
   
Var
   Gabarito:   Vetor[1..GMAX] de Inteiro
   Aluno:      Vetor[1..AMAX] de TAluno
   I:          Inteiro
   J:          Inteiro
   Resposta:   Inteiro
   Media:      Real

Inicio
   Media <- 0
   Escreval("-----------------------")
   Escreval(" ENTRE COM O GABARITO  ")
   Escreval("-----------------------")
   
   Para I <- 1 Ate GMAX Faca
      Escreva("Questão ", I, ": ")
      Leia(Gabarito[I])
   FimPara
   
   Para I <- 1 Ate AMAX Faca
      Aluno[I].Nota <- 0
      Escreva("Nome Aluno ", I, ": ")
      Leia(Aluno[I].Nome)
      Para J <- 1 Ate GMAX Faca
         Escreva("Resposta ", J, ": ")
         Leia(Resposta)
         Se(Resposta = Gabarito[J]) então
            Aluno[I].Nota <- Aluno[I].Nota + 10/GMAX
         FimSe
      FimPara
      Media <- Media + Aluno[I].Nota/AMAX
   FimPara

   Escreval("-----------------------")
   Escreval("        NOTAS          ")
   Escreval("-----------------------")
   
   Para I <- 1 Ate AMAX Faca
      Escreval(Aluno[I].Nome, " = ", Aluno[I].Nota)
   FimPara

   Escreval("Media da Turma = ", Media)
FimAlgoritmo


 

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

@Midori     e também ,  poderia validar o Gabarito,  para não armazenar caracteres que não sejam números :

Algoritmo "Notas"
Const
   GMAX  = 5
   AMAX  = 3
Tipo
   TAluno = Registro
      Nome: Caractere
      Nota: Real
   FimRegistro
Var
   Gabarito : Vetor[1..GMAX] de Inteiro
   Aluno    : Vetor[1..AMAX] de TAluno
   I,p      : Inteiro
   J        : Inteiro
   Resposta : Inteiro
   Media    : Real
Inicio
   Media <- 0
   Escreval("-----------------------")
   Escreval(" ENTRE COM O GABARITO  ")
   Escreval("-----------------------")
   Para p <- 1 Ate GMAX Faca
      repita
         Escreva("Questão ", p, ": ")
         leia(ax)
         se ( asc(ax) < 48 ) ou ( asc(ax) > 57 ) então
           escreval("Erro, '",maiusc(ax),"' não é Número .")
         fimse
      ate caracpnum(ax) <> 0
      Gabarito[p] := caracpnum( ax )
   FimPara
   Para I <- 1 Ate AMAX Faca
      Aluno[I].Nota <- 0
      Escreva("Nome Aluno ", I, ": ")
      Leia(Aluno[I].Nome)
      Para J <- 1 Ate GMAX Faca
         Escreva("Resposta ", J, ": ")
         Leia(Resposta)
         Se(Resposta = Gabarito[J]) então
            Aluno[I].Nota <- Aluno[I].Nota + 10/GMAX
         FimSe
      FimPara
      Media <- Media + Aluno[I].Nota/AMAX
   FimPara
   Escreval("-----------------------")
   Escreval("        NOTAS          ")
   Escreval("-----------------------")
   Para I <- 1 Ate AMAX Faca
      Escreval(Aluno[I].Nome, " = ", Aluno[I].Nota)
   FimPara
   Escreval("Media da Turma = ", Media)
FimAlgoritmo

 

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

@devair1010 Para uma validação mais rigorosa não encontrei outra forma sem loop. Porque só com Asc este teste retorna falso,

 

Escreva((Asc("1A") < 48) Ou (Asc("1A") > 57))

 

Implementei duas funções para auxiliar esse teste: Numero e TesteNumerico para para ficar em loop caso o valor não seja numérico. Usei essa função para o gabarito e resposta.  

 

Algoritmo "Notas"

Const
   GMAX  = 5
   AMAX  = 3
   A     = 48
   
Tipo
   TAluno = Registro
      Nome: Caractere
      Nota: Real
   FimRegistro
   
Var
   Gabarito:   Vetor[1..GMAX] de Inteiro
   Aluno:      Vetor[1..AMAX] de TAluno
   I:          Inteiro
   J:          Inteiro
   Resposta:   Inteiro
   Media:      Real
   
Funcao Numero(Valor: caractere): Logico
Var
   I:    Inteiro
   Num:  caractere
   Ret:  Logico

Inicio
   I <- Compr(Valor)
   Ret <- Verdadeiro
   Enquanto I > 0 Faca
      Num <- Copia(Valor, I, 1)
      Se(Num < "0") Ou (Num > "9") então
         Ret <- Falso
      FimSe
      I <- I - 1
   FimEnquanto
   Retorne Ret
FimFuncao

Funcao TesteNumerico(Texto: caractere): Inteiro
Var
   Enum:    Logico
   Valor:   caractere
   I:       Inteiro
   
Inicio
   Repita
      Escreva(Texto)
      Leia(Valor)
      Enum <- Numero(Valor)
      Se(Enum = Falso) Ou (Valor = "") então
         Escreval("Erro ", Valor, " não é numero")
         Enum <- Falso
      FimSe
   Ate Enum = Verdadeiro
   Retorne Caracpnum(Valor)
FimFuncao

Inicio
   Media <- 0
   Escreval("-----------------------")
   Escreval(" ENTRE COM O GABARITO  ")
   Escreval("-----------------------")
   
   Para I <- 1 Ate GMAX Faca
      Gabarito[I] <- TesteNumerico("Gabarito " + Carac(I + A) + ": ")
   FimPara
   
   Para I <- 1 Ate AMAX Faca
      Aluno[I].Nota <- 0
      Escreva("Nome Aluno ", I, ": ")
      Leia(Aluno[I].Nome)
      Para J <- 1 Ate GMAX Faca
         Resposta <- TesteNumerico("Resposta " + Carac(J + A) + ": ")
         Se(Resposta = Gabarito[J]) então
            Aluno[I].Nota <- Aluno[I].Nota + 10/GMAX
         FimSe
      FimPara
      Media <- Media + Aluno[I].Nota/AMAX
   FimPara

   Escreval("-----------------------")
   Escreval("        NOTAS          ")
   Escreval("-----------------------")
   
   Para I <- 1 Ate AMAX Faca
      Escreval(Aluno[I].Nome, " = ", Aluno[I].Nota)
   FimPara

   Escreval("Media da Turma = ", Media)
FimAlgoritmo

 

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

  • Membro VIP
Em 29/09/2023 às 14:23, devair1010 disse:
         se ( asc(ax) < 48 ) ou ( asc(ax) > 57 ) então
           escreval("Erro, '",maiusc(ax),"' não é Número .")
         fimse

 

Em 29/09/2023 às 16:14, Midori disse:

@devair1010 Para uma validação mais rigorosa não encontrei outra forma sem loop. Porque só com Asc este teste retorna falso,

 

Essa validação acima não passa no teste porque o comando Asc() só pega o primeiro caractere da sequência (de caracteres) que foi enviado. Por exemplo: se enviar "41dois", ele só vai pegar o 4, portanto a sentença vai resultar em FALSO. (Não acusando o erro.)

 

Definição:

Asc (s : caractere) : Retorna um inteiro com o código ASCII do primeiro caractere da expressão.

 

Adendo: isso ocorre porque o VisualG não tem algo como o tipo "char" (um caractere), tem apenas o tipo "cadeia de caractere" (que seria análogo ao string das principais linguagens). Ao mesmo tempo esse "código ASCII" é sempre para um caractere único, daí o VisualG já separa o primeiro automaticamente . Seria algo como:

 

Asc(Copia(s, 1, 1))

 

 

 

 

Adendo 2:

Em 29/09/2023 às 16:14, Midori disse:
Funcao Numero(Valor: caractere): Logico
Var
   I:    Inteiro
   Num:  caractere
   Ret:  Logico

Inicio
   I <- Compr(Valor)
   Ret <- Verdadeiro
   Enquanto I > 0 Faca
      Num <- Copia(Valor, I, 1)
      Se(Num < "0") Ou (Num > "9") então
         Ret <- Falso
      FimSe
      I <- I - 1
   FimEnquanto
   Retorne Ret

 

Apenas para efeitos didáticos. Dá para interromper o laço após identificar o primeiro caractere inválido (que não é número). Exemplo:

 

         se (num < "0") OU (num > "9") então
            ret <- FALSO
            interrompa
         fimSe

 

Obs.: tecnicamente não é uma boa prática utilizar o interrompa. Mas nesse contexto não tem problema.

 

 

  • Curtir 1
  • Obrigado 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!