Ir ao conteúdo

Posts recomendados

Postado

sempre que eu executo esse código fala que estava esperando uma expressão lógica, ou só a parece o número no computador, tipo se eu colocar s de scanner vai contabilizar 1 para computador, alguém me ajuda a descobri o erro

 

 


 

Var
   // Seção de Declarações das variáveis

   Computador: inteiro
   Scanner: inteiro
   Impressora: inteiro
   continuar: caractere
   tipo_bem: inteiro

Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   computador <- 0
   impressora <- 0
   scanner <- 0

   // Laço principal do levantamento

   repita
      escrevaL("-----------------------------------")
      escrevaL("---LEVANTAMENTO DE BENS MATERIAIS--")
      escrevaL("-----------------------------------")
      escreval("BENS PATRIMONIAIS:")
      escreval(".............[C] COMPUTADOR")
      escreval(".............[I] IMPRSSORA")
      escreval(".............[S] SCANNER")
      escreval("Selhecione o tipo do bens para realizar o levantamento: ")
      leia( tipo_bem )

      // Verificando tipo de bem informado
      se (tipo_bem = "C") então
         computador <- computador + 1

      senao
         se (tipo_bem = "I") então
            impressora <- impressora + 1

         senao
            se (tipo_bem = "S") então
               scanner <- scanner + 1
            fimse
         fimse
      fimse
      escreva("Deseja continuar o levantamento [S] ou [N] ? ")
      leia(continuar)
   ate ( (continuar = "N")  ou (continuar = "n") )

   // Exibir o resultado final do levantamento


   escreval("---------------------------------------------------")
   escreval("Resultado do levantamento:")
   escreval("Total de Computadores: ", computador)
   escreval("Total de Impressoras: ", impressora)
   escreval("Total de Scanners: ", scanner)


Fimalgoritmo

 

  • Obrigado 1
Postado

O tipo da variável tipo_bem está errado, o ideal seria ela ser do tipo caractere.

Já no caso do estrutura Se ... Então o ideal seria usar sem o comando SeNão, dessa maneira.

    se (tipo_bem = "C") então
        computador <- computador + 1
    fimse
    se (tipo_bem = "I") então
        impressora <- impressora + 1
    fimse
    se (tipo_bem = "S") então
        scanner <- scanner + 1
    fimse

Mas o ideal mesmo seria usar o Escolha ... Caso.

Exemplo:

Algoritmo "semnome"
Var
   // Seção de Declarações das variáveis

   Computador: inteiro
   Scanner: inteiro
   Impressora: inteiro
   continuar: caractere
   tipo_bem: caractere

Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   computador <- 0
   impressora <- 0
   scanner <- 0

   // Laço principal do levantamento

   repita
      escrevaL("-----------------------------------")
      escrevaL("---LEVANTAMENTO DE BENS MATERIAIS--")
      escrevaL("-----------------------------------")
      escreval("BENS PATRIMONIAIS:")
      escreval(".............[C] COMPUTADOR")
      escreval(".............[I] IMPRSSORA")
      escreval(".............[S] SCANNER")
      escreval("Selhecione o tipo do bens para realizar o levantamento: ")
      leia( tipo_bem )

      // Verificando tipo de bem informado
      escolha maiusc(tipo_bem)
      caso "C"
         Computador <- Computador+1
      caso "I"
         Impressora <- Impressora+1
      caso "S"
         Scanner <- Scanner+1
      outrocaso
         escreval("Caractere invalido!")
      fimEscolha
      escreva("Deseja continuar o levantamento [S] ou [N] ? ")
      leia(continuar)
   ate ( (continuar = "N")  ou (continuar = "n") )

   // Exibir o resultado final do levantamento


   escreval("---------------------------------------------------")
   escreval("Resultado do levantamento:")
   escreval("Total de Computadores: ", computador)
   escreval("Total de Impressoras: ", impressora)
   escreval("Total de Scanners: ", scanner)


