Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.944
  • Cadastrado em

posts postados por Simon Viegas

  1. Em 20/07/2023 às 20:11, Ramon2023n disse:

    @Simon Viegas, um problema que estou tendo é que sempre que eu atribuo o hospede para o quarto, quando chamo a função exibir quartos() por causa do laço "para" , todos os quartos ficam "Livre".

     

    Perfeito. O detalhe está aqui:

     

    image.png

    Ou seja: só precisa inicializar uma vez... no início do programa. Algo como:

     

    	funcao inicio()
    	{
    		inicializarQuartos()
    		
    		faca {
    			escreva("\n Digite \n 1 – Cadastrar Hospedes \n 2 – Exibir Hospedes Cadastrados\n 3 – Exibir Quartos\n 4 – Atribuir Hospede a um quarto\n 5 – Reservar Área de Lazer\n 6 – Calcular Total a Pagar\n 0 – Sair\n ")
    			
    			leia(opcao)
    			escolha (opcao) {
    				caso 1:

     

    A função deve se limitar ao seu escopo, ou seja, a função exibir deve servir apenas para exibir... Zerar os quartos é algo externo.

  2. Em 22/07/2023 às 21:28, Eli Almeidaa disse:

    Ouvi dizer que a melhor maneira de nomear uma função ou procedimento é utilizar um verbo e um substantivo.

     

    Sim.. seria uma forma interessante.

     

     

    Em 22/07/2023 às 21:28, Eli Almeidaa disse:

    Nesse , caso, poderia usar "nota1", "nota2" e "nota3", aí no "leia", já que eles já está sendo usado nos parâmetros da função? qual o melhor

    nome para dá para esses dados de entrada?

     

    Podem, se quiser, utilizar o mesma nomenclatura... pois as variáveis da função ou procedimento são locais. Já as variáveis do programa principal são ditas como globais, como são de escopos diferentes, o VisualG permite "duplicar" os nomes...

     

    Veja:

    image.png

     

    São 4 variáveis distintas.

     

    Sugiro pesquisar sobre:

    - variáveis globais x variáveis locais;

    - escopo

    - passagem de parâmetro por valor x parâmetro por referência

     

     

    Adendo: para testar linha a linha do código, pode ir pressionando F8.

     

    • Obrigado 1
  3.  

    5 horas atrás, bngomes disse:

    em todas as linguagens que eu trabalhei.. o case (no, caso escolha) tem que ter um finalizador

     

    No VisualG não tem.

     

     

     

     

    6 horas atrás, Caiomqc disse:

    esmo os outros casos sendo verdadeiros o outrocaso ainda e executado

     

    Após o comando caso é necessário ter um espaço (antes dos ").

     

     

     

     

    6 horas atrás, Caiomqc disse:

    alem de R(resultado) ficar em 0

     

    Mesma causa raiz do anterior.

     

    Dica: pressione Ctrl+G no VisualG para auto-indentação de código. Vá se acostumando com a indentação padrão, ou seja, como estava com esse erro (de não ter dado espaço), a indentação fica bagunçada.

  4. Em 13/07/2023 às 16:40, extremedll disse:

    pensei nisso, mas como ele não colocou o enunciado, respondi apenas com a informação solicitada.

     

    Perfeito! Também segui a mesma lógica e mantive como foi apresentado. A ideia seria citar o @Lucas Andrade Cunha, mas acabei citando do seu código... foi mal!! 🙂. Corrigi a citação.

     

    A sugestão em si fica: entendo que quem tem 60 já tem direito, e não 61 em diante.

     

     

     

    Em 13/07/2023 às 16:40, extremedll disse:

    no caso do portugol, é da forma que ele colocou

     

    Acho que meio que seria um "poderia ser também assim". Funciona das duas formas. Na prática, a sugestão seria evitar tudo junto. Isso pode dar problema em outros linguagem e no próprio Portugol Studio. Acabei de ver um problema parecido no VisualG (que também é em Portugol). Vejam:

     

    11 minutos atrás, Simon Viegas disse:

    Sobre:

    Em 15/07/2023 às 19:33, kgin disse:
    Se (não (operacao = "S") OU (operacao = "C") OU (operacao = "T")) então

     

    Esta expressão está incompleta. A negação seria da expressão toda, e não só da sentença ao lado.

     

    A linha acima seria, tecnicamente, igual a:

    se ((não (operacao = "S")) OU (operacao = "C") OU (operacao = "T")) então

     

    Ou seja: na primeira linha, estaria negando apenas a sentença à direita, mas o VisualG meio que está negando todas as expressões... Algo muito estranho (mas tá certamente* bugado)... Seguindo uma "formalidade maior", evitaria essa possibilidade de bug*, ou seja, para esse caso, deu o que o programador queria, mas se não desse? Fiz testes na versão 3.6.0.5 do VisualG, mas se em outra tiver um comportamento diferente?

     

    Lá na postagem tem outros detalhes... a depender podem até complementar ou corrigir. 

    • Amei 1
  5. Complementando:

     

    Como sabido, o então e não (com ~) não funcionam no VisualG. Esse acento é colocado aqui no Fórum por causa de um "corretor automático". Basta substituir pela palavra correta. Exemplo:

     

    Pressiona "Ctrl-U":

     

    image.png

     

    E substitui tudo ou vai analisando um a um... O não como só tem um, basta editar manualmente.

     

     

     

    Sobre:

    Em 15/07/2023 às 19:33, kgin disse:
    Se (não (operacao = "S") OU (operacao = "C") OU (operacao = "T")) então

     

    Esta expressão está incompleta. A negação seria da expressão toda, e não só da sentença ao lado.

     

    A linha acima seria, tecnicamente, igual a:

    se ((não (operacao = "S")) OU (operacao = "C") OU (operacao = "T")) então

     

     

    Ajustando poderia ficar com algo assim:

     

    se não ((operacao = "S") OU (operacao = "C") OU (operacao = "T")) então

     

    Ou seja: "nego o resultado da expressão".

     

    ou

     

    se (não ((operacao = "S") OU (operacao = "C") OU (operacao = "T"))) então

     

    Ou ainda negando a expressão em si no código:

     

    se ((operacao <> "S") E (operacao <> "C") E (operacao <> "T")) então

     

    Dá na mesma. As 3 expressões são logicamente equivalentes.

     

     

    Adendo: "ah! porque está funcionando? Eu testei tudo e foi de boa". Pelo simples fato do VisualG ser bugado! 😄. Tenho quase certeza que isso não é proposital. Seria uma falha no interpretador da execução.

  6.  

    Pelo visto não teve respostas... e desculpe pela demora...

     

    Então, poste o código completo e em forma de texto...

     

     

     

    Sobre:

    Em 15/07/2023 às 22:01, Ramon2023n disse:

    image.png

     

    Está invertido. O vetor de quartos que recebe o nome do hóspede. Só apague essa linha! (Vai usar a outra de baixo.)

     

     

    Sobre:

    Em 15/07/2023 às 22:01, Ramon2023n disse:

    image.png

     

    Conforme o item 4, você vai exibir o nome do hóspede, e não "Ocupado". Cada posição do vetor quarto já começa com o texto "LIVRE". Daí, ao atribuir um hóspede, o programa deve jogar o nome do cliente na posição desejada, ou seja, em vez de "Ocupado", use nomes[indiceHospede]. Abaixo detalhes:

     

    image.png

     

    O vetor quartos vai armazenar ou "LIVRE" ou "<O nome do hóspede>", daí simplesmente vai exibir o que está lá no vetor. Ao iniciar o programa, todos os quartos devem ter o texto "LIVRE". A medida que for cadastrando um hóspede no quarto, esse texto vai ser substituído pelo nome cliente.

     

    Lembrar de postar o código completo.

    • Curtir 1
  7. Em 13/07/2023 às 20:23, Ramon2023n disse:

    Estou com dúvida nessa parte de adicionar hospedes 

     

    Ok!. Qual dúvida? Seria interessante citar qual parte não está entendendo e postar o código completo.

     

     

    Vamos lá:

     

    Segue o que foi implementado:

    Em 13/07/2023 às 20:23, Ramon2023n disse:
    	funcao atribuirHospede() {
    		inteiro auxinteiro1 = 0
    		
    		exibirHospede()
    		escreva("Índice do Hospede? ")
    		leia(nomes[i])
    		
    		para(i = 0; i<4;i++) {
    			quartos[i] = "Livre"
    			
    			se (quartos[i] == "Livre"){
    				quartos[i] = "Ocupado"
    				escreva("Quarto", i+1, quartos[i] = nomes[i]) 
    			pare
    			}
    		}
    	}

     

     

    Comece ajustando a nomenclatura da função de exibir os hóspedes. 

     

    Em 13/07/2023 às 20:23, Ramon2023n disse:

    image.png

     

    O nome da função seria no plural.

     

    Ajuste de:

    Em 13/07/2023 às 20:23, Ramon2023n disse:
    	funcao exibirHospede()
    	{

     

    Para 

    	funcao exibirHospedes()
    	{

     

    Adendo: não confundir o que foi postado lá no outro tópico. Veja:

    Em 06/05/2023 às 17:50, Simon Viegas disse:
    	funcao exibirHospede()
    	{
    		escreva("*** DADOS DE HÓSPEDE ***\n")
    		escreva("\n Nome   : ", nome) 
    		escreva("\n CPF    : ", cpf) 
    		escreva("\n Diárias: ", qtdDiarias)
    	}

     

    Lá estávamos trabalhando com variáveis simples. Tratando a demanda como se fosse um único cadastro. Veja que não tem vetor ainda! (Analise o contexto do código lá.)

     

    Outro detalhe que esquecemos de exibir o índice. É o que está sendo exigido lá na parte 3.

    image.png

     

    Algo como:

    	funcao exibirHospedes()
    	{
    		para (inteiro posicaoVetor = 0; posicaoVetor < i; posicaoVetor++) {
    			escreva("*** DADOS DO HÓSPEDE ***\n")
    			escreva("\n Índice: ", posicaoVetor) 
    			escreva("\n Nome: ", nomes[posicaoVetor]) 
    			escreva("\n CPF: ", cpfs[posicaoVetor]) 
    			escreva("\n Quantidade de Dias: ", qtdDiarias[posicaoVetor], "\n")
    		}
    	}
    	

     

     

     

     

     

     

    Seguimos com a leitura do índice que consta lá:

     

    Em 13/07/2023 às 20:23, Ramon2023n disse:
    		escreva("Índice do Hospede? ")
    		leia(nomes[i])

     

    Índice e nome são coisas distintas.

     

    Que tal?:

    		escreva("Índice do Hospede? ")
    		leia(indiceHospede)

     

     

     

     

    Daí vai seguindo o que está determinado no enunciado.

     

    image.png

     

     

    Deixe essa parte em vermelho para depois. Faça como sempre fosse digitado valores ideais, ou seja, que não validariam esses se. Depois de testar direitinha, para para inserir essas condicionais.

     

    Segue esboço:

    	funcao atribuirHospede() {
    		inteiro indiceHospede, numeroQuarto
    		
    		exibirHospedes()
    		escreva("Índice do Hospede? ")
    		leia(indiceHospede)
    		escreva("Número do Quarto? ")
    		leia(numeroQuarto)
    		
    		
    
    
    		}
    	}

     

    Termine de implementar a função para atribuir o nome do usuário lá no vetor dos quartos.

     

    No caso, o nome dele estará na posição correspondente. Algo como:

    nomes[indiceHospede]

     

    Joga lá no vetor de quartos.

     

     

    Tente dar continuidade. Caso tenha dúvidas, poste o código completo e qual dúvida tem.

  8.  

    Em 07/07/2023 às 17:24, Lucas Andrade Cunha disse:
    se (idade < 5 ou idade > 60) {

     

    Talvez ali seja >= 60, pois seria algo como "maior de 60 anos", ou seja, quem tem 60 já teria direito. Na prática, quem tem 60, "têm mais de 60 anos". Após aniversário, passaram 1s, 2s, 1 mês etc.... Saca? Do jeito que está, apenas pessoas com 61 anos teriam gratuidade. (Se esse for o caso, está certo :D)

     

    Adendo: 

    A depender da linguagem de programação, pode dar problema essa não separação das instruções do se. Sugeriria algo assim:

     

    se ((idade < 5) ou (idade > 60)) {

     

    Acho que também fica mais claro... eliminando a ideia de pensar em algo como "5 ou idade". 😄

     

    ou assim:

     

    se (idade < 5) ou (idade > 60) {

    Obs.: talvez esse acima não funcione, pois o compilador pode exigir os "()" externos.

  9. Em 11/07/2023 às 19:57, Diego Blois Teixeira disse:
          Escreva  ("        Para começar me diga seu nome por favor: ")
          Leia (Nome)
          Escreval ("                                                      ")
          Escreval (" Ola, ", nome, " Paz do senhor :) ")
          Escreval ("                                                      ")
          Escreva  ("  Qual personagem biblico você gostaria de conhecer?  ")
          Leia (Nome)
          Se (Paulo) então

     

    Você está utilizando a mesma variável para duas coisas distintas. Poderia utilizar nome1 e nome2, por exemplo.. No caso lá vai perder o nome do usuário. Outro ponto é buscar seguir boa semântica para as nomenclaturas de variáveis. Exemplo:

     

    var
       nome, personagem: caractere

     

    Ou melhor ainda:

     

    var
       nomeUsuario, nomePersonagem: caractere

     

    Segue um exemplo de base de código:

     

    algoritmo "Interação com usuário"
    var
       nomeUsuario, nomePersonagem: caractere
    
    inicio
       escrevaL("|----------------------------------------------------|")
       escrevaL("|          Conhecendo personagens bíblicos!          |")
       escrevaL("|----------------------------------------------------|")
       escrevaL("                                                      ")
       escreva ("        Para começar me diga seu nome, por favor: ")
       leia(nomeUsuario)
       escrevaL("                                                      ")
       escrevaL(" Olá!, ", nomeUsuario, ". Paz do senhor :)")
       escrevaL("                                                      ")
       Escreva ("  Qual personagem bíblico você gostaria de conhecer?  ")
       leia(nomePersonagem)
    
       se (nomePersonagem = "Paulo") então
          escrevaL(" Historia de Paulo ")
       senao
          se ((nomePersonagem = "João") OU (nomePersonagem = "JOÃO")  OU (nomePersonagem = "Joao")) então
             escrevaL(" Historia de João ")
          senao
             escrevaL(" Outro personagem")
          fimSe
       fimSe
    fimAlgoritmo

     

    Adendo: o VisualG não é case-sensitive para as comparações. Funciona como se o computador sempre comparasse as cadeias de caracteres todos em maiúsculas. Daí tanto faz, por exemplo, Paulo, paULo, paulo etc quando for digitado pelo usuário ou como quiser colocar dentro do se  (pois "tudo seria transformado" em PAULO na hora de comparar). Já os acentos são diferenciados. Teria que fazer uma combinação, como no exemplo acima.

     

    Adendo do adendo: se ligue que o que precisou ser diferenciado foi apenas o "ã" e o "Ã" (incluir sem acento pois pode ocorrer, aí vai de você querer aceitar ou não apenas a escrita com acentos), o restante da cadeia não importa se está maiúsculo ou não. (Tipo: vai comparar sempre JOAO e depois JOÃO.)

     

    Adendo do adendo do adendo: esse "problema" com as letras com acentos ocorre porque o "algoritmo nativo de tornar maiúsculo" não sabe ou não quer cuidar de acentos...  Veja:

     

    image.png

    (Na imagem acima, foi utilizada a função Maiusc() para escrever a palavra "João" em maiúsculo na tela. O resultado foi "JOãO". (Em detrimento do que pareceria ser mais lógico: JOÃO.)

  10. 23 horas atrás, Eli Almeidaa disse:

    elas não são variáveis globais?

     

    Sim. As variáveis são globais, pois elas estão no escopo global. São enxergadas por todo programa, mas o problema é outro. Está relacionado ao fluxo do algoritmo. Resumidamente: para o contexto, essas variáveis precisam ser reinicializadas a cada verificação de primo, pois a cada verificação elas precisam ter determinados valores iniciais (requisito do algoritmo da tal verificação). Veja:

     

    23 horas atrás, Eli Almeidaa disse:
    Inicio
        contarDivisor <- 0
        contador <- 1
    
    Repita
        escreval("Menu")

     

    Assim, a variável é inicializada apenas uma vez (o algoritmo fica errado)... simplesmente por "está fora do laço de repetição". Se colocar em algum lugar dentro do loop (dentro do repita) e que esteja antes de ser utilizado lá no caso 2, vai funcionar. Exemplo:

     

       repita
          escreval("Menu")
          escreval("1. Inserir número")
          escreval("2. Verificar se é primo")
          contarDivisor <- 0
          escreval("3. Sair")
          escreval("Escolha uma opção:")
          leia(opcao)
          contador <- 1
         
          escolha(opcao)
          caso 1
             escreval("Digite o número:")
             leia(numero)
          caso 2
             se numero <= 1 então
                escreval(numero, " não é primo.")

     

    Ou seja: antes de entrar no caso 2, a cada loop, necessariamente vai inicializar as duas variáveis que preciso lá... o problema de ficarem fora do caso 2 (dentro do repita, mas fora do escopo do caso 2) é que vai ser reinicializar sempre... mesmo que escolha o caso 1. Na prática não vai perceber diferença nenhuma na execução, mas tecnicamente seria um "desperdício de recurso", entende? Para que inicializar se não vai ser utilizada no caso 1? Para avaliação da lógica, seria considerado um erro. Mais correto é ficar dentro do caso 2 mesmo.

     

    Deixando dentro do caso 2, vai ser inicializado apenas quando precisa.

     

    Ah!, mas se no caso 1 também utilizasse essas mesmas variáveis? Aí poderia inicializar uma vez em cada caso, ou inicializaria antes do escolha. Aqui as duas formas poderiam seriam válidas. Teria que avaliar o que ficaria mais interessante.

     

     

     

     

    RESUMINDO:

    Assimile que o fluxo de execução execução do VisualG é "da esquerda para direita, de cima para baixo". Vai executando linha por linha. Daí, para o algoritmo funcionar corretamente, as instruções precisam está numa sequência válida para o contexto do algoritmo em si.

     

     

     

     

     

     

     

    Adendo 1

    Segue uma demonstração de porque não funciona se colocar ANTES do repita:

     

    image.png

     

    O VisualG vai executar linha por linha... quando chega num leia(), o programa para., pois fica aguardando o usuário informar o valor. Nesse momento, as variáveis estão com 0 e 1 respectivamente, pois foram os valores que acabaram de ser atribuído mais acima.

     

    image.png

     

    Inseri um valor qualquer...: 123. O programa volta para o menu e vou para a opção 2. Verificado se é primo. Após o resultado, o fluxo do programa voltar novamente para próximo linha após o repita... mostra o menu e pede para informar a nova opção. Veja como estão os valores das variáveis!!! Oras, ao informar um novo número (ou tentar verificar novamente o mesmo), essas variáveis, essenciais para a lógica de verificação, estarão com o "lixo" da execução anterior, comprometendo o resultado.

     

    Não é pela quantidade de divisores que teu algoritmo verificar se é primo?

    Em 06/07/2023 às 20:37, Eli Almeidaa disse:
                   se contarDivisor > 2 então
                      escreval(numero, " não é primo.")

     

    Dessa forma, sempre que for digitado um valor maior que 1, será executada a linha abaixo:

    Em 06/07/2023 às 20:37, Eli Almeidaa disse:
                      contador <- contador + 1

     

    Portanto, contarDivisor será atualizado e o algoritmo parará de funcionar corretamente, pois a variável terá um valor maior que 2 acusando para qualquer outro novo valor, que não é primo!

     

     

     

     

    Adendo 2:

    Em 06/07/2023 às 20:37, Eli Almeidaa disse:
    caso 1:

     

    Na sintaxe do escolha, cada caso não tem esses ":". Basta removê-los.

     

     

     

     

    Adendo 3: para entender melhor o fluxo, experimente diminuir a velocidade de execução. Exemplo:

    inicio
       timer 300
       contarDivisor <- 0
       contador <- 1
    
       repita
          escreval("Menu")
          escreval("1. Inserir número")
          escreval("2. Verificar se é primo")

     

    Defina a velocidade que quiser... o número ali depois do timer é em milissegundos.

    • Amei 1
  11. Em 13/06/2023 às 20:41, Emanuelli disse:

    A minha primeira dúvida é: como faço pra que quando o usuário inserir 0 na opção do Menu de Lanches, ele volte pro Menu Principal?

     

    Basicamente utilizando um laço de repetição. Conceito que já está utilizando.

     

    Entenda assim: o VisualG é um interpretador de código, que vai executando linha a linha... daí, como quer "voltar", teríamos duas opções: ou de alguma forma fazer "pular" para a linha anterior desejada (conceito de label), ou deixar o trecho do código dentro de um laço de repetição, dessa forma, ao finalizar um laço dessa repetição, o interpretador entenderia que deveria ir para o início do laço.

     

    Na prática, basicamente isso:

    inicio
       repita
          escrevaL("                 MENU PRINCIPAL                 ")
          escrevaL("------------------------------------------------")
          escrevaL("1 - LANCHES")
          escrevaL("2 - ACOMPANHAMENTOS")
          ...
       ate (opcao = 0)
       ...
     fimAlgoritmo

     

    Adendo: você está reutilizando a mesma variável para as opções, o que pode fazer perder informações entre as "telas". Precisa ajustar. Exemplo:

     

    algoritmo "Nome ou descrição do programa"
    var
       opcao, codItem : inteiro
    
    inicio
       repita
          escrevaL("                 MENU PRINCIPAL                 ")
          escrevaL("------------------------------------------------")
          escrevaL("1 - LANCHES")
          escrevaL("2 - ACOMPANHAMENTOS")
          escrevaL("3 - BEBIDAS")
          escrevaL("0 - PARA SAIR DO SISTEMA")
          escrevaL("------------------------------------------------")
          escrevaL("")
          escrevaL("Insira a opção desejada:")
          leia(opcao)
          escreval("")
    
          enquanto ((opcao < 0) OU (opcao > 3)) faca
             escrevaL("Opção inválida, digite novamente:")
             leia(opcao)
          fimEnquanto
    
          // Segunda tela do cardápio, o Menu de Lanches
          se (opcao = 1) então
             repita
                escrevaL("                    LANCHES                     ")
                escrevaL("------------------------------------------------")
                escrevaL("1 - XTUDO------------R$17,00")
                escrevaL("2 - XBURGUER---------R$15,00")
                escrevaL("3 - XBACON-----------R$15,00")
                escrevaL("4 - XSALADA----------R$10,00")
                escrevaL("5 - XEGG-------------R$10,00")
                escrevaL("6 - MISTO QUENTE------R$8,00")
                escrevaL("7 - BIG BAURU--------R$16,00")
                escrevaL("0 - VOLTAR AO MENU PRINCIPAL")
                escrevaL("")
                escrevaL("Insira a opção desejada:")
                leia(codItem)
                escrevaL("")
             ate (codItem = 0)
          fimSe
       ate (opcao = 0)
    fimAlgoritmo

     

    Adendo: por uma questão de semântica, utilizei codItem... Nesse caso não teria problema utilizar essa mesma variável para o menu 2, menu 3 etc, percebe? Pois as informações que não podem ser perdidas são as entre "pai e filho", ou seja, entre o item de menu e o menu principal. Daí, se tiver outra opção como "quantidade de item", teria que ser outra variável, como por exemplo: qtdItens. Cada sub-nível dentro do seu próprio mundinho.

     

    Adendo 2: veja como fica melhor opcao, codItem e qtdItem etc, em vez de algo como opcao1, opcao2, opcao3 etc.. Fica mais fácil para saber qual variável usar... ficaria estranho utilizar qtdItem lá no menu da escolha do item, saca? Logo, mais prático para se organizar.

     

    Adendo 3: o nível de organização vai do enunciado e do que deseja implementar... seguindo uma lógica, se tem "validação de entrada para o menu principal" seria sensato fazer o mesmo para cada sub item de menu lá quando selecionar o lanche. Sugiro ir prezando pera padronização dos conceitos... tende a facilitar.

  12. @DougrasDen, uma dica inicial que dou (lá ele) seria: vá implementando o código aos poucos. Faz um pouco e testa, faz um pouco e testa... Já evitaria esse problema... veja:

     

     

    Vou me basear pela versão 3.0.6.5 do VisualG. Meio que versão padrão.

     

    Em 14/06/2023 às 13:17, DougrasDen disse:

    infelizmente ocorre o erro de "esperava encontrar fimalgoritmo", como resolvo? ajudem

     

    Basicamente não existe o comando fim no VisualG, ou seja, assim que tivesse implementado essa função, já veria que o problema estaria nela. O erro citado ocorre porque o VisuaG não está conseguindo montar a função, daí apresenta problemas tudo! (O VisualG não compila códigos, ele vai interpretando linha por linha... por isso os erros apresentados nem sempre ficam claros.)

     

    Só corrigir:

    funcao lancarDado(): inteiro
    var
       face: inteiro
    inicio
       face <- aleatorio(1, 6)
       retorne face
    fimFuncao

     

    Pronto! Resolveria o erro informado.

     

    Aí vai vendo os outros pontos... Ah! Ao testar essa função, verás que a sintaxe do aleatorio está em inconformidade. Essa estrutura não vai rodar... aí pararia para entender e corrigir... mais abaixo dou uma solução. 

     

    OK. Ainda nesse sentido de implementar aos poucos, veja como seria mais fácil identificar que existe outro problema análogo.

     

    image.png

     

     

    Ou seja: "ué? Por que não funcionou? Ah! Porque ali é fimAlgoritmo". Após corrigir, veria que rodaria normalmente.... Entende? A medida que vai implementando algo novo, já testa... com o tempo vai pegando as manhas e vai testando menos... Daí precisaria ter a noção que provavelmente os erros que ocorrem seriam a partir que está implementando agora, "pois o que já está no código meio que já estão testados...".

     

    Vamos seguir esse exemplo de implementando aos poucos...

     

    image.png

     

    Opa! Rodou, mas o leia() não funcionou. O código passou direto. Só entender o problema e tentar corrigir. Exemplo:

     

    image.png

     

    Resumidamente, precisaria usar uma variável qualquer... no VisualG não funciona o leia() puro; (No Pascal funciona.)

     

    Observe que a ideia aqui é que não deve fazer sentido um algoritmo ter diversos erros distintos, pois alguns desses erros não eram para deixar evoluir... já vai tentando deixar pelo menos rodando sem erros de sintaxe...

     

     

    Vai implementando e testando.. outro ponto:

     

    Em 14/06/2023 às 14:55, Arthur Arnemann disse:
    senao se soma = 2 ou soma = 3 ou soma = 12 então

     

    No VisualG NÃO É possível deixar dois comandos "distintos" na mesma linha. Necessariamente precisa ficar abaixo. (Obs.: no Pascal, pai do VisualG, pode! Aqui não.)

     

    Seria:

       senao
          se soma = 2 ou soma = 3 ou soma = 12 então
             escreval("Você perdeu!")

     

    Aqui deve surgir outro problema... que seria a "separação das instruções do se". Pode ser que não dê erro (tenho quase certeza que dá). Usaria algo como:

     

          se (soma = 2) OU (soma = 3) OU (soma = 12) então
             escrevaL("Você perdeu!")

     

    Eu particularmente deixo meus se com um parêntese principal. Ficaria assim:

     

          se ((soma = 2) OU (soma = 3) OU (soma = 12)) então
             escrevaL("Você perdeu!")

     

     

    Atenção: todo se tem o seu fimSe correspondente. Precisa ter atenção nisso.

     

     

     

    Sobre o problema lá do aleatório. Poderia fazer algo como:

     

    funcao lancarDado(): inteiro
    var
       face: inteiro
    inicio
       face <- randI(6)+1
       retorne face
    fimFuncao

     

     

    Existem outros probleminhas. Aí tem duas opções:

     

    ou refaz o código do zero. Implementando os poucos... vai pegando o que já fez como base, mas recomeçando do zero mesmo.

    ou vai testando e descobrindo os problemas, e corrigindo aos poucos. Acho que dá mais trabalho.

     

    O melhor dos mundo seria fazer as duas coisas. Que aí treinaria bastante.

     

    Qualquer dúvida é só postar.

  13. Em 16/06/2023 às 21:04, ViniciusMb disse:

    porém o professor continua apontando um erro, eu e meu amigo ja olhamos em tudo e não encontramos

     

    Qual erro?

     

    Basicamente seria isso: foque no problema. Entendendo o problema, fica mais fácil achar uma solução.

     

    Um detalhe:

     

    Em 16/06/2023 às 13:46, ViniciusMb disse:
    Var
       // Seção de Declarações das variáveis
       opc , oplanch, opacompanhamento , opbebida, qtd : inteiro
       vlLanch, vlAcompanhamento , vlBebida : real
       Lanches, Acompanhamento , Bebidas , Total : real
    
    
    
    
    
    
    
    
    
    
    
     Total <- 0

     

    Faltou o comando inicio após a declaração das variáveis e início da execução principal. Exemplo:

     

    algoritmo "Nome do meu programa"
    var
       opc, oplanch, opacompanhamento, opbebida, qtd : inteiro
       vlLanch, vlAcompanhamento, vlBebida : real
       Lanches, Acompanhamento, Bebidas, Total : real
    
    inicio
       Total <- 0
       opc <- 0

     

     

    Um outro detalhe é que, ao finalizar um item do menu e volta para o menu principal, está informando o "valor do pedido"... o que para mim ficou estranho, já que ainda não finalizou o pedido.

     

    image.png

     

    Seria "um subtotal dessa categoria"?

     

    De um modo geral, seria necessário seguir o que está no enunciado. É ele que define o que se deve fazer. Mesmo que o programa esteja rodando tudo certinho, precisa fazer o que se pede.

     

    Posta o enunciado e qual o erro específico que foi relatado.

     

     

    Adendo:

    Em 16/06/2023 às 14:43, Diego Mendes Rodrigues disse:

    - O nome das variáveis no Portugol não pode ser CamelCase, como vlLanch, todas as letras dever ser minúsculas utilizando um separador _, como valor_lanche

     

    Entendo que não existe uma regra de padrão de escrita para o Portugol (do VisualG), ou seja, poderia utilizar o padrão que quiser. O ponto que levantaria seria manter um padrão... deixar uma estrutura mais uniforme e organizada.

     

    No VisualG poderia usar camelCase, PascalCase, snake_case etc. Particularmente recomendo o camelCase, mas o uso do snake_case também é bem popular... Só recomendo muito o uso do PascalCase... de um modo geral não fica agradável para mim... 

     

    Obs.: em algumas linguagens de programação, é meio que obrigatório alguns padrões específicos, caso contrário, o código não compila, ou seja, essa forma de escrita fazendo parte da sintaxe em si.

  14. @juanitokol, comece fazendo os exercício que o próprio professor deve está sugerindo para fazer.

     

    De um modo geral, existem três tipos de laços de repetição no VisualG:

    • Repita;
    • Enquanto;
    • Para.

    Estude um pouco mais sobre um deles. Qual qualquer um. Daí tente fazer exercícios. Caso tenha dúvidas, poste o enunciado, o código completo e em qual parte está com dúvidas.

     

    No aguardo.

  15. @Bruno Pz, me parece que ficou tudo certinho! Muito bom!

     

    Adendo: apenas o detalhe que dá BO se tiver mais 400 anos ou se nasceu no ano corrente (idade 0). 😄

     

    Adendo 2: como observável, a lógica independe da linguagem. O que muda aí é que o C teve estruturas que facilitaram/aprimoraram o algoritmo, por exemplo, com a coleta da "data" atual.

     

    Não programo em C, mas vou tentar explicar o que eu entendi da estrutura:

     

    Em 28/05/2023 às 18:13, Bruno Pz disse:
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);

     

    O time() retorna o "dados de data atual" em determinado formato. O "localtime() usa a hora apontada pelo timer para preencher a variável tm com os valores que representam a data/hora correspondente passada pelo parâmetro", ou seja, foi declarado a variável tm (o C permite e eventualmente resolveu utilizar a mesma nomenclatura da struct. Poderia ser outra!), que por sua vez é do tipo (struct) tm (algo nativo de alguma biblioteca)... e na mesma linha já definiu que seu valor vai ser igual ao retorno do tal localtime(). Portanto, a variável tm terá em si os dados de data/hora preenchidos, assim posteriormente podendo coletar o ano, mês e dia de forma mais simples (acessando os campos da struct da variável).

     

    a struct tm teria essa estrutura:

    struct tm {
       int tm_sec;         /* seconds,  range 0 to 59          */
       int tm_min;         /* minutes, range 0 to 59           */
       int tm_hour;        /* hours, range 0 to 23             */
       int tm_mday;        /* day of the month, range 1 to 31  */
       int tm_mon;         /* month, range 0 to 11             */
       int tm_year;        /* The number of years since 1900   */
       int tm_wday;        /* day of the week, range 0 to 6    */
       int tm_yday;        /* day in the year, range 0 to 365  */
       int tm_isdst;       /* daylight saving time             */	
    };

     

    Só para deixar mais claro... segue o exemplo:

        time_t t = time(NULL);
        struct tm nome_que_eu_quiser_incluse_tm;
        nome_que_eu_quiser_incluse_tm = *localtime(&t);
    
        printf("Digite o nome completo do aluno(a): ");
        fgets(nome, 100, stdin);
    
        printf("Digite a data de nascimento (dd mm aaaa): ");
        scanf("%d %d %d", &dia, &mes, &ano);
    
        idade = nome_que_eu_quiser_incluse_tm.tm_year + 1900 - ano;
        if (nome_que_eu_quiser_incluse_tm.tm_mon + 1 < mes 
           || (nome_que_eu_quiser_incluse_tm.tm_mon + 1 == mes && nome_que_eu_quiser_incluse_tm.tm_mday < dia)) {
            idade--;
        }

     

    Observem que isso:

        struct tm nome_que_eu_quiser_incluse_tm;
        nome_que_eu_quiser_incluse_tm = *localtime(&t);

     

    foi para exemplificar que é a mesma coisa que isso:

    struct tm nome_que_eu_quiser_incluse_tm = *localtime(&t);

     

    Quem puder me corrigir/complementar em algo, também agradeço.

     

    Adendo 3: o Portugol seria apenas uma forma de "pescar" os estudantes... utilizando do nosso idioma como chamariz. Passou um pouquinho do nível iniciante, melhor coisa é partir para algo mais avançado e robusto mesmo! 🙂

     

    Como observável, tirando a parte da "coleta da data atual", que não é especificamente trivial os detalhes, o restante é basicamente a mesma coisa, só mudando a sintaxe dos comando (de português para inglês e com formas e ordem divergentes). Só isso. Em relação ainda à parte da data, também não tem mistério.. seria só "como pego a data atual do sistema em C?". Daí só "copiar" a estrutura! Ninguém precisaria dominar os detalhes em C ou qualquer outra linguagem para utilizar recursos... o que tentei explicar/comentar acima, seria apenas uma forma de tentar "aprofundar" e entender mais ou menos como funcionaria as coisas... mas se não quisesse entender detalhes, também seria de boa.. apenas precisa entender lá na parte de usar os campos do tm. Tipo:

     

     

    Saber como isso funciona não é tão relevante (mais é interessante):

     

    Em 28/05/2023 às 18:13, Bruno Pz disse:
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);

     

    Pois podem-se abstrair e saber que pode fazer isso:

     

    idade = tm.tm_year + 1900 - ano;

     

    Ou seja: o que "me importa" é que vou ter uma variável que nela tem esses dados de data que preciso.

     

    Ah! só para finalizar essa questão da abstração, seria algo como:

     

    struct tm tm = *localtime(&t);

     

    Esse struct tm seria como se fosse um tipo em si... como se fosse algo assim: 

     

    int tm = *localtime(&t);

     

    Espero que não tenha viajado d+... 😄

     

  16. @juanitokol, show! Parabéns!

     

    Alguns pontos: basicamente no início é vai aprendendo a ter mais atenção aos detalhes. É normal não "enxergar" todos no início. Faz parte da aprendizagem conseguir focar melhor neles. Por exemplo:

     

    7 horas atrás, juanitokol disse:
    se (n3 = s) ou (n3 <> n ) então


    Veja: n3 é uma variável. Daí você definiu para comparar com outra variável de nomenclatura s. Depois colocou para compara com a variável n. Você nem declarou essas variáveis. Daí, pelo contexto, fica claro que queria comparar com o caractere "s" ou "n"... ou com a cadeia de caracteres "sim" ou "não", correto? Para tanto, usam-se justamente as "aspas duplas".

    se (n3 = "s") então

     

    Pense assim: como o computador iria diferencia s (variável) de s (caractere)? As aspas duplas estão servindo para isso! Como estava sem aspas, o computador pensa que é uma variável ou algum comando da linguagem.

     

    Ah! Observe que a segunda expressão (n3 <> "n") não é necessária.

     

    Ou se quiser incluir o "sim":

    se ((n3 = "s") OU (n3 = "sim")) então

     

    Desse forma... se informar "s" OU (disjunção) se informar "sim", a expressão vai resultado VERDADEIRO. Quaisquer outros valores resultaram em FALSO.

     

    Caso queira o contrário, ou seja, qualquer valor diferente de "n" aceite como verdadeiro, aí só ajustar a expressão:

    se (n3 <> "n") então

     

    Nesse caso, qualquer valor que não seja "n" vai resultar em VERDEDEIRO. O contrário resultará em FALSO.

     

    Se incluindo o "não":

    se ((n3 <> "n") E (n3 <> "não")) então

     

    Observe que aqui está utilizando (conjunção), pois seria para "uma resposta diferente de 'n' E também diferente de 'não'".

     

     

     

    Segue umas dicas gerais:

    - utilize nomenclatura de variáveis mais sugestíveis;

    - sugiro um pouco mais de atenção com o nosso idioma (português). Assim com o Portugol, ela também é uma linguagem com regras... precisam* ser seguidas, sobretudo sobre "acentuação".

     

    algoritmo "Meu primeiro programa"
    var
       nome, resposta : caractere
       numero1, numero2, resultado : inteiro
       anoNascimento, anoAtual, idade : inteiro
    
    inicio
       escreva (" Olá! Qual é seu nome? ")
       leia(nome)
       escrevaL(" ", nome, ", como está?") //pergunta retórica!
       escreva (" Bora brincar de calculadora? [s/n] ")
       leia(resposta)
    
       se (resposta = "s") então
          escreva (" Primeiro número: ")
          leia(numero1)
          escreva (" Segundo número: ")
          leia(numero2)
          resultado <- numero1*numero2
          escrevaL(" O resultado foi ", resultado:1)
       senao
          escrevaL(" Então irei calcular a tua idade ")
          escreva (" Em que ano você nasceu? ")
          leia(anoNascimento)
          escreva (" Em que ano estamos? ")
          leia(anoAtual)
          idade <- anoAtual-anoNascimento
          escrevaL(" Tua idade é ", idade:1)
       fimSe
    fimAlgoritmo

     

    image.png

     

    image.png

     

     

    Qual dúvida é só postar.

  17. Em 15/05/2023 às 14:57, Jackson Vanutty disse:

    Está dando erro na compilação! Queria saber se conseguir preencher todos requisitos apresentados na questão.

     

    São duas coisas distintas. [1] erro de compilação; [2] atender aos requisitos.

    Vou tentar detalhar cada uma delas.

     

     

     

    Sobre o erro: qual erro está dando?

    A partir do erro verificado, tenta entendê-lo:

     

    image.png

     

    Ou seja, o esperado seria que visse esse erro, tentasse entender e depois tentar solucionar. Caso não, aí citaria o tal erro no fórum. 🙂

     

    O que quero dizer: é menos didático os colegas pegarem o código, testar, descobrir qual o suposto erro que está enfrentando, e depois dar uma sugestão de solução. Melhor já entender do que se trata e ser específico (tanto para tentar resolver sozinho, tanto para pedir auxílio). 😉

     

     

    O erro fala sobre algo relacionado à inicialização da variável x_ingresso. Como sugerido pelo @devair1010, eventualmente esta variável precisa ter um valor inicial, mas você "não inicializou ou ela pode não ser inicializa no percurso", ou seja, ali na linha 25, essa variável está sendo usada para ser impressa, correto? Mas, tecnicamente, a execução poderia chegar lá sem ter um valor para essa variável... Como assim? O compilador entende algo assim: "vixe, pode ser que o computador tente imprimir uma variável sem que ela tenha tido um valor inicial. Não vou deixar compilar". Variáveis seriam apenas "espaços de memória". Se a variável não for inicializada, ela estaria com o lixo de memória antes do espaço ser reservado, aí podendo bugar o programa.

     

    O segredo do problema está nesse trecho:

     

                se (lucro > lucro_maximo)
                {
                    lucro_maximo = lucro
                    x_ingresso = ingresso
                    numero_ingressos_max = numero_ingressos
                }

     

    Observe que a variável x_ingresso estaria para receber um valor, ou seja, seria inicializada (e não daria erro de compilação). Entretanto, o comando está dentro de um se, que por definição é uma estrutura de seleção, logo, podendo ser executado o que está dentro do se ou não. O compilador protege de uma má execução do programa!!! Além disso, esse se está dentro de um para, que tecnicamente pode ser que sequer inicie o loop... Esses são os motivos para o compilador te forçar que a variável x_ingresso tenha algum valor inicial antes de ser utilizada o valor. 

     

    Adendo: para deixar claro, sempre em algum momento as variáveis precisam primeiro receber um valor qualquer antes de ser usado para cálculo ou exibição. Se ela já recebe durante o fluxo, não precisa "inicializar" na declaração. Veja por exemplo a variável ingresso. Não precisa!

     

     

    RESUMINDO:

    Em relação à sintaxe, só é preciso inicializar as 3 variáveis que estão sendo impressas:

     

    Em 15/05/2023 às 14:57, Jackson Vanutty disse:
            escreva("\nCom o ingresso no valor de: ", x_ingresso)
            escreva("\nVendendo ", numero_ingressos_max, " ingressos")
            escreva("\nO valor do lucro máximo será de: ", lucro_maximo)

     

    E a variável que está sendo utilizada no cálculo:

    Em 15/05/2023 às 14:57, Jackson Vanutty disse:
    numero_ingressos = numero_ingressos + (valor_ingresso * 26)

     

     

    O restante NÃO precisa. Não precisa nem preocupar quando deve inicializar ou não.. se não compilar, vai lá e inicializa. Isso é bom que vai acostumando com os erros!!!

     

    Observe que a variável valor_ingresso é inicializada no para, logo, inicializar na declaração ficou redundante.

    Em 15/05/2023 às 14:57, Jackson Vanutty disse:
    para (valor_ingresso = 5; valor_ingresso <= 8; valor_ingresso++)

     

     

     

    RESUMO DO RESUMO

    Se atente ao erro informado. Geralmente é um bom indicativo do que exatamente está ocorrendo. Daí, aplica o sugerido, mesmo que eventualmente não entenda o motivo do erro, mas já saberia que por algum motivo está precisando que inicialize, daí, só inicializar.

     

    DICA:

    Não inicialize as variáveis por inicializar (nada de "vou inicializar logo aqui para evitar erro"). Deixe o compilador dar erro mesmo e tente entender o motivo. Com o tempo se acostuma e aí inicializaria sabendo do que está fazendo.

     

     

     

    Sobre os requisitos: quais requisitos faltam?

     

    Oras! provavelmente, se não estava compilando, você meio que não conseguiu testar muita coisa. Mete mão aí. Testa, tenta entender o que ocorre e daí busca uma solução caso necessário. Mas sempre tente primeiro entender o problema!!!

     

    Tendo dificuldades, informa qual é... (tipo, não funcionaria muito bem um só "não consegui resolver" ou algo do tipo, saca?)

    • Curtir 1
    • Obrigado 1
  18. Se estiver estudando enquanto... pode usar ele mesmo! Um outro princípio do dia a dia seria: se está estudando sobre um determinado tema, tecnicamente os exercícios são para serem aplicados com ele... mesmo que exista algo mais simples, por exemplo. Isso também parece óbvio depois que percebe. 😄

     

    Tipo... se rola um plano de estudos, quando "chegar no estudo do para", ficaria ainda mais claro porque o uso dele seria mais "adequado" para algumas situações (como desse exercício)... O para é para contextos mais específicos (basicamente que tem uma quantidade determinada de repetições), ao mesmo tempo, torna ele mais limitado (menos flexível em nível de condições de parada) que o enquanto ou repita. É análogo ao uso do escolha, que para situações mais específicas, pode substituir bem um conjunto de se/senão, mas fica limitado a poucos casos gerais. 

    • Curtir 1
  19. Dúvida:

    47 minutos atrás, eulercruz_ disse:

    Apenas coloquei [] e {} para destacar os pares e ímpares, mas como faço o programa dizer quais são os pares e ímpares? Muito obrigado pela ajuda 😀

     

    O segredo para resolver qualquer problema é saber do que o problema se trata.

     

    Enunciado:

    45 minutos atrás, eulercruz_ disse:

    Crie um programa que leia 6 números inteiros e no final mostre quantos deles são pares e quantos são ímpares.

     

    Em qual momento estaria solicitando "quais"? Entende?

     

    Imagine um cliente pedir um cachorro quente simples num restaurante, daí o garçom entrega um delicioso hambúrguer! "Oras! Meu consagrado, eu te pedi um cachorro quente. O que é isso?". 🙂

     

    A tua dúvida seria apenas um detalhe para finalizar o algoritmo... mais abaixo exemplifico como poderia ficar. Vou aproveitar para citar como sugeriria criar esboços:

     

    - como são 6 números inteiros, ou seja, um quantidade fixa de leitura, ficaria mais simples utilizar para, em vez de enquanto.

    - para simplificar os testes, utilizar uma quantidade menor, como apenas 2.

     

    algoritmo "Quantidade de pares e ímpares"
    //Crie um programa que leia 6 números inteiros e no final mostre quantos deles
    //são pares e quantos são ímpares.
    
    var
       i, numero : inteiro
    inicio
       para i de 1 ate 2 faca //testando com 2, depois muda para 6
          leia(numero)
       fimPara
    
    fimAlgoritmo

     

    Daí só adicionar a verificação e exibir o resultado:

    algoritmo "Quantidade de pares e ímpares"
    //Crie um programa que leia 6 números inteiros e no final mostre quantos deles
    //são pares e quantos são ímpares.
    
    var
       i, numero : inteiro
       qtdPares, qtdImpares : inteiro
    inicio
       qtdPares <- 0 //[1]
       qtdImpares <- 0
    
       para i de 1 ate 2 faca //testando com 2, depois muda para 6
          leia(numero)
    
          se (numero % 2 = 0) então
             qtdPares <- qtdPares+1
          senao //[2]
             qtdImpares <- qtdImpares+1
          fimSe
       fimPara
    
       escrevaL("Quantidade de pares   : ", qtdPares:1)
       escrevaL("Quantidade de ímpares : ", qtdImpares:1)
    fimAlgoritmo
    
    //1. como está funcionando como um contador, precisa* inicializar as variáveis
    //   obs.: o VisualG já zera automaticamente, mas vai acostumando com a boa prática
    
    //2. todo número inteiro OU é par, ou é ímpar. É uma dicotomia, logo, se não
    //   for par, será necessariamente ímpar. Não precisa retestar

     

     

     

     

    Sobre "dizer quais são os pares e ímpares", uma forma seria simplesmente exibir:

     

    algoritmo "Quantidade de pares e ímpares"
    //Crie um programa que leia 6 números inteiros e no final mostre quantos deles
    //são pares e quantos são ímpares.
    
    var
       i, numero : inteiro
       qtdPares, qtdImpares : inteiro
    inicio
       qtdPares <- 0 //[1]
       qtdImpares <- 0
    
       para i de 1 ate 2 faca //testando com 2, depois muda para 6
          escrevaL("Digite o número desejado")
          leia(numero)
    
          se (numero % 2 = 0) então
             qtdPares <- qtdPares+1
             escrevaL("O número ", numero:1, " é par")
          senao //[2]
             qtdImpares <- qtdImpares+1
             escrevaL("O número ", numero:1, " é ímpar")
          fimSe
    
          escrevaL()
       fimPara
       escrevaL()
       escrevaL("Quantidade de pares   : ", qtdPares:1)
       escrevaL("Quantidade de ímpares : ", qtdImpares:1)
    fimAlgoritmo
    
    //1. como está funcionando como um contador, precisa* inicializar  as variáveis
    //   obs.: o VisualG já zera automaticamente, mas vai acostumando
    
    //2. todo número inteiro OU é para, ou é ÍMPAR. É uma dicotomia, logo, se não
    //   for par, será necessariamente ímpar. Não precisa retestar

     

    image.png

     

     

    Após testar direitinho, muda para 6 números e testa.

     

    Ah! para facilitar os testes, é possível gerar números aleatórios. Uma forma simples e rápida seria assim:

     

    image.png

     

    Para parar, só desativar novamente.

     

    Aí vai ajustando até ficar da forma que desejar.

     

    ADENDO: lembrando que o enunciado NÃO pede quais são pares ou ímpares, portando não devem ficar na versão final.

     

    Um outro exemplo:

    image.png

     

  20. 21 horas atrás, Jackson Vanutty disse:

    @devair1010 e @Simon Viegas, consegui desenvolver uma estrutura, mas não estou conseguindo rodar ainda! poderiam me dar um help? 

     

    A pergunta seria: não conseguindo porque? Qual erro está ocorrendo?

     

    Se o erro foi lá no caractere (sem o "e"), o fato de ter uma "linha" abaixo das palavras já indica que tem erro... mas é só remover o "e" no final mesmo.

     

    image.png

     

     

     

     

    Apenas colei o código e teste:

    image.png

     

    Idem: a mensagem aí já diz o que precisa fazer. Sem mistério.

     

        cadeia novoNome = "", nome

     

     

     

     

    Por fim... por que raios está inicializando i com 1?

     

    Segue um código completo:

     

    programa
    {
    	inclua biblioteca Texto --> tx
    	
    	funcao inicio()
    	{
    
    	cadeia nome, novoNome = ""
    	caractere letra
    	inteiro i = 0 
    	
    	escreva("Digite o nome a ser criptografado: ")
    	leia(nome)
    	
    	faca {
    		letra = Texto.obter_caracter(nome, i)
    		
    		se (letra == 'A' ou letra == 'a')
    			novoNome = novoNome + "1"
    		senao se (letra == 'E' ou letra == 'e')
    			novoNome = novoNome + "2"
    		senao se (letra == 'I' ou letra == 'i')
    			novoNome = novoNome + "3"
    		senao se (letra == 'O' ou letra == 'o')
    			novoNome = novoNome + "4"
    		senao se (letra == 'U' ou letra == 'u')
    			novoNome = novoNome + "5"
    		senao se (letra == ' ')
    			novoNome = novoNome + '#'
    		senao 
    			novoNome = novoNome + letra
    			
    		i = 1 + i
    	} enquanto (i < Texto.numero_caracteres(nome))
    		escreva ("O nome criptografado: ", novoNome)
    	}
    }

     

    Sugestões de melhorias:

    1. o que está sendo coletado no obter_caracter(nome, i) não é uma letra, mas sim um caractere, logo, o nome da variável não está semântica. Mude para outra, exemplo: caract ou algo que remeta a "caractere".
    2. como a laço de repetição tem um limite determinado, alteraria de faça/enquanto para para;
    3. em vez de uma cadeia de se/senao, utilizar escolha/caso.

     

    Adendo: o corretor do Fórum está inserindo o "e" no final de caractere, mas no Portugol Studio não tem! 

    • Curtir 1
    • Obrigado 1
  21. @Jackson Vanutty, você está estudando VisualG ou Portugol Studio? Isso vai apenas influenciar na hora de implementar. Mas a lógica para resolver NÃO DEPENDE DE LINGUAGEM DE PROGRAMAÇÃO. Você precisa pensar em como resolveria isso, por exemplo, no papel.

     

    Quais passos que poderiam ser feitos para transformar Maria Santos em M1r31#S1nt5s? Pense numa solução e descreva na sua resposta.

     

     

     

    Para adiantar, caso já tenha algo em mente em como resolver, é só traduzir para a linguagem escolhida. Um exemplo de esboço para VisualG:

     

    Algoritmo "Criptografia de nomes"
    // Disciplina  :
    // Professor   :
    // Autor(a)    : Jackson Vanutty
    // Data atual  : 14/05/2023
    
    // Enunciado   :
    //Faça um programa para criptografar o nome de uma pessoa. O programa deverá
    //ler o nome e mostrar o novo nome criptografado. A cifração ou encriptação
    //deverá ocorrer apenas sobre as vogais A, E, I, O, U e sobre o caractere
    //espaço (em branco), quando houver. As vogais deverão ser substituídas
    //respectivamente pelos algarismos 1, 2, 3, 4, 5 e o caractere espaço deverá
    //ser trocado pelo caractere cerquilha (#).
    
    //Exemplo: A cifração do nome Maria Santos seria M1r31#S1nt5s
    
    //OBS: É vedado o uso de vetor/matriz ou algum outro tipo estruturado de dado.
    //O Portugol Studio/Visualg possuem funções para manipulação de string (cadeia
    //de caracteres). Utilize-as para resolver as questões a seguir, caso
    //necessário.
    
    var
    nomeOriginal, nomeCriptogrado : caractere
    
    inicio
    escrevaL("Informa o nome a ser criptografado")
    leia(nomeOriginal)
    
    
    //Aqui você implenta um lógica que fará o solicitado no enunciado
    
    
    //Abaixo um exemplo que simplesmente retorna o nome todo em maiúsculo
    nomeCriptogrado <- Maiusc(nomeOriginal)
    
    escrevaL("Nome original     : ", nomeOriginal)
    escrevaL("Nome criptografado: ", nomeCriptogrado)
    
    fimAlgoritmo

     

    Ou seja: se o enunciado fosse "leia o nome de uma pessoa e retorne o nome todo em maiúsculo", o código acima basicamente já resolveria isso. Pois existe uma função que já faz isso. Para o teu código, você precisa analisar caractere a caractere (já dando o spoiler).

     

    87,36% de uma solução já foi dada:

     

    Em 11/05/2023 às 03:41, devair1010 disse:

    @Jackson Vanutty,  no visualG você pode usar o comando "copia" para verificar cada letra da frase digitada, e junto com o comando "compr" que obtém a quantidade de caracteres da frase,  e use esses comandos dentro de um loop "para / fimpara" , e depois que você fizer um código sobre esse exercício, poste ele aqui e ajudaremos se ainda precisar.

     

    Basicamente pesquise sobre o comando Copia() e Compr() no Visualg. Entendendo como eles funcionam, perceberá como ele pode ser útil para uma lógica que resolva esse problema (atenda ao enunciado).

     

    • Curtir 2
  22. @Pedro Roth, para não passar em branco, segue algumas dicas:

     

     

    Passagem de parâmetros ou uso direto de variáveis globais

     

    Em 04/05/2023 às 18:58, Pedro Roth disse:
    var
       Opcao: inteiro
       VMV, VMC, IN, TotM, Porce, TotPorce: real
       Resp: caractere
       
    Procedimento ProcM(VMV, VMC, IN, TotM, Porce, TotPorce:Real)
    var
       Resp2:Caractere
    inicio

     

    Como as variáveis estão como globais, não precisaria passar por parâmetro. Ainda mais que não estão passando valores, pois estes são lidos dentro do procedimento.

     

    Alternativa 1:

    Se quer utilizar as variáveis globais, seria só remover os parâmetros mesmo:

     

    procedimento ProcM()

     

    Daí ajustar as chamadas do procedimentos. Exemplo:

     

       caso 1
          ProcM()

     

     

     

    Alternativa 2:

    Declarar as variáveis dentro dos procedimento. Acho melhor! Dessa forma, cada procedimento terá tudo que precisa dentro dele mesmo E/OU, se precisasse de um valor externo, usaria o parâmetro (em vez de acessar variáveis globais diretamente).

     

    var
       opcao: inteiro
       resp : caractere
    
    irocedimento ProcM()
    var
       mvm, vmc, in, totM, porce, totPorce: real
       resp : caractere
    inicio

     

    Adendo 1: as variáveis internas e globais são distintas (escopos diferentes), por isso é possível utilizar "resp" tanto fora, quanto dentro.

    Adendo 2: detalhe é que no VisualG não dá para diferenciar. Aqui só daria para acessar a variável local. ... mas, de qualquer forma, como não devemos utilizar variáveis globais diretamente, acaba não sendo um grande problema... (e para resolver isso, seria simplesmente usar outra nomenclatura 😉)

     

     

     

     

    Exemplo de bom* uso de parâmetros

    procedimento Menu(var opcao:inteiro)
    inicio
       escrevaL("---------------------------------------------------------------")
       escrevaL("                     CALCULADORA DE MILHAS                     ")
       escrevaL("---------------------------------------------------------------")
       escrevaL("  ")
       escrevaL(" O que você gostaria de calcular?")
       escrevaL(" [1] Pontos")
       escrevaL(" [2] Milhas")
       escrevaL(" [3] Sair")
       leia(opcao)
       escrevaL("---------------------------------------------------------------")
    fimProcedimento
    
    inicio
       repita
          Menu(opcao)

     

    Desta forma, está implícito que o parâmetro foi usado para que o procedimento retorne algo do escopo dele para o global. Ah! Isso é possível devido à palavra reservada var ali no parâmetro.

     

     

    Outra forma seria utilizando funções.

     

    funcao Menu() : inteiro
    var
       op : inteiro
    inicio
       escrevaL("---------------------------------------------------------------")
       escrevaL("                     CALCULADORA DE MILHAS                     ")
       escrevaL("---------------------------------------------------------------")
       escrevaL("  ")
       escrevaL(" O que você gostaria de calcular?")
       escrevaL(" [1] Pontos")
       escrevaL(" [2] Milhas")
       escrevaL(" [3] Sair")
       leia(op)
       retorne op
       escrevaL("---------------------------------------------------------------")
    fimFuncao
    
    inicio
       repita
          opcao <- Menu()
    
          escolha (opcao)

     

    Perceba que não é obrigado usar a mesma nomenclatura de variável. Mas poderia também. Tanto faz.

     

     

     

    Simplificação do "programa principal"

    Basicamente poderia remover o trecho "duplicado". Só ajustar o repita com o que está fora dele. Algo como:

     

    inicio
       repita
          Menu(opcao)
    
          escolha (opcao)
          caso 1
             ProcP()
          caso 2
             ProcM()
          caso 3
             escrevaL(" Encerrando... ")
             escrevaL("---------------------------------------------------------------")
             Timer 2000
             Timer 0
             LimpaTela()
          fimEscolha
       ate (opcao = 3)
    fimAlgoritmo

     

    Adendo:

    Em 04/05/2023 às 18:58, Pedro Roth disse:
             Caso 3
                Escreval(" Encerrando... ")
                Escreval("---------------------------------------------------------------")
                Timer(2000)
                LimpaTela
                Fimalgoritmo
             Fimescolha


    Na minha visão NÃO é possível utilizar o fimAlgoritmo para finalizar o programa dessa forma no VisualG. Considero com erro de sintaxe. Resumidamente: um algoritmo só deve ter um fimAlgoritmo, que basicamente é aquele associado ao inicio.

     

    Por sinal, no Pascal, o fimAlgoritmo seria equivalente ao "end."... e lá tem o os comandos exit e halt. Estes dois últimos "NÃO EXISTEM" no Visualg. E, mesmo lá no Pascal, não seria uma boa prática "forçar o encerramento" dessa forma, o mais correto seria "deixar o fluxo seguir" até que o programa chegue lá no "verdadeiro" fimAlgoritmo... que fica no fim do código, assim como sugerido mais acima.

     

     

     

     

    Sobre perguntar sobre novos cálculos

    Sugeria deixar ou dentro de cada procedimento ou dentro de cada opção.

     

     

     

    Em fim... tudo isso são "técnicas de programação". Independe da linguagem. Por sinal, o VisualG sequer é uma linguagem (é uma pseudolinguagem). O Visualg tem 2 pontos fontes para iniciantes: é em Português e tem essa "áreas de variáveis de memória" bem na cara... que ajuda muito... mas por outro lado tem muitas limitações e bugs, incluse desse de usar fimAlgoritmo onde não deve, rs.

     

    Se quiser dar continuidade por aqui não tem problema... mesmo que queira também já imergir em outra linguagem mais forte.

     

    • Curtir 1

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!