Ir ao conteúdo
  • Cadastre-se

Problema com contador em visualg


Ir à solução Resolvido por groutmoustache,

Posts recomendados

Boa tarde galera,

Estou desenvolvendo um código para essa problemática:

Faça um algoritmo que contabiliza os dados sobre o uso de tv por assinatura por parte de um grupo de pessoas. 

Cada pessoa informou :
Nome (fim para encerrar)
Operadora : sky, claro, oi, net ou gvt.
Valor : em real

Receba esses dados via teclado e, ao final exiba :

A) qtd pesquisados
 Qtd pessoas por operadora
C) total geral arrecadado
D) total arrecadado por operadora
E) média geral de pagamento
F) quantas pessoas gastam mais de 200 reais.

 

no item "F" estou tendo dificuldade pois, o contador esta repetindo a informação a cada loop, ou seja, se eu informar que foi gasto 200 com a operadora sky, por exemplo, e no proximo loop 150 com a operadora vivo, ele lê 2 pessoas com mais de 200 reais e não uma. alguém pode me ajudar ?

segue o código abaixo:


 

algoritmo "Operadoras de TV"
var
   nome, operadora:caracter
   carot, mediag, sky, claro, oi, net ,vivo, valors:real
   valorc, valoro, valorn, valorv, qtd, totalg:real
   soma1, soma2, soma3, soma4, soma5: real
   caro1, caro2, caro3, caro4, caro5: real
inicio

   escreval("Digite o seu nome")
   leia(nome)
   enquanto nome <> "fim" faca
      escreval("Qual sua operadora de TV?")
      escreval("Menu: sky, claro, oi, net ou vivo")
      leia(operadora)
      se operadora = "sky" então
         escreval("Qual o valor da sua mensalidade Sky?")
         escreva("R$: ")
         leia(valors)
      senao
         se operadora = "claro" então
            escreval("Qual o valor da sua mensalidade Claro?")
            escreva("R$: ")
            leia(valorc)
         senao
            se operadora = "oi" então
               escreval("Qual o valor da sua mensalidade Oi?")
               escreva("R$: ")
               leia(valoro)
            senao
               se operadora = "net" então
                  escreval("Qual o valor da sua mensalidade Net?")
                  escreva("R$: ")
                  leia(valorn)
               senao
                  se operadora = "vivo" então
                     escreval("Qual o valor da sua mensalidade Vivo?")
                     escreva("R$: ")
                     leia(valorv)
                  fimse
               fimse
            fimse
         fimse
      fimse
      se operadora= "sky" então
         soma1:= soma1 + valors
      senao
         se operadora= "claro" então
            soma2:= soma2 + valorc
         senao
            se operadora= "oi" então
               soma3:= soma3 + valoro
            senao
               se operadora= "net" então
                  soma4:= soma4 + valorn
               senao
                  se operadora= "vivo" então
                     soma5:= soma5 + valorv
                  fimse
               fimse
            fimse
         fimse
      fimse
      qtd:= qtd+1
      totalg:= (soma1 + soma2 + soma3 + soma4 + soma5)
      mediag:= totalg / 5

      se operadora = "sky" então
         sky:=sky+1
      senao
         se operadora = "claro" então
            claro:=claro+1
         senao
            se operadora = "oi" então
               oi:=oi+1
            senao
               se operadora = "net" então
                  net:=net+1
               senao
                  se operadora = "vivo" então
                     vivo:=vivo+1
                  fimse
               fimse
            fimse
         fimse
      fimse
      se valors >= "200" então
         caro1:=caro1+1
      fimse
      se valorc >= "200" então
         caro2:=caro2+1
      fimse
      se valoro >= "200" então
         caro3:=caro3+1
      fimse
      se (valorn >= "200") então
         caro4:=caro4+1
      fimse
      se (valorv >= "200") então
         caro5:=caro5+1
      fimse
      carot:=(caro1+caro2+caro3+caro4+caro5)
      escreval("Digite o seu nome")
      leia(nome)
   fimenquanto
   escreval("")
   escreval("Foram entrevistados",qtd," clientes ao total")
   escreval("")
   escreval(sky," da Sky,")
   escreval(claro," da Claro,")
   escreval(oi," da Oi,")
   escreval(net," da Net,")
   escreval(vivo," da Vivo,")
   escreval("")
   escreval("São gastos com operadoras de TV R$:",totalg," ao total")
   escreval("")
   escreval("R$:",soma1, " com a operadora Sky,")
   escreval("R$:",soma2, " com a operadora Claro,")
   escreval("R$:",soma3, " com a operadora Oi,")
   escreval("R$:",soma4, " com a operadora Net,")
   escreval("R$:",soma5, " com a operadora Vivo,")
   escreval("")
   escreval("A media geral gasta com operadoas de TV é R$:",mediag)
   escreval("")
   escreval(carot," clientes gastão 200 reais ou mais em suas mensalidades.")

 

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

  • Solução