Fimalgoritmo

 

funcionando

ed.thumb.jpeg.d92fceac036ef1ef7d2a7c8351ba0369.jpeg

 

  • Curtir 1
  • Obrigado 1
Postado

Esqueci de avisar que é bom você passar os caracteres para maiúsculo (ou minúsculo) antes de fazer uma comparação, e comparar os caracteres em uma caixa só (alta ou baixa, mas nunca as duas ao mesmo tempo).

O visualG tem um bug com isso, então é melhor evitar. Para passa para maiúsculo utilize a função maiusc(), e as outras funções você pode checar aqui no manual visualG

  • Curtir 1
  • Obrigado 1
Postado

@kgin    se usar o Visualg da versão 3.0.6.5 não tem esse bug e não precisa converter para maiúsculas ,  pois o VisualG  não diferencia letras maiúsculas ou minúsculas como em outras linguagens tipo c,  c++    e outras   . . .  !

  • Curtir 1
  • Membro VIP
Postado

Vamos tentar destrinchar cada ponto:

 

Em 18/10/2024 às 19:43, ryan_santos disse:

se eu colocar s de scanner vai contabilizar 1 para computador

Isto está ocorrendo por 2 erros centrais:

  1. você está atribuindo um valor do tipo caractere para uma variável de tipo numérica (inteiro), mas o VisualG não está dando erro; (Deveria dar!!!!!!)
  2. você está comparando um valor do tipo inteiro (da variável tipo_bem:inteiro) com um valor do tipo caractere (valor que está entre aspas duplas no se) e também o VisualG não está dando erro(Deveria dar!!!!!!)

Isso muito estranho, mas está ocorrendo! São falhas da versão do aplicativo! Provavelmente em todas... (Não testei, só imagino.) 

 

Existem algumas formas de testar para entender melhor o problema... uma delas é ir pressionando F8 e analisando linha a linha. Outra forma mais rápida é colocando um break point (F5), numa linha estratégia, como logo após o se onde está contando mais 1 para computador. Veja:

 

É esse comando aqui:

image.png.0d3da00140461314e241033b428046a4.png

 

Basta pressionar F5 na linha desejada. A linha fica vermelha:

 

image.png.b399822f1460bed5d12972f5e0c5351e.png

 

Quando o VisualG executa uma linha que tem break point, o programa "para"... ficando pausando até que coloque para rodar novamente (pressionar F8 ou F9).

 

Repare agora que interessante:

 

image.png.5c551a376f2a97dd585b729235d7081f.png

 

A variável tipo_bem está com o valor 0 nela... Ao enviar o "c" para a variável, o VisualG, por algum motivo místico, está enviando o número 0 e armazenando na variável. Mas como sugerido mais acima, o programa deveria TRAVAR... pois são "variáveis de tipos incompatíveis".

 

Veja um exemplo análogo do que deveria ocorrer:

 

image.png.a2b75d613dbe962863073f10d43c9117.png


Inteiro não sabe receber caractere!!! Logo, deveria dar esse erro e citar a respectiva linha. 

 

Beleza... tem um 0 lá na variável... Ai vem o outro problema: como o break point está (propositalmente) dentro do se, significa que o VisualG está dizendo que

 

0 = "C"

 

Concorda? Logo: basicamente o VisualG está dizendo que um inteiro qualquer é igual a um caractere qualquer🫠... Em outras palavras: tá apresentando problemas!

 

 

PARA RESOLVER:

Só trocar de:

Em 18/10/2024 às 19:43, ryan_santos disse:
tipo_bem: inteiro

 

Para:

tipo_bem: caractere

 

Só isso.

 

 

 

 

 

Abaixo tem outros detalhes que podemos discutir:

 

Em 18/10/2024 às 20:32, kgin disse:

Já no caso do estrutura Se ... Então o ideal seria usar sem o comando SeNão, dessa maneira.

