Ir ao conteúdo
  • Cadastre-se

VisualG Contador do VisualG para de contar


Posts recomendados

Boa tarde,

Estou enfrentando grande problema pra resolver um exercício do VisualG, onde o contador só conta a primeira vez no comando "PARA", segue o enunciado:
 

Uma loja deseja fazer a avaliação com base na opinião de seus clientes. Para isto, ela irá disponibilizar um computador que irá perguntar a cada cliente a sua idade e a nota que ele avalia a loja. Você deverá elaborar o programa de computador que fará a leitura da opinião dos 100 primeiros clientes e deverá informar os dados solicitados abaixo: NOTAS: A. Ótimo B. Bom C. Regular D. Ruim E. Péssimo 1. A quantidade de respostas A (Ótimo); 2. A média de idade das pessoas que responderam D (Ruim); 3. A percentagem de respostas E (Péssimo) e a menor idade de quem informou esta resposta; 4. A maior idade de quem respondeu A (Ótimo) e a maior idade de quem respondeu D (Ruim);

 

Segue o algoritmo que eu escrevi:

 

Var
nome : caracter
idade, x, a, b, c, d, f, nota, cont : inteiro

para x de 0 ate 100 faca
limpatela
escreval ("Informe seu nome:")
leia (nome)

escreval ()
escreval ("Informe sua idade:")
leia (idade)
escreval ("-----------------------------------------------------")
escreval ("Informe a nota:")
escreval ()
escreval ("A. Ótimo")

escreval ("B. Bom")
escreval ("C. Regular")
escreval ("D. Ruim")
escreval ("F. Péssimo")
leia (nota)

escreval ("------------------------------------------------------------")
se nota = a entao
a := nota+1
fimse
fimpara
escreval ("Você obteve:", a, "notas como ótimo serviço")

Como podem ver, parei aqui: 1. A quantidade de respostas A (Ótimo);  Alguém poderia me ajudar, me dizendo onde estou errando pois o contador só conta a primeira vez que digito "A". Gratidão!

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

@M4DM0NK31    seria melhor usar um vetor ou uma matriz , para armazenar os dados , e depois de pegar todos os 100 , aí você faz os cálculos , pois usando variáveis simples , como essas que você declarou no início , dará muito trabalho .   e caracteres é entre aspas duplas  ,  identar o código ajuda a detectar erros  :

Algoritmo "opinioes de clientes"
Var
  nome            : caracter
  idade,x,a,b     : inteiro
  c,d,f,nota,cont : inteiro
inicio
  para x de 0 ate 3 faca
    limpatela
    escreval ("Informe seu nome:")
    leia(nome)
    escreval
    escreval("Informe sua idade:")
    leia(idade)
    escreval("-----------------------------------------------------")
    escreval("Informe a nota:")
    escreval
    escreval("A. Ótimo")
    escreval("B. Bom")
    escreval("C. Regular")
    escreval("D. Ruim")
    escreval("F. Péssimo")
    leia(nota)
    escreval("------------------------------------------------------------")
    se nota = "a" entao // caractere entre aspas duplas
      a := a+1  // incrementar a própria variável
    fimse
  fimpara
  escreval("Você obteve:", a, "notas como ótimo serviço")
Fimalgoritmo

 

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

@M4DM0NK31    Olá ,  não observei que a variável  nota  , é do tipo inteiro ,  aí você digita uma letra e o leia não pega nada pois é de outro tipo , e ainda coloca zero na variável nota ,  então passando esse nota para caractere funciona bem .

Algoritmo "opinioes de clientes"
Var
  nome,nota      : caracter
  idade,x,a,     : inteiro
  c,d,f,not,cont : inteiro

 

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

@devair1010@Simon Viegas Boa noite, agradeço demais todo o apoio. Segue o código completo:

 

Var
   nome, nota : caracter
   idade, x, a, b, c, d, f, menorf, maiora, maiord : inteiro
   mediaid, somaid, porcf : real