Você está usando um loop, certo? (enquanto)

Cada vez que uma variável correspondente ao valor de um operadora for igual a "200", você está acrescentando 1 para representar uma pessoa, mas está esquecendo de zerar esta variável, no fim do loop.

 

Quando o laço de repetição reinicia, a variável vai continuar com o mesmo valor (200), fazendo com que o contador seja ativado, mesmo que ninguém pague 200.

PS: Seu código está muito extenso, apesar de estar correto. Toda a parte de verificação de valores e operadoras pode ser feito dentro da condição "operador = nome_operadora", utilizando somente uma variável como contador, ao invés de cinco. Procure se desafiar a fazer desta forma que falei, com somente 1 contador para cada verificação.

Não fique se forçando a entender o problema o dia todo. Quando a cabeça esquentar, vá se divertir, porque quando voltar vai perceber que o problema estava fácil de identificar.

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

  • Membro VIP

Olá @José Duarte de Barros Neto.

 

Comentando...

 

A variável valors seria uma variável "individual", correto? ou seja, que está relacionado aos "valores do entrevistado no momento" (e não um "somatório de todos", ou algo do tipo). Daí, é necessário iniciá-lo antes de começar uma "nova entrevista", pois senão vai ficar com o valor antigo nele, como citado por @Joao_Lucaas.

Teoricamente, você pode inicializar em qualquer momento que seja "antes de utilizá-lo" novamente... mas para fins práticos, você poderia utilizar logo no "início da entrevista". No seu caso, logo abaixo do enquanto. No início do loop, vai "zerar" tb logo para o primeiro acesso. (apesar de não precisar, mas deveria)

 

Em 06/09/2016 às 13:28, José Duarte de Barros Neto disse:

   escreval("Digite o seu nome")
   leia(nome)
   enquanto nome <> "fim" faca
      escreval("Qual sua operadora de TV?")
      escreval("Menu: sky, claro, oi, net ou vivo")
      leia(operadora)

 

 

O que significa "inicializar" nesse contexto?
Basicamente seria "dar um valor inicial a algo"... no seu caso um "0" (valor inicial que você precisa, mas poderia ser outro valor qualquer, dependendo do contexto). Ex.:
 

valors<-0



EXTRA

Obs.: A princípio você deveria "inicializar" todas a variáveis de "somatório", ou seja, que funcionam como "valor atual + novo valor"!!! Pois o valor inicial da variável não necessariamente está com um valor desejado!. (as variáveis que recebem um valor novo até que não precisa, pois o valor novo vai substituir..)

 