Entendo que seria o contrário. Como são condições mutualmente excludentes entre si, faz mais sentido utilizar o se/senão... pois quando uma condição é verdadeira, não precisará verificar as outras seguintes...

 

 

Em 18/10/2024 às 20:32, kgin disse:

Mas o ideal mesmo seria usar o Escolha ... Caso.

Concordo. O escolha seria justamente uma "versão mais específica e organizada" de um conjunto de se/senão. (O que corrobora que deveria ser mesmo um conjunto de se/senão, em vez de um conjunto de se isolados.)

 

 

Em 18/10/2024 às 21:19, kgin disse:

Esqueci de avisar que é bom você passar os caracteres para maiúsculo (ou minúsculo) antes de fazer uma comparação, e comparar os caracteres em uma caixa só (alta ou baixa, mas nunca as duas ao mesmo tempo).

O visualG tem um bug com isso, então é melhor evitar. Para passa para maiúsculo utilize a função maiusc(), e as outras funções você pode checar aqui no manual visualG

Em relação às comparações de caracteres, não seria um bug, mas sim uma característica... ou seja: ocorre que VisualG não é Case Sensitive. A maioria das linguagens principais do dia-a-dia são, então é bom ir se acostumando mesmo... Mas aqui não precisa.

 

Outro exemplo de característica "exótica" do VisualG (e também presente no seu pai Pascal/Delphi) é que não é preciso inicializar variáveis globais. Elas são automaticamente zeradas:

 

Em 18/10/2024 às 20:32, kgin disse:
Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   computador <- 0
   impressora <- 0
   scanner <- 0

 

Ou seja: esses 3 comandos acima seriam desnecessários. Podem apagar sem medo!... maaaaas, não custa nada deixá-los. Apenas levanto a observação de entender como funciona a "linguagem de programação"* que está utilizando.

 

 

 

Por fim, sugeriria dar nomenclaturas de variáveis mais sugestivas, exemplo:

var
   qtd_computador, qtd_scanner, qtd_impressora: inteiro
   tipo_bem: caractere
   continuar: caractere

 

Uma forma de alterar todas é pressionando Ctrl+U e substituir as ocorrências necessárias. Exemplo:

 

image.png.551e659b0d92f10c7d03dad07720ef52.png

 

Vai pressionando "s" ou "n".

 

 

Abaixo segue um exemplo de código mais limpo para VisualG:

algoritmo "FCdH"
var
   qtd_computador, qtd_scanner, qtd_impressora: inteiro
   tipo_bem: caractere
   continuar: caractere
inicio
   repita
      limpaTela()
      escrevaL("-----------------------------------")
      escrevaL("---LEVANTAMENTO DE BENS MATERIAIS--")
      escrevaL("-----------------------------------")
      escrevaL("BENS PATRIMONIAIS:                 ")
      escrevaL(".............[C] COMPUTADOR        ")
      escrevaL(".............[I] IMPRSSORA         ")
      escrevaL(".............[S] SCANNER           ")
      escrevaL("Selhecione o tipo do bens para realizar o levantamento: ")
      escreva ("=> ")
      leia(tipo_bem)

      escolha tipo_bem
      caso "C"
         qtd_computador <- qtd_computador+1
      caso "I"
         qtd_impressora <- qtd_impressora+1
      caso "S"
         qtd_scanner <- qtd_scanner+1
      outroCaso
         escrevaL("")
         escrevaL("Código de item inválido")
      fimEscolha

      escrevaL("")
      escreva("Deseja continuar o levantamento [S] ou [N] ? ")
      leia(continuar)
   ate (continuar = "n")

   escrevaL("")
   escrevaL("---------------------------------------------------")
   escrevaL("Resultado do levantamento:")
   escrevaL("Total de Computadores: ", qtd_computador:1)
   escrevaL("Total de Impressoras : ", qtd_impressora:1)
   escrevaL("Total de Scanners    : ", qtd_scanner:1)
