Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.931
  • Cadastrado em

posts postados por Simon Viegas

  1. Só complementando:

     

    Em 19/03/2021 às 11:41, Simon Viegas disse:

    Você não poderia ordenar uma fila, afinal, ela é uma FIFO.

     

    O que é um FIFO? 

    É: First in, first out, traduzindo: "Primeiro a Entrar, Primeiro a Sair”¹)... por uma análise óbvia, uma fila só pode ser ordenada se a ordem for exatamente igual a original 😄. Se mudou a ordem, deixou de ser FIFO... O mesmo ocorre para FILO ("First In Last Out"), no caso de pilhas. Se "pode mexer na ordem", então seria uma "lista".

     

    1 = lá ele

    • Obrigado 1
  2. 13 horas atrás, devair1010 disse:
    funcao sub_rotina(tam_vet : inteiro):inteiro
    Var
      A,L : inteiro
    Inicio
       Para    L de 1 ate 9      Faca
          Para A de 1 ate 10 - L Faca
             Se Vet[A    ] >  Vet[A + 1] então
                Aux        := Vet[A    ]
                Vet[A    ] := Vet[A + 1]
                Vet[A + 1] := aux
             FimSe
          FimPara
       FimPara
       retorne tam_vet
    Fimfuncao

     

    Está recebendo o parâmetro, mas não está usando na ordenação... Poderia ficar com algo assim:

       Para    L de 1 ate tam_vet     Faca
          Para A de 1 ate tam_vet - L Faca

     

    Daí o retorno também não seria necessário, pois está retornando o próprio valor original que foi recebido. Se não me engano isso seria uma Tautologia. Portanto, usaria um procedimento (que não tem retorno na próprio método), em detrimento de usar uma função (que é basicamente um procedimento que tem o tal retorno). 

     

    PS: em linguagens mais modernas/comuns, não existe diferenciação entre procedimento e função, tudo é função... daí, as funções podem ou não retornar algo... quando não precisa retornar, comumente é definido com o "retorno void" (que significa vazio), ou seja, se o VisualG tivesse esse conceito, um procedimento seria algo assim:

     

    funcao xpto () : vazio
    inicio
    
    fimFuncao

     

     

     

    Alguns pontos:

    19 horas atrás, Gustavo Alves7 disse:
    L, A, Aux: Inteiro


    Por que especificamente "L" e "A"? Tem alguma correlação com algo?

     

    Convencionalmente utilizam-se "i" e "j" como variáveis auxiliares para as iterações do para.

    i, j, aux : inteiro

     

    Como sugerível acima, as variáveis e comando também são comumentes iniciadas em minúsculo. Dá uma pesquisada sobre camelCase... (Obs.: isso não é obrigatório, estaria relacionado mais a uma tentativa de seguir um suposto padrão geral.

     

    Exemplo de código sem sub-rotina:

    algoritmo "EXE4SUBROTINAS"
    //Para demonstrar o uso de sub-rotina com passagem de parâmetro, considere a
    //leitura de 10 valores em um vetor e os coloque em ordem crescente. A
    //ordenação deve ser executada por uma sub-rotina apropriada para este fim.
    
    var
       vet : vetor [1..10] de inteiro
       i, j, aux : inteiro
    
    inicio
       para i de 1 ate 10 faca
          escreva ("Digite um numero: ")
          leia(vet[i]:3)
       fimPara
    
       escreva ("Vetor original :")
    
       para i <- 1 ate 10 Faca
          escreva (vet[i])
       fimPara
    
       escrevaL("")
       
       para i de 1 ate 9 Faca
          para j de 1 ate 10-i faca
             se (vet[j] > vet[j+1]) então
                aux <- vet[j]
                vet[j] <- vet[j+1]
                vet[j+1] <- aux
             fimSe
          fimPara
       fimPara
    
       escreva ("Vetor ordenado :")
    
       para i <- 1 ate 10 faca
          escreva (vet[i]:3)
       fimPara
    fimAlgoritmo


    Para facilita os testes, pode deixar essa opção marcada:

    image.png.3b2be5a6139fd6d5ec3400b024475612.png

     

    Ai o próprio VisualG preenche com valores aleatório. Resultado ao pressionar F9:

    image.png.f34393d418f277058678f636562f3031.png

     

     

    19 horas atrás, Gustavo Alves7 disse:

    Para demonstrar o uso de sub-rotina com passagem de parâmetro [...]

     

    Como já citado, por uma limitação técnica (o criador/desenvolvedor) simplesmente não implementou o recurso que possibilite passar vetores por parâmetro em procedimentos ou funções. É isso! O Pascal, "pai do VisualG", permite! Quem sabe vem numa próxima versão?

     

    Daí... meio que o enunciado fica vago... Pois o vetor, necessariamente, terá que ser "passado" via variável global... e o tamanho do vetor também já é conhecido e fixo... já que está no próprio enunciado:

    19 horas atrás, Gustavo Alves7 disse:

    considere a leitura de 10 valores em um vetor

     

     

    19 horas atrás, Gustavo Alves7 disse:

    A ordenação deve ser executada por uma sub-rotina apropriada para este fim

     

    O código poderia ficar com algo assim:

     

    O esqueleto do procedimento:

    procedimento bubbleSort ()
    inicio
    
    fimProcedimento

    https://pt.wikipedia.org/wiki/Bubble_sort

     

    Aí só joga o conteúdo dentro:

       para i de 1 ate 9 Faca
          para j de 1 ate 10-i faca
             se (vet[j] > vet[j+1]) então
                aux <- vet[j]
                vet[j] <- vet[j+1]
                vet[j+1] <- aux
             fimSe
          fimPara
       fimPara

     

     

     

    ADENDO IMPORTANTE:

    Como boa prática, é interessante que "tudo que método use, ou venha por parâmetro, ou seja declarado dentro do método", ou seja, o vetor e o tamanho do vetor deveriam* vir por parâmetro (o primeiro o VisualG não permite, o segundo já foi proposto que é fixo), e as variáveis utilizadas no laços de repetições, declaradas dentro do método (criação de variáveis locais, que se separam das variáveis locais). Veja:

     

    procedimento bubbleSort ()
    var
       i, j, aux : inteiro
    inicio
       para i de 1 ate 9 Faca
          para j de 1 ate 10-i faca
             se (vet[j] > vet[j+1]) então
                aux <- vet[j]
                vet[j] <- vet[j+1]
                vet[j+1] <- aux
             fimSe
          fimPara
       fimPara
    fimProcedimento

     

     

    Daí só invocar o método onde precisa:

       ...
          escreva (vet[i]:3)
       fimPara
    
       escrevaL("")
    
       bubbleSort()
    
       escreva ("Vetor ordenado :")
    
       para i <- 1 ate 10 faca
       ...

     

    Olha como é interessante, uma sub-rotina seria basicamente um bloco de comandos em que se deu um nome... aí só invocar! Na prática, o VisualG vai "pular" para o trecho de código e ir executando linha a linha da mesma forma que se tivesse no corpo principal do código e depois volta para próxima linha depois de onde foi invocado. Como se fosse um "subprograma". O programa principal fica aguardando a sub-rotina terminar.

     

    Código completo:

    Spoiler
    algoritmo "EXE4SUBROTINAS"
    //Para demonstrar o uso de sub-rotina com passagem de parâmetro, considere a
    //leitura de 10 valores em um vetor e os coloque em ordem crescente. A
    //ordenação deve ser executada por uma sub-rotina apropriada para este fim.
    
    
    procedimento bubbleSort ()
    var
       i, j, aux : inteiro
    inicio
       para i de 1 ate 9 Faca
          para j de 1 ate 10-i faca
             se (vet[j] > vet[j+1]) então
                aux <- vet[j]
                vet[j] <- vet[j+1]
                vet[j+1] <- aux
             fimSe
          fimPara
       fimPara
    fimProcedimento
    
    var
       vet : vetor [1..10] de inteiro
       i, j, aux : inteiro
    
    inicio
       para i de 1 ate 10 faca
          escreva("Digite um numero: ")
          leia(vet[i])
       fimPara
    
       escreva ("Vetor original :")
    
       para i <- 1 ate 10 Faca
          escreva (vet[i]:3)
       fimPara
    
       escrevaL("")
    
       bubbleSort()
    
       escreva ("Vetor ordenado :")
    
       para i <- 1 ate 10 Faca
          escreva (vet[i]:3)
       fimPara
    fimAlgoritmo

      

     

    Aí, como parâmetros são necessário, poderia seguir a sugestão do @devair1010, ficaria algo assim:

    procedimento bubbleSort (tam : inteiro)
    var
       i, j, aux : inteiro
    inicio
       para i de 1 ate tam-1 Faca
          para j de 1 ate tam-i faca
             se (vet[j] > vet[j+1]) então
                aux <- vet[j]
                vet[j] <- vet[j+1]
                vet[j+1] <- aux
             fimSe
          fimPara
       fimPara
    fimProcedimento

     

    Chama o método passando o parâmetro necessário.

       ...
       escrevaL("")
    
       bubbleSort(10)
    
       escreva ("Vetor ordenado :")
       ...

     

    Ou, ainda aprimorar o Bubble Sort(), criando um método específico para efetuar as trocas de posições:

    algoritmo "EXE4SUBROTINAS"
    //Para demonstrar o uso de sub-rotina com passagem de parâmetro, considere a
    //leitura de 10 valores em um vetor e os coloque em ordem crescente. A
    //ordenação deve ser executada por uma sub-rotina apropriada para este fim.
    
    procedimento troca(var a, b : inteiro)
    var
       aux : inteiro
    inicio
       aux <- a
       a <- b
       b <- aux
    fimProcedimento
    
    procedimento bubbleSort ()
    var
       i, j : inteiro
    inicio
       para i de 1 ate 10-1 Faca
          para j de 1 ate 10-i faca
             se (vet[j] > vet[j+1]) então
                troca(vet[j], vet[j+1])
             fimSe
          fimPara
       fimPara
    fimProcedimento
    
    var
       vet : vetor [1..10] de inteiro
       i, j, aux : inteiro
    
    inicio
       para i de 1 ate 10 faca
          escreva("Digite um numero: ")
          leia(vet[i])
       fimPara
    
       escreva ("Vetor original :")
    
       para i <- 1 ate 10 Faca
          escreva (vet[i]:3)
       fimPara
    
       escrevaL("")
    
       bubbleSort()
    
       escreva ("Vetor ordenado :")
    
       para i <- 1 ate 10 Faca
          escreva (vet[i]:3)
       fimPara
    fimAlgoritmo

     

    Ou seja: o procedimento troca() já satisfaria a exigência do enunciado ("uso de sub-rotina com passagem de parâmetro"). Mas tanto faz também deixar o método de ordenação também recebendo o parâmetro com o tamanho do vetor.

     

    Ah! se o VisualG aceitasse vetores por parâmetro, a assinatura seria algo assim:

     

    procedimento bubbleSort (var vet:vetor)

    Ou:

    procedimento bubbleSort (var vet:vetor; tam:inteiro)

    Lembrando que isso NÃO FUNCIONA... pois ainda não foi implementando no VisualG. Já no Pascal, sim!... (não exatamente assim, mas funciona 😄)

     

    PS: esse var determina que seria uma passagem de parâmetro do referência, ou seja, a variável local do método aponta diretamente para própria variável da qual foi passado o parâmetro, assim, tudo que for alterado dentro do método, será refletido na variável original... Funciona como um "ponteiro de memória". Já sem o var, o VisualG apenas "copia" o valor original e joga na variável local. Ao sair, a variável original fica intacta.

     

     

    POSSÍVEL DÚVIDAS:

    Oxente, por que declarou duas vezes as variáveis i e j? E pior, por que o VisualG não acusou que a variável foi "declarada mais de uma vez". Vide exemplo:

     

    image.png.1d96e6881e5b8096d2b93c4c0cf4aff6.png

     

    Resposta: as variáveis i e j foram declaradas "novamente" pois eventualmente o escopo do método precisa dessas variáveis, e como foi exposto no "ADENDO IMPORTANTE" mais acima, o objetivo é "isolar" o método do programa principal, ou seja, mesmo que seja modificado o laço de repetição no programa principal, o método não será comprometido, pois "tudo dentro do método ou veio de fora ou foi criado dentro do método"... 🙂

    Por fim, foi utilizado também as mesmas letras, pois o VisualG permite. Poderia ser letras diferentes. Só se atente que são variáveis distintas! Tem a mesma nomenclatura, mas são de escopos diferentes. Veja:

    image.png.b0626d215aff6ade4f4825072a5b1b3a.png

     

    Cada par de variável não tem nada a ver com o outro. Se não declarasse as variáveis locais, a sub-rotina iria utilizar a variáveis globais...

     

    A magia vem aí... ao implementar uma método, você não precisa se preocupar se já existe uma variável com a mesma nomenclatura fora, nem muito menos vai se preocupar se está alterando um valor que não deveria... Por isso a importância do "isolamento". Isso vai ficar mais claro e medida que for implementando programas maiores... imagine a trabalheira que dá ficar "cuidado de cada variável". 

     

    • Obrigado 1
  3. 13 horas atrás, jooao2607 disse:

    boa noite, estou com essa duvida aqui se existe alguma regra ou algo do tipo onde eu não possa usar o <FOR>, ou pode usar em qualquer circunstancia

     

    @jooao2607, o que pode ocorrer é que uma estrutura de repetição (como o For, While, Do While, For Each etc) possa ser mais prática ou adequada que a outra para um caso, mas meio que não existe uma regra específica obrigue utilizar uma coisa ou outra. Vai do contexto. Cada estrutura pode funcionar melhor ou pior que a outra. Ou pode também existir "padrões de implementações", ou seja, uma forma de fazer que seria mais comum no dia a dia dos programadores em geral...

     

    Teria algum exemplo para contextualizar melhor a tua dúvida?

    • Curtir 1
    • Obrigado 1
  4. Em 03/05/2024 às 17:25, Ansi C disse:
       repita
          contador <- contador + 1
          Escreval(contador)
       Ate (contador = 10)

     

    Só um detalhe... Para garantir o melhor funcionamento, utilizar ">=". Por que se der alguma zica e passar do 10, praticamente* vai entrar num loop infinito 🫠

     

     

    * o tipo numérico inteiro tem um limite (pra lá de uns 2 bilhões positivos, pelo menos num x64), daí pularia para negativo (mais uns pra lá de 2 bi), até voltar para o positivo novamente podendo ou não repetir a zica.  

     

    PS: outra forma seria começar do 1 e ajustar o limite:

     

    algoritmo "Conte Ate 10 (inclusive)"
    var
       contador : inteiro
    
    inicio
       contador <- 1
       
       repita
          escreval(contador)
          contador <- contador + 1
       ate (contador > 10)
    fimAlgoritmo

     

    Como é uma contagem, o para seria ainda mais harmonioso:

    algoritmo "Conte Ate 10 (inclusive)"
    var
       contador : inteiro
    
    inicio
       para contador de 1 ate 10 faca
          escreval(contador)
       fimPara
    fimAlgoritmo

     

    Obviamente, se o tópico de estudo for o repita, tem que ser com o repita.

     

    • Curtir 2
  5. Só analisando alguns pontos...

     

     

    Um detalhezinho para o primeiro código:

     

    Em 14/04/2024 às 01:41, Eli Almeida disse:
          reiniciarVelha()
            
          se simbolo = "x" então
             simbolo <- "o"
          senao
             se simbolo = "o" então
                simbolo <- "x"
             fimse
          fimse

     

    Oras! Essa "troca" já existia no código:

     

    Em 14/04/2024 às 01:41, Eli Almeida disse:
    procedimento trocarJogador ()
    inicio
       se simbolo = "x" então
          simbolo <- "o"
       senao
          simbolo <- "x"
       fimSe
    fimProcedimento

     

    Seria só chamar a função:

     

          reiniciarVelha()
          trocarJogador()

     

    ...no novo código o problema da substituição já foi resolvida, que seria "salvando o jogador que vai começar". 🙂

     

     

     

     

    Para o novo código, temos um probleminha de conceito. Se a função chama-se "mostrar", nela não* deveria mexer em nada nos dados.... Só remover o se.

     

    Errado*

    Em 15/04/2024 às 01:36, Eli Almeida disse:
    procedimento mostrarVelha ()
    var
       linha, coluna, contador : inteiro
    inicio
       contador <- 1
         
       para linha <- 1 ate 3 faca
          para coluna <- 1 ate 3 faca
             se (tabela[linha,coluna] <> "x") e (tabela[linha,coluna]<> "o") então
                tabela[linha,coluna] <- numpcarac(contador)
             fimse
         
             escreva(tabela[linha,coluna]:3)
             contador <- contador+1
          fimPara
         
          escreval()
       fimPara
    fimProcedimento

     

     

    Correto:

    procedimento mostrarVelha ()
    var
       linha, coluna : inteiro
    inicio
       para linha <- 1 ate 3 faca
          para coluna <- 1 ate 3 faca
             escreva (tabela[linha,coluna]:3)
          fimPara
          
          escreval()
       fimPara
    fimProcedimento

     

     

     

    Veja que no código "errado", para cada vez que mostrar a velha, estará reescrevendo a tabela redundantemente. (Onde já tem o número, vai ter o mesmo número novamente...)

     

    A mesma regra vale para o reiniciarVelha().

     

    Em 15/04/2024 às 01:36, Eli Almeida disse:
    procedimento reiniciarVelha()
    var
       contador : inteiro
    inicio
       contador <- 1
         
       para linha <- 1 ate 3 faca
          para coluna <- 1 ate 3 faca
             tabela[linha,coluna] <- numpcarac(contador)
             escreva(tabela[linha,coluna]:3)
             contador <- contador+1
          fimpara
         
          escreval()
       fimpara
          
       se c = "x" então
          simbolo <- "o"
          c <- simbolo
       senao
          se c = "o" então
             simbolo <- "x"
             c <- simbolo
          fimse
       fimse
    fimProcedimento

     

    Já existe uma função com o papel de mostrar, correto?... Deixa então o ela executar. Só remover o se lá dentro do para.

     

    procedimento reiniciarVelha ()
    var
       contador : inteiro
    inicio
       contador <- 1
       
       para linha <- 1 ate 3 faca
          para coluna <- 1 ate 3 faca
             tabela[linha,coluna] <- numpcarac(contador)
             contador <- contador+1
          fimpara
       fimpara
    
       se c = "x" então
          simbolo <- "o"
          c <- simbolo
       senao
          se c = "o" então
             simbolo <- "x"
             c <- simbolo
          fimse
       fimse
    fimProcedimento

     

    Cada um no seu quadrado 😉.

     

    **Como esperado, daí vai precisar chamar as duas funções para o código funcionar corretamente**

     

     

    Por falar em papeis... poderia retirar esse "troca da vez" de dentro do reiniciarVelha(), pois seria também uma função separada. Poderia criar algo como "definirQuemJoga()", onde na primeira vez seta para o "x", e depois seguiria com essa lógica de alternar o jogador. No código, chamaria logo após o comando enquanto, antes do repita. (Não testei, mas acho que lá mesmo.)

    • Curtir 1
  6. @Samuel Fortes Brasil, o código está até bem arrumado, mas tem uns probleminhas que precisam se verificados. Poderia postar o enunciado completo da questão para sermos mais precisos?

     

     

     

     

    Para adiantar, alguns pontos:

     

     

    Procure deixar o código o mais semântico possível, ou seja, com nomenclaturas de variáveis e estruturas fazendo o maior sentido possível... Veja:

     

    Em 29/04/2024 às 16:58, Samuel Fortes Brasil disse:
    Inicio
    Escreval("-----------------------------------")
    Escreva("Quantos alunos a turma possui: ")
    Leia(turma)

     

    Você pergunta "quantos alunos", mas o nome da variável está chamando-se "turma". Que tal chamar de "quantidadeDeAlunos"? Percebe que só de ler o nome da variável você já tem uma noção de mais ou menos para que ela vai servir? Para simplificar, é também comum abreviar. Ex.: qtdAlunos. Se existissem outros de tipos de quantidade, poderia ser ainda mais explicativo. Ex: qtdAlunosTurma, qtdAlunosColegio etc. Mas nesse caso, não precisa.

     

     

    Outro ponto:

    Em 29/04/2024 às 16:58, Samuel Fortes Brasil disse:
         caso 2
                  Escreva("Qual é o nome do(a)Aluno(a): ")
                  Leia(N1)
                  Escreva("Nota: ")
                  Leia(Nota)
                  Escreva("Qual é o nome do(a)Aluno(a): ")
                  Leia(N2)
                  Escreva("Nota: ")
                  Leia(Nota)

     

     

    Observe que N1 ficou ambíguo.. não se sabe se seria para "Nota" ou "Nome".  Pior: se N1 (e afins) são para nomes, porque está estruturada para receber números lá na declaração de variáveis? 🤔

     

    Em 29/04/2024 às 16:58, Samuel Fortes Brasil disse:
    Var
       turma:Inteiro
       N1,N2,N3,N4,N5:Inteiro

     

    Ou seja: seguir esse princípio de "manter uma boa semântica", já evitaria isso. Poderia ficar assim:

     

    algoritmo "Cadastro de Notas de Alunos"
    var
       qtdAlunos : inteiro
       nome1, nome2, nome3, nome4, nome5 : caractere

     

    Tipo, na hora que estivesse escrevendo, já veria que "que seria estranho associar um nome ao tipo numérico", saca? A coisa não estaria semântica.

     

    Observe também que está utilizando a mesma nota para cada um dos alunos, ou seja, a cada nova leitura, estará perdendo o dado anterior, pois simplesmente será substituído. Poderia ter uma nota para cada aluno... assim como tem um nome para cada um.

     

    Até aqui poderia ser algo como:

    algoritmo "Cadastro de Notas de Alunos"
    var
       qtdAlunos : inteiro
       nome1, nome2, nome3, nome4, nome5 : caractere
       nota1, nota2, nota3, nota4, nota5 : real
       
    inicio
       escrevaL("-----------------------------------")
       escreva ("Quantos alunos a turma possui: ")
       leia(qtdAlunos)
       escrevaL("-----------------------------------")
    
       enquanto (qtdAlunos > 5) faca
          escrevaL("Não é possível criar registro de uma turma")
          escrevaL("com mais de 5 alunos. Por favor informe um número menor!")
          escreva ("Informe um novo valor: ")
          leia(qtdAlunos)
          escrevaL("-----------------------------------")
       fimEnquanto
    
    
    
    fimAlgoritmo

     

     

     

    Entrando na leitura dos dados:

    algoritmo "Cadastro de Notas de Alunos"
    var
       qtdAlunos : inteiro
       nome1, nome2, nome3, nome4, nome5 : caractere
       nota1, nota2, nota3, nota4, nota5 : real
       cont : inteiro
    
    inicio
       escrevaL("-----------------------------------")
       escreva ("Quantos alunos a turma possui: ")
       leia(qtdAlunos)
       escrevaL("-----------------------------------")
    
       enquanto (qtdAlunos > 5) faca
          escrevaL("Não é possível criar registro de uma turma")
          escrevaL("com mais de 5 alunos. Por favor informe um número menor!")
          escreva ("Informe um novo valor: ")
          leia(qtdAlunos)
          escrevaL("-----------------------------------")
       fimEnquanto
       
       escolha (qtdAlunos)
       caso 1
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome1)
          escreva ("Nota: ")
          leia(nota1)
       caso 2
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome1)
          escreva ("Nota: ")
          leia(nota1)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome2)
          escreva ("Nota: ")
          leia(nota2)
       caso 3
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome1)
          escreva ("Nota: ")
          leia(nota1)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome2)
          escreva ("Nota: ")
          leia(nota2)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome3)
          escreva ("Nota: ")
          leia(nota3)
       caso 4
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome1)
          escreva ("Nota: ")
          leia(nota1)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome2)
          escreva ("Nota: ")
          leia(nota2)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome3)
          escreva ("Nota: ")
          leia(nota3)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome4)
          escreva ("Nota: ")
          leia(nota4)
       caso 5
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome1)
          escreva ("Nota: ")
          leia(nota1)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome2)
          escreva ("Nota: ")
          leia(nota2)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome3)
          escreva ("Nota: ")
          leia(nota3)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome4)
          escreva ("Nota: ")
          leia(nota4)
          escreva ("Qual é o nome do(a)Aluno(a): ")
          leia(nome5)
          escreva ("Nota: ")
          leia(nota5)
       fimEscolha
         
       //aqui entraria o processamento dos dados e depois exibição dos resultados... mas aí vai depender do enunciado
         
         
    fimAlgoritmo

     

     

    Daí, a lógica utilizada para o processamento e exibição do resultado, vai depender do que está no enunciado do problema. Se for algo como "exibir a maior nota e o nome do respectivo aluno", já adianto que não daria muito certo, pois iria dar uma trabalheira absurda ir comparando as nota por nota... teria que pensar em outra lógica... e sempre se baseando no enunciado do problema.

     

    Se você já estiver com uma solução, por favor, posta o enunciado completo e código aqui para analisarmos...  Caso não, posta o enunciado e o que já conseguiu fazer.

     

    No aguardo.

    image.png

    • Obrigado 1
  7. Em 13/04/2024 às 14:44, devair1010 disse:

    mas fiz uns testes de mesa  no visualG 3,0,6,5 , e essa estrutura funcionou

     

    Pois é! Entendo que basicamente seria uma falha de programação do VisualG. De um modo geral não recomendaria o uso dessa estrutura (usaria se ou se/senao), pois foge do que seria o padrão, tanto para o Pascal (pai do VisualG), tanto para maioria das outras linguagens. (Apesar de fazer sentido, ou seja, não seria uma estrutura documentada, mas alguém teve a brilhante ideia de usar... e funcionou* kkkkkkkkkk).

     

    Eu não encontrei um documentação oficial, e os documentos que tem são bem simplificados.

     

    Mas só para citar que existem claros problemas, vejam:

     

    image.png.7a4204aa92313d2891abe02dc7059a88.png

     

    Oras! desde quando 10.5 está entre 0 e 10?

     

     

    O que empiricamente eu entendo até aqui:

    1. escolha só aceita variáveis do tipo inteiro ou caractere. Ela não foi programada para aceitar números reais. (Acaba "rodando", mas não deveria.);
    2. os itens dos casos são, quando necessários, separados por ",". Ela não foi programada para aceitar faixa de valores, como no tal contexto de "x ate y". (Acaba "rodando", mas não deveria.);

     

  8. Opa! Vou tentar detalhar alguns pontos.

     

     

    Em 11/04/2024 às 17:50, Sants_021 disse:

    Estou tentando a horas achar o erro, mas parece q e impossível.

     

    Testei nas versões 2.5.1920, 3.0.6.5 e 3.0.7.0 do VisualG, e todos apresentaram o mesmo erro.

     

    Segue tela de teste:

    image.png.9fe8dc9601c712076e25b7e35598b1a9.png

    Tela com resultado da execução mostrando o resultado final, mas com uma tela de aviso sobrepondo a tela anterior, indicando que encontrou o erro "FIMPARA sem PARA correspondente."

     

    Ou seja: exatamente o sugerido por @devair1010:

    Em 11/04/2024 às 22:30, devair1010 disse:
    Escreval("Auxilio Alimentação:",aux_aliment," Salario Final:",sal_final)
    fimpara // <----------  essa linha Aqui, pois não tem o outro comando, o "para" 
    
    Fimalgoritmo

     

    Para resolver esse erro, antes um dica: sempre que for programando, vá pressionando Ctrl+G no VisualG para efetuar a indentação automática (o ideal é meio que já programar deixando indentando também). Com isso, ficará bem visível que tinha "algo a mais". Veja:

     

    image.png.9ebbb5803c99eea079bf19ef5cc50604.png

    Print de tela indicando menu, do VisualG, onde consta a item "Indentação Ctrl+G"

     

     

    image.png.0a1d25f6ae4f0fc20bba863ab7f6a5fd.png

    Print de tela destacando o comando fimpara na linha 52

     

    Ou seja: o fimpara está recuado "um dente" para esquerda, ao procurar nas linhas de cima (na mesma coluna), não encontra o respectivo comando para, logo, precisa corrigir... que seria simplesmente remover a linha ou eventualmente inserir o tal para, se fosse o caso.

     

     

    RESUMINDO: provavelmente, OU esqueceu de inserir o trecho o para no código:

    Em 21/11/2023 às 23:49, ElliePJ disse:
    para i <-1 ate 400 faca

     

    OU esqueceu de remover o fimPara quando decidiu remover o comando supracitado... 🙂

     

     

     

    Outro ponto importante que tinha passado... Essa estrutura escolha abaixo não existe (pelo menos até onde me lembro e pesquisei):

    Em 11/04/2024 às 17:50, Sants_021 disse:

       escolha (sal_inicial)
          Caso 0 ate 780
             aux_aliment <- sal_inicial * 0.25
          Caso 781 ate 1200
             aux_aliment <- sal_inicial * 0.20
          Caso 1201 ate 9999999
             aux_aliment <- sal_inicial * 0.15
       fimescolha

     

    Ou seja: o escolha não funciona para "faixas de valores", mas sim apenas para "lista de valores" (separados por ",", caso exista mais de um). Não tem isso de "x até y" para os casos. É assim no Pascal (pai do VisualG), seria assim no VisualG. Tá rodando, mas não necessário está executando corretamente. O código estaria apresentando problemas no VisualG... Tenho 94.7% de certeza disso. Favor me corrijam se estiver enganado... Em outras palavras, poderia utilizar a estrutura se e/ou se/senao. Veja:

     

     

     

    algoritmo "Folha"
    var
       codigo, horas_trab :inteiro
       turno, categoria :caractere
       sal_minimo, valor_hora, sal_inicial, aux_aliment, sal_final :real
    
    inicio
       escrevaL("Digite o codigo do funcionario:")
       leia(codigo)
       escrevaL("Digite o numero de horas trabalhadas no mês:")
       leia(horas_trab)
       escrevaL("Digite o turno de trabalho (M-Matutino, V-Vespertino, N-Noturno)")
       leia(turno)
       escrevaL("Informe a categoria do (G-Gerente, F-Funcionario)")
       leia(categoria)
       escrevaL("Digite o valor do salario minimo:")
       leia(sal_minimo)
    
       se (categoria = "G") e (turno = "N")então
          valor_hora <- sal_minimo * 0.06
       fimSe
    
       se (categoria = "G") e (turno = "M")então
          valor_hora <- sal_minimo * 0.04
       fimSe
    
       se (categoria = "G") e (turno = "V")então
          valor_hora <- sal_minimo * 0.04
       fimSe
    
       se (categoria = "F") e (turno = "N")então
          valor_hora <- sal_minimo * 0.02
       fimSe
    
       se (categoria = "F") e (turno = "M")então
          valor_hora <- sal_minimo * 0.01
       fimSe
    
       se (categoria = "F") e (turno = "V")então
          valor_hora <- sal_minimo * 0.01
       fimSe
    
       sal_inicial <- horas_trab * valor_hora
    
       se (sal_inicial >= 0) E (sal_inicial <= 800) então
          aux_aliment <- sal_inicial * 0.25
       fimSe
    
       se (sal_inicial > 800) E (sal_inicial <= 1200) então
          aux_aliment <- sal_inicial * 0.20
       fimSe
    
       se (sal_inicial > 1200) então
          aux_aliment <- sal_inicial * 0.15
       fimSe
    
       sal_final  <- sal_inicial + aux_aliment
    
       escrevaL("Codigo: ", codigo:1, " Horas Trabalhadas: ", horas_trab:1)
       escrevaL("Valor da Hora Trabalhada: ", valor_hora:1:2, " Salario Inicial: ", sal_inicial:1:2)
       escrevaL("Auxilio Alimentação: ", aux_aliment:1:2, " Salario Final: ", sal_final:1:2)
    fimAlgoritmo

     

     

    Pontos para verificar posteriormente:

    1. a verificação de turnos "M" e "V" podem ser agrupados em uma verificação só, do jeito que está, está "duplicando código";
    2. como existem condições mutuamente excludentes entre si nessas sequências de se, poderia utilizar estruturas com conjuntos de se/senão, em vez de um monte de se isolados.

     

     No aguardo.

    • Obrigado 1
  9. Adendo inicial: sugiro não copiar os códigos de um modo geral, mas sim apenas tomar como referência e ir digitando manualmente...

     

    Para facilitar os testes, retire as leituras dos dados:

       //para linha <- 1 ate 4 faca
       //   para coluna <- 1 ate 4 faca
       //      escreval("Informe a ", coluna:1, "º nota do ", coluna:1, "º bimestre de ", materias[linha])
       //      leia(notasBimestres[linha,coluna])
       //   fimPara
       //fimPara

     

     

    Ah! Não precisaria de um vetor para o número do bimestre:

     

    De:

    Em 27/11/2023 às 16:27, Eli Almeida disse:
       para linha <- 1 ate 4 faca
          escreva("          ",bimestre[linha]:15)
       fimpara

     

    Para algo como:

       para linha <- 1 ate 4 faca
          escreva ("          ", linha:1, "º bimestre")
       fimPara

     

    Ficando com algo assim:

    algoritmo "notasQuatroBimestres"
    var
       notasBimestres : vetor [1..4,1..4] de real
       linha, coluna : inteiro
       materias : vetor [1..4] de caractere
    
    inicio
       materias[1] <- "matemática"
       materias[2] <- "português"
       materias[3] <- "geografia"
       materias[4] <- "história"
    
       //para linha <- 1 ate 4 faca
       //   para coluna <- 1 ate 4 faca
       //      escreval("Informe a ", coluna:1, "º nota do ", coluna:1, "º bimestre de ", materias[linha])
       //      leia(notasBimestre[linha,coluna])
       //   fimPara
       //fimPara
    
       para linha <- 1 ate 4 faca
          escreva("          ", linha:1, "º bimestre")
       fimpara
       
       para linha <- 1 ate 4 faca
          escreval()
          escreva (materias[linha])
          
          para coluna <- 1 ate 4 faca
             escreva ("  ", notasBimestre[linha,coluna]:12)
          fimPara
          
          escreval()
       fimPara
    fimAlgoritmo

     

    image.png

     

     

     

    Inserindo a base do código do @Midori:

    algoritmo "notasQuatroBimestres"
    var
       notasBimestres : vetor [1..4,1..4] de real
       linha, coluna : inteiro
       materias : vetor [1..4] de caractere
    
    inicio
       materias[1] <- "matemática"
       materias[2] <- "português"
       materias[3] <- "geografia"
       materias[4] <- "história"
    
       //para linha <- 1 ate 4 faca
       //   para coluna <- 1 ate 4 faca
       //      escreval("Informe a ", coluna:1, "º nota do ", coluna:1, "º bimestre de ", materias[linha])
       //      leia(notasBimestres[linha,coluna])
       //   fimPara
       //fimPara
    
       escreva (" ":12)
    
       para linha <- 1 ate 4 faca
          escreva (linha:1, "º bimestre":12)
       fimpara
    
       para linha <- 1 ate 4 faca
          escreval()
          escreva (materias[linha]:11)
    
          para coluna <- 1 Ate 4 Faca
             escreva (notasBimestres[linha, coluna]:12:2)
          fimPara
       fimPara
    fimAlgoritmo

     

    image.png

     

     

     

    2 horas atrás, Eli Almeida disse:

    Agora gostaria de saber como faço para colocar as linhas e deixar os bimestres e as matérias junto com as notas dentro do retângulo.

     

    Vá tentando na marra... vai fazendo testes até que saia algo que agrade. Isso é bom para ir se acostumando com os comportamentos da tela.

     

    Exemplo, insere uns:

     escrevaL("------------------------------------------")

     

    Para as colunas, inserir uns "|". Vai futucando... A ideia do exercício é justamente treinar "vestir a roupa de sapo e dar seus pulos".

     

     

     

     

    2 horas atrás, Eli Almeida disse:

    Nessa parte aqui : Escreva(bimestre[linha]:12), ele conta a quantidade de caracteres e deixa somente um espaço à esquerda ?

     

    Basicamente o número à direita dos ":" define o mínimo de espaço que o conteúdo à esquerda dos ":" vai ocupar na tela, ou seja, se um texto tiver, por exemplo, 5 caracteres, o VisualG vai inserir mais 7 espaços para que ocupe 12. Se for caractere, insere á direita (alinhado à esquerda). Se for número, insere à esquerda (alinhado à direita). A dica é a mesma: faça testes! Exemplo:

     

    image.png

     

    Para também auxiliar no entendimento, dá uma pesquisada sobre "formatação visualg" no Google... e vai pescando ideias...

     

    PS: e quando for número real, como no exemplo:

    2 minutos atrás, Simon Viegas disse:
    escreva (notasBimestres[linha, coluna]:12:2)


    idem: vai fazendo testes até compreender.

    • Curtir 2
    • Obrigado 1
  10. Em 22/11/2023 às 21:18, ElliePJ disse:

    Acredito que estou errando na hora parte da estrutura, com o se e então, ou até mesmo na parte de escolha. Não sei se é realmente isso mas acredito que seja. Quando tentei, os cálculos chegavam apenas a zero. 

     

    Pronto! Já temos um norte! "Os resultados estão dando 0". Poderia ter mandando um print da tela para analisar melhor, mas vamos lá...

     

    Peguei o código e inseri os dados da primeira linha dos testes:

     

    image.png

     

    Não saiu zerado. 🙂

     

     

    Provavelmente está informando os dados errados: 

     

    Em 22/11/2023 às 14:28, Simon Viegas disse:

    [...] o turno vem antes da categoria.

     

    Exemplo informando errado:

    image.png

     

    Aí vai sair zerado mesmo... 

     

    • Obrigado 1
  11. Em 23/11/2023 às 02:46, HenriqueArisi disse:

    sei q nem sempre o que ele acusa é o que esta incorreto!

     

    Sim..., mas comece pelo que foi informado.

     

     

    Em 23/11/2023 às 02:46, HenriqueArisi disse:

    imagem_2023-11-23_023320718.png

     

    Está dizendo que não foi encontrada a posição 0 do vetor nome.

     

    Em 23/11/2023 às 02:46, HenriqueArisi disse:
    nome: vetor[1..50] de caractere

     

    Como visto, não existe a posição 0.

     

    Só corrigir:

    procedimento cadastrarProduto ()
    inicio
       se (quantidadeProdutos < 100) então
          quantidadeProdutos <- quantidadeProdutos+1
          escreva ("Digite o nome do produto: ")
          leia(nome[quantidadeProdutos])
          escreva ("Digite o código do produto: ")
          leia(codigo[quantidadeProdutos])
          escreva ("Digite o valor do produto: ")
          leia(valor[quantidadeProdutos])
          escrevaL("Produto cadastrado com sucesso!")
       senao
          escrevaL("Limite de produtos atingido. Não é possível cadastrar mais produtos.")
       fimse
    fimProcedimento
  12. 14 horas atrás, ElliePJ disse:

    Cheguei até aí mas tem algo dando errado e não consigo mais avançar. 😞

     

    O que está dando errado?

     

    Para achar uma solução de um problema, é preciso definir qual é o problema... 🙂

     

    Para adiantar, sugiro o seguinte: crie uma planilha com os dados dos testes e adicione também os respectivos resultados esperados, algo como:

     

    image.png

     

    Aí executar o programa e compara os dados... Identifique qual problema seria e busca corrigir. Se for outra coisa, tenta demonstrar o que é...

     

     

    Adendo:

    15 horas atrás, ElliePJ disse:
       Escreval("Digite o codigo do funcionario:")
       Leia(codigo)
       Escreval("Digite o numero de horas trabalhadas no mês:")
       Leia(horas_trab)
       Escreval("Informe a categoria do (G-Gerente, F-Funcionario)")
       Leia(categoria)
       Escreval("Digite o turno de trabalho (M-Matutino, V-Vespertino, N-Noturno)")
       Leia(turno)
       Escreval("Digite o valor do salario minimo:")
       Leia(sal_minimo)

     

    Sugiro deixar na ordem do enunciado, ou seja, o turno vem antes da categoria.

     

    Adendo 2:

    15 horas atrás, ElliePJ disse:
          outrocaso
             escreval ("Opção Invalida")

     

    Essa validação não faz parte do enunciado, basta remover.

    • Curtir 1
  13. 22 horas atrás, Eli Almeida disse:

    Porém existe um problema que não sei como solucionar, no caso, quando executa o código e o programa escolhe os nomes aleatoriamente, ele acaba escolhendo nomes repetidos, como nesse caso, ele repetiu Gabriel duas vezes.

     

    É normal. Os nomes são sorteados. Como existiam poucas opções, as chances de repetir são maiores. Uma alternativa seria cadastrar mais nomes. Obs.: o algoritmo de sorteio no VisualG não é bom de qualquer forma, mas não precisa se apegar a esse detalhe (de repetições).  

     

    A ideia central seria ter contato com o recurso. Pode ser útil para facilitar testes, por exemplo... Muito mais prático que ficar digitando valores cada vez.

     

     

    • Obrigado 1
  14. 19 horas atrás, Eli Almeidaa disse:

    Fazer essa questão usando registro não seria mais adequado?

     

    Depende. Deixaria mais organizado... Se onde o exercício foi proposto já estudou registros, sim. Se for um exercício onde está estudando registro, tem a obrigação de usar... Caso contrário, não... ou crie duas versões diferentes.

     

     

    19 horas atrás, Eli Almeidaa disse:

    Por quê utilizar vetor ao invés de registro? 

     

    Uma coisa não substitui a outra, pelo contrário, geralmente são utilizadas em conjunto. Dê uma pesquisada sobre registros no VisualG e se aprofunde no tema. Após, aplique o que aprendeu (e vai aprendendo).

     

     

    Sobre o código atual usando apenas vetores... para mim está muito bom. Só inseria o registro.

     

     

     

     

     

    Adendo 1:

    Segue código modificado utilizando dois novos* conceitos: valores aleatórios e listas. (O segundo está relacionado ao primeiro.)

     

    algoritmo "Análise Das Notas Da Turma v0.2_auto"
    var
       nome : vetor [1..4] de caractere
       nota1 : vetor [1..4] de real
       nota2 : vetor[1..4] de real
       mediaAluno : vetor [1..4] de real
       contador : inteiro
       somaMedia, mediaTurma : real
       qtdAlunosAcimaDaMediaDaTurma : inteiro
    
    procedimento espera (pularLinha:logico)
    //veja a magia da organização de códigos. Basicamente copiei esse código de
    //outro tópico aqui do fórum
    //...apenas inseri essa opção de pular a linha, ou seja, já criando uma nova
    //versão alternativa para esse recurso
    var
       entrada:caractere
    inicio
       escreva ("Pressione enter para continuar...")
    
       se (pularLinha) então
          escrevaL("")
       fimSe
    
       leia(entrada)
    fimProcedimento
    
    inicio
       somaMedia <- 0
       
       para contador <- 1 ate 4 faca
          escrevaL("Informe os dados do ", contador:1, "º aluno")
          ALEATORIO ON
          LISTA "NOMES DE PESSOAS
          escreva ("   Nome : ")
          leia(nome[contador])
          escreva (" 1º nota: ")
          ALEATORIO 0,10
          leia(nota1[contador])
          escreva (" 2º nota: ")
          leia(nota2[contador])
          ALEATORIO OFF
          mediaAluno[contador] <- (nota1[contador]+nota2[contador])/2
          somaMedia <- somaMedia+mediaAluno[contador]
          escrevaL("")
       fimPara
       mediaTurma <- somaMedia/4
       espera(FALSO)
    
       limpaTela()
       escrevaL("Listagem de alunos :")
       escrevaL("Nome":16, "Nota")
       escrevaL("--------------------")
       qtdAlunosAcimaDaMediaDaTurma <- 0
       
       para contador <- 1 ate 4 faca
          escrevaL(nome[contador]:15, "|", mediaAluno[contador]:5:2)
    
          se (mediaAluno[contador] > mediaTurma) então
             qtdAlunosAcimaDaMediaDaTurma <- qtdAlunosAcimaDaMediaDaTurma+1
          fimSe
       fimPara
    
       escrevaL("")
       escrevaL("Ao todo temos ", qtdAlunosAcimaDaMediaDaTurma:1, " aluno(s) que está(ão) acima da média da turma, que é ", mediaTurma:4:2, ".")
    fimAlgoritmo

     

    Telas:

    image.png

     

    image.png

     

     

    Adendo 2: não, não nos pergunte como configurar as listas. PESQUISE!!!

     

    No aguardo. 

    • Obrigado 1
  15. Em 09/11/2023 às 15:37, Eli Almeidaa disse:

    Não consegui pensar em uma lógica para usar os valores verdadeiro e falso, como você já vinha fazendo para retornar um valor lógico para essa função.

     

    Do que entendi, você está usando os valores lógicos.

     

    Em 09/11/2023 às 15:37, Eli Almeidaa disse:
          se (produtoCadastrado(novoProduto.nome)) então
    
          fimse

     

     

    O se está utilizando o valor retornado pela função.

     

     

     

     

     

    Em 09/11/2023 às 15:37, Eli Almeidaa disse:

    Fiz assim, não sei se está correto:

    Pra mim ficou correto, sim. Tá muito bom!

     

     

     

     

    Para exemplificar uma nova possível simplificação:

     

    DE:

    Em 09/11/2023 às 15:37, Eli Almeidaa disse:
    funcao produtoExiste (nome:caractere) : logico
    var
       contador : inteiro
       existe : logico
    inicio
       existe <- FALSO
    
       para contador <- 1 ate qtdProdutos faca
          se (produtos[contador].nome = nome) então
             escrevaL("Já existe um produto com o nome '", nome, "' no cadastro!")
             existe <- VERDADEIRO
             interrompa()
          fimSe
       fimPara
    
       retorne existe
    fimFuncao
    
    funcao buscaPosicaoProduto(nome:caractere):inteiro
    var
       resultado : inteiro
       contador : inteiro
    inicio
       resultado <- 0
    
       para contador <- 1 ate qtdProdutos faca
          se (nome = produtos[contador].nome) então
             resultado <- contador
             interrompa()
          fimse
       fimPara
    
       retorne resultado
    fimFuncao

     

    Observe que um código é bem parecido com o outro... daí poderia remover esse "código repetido", deixando a estrutura de busca em apenas um local.

     

    PARA:

    funcao produtoExiste (nome:caractere) : logico
    var
       resultado : logico
    inicio
       resultado <- FALSO
    
       se (buscaPosicaoProduto(nome) > 0) então
          escrevaL("Já existe um produto com o nome '", nome, "' no cadastro!")
          existe <- VERDADEIRO
       fimSe
    
       retorne resultado
    fimFuncao
    
    funcao buscaPosicaoProduto(nome:caractere) : inteiro
    var
       resultado : inteiro
       contador : inteiro
    inicio
       resultado <- 0
    
       para contador <- 1 ate qtdProdutos faca
          se (nome = produtos[contador].nome) então
             resultado <- contador
             interrompa()
          fimse
       fimPara
    
       retorne resultado
    fimFuncao

     

    Ou seja: a busca pela posição já indica se existe ou não... assim reaproveita o que já tem, em vez de "duplicar o código".

     

    produtoCadastrado() pode seguir a mesma lógica.

     

    • Curtir 1
    • Obrigado 1
  16. @dmoret, entre usar se, ou se/senao ou escolha, conceitualmente falando, você meio que deve utilizar aquilo que está sendo estudado no momento, ou seja, se foi um exercício de se/senão, utilize ele mesmo! Não faria sentido utilizar outra coisa, mesmo que eventualmente fique até melhor... Se já estudou os 3 e está em aberto, na ordem do "mais adequado para o menos adequado", seria: escolha, depois se/senao e em último caso um conjunto de se

     

    A ideia seria justamente essa... entende-se bem o se/senão.. Daí, quando estudar escolha, vai entender melhor quando utilizar um ou outro... É como uma evolução.. 

     

     

    Sobre o erro apresentado, existem basicamente dois probleminhas:

    1 hora atrás, dmoret disse:
    senao se categoria = "2" então
    1. todo se tem o seu respectivo fimse, daí faltou usá-los. O VisualG leu todos linhas até chegar no fim do código e não encontrou... e acusa o erro.
    2. devido a uma limitação técnica, o se e senao não podem ficar na mesma linha aqui no VisualG (na maioria das outras linguagem principais podem... Inclusive no Pascal, pai do VisualG). Mesmo que venha a funciona e aparentar está funcionando, estará com a sintaxe errada!!! (Tem que colocar em linhas separadas.) 

     

    Dica 1: ao iniciar um se, já insere o respectivo fimSe abaixo. Depois preenche o conteúdo. Isso ajuda a não esquecer ou se perder quando o código começar a ficar grande.

     

    Exemplo:

     

    Implementa a base:

       se categoria = "1" então
    
       fimSe

     

    Observe que já deixa uma linha em branco no meio...

     

    Depois vai preenchendo:

       se categoria = "1" então
          vlr_diaria <- 299.99
          escreval("Categoria: Popular")
       fimSe

     

    Insere o senao.. Depois o conteúdo do senao, que nesse caso eventualmente é outro se:

       se categoria = "1" então
          vlr_diaria <- 299.99
          escreval("Categoria: Popular")
       senao
          se categoria = "2" então
    
          fimSe
       fimSe
        

     

    Preenche o novo se.

    se categoria = "1" então
       vlr_diaria <- 299.99
       escreval("Categoria: Popular")
    senao
       se categoria = "2" então
          vlr_diaria <- 399.99
          escreval("Categoria: Hatch ou Sedan Intermediário")
       fimSe
    fimSe

     

    Por aí vai.

     

     

    Dica 2: quando tiver implementando, pressione Ctrl+G para indentar o código. Se tiver faltando um fimse, o código ficará todo desalinhado.   

     

     

     

     

    Corrigindo ficaria algo assim:

    var
       categoria: caractere
       tipoc: caractere
       diarias: inteiro
       vlr_diaria: real
       vlr_total: real
       desconto: real
    inicio
       escreval("Escolha a categoria do veículo (1, 2 ou 3): ")
       leia(categoria)
       escreval("Digite a qtd de diárias: ")
       leia(diarias)
    
       se categoria = "1" então
          vlr_diaria <- 299.99
          escreval("Categoria: Popular")
       senao
          se categoria = "2" então
             vlr_diaria <- 399.99
             escreval("Categoria: Hatch ou Sedan Intermediário")
          senao
             se categoria = "3" então
                vlr_diaria <- 499.99
                escreval("Categoria: SUV ou Sedan Luxo")
             fimse
          fimse
       fimse
    
       escreval("Tipo Categoria: ", tipoc)
       escreval("Qtd de diárias: ", diarias)
       escreval("Vlr da diária: R$ ", vlr_diaria)
    
       se diarias <= 6 então
          desconto <- 0
       senao
          se diarias <= 14 então
             desconto <- 0.05
          senao
             se diarias <= 30 então
                desconto <- 0.1
             fimse
          fimse
       fimse
    
       vlr_total <- diarias * vlr_diaria * (1 - desconto)
       escreval("Valor total do aluguel: R$ ", vlr_total)
    fimalgoritmo

     

     

    Adendo: provavelmente dentro lá de cada se, seria para definir o valor de tipoc, em vez já escrever a resposta... O que deve fazer ou não vai depender do enunciado...

     

    Pode ser que seria algo como:

       se categoria = "1" então
          vlr_diaria <- 299.99
          tipoc <- "Popular"
       senao
          se categoria = "2" então
             vlr_diaria <- 399.99
             tipoc <- "Hatch ou Sedan Intermediário"
          senao
             se categoria = "3" então
                vlr_diaria <- 499.99
                tipoc <- "SUV ou Sedan Luxo"
             fimse
          fimse
       fimse

    Adendo 2:

    1 hora atrás, JoãoPe230 disse:

    Aqui "Escolha" é melhor mesmo, funciona com "Se", mas fica mais otimazado e correto com "Escolha", tudo que for com algarismo e não tiver ">, < e etc" "escolha" é melhor

     

     

    O escolha funciona como um se/senao, no caso eles são específicos para condições mutuamente excludentes, ou seja, aqueles casos em que "se for uma coisa, não pode ser outra"... A ideia é que neles, se uma condição for verdadeira, o programa já pula para o fim da estrutura... não perdendo tempo verificando se outra coisa. Já no caso de um conjunto de se, independente da categoria escolhida, sempre vai verificar todas as condições (opção menos adequada para o contexto).

    • Curtir 3
    • Obrigado 1
  17. @Eli Almeidaa, o algoritmo está muito bom! Show de bola! 

     

     

     

     

     

    Complementando, segue algumas dicas/sugestões/revisões gerais de pequenos detalhes. Aí pode ir analisando e implementando o que achar que faz sentido, ou não:

     

    Vou tentar exemplificar sem explicar muito, pois costumo ser muito prolixo...  😄

     

     

    De:

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
    retorno <- falso

     

    Para:

    retorno <- FALSO

     

    FALSO e VERDADEIRO são constantes... 😉

     

     

     

     

    De:

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
    se  vetorCheio = falso então

     

    Para:

    se (não vetorCheio()) então

     

    Daí a mesma lógica para outras estruturas semelhantes.

     

     

     

     

    Simplificando o cadastrarProduto() pela lógica do restante do algoritmo:

     

    De:

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
       se  vetorCheio = falso então
          repita
             produtoJaExiste <- falso
             escrevaL("Informe o nome do produto")
             leia(novoProduto.nome)
             se produtoExiste(novoProduto.nome) = falso então
                escrevaL("Informe o preço do produto")
                leia(novoProduto.preco)
                escrevaL("Informe o estoque do produto")
                leia(novoProduto.estoque)
                qtdProdutos <- qtdProdutos+1
                produtos[qtdProdutos] <- novoProduto
                escrevaL("Produto cadastrado com sucesso")
             senao
                ProdutoJaExiste <- verdadeiro
             fimSe
          ate (ProdutoJaExiste = falso)
       fimSe

     

    Para:

       se (não vetorCheio()) então
          repita
             escrevaL("Informe o nome do produto")
             leia(novoProduto.nome)
             produtoJaExiste <- produtoExiste(novoProduto.nome)
             
             se (não produtoJaExiste) então
                escrevaL("Informe o preço do produto")
                leia(novoProduto.preco)
                escrevaL("Informe o estoque do produto")
                leia(novoProduto.estoque)
                qtdProdutos <- qtdProdutos+1
                produtos[qtdProdutos] <- novoProduto
                escrevaL("Produto cadastrado com sucesso")
             fimSe
          ate (não produtoJaExiste)
       fimSe

     

     

     

     

     

     

    De

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
    funcao existemProdutosCadastrados() : logico

     

    Para:

    funcao vetorVazio() : logico
    var
       retorno : logico
    inicio
       retorno <- FALSO
    
       se (qtdProdutos <= 0) então
          escrevaL("Não há produtos cadastrados")
          retorno <- VERDADEIRO
       fimSe
    
       retorne retorno
    fimFuncao

     

    Já que temos vetorCheio()... Pode fazer mais sentido. Caso queira alterar, poderia utilizar o Ctrl+U.

     

    image.png

     

    E ir alterando um por um. Lembrando que o valor lógico estaria invertido, teria que também ajustar a lógica. Exemplo:

     

    De:

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
       se  existemProdutosCadastrados = verdadeiro então
          escrevaL("Produtos cadastrados :")

     

    Para:

       se (não vetorVazio()) então
          escrevaL("Produtos cadastrados :")

     

     

     

     

    De:

    Em 27/10/2023 às 16:49, Eli Almeidaa disse:
    procedimento consultarEstoque ()
    var
       novoProduto : t_Produto
       r:inteiro
    inicio
       se  existemProdutosCadastrados = verdadeiro então
          escreval("Informe o nome do produto que gostaria de consultar o estoque")
          leia(novoProduto.nome)
          se  buscaPosicaoProduto(novoProduto.nome)> 0 então
             escreval(" O estoque de ", novoProduto.nome, " é ", produtos[buscaPosicaoProduto(novoProduto.nome)].estoque:1)
          fimSe
       fimse
    fimProcedimento

     

    Observe que não há um "novo produto" nesse contexto...


    Para:

    procedimento consultarEstoque()
    var
       nomeProduto : caractere
       posProduto : inteiro
    inicio
       se (não vetorVazio()) então
          escrevaL("Informe o nome do produto que gostaria de consultar o estoque")
          leia(nomeProduto)
          
          posProduto <- buscaPosicaoProduto(nomeProduto)
          
          se (posProduto > 0) então
             escreval(" O estoque de ", produtos[posProduto].nome, " é ", produtos[posProduto].estoque:1)
          fimSe
       fimse
    fimProcedimento

     

    ou

     

    procedimento consultarEstoque()
    var
       nomeProduto : caractere
       posProduto : inteiro
       dbProduto : t_Produto
    inicio
       se (não vetorVazio()) então
          escrevaL("Informe o nome do produto que gostaria de consultar o estoque")
          leia(nomeProduto)
    
          posProduto <- buscaPosicaoProduto(nomeProduto)
    
          se (posProduto > 0) então
             dbProduto <- produtos[posProduto]
             escreval(" O estoque de ", dbProduto.nome, " é ", dbProduto.estoque:1)
          fimSe
       fimse
    fimProcedimento

     

    Adendo: infelizmente o VisualG NÃO PERMITE retornar um registro por uma função. Algo assim:

     

    funcao buscaProduto(nome:caractere) : t_Produto

     

    Mas consegue compreender como isso seria útil para esse ou outros contextos? Infelizmente não rola!

    Até dá para fazer um malabarismo utilizando uma variável global, mas acho meio deselegante, para não dizer: armengue . Veja:

     

    var
       produtos : vetor [1..QTD_MAX_PRODUTOS] de t_Produto
       opcao, qtdProdutos : inteiro
       retornoProduto : t_Produto

     

    Aí a função poderia ficar:

    funcao buscaProdutoPorNome (nome:caractere) : logico
    var
       posProduto : inteiro
       retorno : logico
    inicio
       retorno <- FALSO
       posProduto <- buscaPosicaoProduto(nome)
    
       se (posProduto > 0) então
          retornoProduto <- produtos[posProduto] //aqui utilizando uma variável global para superar a limitação do VisualG
          retorno <- VERDADEIRO
       fimSe
       
       retorne retorno
    fimFuncao

     

    E usar algo como:

    procedimento consultarEstoque()
    var
       nomeProduto : caractere
       posProduto : inteiro
       dbProduto : t_Produto
    inicio
       se (não vetorVazio()) então
          escrevaL("Informe o nome do produto que gostaria de consultar o estoque")
          leia(nomeProduto)
    
          se (buscaProdutoPorNome(nomeProduto)) então
             dbProduto <- retornoProduto //esse variável à direita foi atulizada na função acima
             escreval(" O estoque de ", dbProduto.nome, " é ", dbProduto.estoque:1)
          fimSe
       fimse
    fimProcedimento

     

    ***Assim como no teu código original, não está sendo tratado a questão do comportamento do que fazer caso não encontre o produto... precisa pensar em algo.***

     

     

    Por aí vai... tem mais coisa que por ir futucando e "melhorando". Exemplo:

     

    produtos[buscaPosicaoProduto(novoProduto.nome)].estoque <- produtos[buscaPosicaoProduto(novoProduto.nome)].estoque+quantidade

     

    Para evitar ficar chamando a função de busca várias vezes, como já citado, copia o valor:

    posProduto <- buscaPosicaoProduto(novoProduto.nome)

     

    Vá tentado refinar o código por completo. Aí se tiver dúvidas posta, ou posta o código completo atual para podermos analisar outros "pequenos detalhes".

    • Curtir 2
    • Obrigado 1
  18. Em 23/10/2023 às 20:53, como ta a mente do palhaço disse:
    algoritmo "Q89 procedimento"
    var
       vezes, repet, repet1, bor :inteiro
       bor1, n, c : caractere
    inicio

     

    O comando inicio, relacionado ao programa principal, deve ficar após as funções e procedimento.

     

     

    Aproveitando a postagem:

    Em 15/04/2023 às 10:07, Fran.DevCoder disse:
    algoritmo "Exercício 89"
    //...
    var
       contador : inteiro
       msg : caractere

     

     

    Essas duas variáveis são locais. A primeira melhor declarada dentro da função que a usa. A segunda já está declarada na assinatura do método, ou seja, declarando aí, está simplesmente duplicando, mas se qualquer forma, o enunciado sugere que envie um texto diretamente (utilizando aspas duplas).

     

     

    Vejam como é a chamada do procedimento:

    Em 15/04/2023 às 10:07, Fran.DevCoder disse:
    //Ex: Uma chamada válida seria Gerador("Portugol Studio",3,2)

     

    Mas no código está utilizando a variável global msg.

    Em 15/04/2023 às 10:07, Fran.DevCoder disse:
    inicio
       gerador(msg, 3, 2)
    fimAlgoritmo

     

    Observe que no momento dessa chamada, essa variável está em branco... pois o programa acabou de ser iniciado. Estaria "funcionando" pois o texto está fixo lá dentro do procedimento, vejam:

    Em 15/04/2023 às 10:07, Fran.DevCoder disse:
    procedimento gerador(msg:caractere; repeticao, borda_tipo:inteiro)
    
    inicio
       borda(borda_tipo)
       para contador de 1 ate repeticao faca
          escreval("Portugol Studio")
       fimPara
       borda(borda_tipo)
    fimProcedimento

     

    Resumindo: o texto precisa vir de fora, daí utiliza a variável msg (que está na assinatura do procedimento) para tal. Exemplo:

    procedimento gerador (msg:caractere; repeticao, borda_tipo:inteiro)
    var
       contador : inteiro
    inicio
       borda(borda_tipo)
    
       para contador de 1 ate repeticao faca
          escreval(msg)
       fimPara
    
       borda(borda_tipo)
    fimProcedimento

     

    Exemplo de chamada:

    inicio
       gerador("Portugol Studio", 3, 1)
       gerador("Portugol Studio", 3, 2)
       gerador("Portugol Studio", 3, 3)
    fimAlgoritmo

     

    Segue um código completo:

    algoritmo "Exercício 89"
    //PROPOSTA: Crie um programa que melhore o procedimento gerador() da questão anterior
    //para que o programador possa escolher uma entre as três bordas
    //+-------=======-------+ Borda1
    //~~~~~~~:::::::~~~~~~~~  Borda2
    //<<<<<<<------->>>>>>>   Borda3
    //Ex: Uma chamada válida seria Gerador("Portugol Studio",3,2)
    // ~~~~~~~:::::::~~~~~~~~
    //    Portugol Studio
    //    Portugol Studio
    //    Portugol Studio
    // ~~~~~~~:::::::~~~~~~~~
    //Autora: Franciele Juchem Santiago
    //Prof: Gustavo Guanabara
    //Data:15/04/2023
    
    const
       BORDA1 = 1
       BORDA2 = 2
       BORDA3 = 3
    
    var
       //Obs.: devido a um bug do VisualG, necessário deixar o comando var, mesmo
       //que não tenha variáveis globais (versão 3.6.0.5)
    
    procedimento borda (borda_tipo:inteiro)
    inicio
       escolha (borda_tipo)
       caso BORDA1
          escreval("+-------=======------+")
       caso BORDA2
          escreval("~~~~~~~~:::::::~~~~~~~")
       caso BORDA3
          escreval("<<<<<<<<------->>>>>>>")
       fimEscolha
    fimProcedimento
    
    procedimento gerador (msg:caractere; repeticao, borda_tipo:inteiro)
    var
       contador : inteiro
    inicio
       borda(borda_tipo)
    
       para contador de 1 ate repeticao faca
          escreval(msg)
       fimPara
    
       borda(borda_tipo)
    fimProcedimento
    
    inicio
       gerador("Portugol Studio", 3, 1)
       gerador("Portugol Studio", 3, 2)
       gerador("Portugol Studio", 3, 3)
    fimAlgoritmo
  19. Em 21/10/2023 às 15:14, Eli Almeidaa disse:

    O código da forma que você está fazendo aí, como criando função existemProdutosCadastrados, função vetorCheio  e função produtoExiste, seria a forma mais correta de fazer essa questão?

     

    Assim..., não seria "a" forma mais correta, seria apenas "umas" sugestões. Seria tentar seguir uma lógica geral e mais uniforme.

     

     

    Em 21/10/2023 às 15:14, Eli Almeidaa disse:

    Seria a forma que deixaria o código mais limpo e mais fácil de entender?

     

    Isso. A proposta é que o código sempre faça o maior sentido possível. Buscar ser coerente. Pois a medida que o código vai crescendo, mais complicado ficará para entender todo o código, ou seja, tendo uma coerência geral, fica mais fácil deduzir "o que seria" cada coisa. E se uma coisa não existir, você já entenderá mais facilmente o que precisaria ser feito.

     

    Veja o código abaixo:

    Em 21/10/2023 às 15:14, Eli Almeidaa disse:
    funcao produtoExiste(nome:caractere):inteiro
    var
       resultado : inteiro
       contador : inteiro
    inicio
    
       para contador <- 1 ate quantidadeProdutosCadastrados faca
          se nome = produtos[contador].nome então
             resultado <- contador
             interrompa()
          fimse
       fimPara
       retorne resultado
    fimFuncao

     

    A função chama-se "produtoExiste", mas analisando o código verificam-se que na verdade ela serve para "retornar a posição do vetor onde está o produto que contenha aquele nome". Entende a diferença? Ela tem uma nomenclatura que indica uma coisa, mas está fazendo outra função (objetivo) diferente. Fica estranho. Quando mais coerente, mais simples vai ficar...

     

    Apenas ajuste a função. Em vez de retornar a posição, fazer o que tem que fazer: retornar se existe ou não. Veja: 

    Em 18/10/2023 às 15:53, Simon Viegas disse:
    funcao produtoExiste (nome:caractere) : logico
    var
       contador : inteiro
       retorno : logico
    inicio
       retorno <- FALSO
    
       para contador <- 1 ate qtdProdutos faca
          se (produtos[contador].nome = nome) então
             retorno <- VERDADEIRO
             interrompa()
          fimSe
       fimPara
    
       retorne retorno
    fimFuncao


    Obs.: eu mudei o nome da variável auxiliar de "existe" para "retorno", justamente para manter a coerência do restante do código.

     

    "Estou verificando se algo existe, logo espero que me retorne se existe ou não".

     

    Tem também a questão de "onde colocar a mensagem de erro". Aí dê uma olhada na minha postagem anterior no trecho citado abaixo:

    Em 18/10/2023 às 15:53, Simon Viegas disse:

    Ou seja: o método de cadastro que exibe a possível mensagem de erro.


    Mas poderia colocar o texto do "erro na validação" dentro do próprio método que valida, veja:

     

     

    Observe que essa característica de "retornar a posição de um produto" poderia ser útil, por exemplo, na hora de atualizar. Aí só aproveitar:

     

    funcao buscaPosicaoProduto(nome:caractere):inteiro
    var
       resultado : inteiro
       contador : inteiro
    inicio
       resultado <- 0
    
       para contador <- 1 ate quantidadeProdutosCadastrados faca
          se (nome = produtos[contador].nome) então
             resultado <- contador
             interrompa()
          fimse
       fimPara
    
       retorne resultado
    fimFuncao

     

    Ou seja: passando o nome, já terá a posição no vetor que precisar atualizar o produto. Se não achar, vai retornar 0.

     

     

     

    CORREÇÕES IMPORTANTES:

    1. iniciando com a quantidade correta

    Em 21/10/2023 às 15:14, Eli Almeidaa disse:
    Inicio
       quantidadeProdutoscadastrados <- 1

     

    Lembre-se da coerência!!! Oras! se não tem nenhum produto cadastrado, como raios vai começar com 1? Tem que ser com 0!!! 🙂(Daí tem que ajustar todo restante do código onde possa ter efeito.)

     

     

    2. Corrija o malabarismo da função de listar

    Em 21/10/2023 às 15:14, Eli Almeidaa disse:
    procedimento listarProduto()
    var
       contador : inteiro
       r, y : inteiro
       nome : caractere
    inicio
       y <- quantidadeProdutosCadastrados
       quantidadeProdutosCadastrados <- 1
       nome <- ""
       r <- produtoExiste(nome)
       se (r = 0) e (r <> 1) então
          quantidadeProdutosCadastrados <- y

     

    Para visualizar a complexidade da coisa: y recebe a quantidade de produtos, depois a quantidade de produtos do programa em si passa ser 1, depois verifica se tem um produto "sem nome" existe no vetor, depois está verificando se o resultado (da existência) retornou especificamente 0, e que ao mesmo tempo essa mesma variável seja diferente de 1 (se é 0, necessariamente será diferente de 1).....

     

    O que você queria verificar? Seria "se existe algum produto cadastrado"?... Logo, seria só verificar a quantidade de produtos:

     

    procedimento listarProdutos()
    var
       contador : inteiro
    inicio
       se (quantidadeProdutoscadastrados > 0) então
          escrevaL("Não há produtos cadastrados")
       senao
          escrevaL("Produtos cadastrados :")
    
          para contador <- 1 ate qtdProdutos faca
             escrevaL("Nome    : ", produtos[contador].nome)
             escrevaL("Preço   : R$ ", produtos[contador].preco:1:2)
             escrevaL("Estoque : ", produtos[contador].estoque:1)
             escrevaL()
          fimPara
       fimSe
    fimProcedimento

     

    Daí, só criei uma função para deixar mais organizado e elegante:

    Em 18/10/2023 às 15:53, Simon Viegas disse:
    procedimento listarProdutos()
    var
       contador : inteiro
    inicio
       se (não existemProdutosCadastrados()) então
          escrevaL("Não há produtos cadastrados")
       senao
          escrevaL("Produtos cadastrados :")
    
          para contador <- 1 ate qtdProdutos faca
             escrevaL("Nome    : ", produtos[contador].nome)
             escrevaL("Preço   : R$ ", produtos[contador].preco:1:2)
             escrevaL("Estoque : ", produtos[contador].estoque:1)
             escrevaL()
          fimPara
       fimSe
    fimProcedimento

     

    Adendo: no código acima também entra a questão de "onde deixar a mensagem de erro" (que citei que tem na postagem anterior), ou seja, pedi para verificar se existe ou não produtos, e a mensagem ficou fora da função que verifica. Se tiver 10 lugares diferentes que chama essa função e precisar de uma mensagem de erro, teria que escrever 10 vezes a mensagem. Se precisa modificar a mensagem, teria que modificar 10x... se deixar dentro da própria função, aí ficaria centralizado só lá. Só reler a postagem anterior também. Vai analisando e deixando da forma que fique mais organizada... lembrando-se sempre de manter um padrão uniforme para as funções.

     

     

    Conteúdo da função existemProdutosCadastrados:

    Em 18/10/2023 às 15:53, Simon Viegas disse:
    funcao existemProdutosCadastrados() : logico
    var
       retorno : logico
    inicio
       se (quantidadeProdutoscadastrados > 0) então
          retorno <- VERDADEIRO
       senao
          retorno <- FALSO
       fimSe
    
       retorne retorno
    fimFuncao

     

    Tudo é uma questão de entender os contextos... essa função poderia se chamar "listaVazia()" ou algo do tipo, por exemplo... nesse caso o resultado seria invertido ("se é maior que 0, então é FALSO") e onde for usar essa função seria ajustado para tal característica. 

     

    Adendo: propositalmente deixei um erro na verificação no listarProdutos... lembre-se: as coisas tem que fazer sentido... Ao ler teria que vir a mente algo como: "Ham! como assim maior que 0". Oras! para "não haver produtos cadastrados, a quantidade tem que ser = 0". Lá está > 0 (se estiver maior, quer dizer que tem produtos!).  

     

    Por aí vai.

    • Curtir 2
    • Obrigado 1
  20. Só um detalhe sobre essa exibição dos valores na tela:

     

    O VisualG já insere automaticamente um espaço ANTES do número a ser impresso. Veja:

       Para C <- 0 Ate 9 Faca
          V[C] <- (C + 1) * 5
          Escreva(V[C])
       FimPara
       Escreval()
    
       Para C <- 0 Ate 9 Faca
          V[C] <- C
          Escreva(V[C])
       FimPara

     

    "Pela lógica", os números sairiam todos colados, né? Mas na verdade saem assim:

    image.png

     

    Ou seja: no teu código os números serão impressos com 2 e 3 espaços, respectivamente, entre si, pois terá um a mais à esquerda. (E não com 1 e 2, que foi o que colocou lá!).🙂

    image.png

     

    Caso queria imprimir sem esse espaço à esquerda, é possível utilizar um recurso de formatação. Veja:

       Para C <- 0 Ate 9 Faca
          V[C] <- (C + 1) * 5
          Escreva(V[C]:1, " ")
       FimPara
       Escreval()
    
       Para C <- 0 Ate 9 Faca
          V[C] <- C
          Escreva(V[C]:1, "  ")
       FimPara

     

    image.png

     

    Assim, ficou "colado à esquerda" e ficou com apenas 1 e 2 espações respectivamente. E claro, se remover esses espaços após a vírgula, sairiam tudo colado.

     

    Como esses ":x" funciona? (Sendo x um número inteiro maior ou igual a zero, mas claro que terá uma limite...): basicamente ele vai definir "quantos espaços mínimos um número deve ocupar na tela, inserindo espaços à esquerda caso necessário". Pode ir fazendo testes com números diferentes e ir assimilando aos poucos. O detalhe é que, ao formatar com ":x", aquele tal "espaço automático à esquerda" é removido!! 😉

     

    Aí pode ir brincado com as possibilidades.

     

    • Obrigado 1
  21. @Eli Almeidaa, teu código já está muito bom. Para efeito didático, aso queira treinar ou usar princípio no teu próprio código, segue um exemplo de possível refatoração no algoritmo. Vai um passo a passo inicial (que serve de modo genérico).

     

    [0] Escopo inicial

    Acho interessante deixar o enunciado no código... Facilita as consultas:

    algoritmo "Gerenciamento de Produtos v0.3"
    // Disciplina  :
    // Professor   :
    // Autor(a)    : Eli Almeidaa
    // Data atual  : 18/10/2023
    // ENUNCIADO:
    //Você foi designado para criar um programa em portugol que ajude uma loja a
    //gerenciar seu estoque de produtos eletrônicos. A loja possui um catálogo de
    //produtos, cada um representado por um vetor de registro com as seguintes
    //informações:
    //* Nome do produto (string)
    //* Preço unitário (real)
    //* Quantidade em estoque (inteiro)
    
    //Sua tarefa é escrever um programa que realize as seguintes operações através
    //de funções:
    //* Cadastro de Produto: Crie uma função que permita ao usuário cadastrar um novo
    //produto, informando o nome, preço unitário e quantidade em estoque. Os dados
    //devem ser armazenados no vetor de produtos.
    //* Consulta de Estoque: Crie uma função que permita ao usuário consultar o
    //estoque de um produto específico, informando o nome do produto. A função deve
    //retornar a quantidade em estoque desse produto.
    //* Atualização de Estoque: Crie uma função que permita ao usuário atualizar o
    //estoque de um produto existente, informando o nome do produto e a quantidade
    //a ser adicionada ou subtraída do estoque.
    //Listagem de Produtos: Crie uma função que liste todos os produtos cadastrados,
    //exibindo o nome, preço unitário e quantidade em estoque de cada um.
    inicio
    
    fimAlgoritmo

     

     

     

     

    [1] DECLARAÇÃO DAS VARIÁVEIS E CONSTANTES GLOBAIS

    18 horas atrás, Eli Almeidaa disse:
    const
       quantidadeMaximaProdutos = 2
    
    tipo
       loja = registro
          nome: caractere
          preco: real
          estoque: inteiro
       fimRegistro
    
    var
       produtos: vetor [1..quantidadeMaximaProdutos] de loja
       quantidadeProdutosCadastrados, opcao, r, quantidade : inteiro
       nome, opcao2  : caractere

     

    1.1 as constantes deixar todo em MAIÚSCULO, para justamente diferenciar das variáveis;

    1.2 em relação ao tipo, você está cadastrando produtos, e não lojas;

    1.3 variáveis que são declaradas em assinaturas de métodos NÃO devem ser declaradas novamente como globais. Você aí está apenas "duplicando". (Sim! vai ficar uma variável global, e outra local para cada caso.);

    1.4 alguns dessas variáveis deveriam ser declaradas dentro do métodos, e não como globais.

     

    De um modo simplificado poderia ficar assim:

    const
       QTD_MAX_PRODUTOS = 2
    
    tipo
       t_Produto = registro
          nome : caractere
          preco : real
          estoque : inteiro
       fimRegistro
    
    var
       produtos : vetor [1..QTD_MAX_PRODUTOS] de t_Produto
       opcao, qtdProdutos : inteiro

     

    Só isso que é global. O restante seria variáveis locais.

     

     

     

     

     

    [2] Simplificação do menu

    18 horas atrás, Eli Almeidaa disse:
          escreval("[1]- Cadastrar produto")
          escreval("[2]- consultar produto")
          escreval("[3]- atualizar estoque")
          escreval ("[4]- listar produtos")
          
          escreval("Escolha uma opcao")
          leia (opcao)
          escolha opcao
          caso 1
             se quantidadeProdutosCadastrados <= quantidadeMaximaProdutos então
                cadastrarProduto()
             senao
                escreval(" Limite de cadastro atingido")
             fimSe
          caso 2
             escreval ("Informe o nome do produto que deseja consultar o estoque")
             leia(nome)
             r <- produtoExiste(nome)
             se r > 0 então
                r <- consultarEstoque(nome)
                escreval(" A quantidade de estoque do produto ", nome, " é ", r:1)
             senao
                escreval(" Produto não cadastrado.")
             fimSe
          caso 3
             escreval ("Informe o nome do produto que deseja atualizar o estoque")
             leia(nome)
             r <- produtoExiste(nome)
             se r > 0 então
                escreval ("[R] - retirar")
                escreval("[A] - adicionar")
                leia(opcao2)
                opcao2 <- maiusc(opcao2)
                se opcao2 = "R" então
                   escreval ("Quanto gostaria de retirar")
                   leia(quantidade)
                   r <- atualizarEstoque(opcao2,quantidade)
                   escreval("O novo estoque é de ", nome, " é ", r:1)
                senao
                   se opcao2 = "A" então
                      escreval ("Quanto gostaria de adicionar")
                      leia(quantidade)
                      r <- atualizarEstoque(opcao2,quantidade)
                      escreval("O novo estoque é de ", nome, " é ", r:1)
                   fimse
                fimse
             senao
                escreval(" Produto não cadastrado.")
             fimSe
             
          fimescolha

     

     

    Deixar o menu cru. Exemplo:

    inicio
       qtdProdutos <- 0
    
       repita
          escrevaL("[1]- Cadastrar produto")
          escrevaL("[2]- Consultar produto")
          escrevaL("[3]- Atualizar estoque")
          escrevaL("[4]- Listar produtos")
    
          escrevaL("Escolha uma opcao")
          leia (opcao)
          
          escolha opcao
          caso 1
             cadastrarProduto()
          caso 2
             consultarEstoque()
          caso 3
             atualizarEstoque()
          caso 4
             listarProdutos()
          fimEscolha
       ate (opcao = 0)
    fimAlgoritmo

     

    Aí dentro de cada método constrói a sua lógica. Sugiro começar pela listagem, pois ela ajuda a ver se está cadastrando certo. Depois o cadastro (usando o listar como apoio). O código ficará muito mais limpo.

     

     

     

     

    [3] Listagem de Produtos

    Vai criando os métodos aos poucos. Sempre começando de algo mais simples e indo incrementando os detalhes depois. Exemplo:

    procedimento listarProdutos()
    var
       contador : inteiro
    inicio
       escrevaL("Produtos cadastrados :")
    
       para contador <- 1 ate qtdProdutos faca
          escrevaL("Nome    : ", produtos[contador].nome)
          escrevaL("Preço   : R$ ", produtos[contador].preco:1:2)
          escrevaL("Estoque : ", produtos[contador].estoque:1)
          escrevaL()
       fimPara
    fimProcedimento

     

    Adendo: o código não precisa ficar pronto de primeira, vai fazendo diversos testes até chegar numa versão que ache que ficou legal.

     

    Simples e direto. Aí, vai inserindo as validações. Exemplo:

    procedimento listarProdutos()
    var
       contador : inteiro
    inicio
       se (qtdProdutos <= 0) então
          escrevaL("Não há produtos cadastrados")
       senao
          escrevaL("Produtos cadastrados :")
    
          para contador <- 1 ate qtdProdutos faca
             escrevaL("Nome    : ", produtos[contador].nome)
             escrevaL("Preço   : R$ ", produtos[contador].preco:1:2)
             escrevaL("Estoque : ", produtos[contador].estoque:1)
             escrevaL()
          fimPara
       fimSe
    fimProcedimento

     

     

     

     

    [4] Cadastro de Produtos

    Segue outro exemplo de método:

    procedimento cadastrarProduto()
    var
       novoProduto : t_Produto
    inicio
       escrevaL("Informe o nome do produto")
       leia(novoProduto.nome)
       escrevaL("Informe o preço do produto")
       leia(novoProduto.preco)
       escrevaL("Informe o estoque do produto")
       leia(novoProduto.estoque)
       qtdProdutos <- qtdProdutos+1
       produtos[qtdProdutos] <- novoProduto
       escrevaL("Produto cadastrado com sucesso")
    fimProcedimento

     

     

    Da mesma forma vai inserindo as validações aos poucos:

    funcao vetorCheio() : logico
    var
       retorno : logico
    inicio
       retorno <- VERDADEIRO
    
       se (qtdProdutos < QTD_MAX_PRODUTOS) então
          retorno <- FALSO
       fimSe
    
       retorne retorno
    fimFuncao
    
    funcao produtoExiste (nome:caractere) : logico
    var
       contador : inteiro
       existe : logico
    inicio
       existe <- FALSO
    
       para contador <- 1 ate qtdProdutos faca
          se (produtos[contador].nome = nome) então
             existe <- VERDADEIRO
             interrompa()
          fimSe
       fimPara
    
       retorne existe
    fimFuncao
    
    procedimento cadastrarProduto()
    var
       novoProduto : t_Produto
    inicio
       se (vetorCheio()) então
          escrevaL("Não há mais espaço no vetor para cadastro de novos produtos")
       senao
          escrevaL("Informe o nome do produto")
          leia(novoProduto.nome)
    
          se (produtoExiste(novoProduto.nome)) então
             escrevaL("Já existe um produto com o nome '", novoProduto.nome, "' no cadastro!")
          senao
             escrevaL("Informe o preço do produto")
             leia(novoProduto.preco)
             escrevaL("Informe o estoque do produto")
             leia(novoProduto.estoque)
             qtdProdutos <- qtdProdutos+1
             produtos[qtdProdutos] <- novoProduto
             escrevaL("Produto cadastrado com sucesso")
          fimSe
       fimSe
    fimProcedimento

     

     

     

     

    [5] Alternativa para forma de validar

    Resumo: Textos dentro do métodos principais X textos dentro dos métodos de validação

     

    O código até aqui estaria com algo assim:

    algoritmo "Gerenciamento de Produtos v0.3"
    // Disciplina  :
    // Professor   :
    // Autor(a)    : Eli Almeidaa
    // Data atual  : 18/10/2023
    // ENUNCIADO:
    ...
    const
       QTD_MAX_PRODUTOS = 2
    
    tipo
       t_Produto = registro
          nome : caractere
          preco : real
          estoque : inteiro
       fimRegistro
    
    funcao existemProdutosCadastrados() : logico
    var
       retorno : logico
    inicio
       se (qtdProdutos > 0) então
          retorno <- VERDADEIRO
       senao
          retorno <- FALSO
       fimSe
    
       retorne retorno
    fimFuncao
    
    funcao vetorCheio() : logico
    var
       retorno : logico
    inicio
       retorno <- VERDADEIRO
    
       se (qtdProdutos < QTD_MAX_PRODUTOS) então
          retorno <- FALSO
       fimSe
    
       retorne retorno
    fimFuncao
    
    funcao produtoExiste (nome:caractere) : logico
    var
       contador : inteiro
       existe : logico
    inicio
       existe <- FALSO
    
       para contador <- 1 ate qtdProdutos faca
          se (produtos[contador].nome = nome) então
             existe <- VERDADEIRO
             interrompa()
          fimSe
       fimPara
    
       retorne existe
    fimFuncao
    
    procedimento cadastrarProduto()
    var
       novoProduto : t_Produto
    inicio
       se (vetorCheio()) então
          escrevaL("Não há mais espaço no vetor para cadastro de novos produtos")
       senao
          escrevaL("Informe o nome do produto")
          leia(novoProduto.nome)
    
          se (produtoExiste(novoProduto.nome)) então
             escrevaL("Já existe um produto com o nome '", novoProduto.nome, "' no cadastro!")
          senao
             escrevaL("Informe o preço do produto")
             leia(novoProduto.preco)
             escrevaL("Informe o estoque do produto")
             leia(novoProduto.estoque)
             qtdProdutos <- qtdProdutos+1
             produtos[qtdProdutos] <- novoProduto
             escrevaL("Produto cadastrado com sucesso")
          fimSe
       fimSe
    fimProcedimento
    
    procedimento listarProdutos()
    var
       contador : inteiro
    inicio
       se (não existemProdutosCadastrados()) então
          escrevaL("Não há produtos cadastrados")
       senao
          escrevaL("Produtos cadastrados :")
    
          para contador <- 1 ate qtdProdutos faca
             escrevaL("Nome    : ", produtos[contador].nome)
             escrevaL("Preço   : R$ ", produtos[contador].preco:1:2)
             escrevaL("Estoque : ", produtos[contador].estoque:1)
             escrevaL()
          fimPara
       fimSe
    fimProcedimento
    
    var
       produtos : vetor [1..QTD_MAX_PRODUTOS] de t_Produto
       opcao, qtdProdutos : inteiro
    inicio
       qtdProdutos <- 0
    
       repita
          escrevaL("[1]- Cadastrar produto")
          escrevaL("[2]- Consultar produto")
          escrevaL("[3]- Atualizar estoque")
          escrevaL("[4]- Listar produtos")
    
          escrevaL("Escolha uma opcao")
          leia (opcao)
    
          escolha opcao
          caso 1
             cadastrarProduto()
          caso 2
             consultarEstoque()
          caso 3
             atualizarEstoque()
          caso 4
             listarProdutos()
          fimEscolha
       ate (opcao = 0)
    fimAlgoritmo

     

    Ou seja: o método de cadastro que exibe a possível mensagem de erro.


    Mas poderia colocar o texto do "erro na validação" dentro do próprio método que valida, veja:

    funcao vetorCheio() : logico
    var
       retorno : logico
    inicio
       retorno <- FALSO
    
       se (qtdProdutos >= QTD_MAX_PRODUTOS) então
          escrevaL("Não há mais espaço no vetor para cadastro de novos produtos")
          retorno <- VERDADEIRO
       fimSe
    
       retorne retorno
    fimFuncao
    
    funcao produtoExiste (nome:caractere) : logico
    var
       contador : inteiro
       existe : logico
    inicio
       existe <- FALSO
    
       para contador <- 1 ate qtdProdutos faca
          se (produtos[contador].nome = nome) então
             escrevaL("Já existe um produto com o nome '", nome, "' no cadastro!")
             existe <- VERDADEIRO
             interrompa()
          fimSe
       fimPara
    
       retorne existe
    fimFuncao
    
    procedimento cadastrarProduto()
    var
       novoProduto : t_Produto
    inicio
       escrevaL("Informe o nome do produto")
       leia(novoProduto.nome)
    
       se ((não vetorCheio()) E (não produtoExiste(novoProduto.nome))) então
          escrevaL("Informe o preço do produto")
          leia(novoProduto.preco)
          escrevaL("Informe o estoque do produto")
          leia(novoProduto.estoque)
          qtdProdutos <- qtdProdutos+1
          produtos[qtdProdutos] <- novoProduto
          escrevaL("Produto cadastrado com sucesso")
       fimSe
    fimProcedimento

     

    Dessa forma o texto fica centralizado em um lugar só, ou seja, se outros métodos principais precisaram utilizar de uma mesma validação, não será necessário escrever a mensagem de erro. É um duplo ganho.

    1. não precisa reescrever a lógica de validação, basta invocar o método que deseja;

    2. não precisa reescrever o texto de resposta, pois o texto está já no método que valida.

     

    Testando:

     

    Se já existir o nome:

    image.png

     

    Se estiver cheio:

    image.png

     

    Se estiver cheio e for um nome repetido:

    image.png

     

    Veja que o programa pergunta o nome do produto mesmo se eventualmente estiver cheio... Aí vai tudo da forma que deseja que o programa se comporte, por exemplo, você pode querer que não pergunte o nome se já estiver cheio, aí precisaria ajustar o código para esse novo comportamento.

     

    Daí poderia fazer o mesmo com o lista, ou seja, o texto:

    escrevaL("Não há produtos cadastrados")

    que está dentro do listarProdutos() e passaria então a ficar no existemProdutosCadastrados(). Após ajustaria o listarProdutos() para essa nova mudança (ficando análogo ao cadastrarProduto()).

     

    O importante que a estrutura do código fique homogênea, ou seja, fica estranho uma método ter um padrão, e outro ter um diferente. Procurar deixar uniforme.

    • Curtir 3
    • Obrigado 1
  22. @devair1010, dá para simplificar simplesmente formatando os números. Exemplo:

     

    algoritmo "Tabuada do 1 ao 10"
    // Data : 13/10/2023
    var
       i,j : inteiro
    inicio
       escrevaL("Tabuada geral")
       escrevaL("")
    
       para i de 1 ate 10 faca
          escrevaL("")
          escrevaL("  Tabuada de ", i:1)
          escrevaL("")
    
          para j de 0 ate 10 faca
             escreva (i:2," x ", j:2, " = ")
             escrevaL(j*i:3)
          fimPara
       fimPara
    
       escrevaL(" ")
       escrevaL(" ")
    fimAlgoritmo
    • Obrigado 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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!