Inicio
mudacor ("verde", "frente")
menorf := 100
maiora := 0
maiord := 0
para x de 0 ate 100 faca
   limpatela
   escreval ("Informe seu nome:")
   leia (nome)
   escreval ()
   escreval ("Informe sua idade:")
   leia (idade)
   escreval ()
   escreval ("-----------------------------------------------------")
   escreval ("Informe a nota:")
   escreval ()
   escreval ("A. Ótimo")
   escreval ("B. Bom")
   escreval ("C. Regular")
   escreval ("D. Ruim")
   escreval ("F. Péssimo")
   leia (nota)
   escreval ()
   escreval ("------------------------------------------------------------")
   se nota = "a" entao
      a := a+1
   fimse
   se nota = "d" entao
      d := d+idade
      somaid := d
   fimse
   mediaid := somaid/100
   se nota = "f" entao
      f := f+1
   fimse
   porcf := f/100
   se (nota = "f") e (idade < menorf) entao
      menorf := idade
   fimse
   se (nota = "a") e (idade > maiora) entao
      maiora := idade
   fimse
   se (nota = "d") e (idade > maiord) entao
      maiord := idade
   fimse
fimpara

escreval ("Você obteve:", a, "notas como ótimo serviço")
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("A média de idade, doss clientes que responderam D, é:", mediaid)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O Percentual de clientes que responderam F, é:", porcf)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O cliente de menor idade, que votou F, é:", menorf)
escreval ()
escreval ("------------------------------------------------------------")
escreval ("O cliente de maior idade, que votou A, é:", maiora)
escreval ()
escreval ("------------------------------------------------------------")
escreval ("O cliente de maior idade, que votou D, é:", maiord)
Fimalgoritmo

 

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

  • Membro VIP
  1. Faltou o comando Algoritmo "nome do programa" no topo do programa;
  2. A contatem começa do 1. Iria de 1 a 100... (Ou, a depender do caso, de 0 a 99);

  3. O cálculo da média e da porcentagem deveria ser feita após coletar os dados (após o fimPara). Não faz sentido ficar calculando a cada loop;

  4. O cálculo para média A verificação do menor valor está com um erro de lógica. Experimente não inserir alguma nota F e veja o que acontece.

 

adicionado 19 minutos depois

@M4DM0NK31, é possível também colocar para o VisualG preencher os dados automaticamente. Exemplo:

 

image.png

 

É possível também utilizar arquivos de texto... desta forma é possível comparar mais facilmente os resultados.

 

 

Caso deseja, primeiro verifique os 4 pontos postados acima. Aí depois podemos ajudar a configurar.

 

No aguardo.

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

@Simon Viegas Obrigado pelas dicas, no caso do último item:

Em 25/08/2020 às 08:38, Simon Viegas disse:

O cálculo para média está com um erro de lógica. Experimente não inserir alguma nota F e veja o que acontece.

Não identifiquei erro de lógica na média da nota "F", e sim na menor idade, onde se não colocasse nenhum valor o menorf mantinha o valor 100. Se puder me ajudar a encontrar este erro de lógico agradeço muito. Segue o código com as devidas correções:

 

Algoritmo "Notas de satisfação"

Var
   nome, otimo, nota : caracter
   idade, idadef, x, a, b, c, d, f, cont, menorf, maiorf, notaf, contf : inteiro
   mediaid, somaid, porcf : real

Inicio
mudacor ("verde", "frente")
menorf := 100
para x de 1 ate 100 faca
   limpatela
   escreval ("Informe seu nome:")
   leia (nome)
   escreval ()
   escreval ("Informe sua idade:")
   leia (idade)
   escreval ()
   escreval ("-----------------------------------------------------")
   escreval ("Informe a nota:")
   escreval ()
   escreval ("A. Ótimo")
   escreval ("B. Bom")
   escreval ("C. Regular")
   escreval ("D. Ruim")
   escreval ("F. Péssimo")
   leia (nota)
   escreval ()
   escreval ("------------------------------------------------------------")
   se nota = "a" entao
      a := a+1
   fimse
   se nota = "d" entao
      d := d+idade
      somaid := d
   fimse
   se nota = "f" entao
      f := f+1
   fimse
   se (nota = "f") e (idade < menorf) entao
      menorf := idade
   senao
      menorf := 0
   fimse