fimAlgoritmo

 

 

Já esse abaixo seria implementando a questão da "inicialização das variáveis" e "case sensitive":

 

algoritmo "FCdH"
var
   qtd_computador, qtd_scanner, qtd_impressora: inteiro
   tipo_bem: caractere
   continuar: caractere
inicio
   //em algumas linguagens seria necessário iniciar as variáveis "contadoras"
   //pois podem vir com um "lixo de memória"
   qtdComputador <- 0
   qtdScanner <- 0
   qtdImpressora <- 0

   repita
      limpaTela()
      escrevaL("-----------------------------------")
      escrevaL("---LEVANTAMENTO DE BENS MATERIAIS--")
      escrevaL("-----------------------------------")
      escrevaL("BENS PATRIMONIAIS:                 ")
      escrevaL(".............[C] COMPUTADOR        ")
      escrevaL(".............[I] IMPRSSORA         ")
      escrevaL(".............[S] SCANNER           ")
      escrevaL("Selhecione o tipo do bens para realizar o levantamento: ")
      escreva ("=> ")
      leia(tipo_bem)

      //utilizando a sugestão do @kgin. Comparar com o"maiúsculo do caractere"
      escolha maiusc(tipo_bem)
      caso "C"
         qtd_computador <- qtd_computador+1
      caso "I"
         qtd_impressora <- qtd_impressora+1
      caso "S"
         qtd_scanner <- qtd_scanner+1
      outroCaso
         escrevaL("")
         escrevaL("Código de item inválido")
      fimEscolha

      escrevaL("")
      escreva("Deseja continuar o levantamento [S] ou [N] ? ")
      leia(continuar)
   //idem acima
   ate (maiusc(continuar) = "N")

   escrevaL("")
   escrevaL("---------------------------------------------------")
   escrevaL("Resultado do levantamento:")
   escrevaL("Total de Computadores: ", qtd_computador:1)
   escrevaL("Total de Impressoras : ", qtd_impressora:1)
   escrevaL("Total de Scanners    : ", qtd_scanner:1)
fimAlgoritmo

 

 

EXTRA:
Ainda sobre a questão do Case Sensitive, caso fosse utilizar variáveis ou constantes na comparação, poderia também tornar maiúscula (ou minúscula se fosse o caso) antes de comparar. Algo assim:

 

Defino os código de cada item:

algoritmo "FCdH"
const
  COD_COMPUTADOR = "c"
  COD_SCANNER = "s"
  COD_IMPRESSORA = "i"
var
   qtd_computador, qtd_scanner, qtd_impressora: inteiro
   tipo_bem: caractere
   continuar: caractere

 

Aí ao comparar, faria:

      escolha maiusc(tipo_bem)
      caso maiusc(COD_COMPUTADOR)
         qtd_computador <- qtd_computador+1
      caso maiusc(COD_SCANNER)
         qtd_impressora <- qtd_impressora+1
      caso maiusc(COD_IMPRESSORA)
         qtd_scanner <- qtd_scanner+1
      outroCaso
         escrevaL("")
         escrevaL("Código de item inválido")
      fimEscolha

 

Saca? Assim você tentar garantir que estará comparando "letras com tamanhos iguais". 😉

 

 

PS: sim! Se você identificou que o código da impressora e scanner estão invertidos entre si, parabéns!

 

  • Curtir 1
Postado

@Simon Viegas     nesse código do  @ryan_santos  a função "leia"  aceita o que for digitado porém retorna zero se for um dado inválido ,  e isso ocorre nas versões mais recentes , pois na versão 2.5 essa função "leia"  apresenta um erro de atribuição no momento em que isso , inserir dados inválidos, ocorre.  o que não se entende é o motivo pelo qual  o visualG aceita a primeira comparação como sendo válida , mesmo não sendo .   

  • DiF alterou o título para VisualG esperando uma expressão lógica

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!