Obs.2: Para facilitar, a alguns compiladores "zeram" as variáveis automaticamente. As variáveis numéricas ficam com "0"; as de caracteres com "" ("nada escrito) etc. Veja, ao declarar uma variável, o "programa" apenas reserva um espaço na memória e define qual tipo de valores ele irá aceitar... daí, o que tiver lá na memória, ficará sendo como o conteúdo da variável, entende?... Mas geralmente ocorre o que citei acima!... ao executar o programa, são "inicializadas" automaticamente. (mas nem sempre será assim. Como visto em outras linguagens, ou como no Pascal, em "funções" - variáveis locais ).

 

 

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

@Simon Viegas, sempre me perguntei porquê algumas pessoas possuem o costume de inicializar a variável com zero se o compilador já faz isso, mas agora que você falou vejo que VisuAlg é uma das exceções que fazem isto. 

o que acontece quando um compilador não inicializa a variável com um valor automático?

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

  • Membro VIP

Resumidamente seria...

Se não inicializar, vai ficar com o que tem lá na memória ("lixo").

 

 

Só que é automático... Segue um padrão. 0 para número (integer), '' para caracteres (string),  verdadeiro (true) para logico (boolean) etc...


No VisuAlg, acho que inicializa ao declarar (não tenho certeza). Já no Pascal, inicializa ao executar o BEGIN (equivalente ao "inicio")... pelo menos era assim (tem um compilador chamado Turbo Pascal, que dá para usar um "debug" que fica monitorando as variável, como aparece no VisuAlg no canto direito. E via que zerava apenas quando o begin principal era executado). Veja, que os comandos são executados "da esquerda para direita, de cima para baixo".

 

No Pascal, quando é utilizado funções (lá chama procedure e function), as variáveis locais (declaradas dentro da função) NÃO SÃO INICIALIZADAS, ou seja, se não inicializar, vai ficar com um valor "aleatório". Por que não inicializa lá? não sei!!! rs.


Um exemplo de código:

program testeMemoria;
var //variáveis declaradas aqui são acessíveis por todo o código
  strGlobal:string;
  numGlobal:integer;
procedure imprimirVariavel;
  var //variáveis declaradas aqui, só são vista dentro do procedimento ("função"). Inclusive pode até usar um nome igual a da Global!!! pois a Global não se enxerga a Local, logo não dando conflito de "nomes iguais". Se for igual, fica valendo o local (isso depende da liguagem)
    strLocal:string;
    numLocal:integer;
  begin
  writeln('String global: ',strGlobal);//exibe '' (o conteúdo entre as aspas, no caso, "nada")
  writeln('Numero global: ',numGlobal);//exibe 0
  writeln('String local : ',strLocal); //aqui vai ter um texto "aleatório" (do lixo da memória). Aqui não sei porque aperece um comando do Notepad++, programa que eu uso! rs
  writeln('Numero local : ',numLocal); //aqui um número aletório, ex. 8732. 
  end;
BEGIN //aqui, as variáveis globais são automaticamente inicializadas
imprimirVariavel;
END.



Mas veja, as variáveis que são "lidas do usuário" ou que não usam um valor atual, não vai fazer diferença... pois vai ter o valor novo que foi atribuído. Já variáveis que são "usadas" sem nenhuma atribuição antes, como valors, caro1, vivo etc, podem dar problema. Por exemplo:

vivo<-vivo+1

Nesse caso, o comando é executado primeiro no que está no lado direito do "<-", logo, seria o  "valor contido em vivo + 1". Mas qual é o valor atual? Como o compilador "zerou" para ele, vai ser 0! Senão seria, algo como 13415+1, e ai?

 

O que ocorreu com o valors lá? o "valor inicial" para próximo loop está com o valor do loop anterior (lixo do loop). No primeiro loop funciona, pois o programa zerou para ele! Isso é um "recurso" que o cara que desenvolveu o VisuAlg disponibilizou! Senão teria que ficar zerando variável por variável!!!

 

No Java eu não lembro... se não me engano, nem compila!!! Solicita a inicialização. (mas lá envolve outros conceitos relacionados a OO (orientação à objetos).

 

A declaração de uma variável seria análogo a "formatação do computador" (do HD). No caso, "formatar" seria "organizar/preparar"... o processo de "apagar" é uma "consequência", ou seja, temos a sensação que "formatar" seria "apagar" os dados, mas apenas reorganiza logicamente a estrutura, no caso de acordo com um formato, como NTFS, FAT32 etc. Quando alguém pede para "formatar" o pendrive, pede no sentido de "apagar tudo", né?  mas o apagar é uma consequência da formatação, não o motivo. Formatar serve para "atribuir uma estrutura", no caso se deixar igual, "reatribuir".

 

Daí, o SO entende esse "formato" e trata os espaços de acordo. Veja, de fato os dados NÃO SÃO APAGADOS, funciona como perdesse apenas as "informações para ter acesso a esses dados", ou seja, os registros que dizem que "tal arquivo está em determinadas posições no disco". Tanto que existem programas que conseguem (tentam) recuperar arquivos que ainda não foram sobrescritos... e outros que "escrevem por cima" para evitar de serem recuperados... Outro fato fácil de verificar é na hora de APAGAR um arquivo com "shift+del". Experimente copiar um filme de um pendrive e depois apagar esse arquivo! O tempo de copiar é muito maior, correto? pois ao apagar, o SO apenas sinaliza como "excluído". É praticamente instantâneo (pois o arquivo ainda está lá, apenas não é mais referenciado). Já pensou todo vez precisasse escrever um monto de 0 em cima? não ia HD que ia aguentar!!! (fora o tempo)

 

No caso das variáveis, ao declarar lá no var, o programador ordena o programa solicitar ao SO que reserve uma parte da memória (se não tiver espaço disponível, da pau, rs) e que esse espaço tenha determinada característica, de acordo com o tipo (type). Como se "formatasse um pedaço da memória". Então, assim como o "formatar", o SO apenas organizou e reservou a estrutura.. entende? o que tá lá, continua lá. (tb não perde tempo reescrevendo bit a bit, mesmo sendo a memória mais rápida).

 

 

 

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

 @Simon Viegas
 

Já tinha lido sobre essa questão de memória, mas nunca tinha relacionado com as variáveis de um código, como você falou. Sempre que uso variável nunca percebo que eu mesmo estou reestruturando um ponto da memória.

 

Quando você falou:

Citação

Já pensou todo vez precisasse escrever um monto de 0 em cima? não ia HD que ia aguentar!!! (fora o tempo)


Porque seria lento e não iria aguentar?

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

Visitante
Este tópico está impedido de receber novas respostas.

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