fimpara

mediaid := somaid/100
porcf := f/100

escreval ("Você obteve:", a, "notas como ótimo serviço")
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("A média de idade, doss clientes que responderam D, é:", mediaid)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O Percentual de clientes que responderam F, é:", porcf)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O cliente de menor idade, que votou F, é:", menorf)

Fimalgoritmo

 

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

  • Membro VIP

Sobre:

1 hora atrás, M4DM0NK31 disse:

Não identifiquei erro de lógica na média da nota "F", e sim na menor idade, onde se não colocasse nenhum valor o menorf mantinha o valor 100.

 

Erro meu... pensei certo, escrevi errado... 😆. Estava me referindo ao "menor" mesmo. Acho que falei "média" por quê tinha citado anteriormente... Corrigi lá.

 

 

 

Sobre:

1 hora atrás, M4DM0NK31 disse:

Se puder me ajudar a encontrar este erro de lógico agradeço muito. Segue o código com as devidas correções:

 

O segredo para resolver um problema é tentar entender o problema... 

Qual valor está ficando quando não há ocorrência do F? Qual valor deveria ficar nesse caso? Tente abstrair da implementação de um código... imagine o problema no mundo real... como você faria para encontrar o menor valor?

 

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

  • Membro VIP
1 hora atrás, M4DM0NK31 disse:

@Simon Viegas O último cód. postado está completo e com este erro corrigido.

 

Este trecho?

22 horas atrás, M4DM0NK31 disse:

   se (nota = "f") e (idade < menorf) entao
      menorf := idade
   senao
      menorf := 0
   fimse

 

Se <a nota for diferente de "f'"> ou <a idade for maior ou igual a menorf>, então o menor é zerado? 🤔

 

Você chegou a testar o código?

 

Dica: use um constante para o total de cadastros... assim para diminuir o valor, bastaria mudar o valor da constante (em vez de precisar mudar no laço e nas divisões toda vez).

 

adicionado 8 minutos depois

Para gerar os dados automaticamente:

 

   ALEATORIO ON //ativa o aleátorio
   LISTA "nomes" //define uma lista de valores possíveis
   leia (nome)
   ...
   ALEATORIO 15, 50 //ativa o aleátorio definindo uma faixa de valores
   leia (idade)
   ...
   LISTA "notas" //define uma lista de valores possíveis
   leia (nota)

Ali nas idades, também poderia definir uma lista, mas fica mais prático utilizar um recurso que já existe.

 

Obs.: enquanto o ALEATORIO estiver ativado, todo leia() que passar será preenchido automaticamente. Para desativar, pode usar o ALEATORIO OFF. Nesse caso, nem precisa.

 

 

Para criar/editar uma lista, só ir no menu Manutenção/Configurações e ir em Listas:

 

 

image.png

 

O resto é auto-explicativo.

 

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

@Simon Viegas Realmente, não havia observado o erro grotesco de lógica na última sintaxe. 😅  Obrigado pela dica, acho que finalmente, dessa vez, deu certo! Segue o código: 
 

Algoritmo "Notas de satisfação"

Const
   total = 100

Var
   nome, otimo, nota : caracter
   idade, idadef, x, a, b, c, d, f, cont, menorf, maiorf, notaf, contf : inteiro
   mediaid, somaid, porcf : real

Inicio
mudacor ("verde", "frente")
para x de 1 ate 100 faca
   limpatela
   escreval ("Informe seu nome:")
   leia (nome)
   escreval ()
   escreval ("Informe sua idade:")
   leia (idade)
   escreval ()
   escreval ("-----------------------------------------------------")
   escreval ("Informe a nota:")
   escreval ()
   escreval ("A. Ótimo")
   escreval ("B. Bom")
   escreval ("C. Regular")
   escreval ("D. Ruim")
   escreval ("F. Péssimo")
   leia (nota)
   escreval ()
   escreval ("------------------------------------------------------------")
   se nota = "a" entao
      a := a+1
   fimse
   se nota = "d" entao
      d := d+idade
      somaid := d
   fimse
   se nota = "f" entao
      f := f+1
   fimse
   se (nota = "f") e (idade < total) entao
      menorf := idade
   fimse
fimpara

mediaid := somaid/100
porcf := f/100

escreval ("Você obteve:", a, "notas como ótimo serviço")
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("A média de idade, doss clientes que responderam D, é:", mediaid)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O Percentual de clientes que responderam F, é:", porcf)
escreval ()
escreval ("------------------------------------------------------------")
escreval ()
escreval ("O cliente de menor idade, que votou F, é:", menorf)

Fimalgoritmo

Muito interessante, irei começar a utilizar! 👍
Só não entendi o porquê de não precisar de um ALEATORIO OFF, neste caso. Poderia me explicar ?

 

4 horas atrás, Simon Viegas disse:

Para gerar os dados automaticamente:

 


   ALEATORIO ON //ativa o aleátorio
   LISTA "nomes" //define uma lista de valores possíveis
   leia (nome)
   ...
   ALEATORIO 15, 50 //ativa o aleátorio definindo uma faixa de valores
   leia (idade)
   ...
   LISTA "notas" //define uma lista de valores possíveis
   leia (nota)

Ali nas idades, também poderia definir uma lista, mas fica mais prático utilizar um recurso que já existe.

 

Obs.: enquanto o ALEATORIO estiver ativado, todo leia() que passar será preenchido automaticamente. Para desativar, pode usar o ALEATORIO OFF. Nesse caso, nem precisa.

 

 

Para criar/editar uma lista, só ir no menu Manutenção/Configurações e ir em Listas:

 

 

image.png

 

O resto é auto-explicativo.

 

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

  • Membro VIP
3 horas atrás, M4DM0NK31 disse:

@Simon Viegas Realmente, não havia observado o erro grotesco de lógica na última sintaxe. 😅  Obrigado pela dica, acho que finalmente, dessa vez, deu certo! Segue o código: 

 

Vamos lá...

 

#1

Sobre:

3 horas atrás, M4DM0NK31 disse:

   se (nota = "f") e (idade < total) entao
      menorf := idade
   fimse

 

Se <a nota for igual a "f"> e <a "idade" for menor que o "total de cadastros"> ? 🤔

 

Qual a relação da idade com o total de cadastros? Aí é menorf mesmo. O problema não está aí. Entenda primeiro o que está acontecendo de errado, após, tente achar uma solução.


ADENDO: não é "f", mas sim "e". ;)

 

 

 

#2

Tá! em relação à dica de uso de uma constante, ela foi relacionada à mudança da quantidade de cadastros, ou seja: para facilitar a alteração do total nos testes.

 

5 horas atrás, Simon Viegas disse:

Dica: use um constante para o total de cadastros... assim para diminuir o valor, bastaria mudar o valor da constante (em vez de precisar mudar no laço e nas divisões toda vez).

 

Algo como:

para x de 1 ate TOTAL faca

No caso, também estaria fazendo uma referência às divisões. Lá ficaria "/total", em vez de "/100".

 

4 horas atrás, M4DM0NK31 disse:

mediaid := somaid/100
porcf := f/100

 

Mas..... esses cálculos também estão errados. A média seria a "soma da ocorrências dividido pelo total de ocorrência" (ex.: uma soma dando 539 para 20 ocorrências, teria uma média de 26,95). E a percentagem "total de ocorrências, dividido pelo total geral, vezes 100" (Ex.: 4 entre 10 seria (4/10)*100, ou seja: 40%).

 

 

#3

Sobre:

3 horas atrás, M4DM0NK31 disse:

Só não entendi o porquê de não precisar de um ALEATORIO OFF, neste caso. Poderia me explicar ?

 

Não precisa desativar, pois em nenhum momento precisa está desativado. Todos os leia() estão sendo preenchidos automaticamente.

 

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