Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

posts postados por Simon Viegas

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. @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
  10. @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
  11. 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
  12. 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
  13. 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
  14. @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
  15. @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
  16. Em 29/09/2023 às 14:23, devair1010 disse:
             se ( asc(ax) < 48 ) ou ( asc(ax) > 57 ) então
               escreval("Erro, '",maiusc(ax),"' não é Número .")
             fimse

     

    Em 29/09/2023 às 16:14, Midori disse:

    @devair1010 Para uma validação mais rigorosa não encontrei outra forma sem loop. Porque só com Asc este teste retorna falso,

     

    Essa validação acima não passa no teste porque o comando Asc() só pega o primeiro caractere da sequência (de caracteres) que foi enviado. Por exemplo: se enviar "41dois", ele só vai pegar o 4, portanto a sentença vai resultar em FALSO. (Não acusando o erro.)

     

    Definição:

    Asc (s : caractere) : Retorna um inteiro com o código ASCII do primeiro caractere da expressão.

     

    Adendo: isso ocorre porque o VisualG não tem algo como o tipo "char" (um caractere), tem apenas o tipo "cadeia de caractere" (que seria análogo ao string das principais linguagens). Ao mesmo tempo esse "código ASCII" é sempre para um caractere único, daí o VisualG já separa o primeiro automaticamente . Seria algo como:

     

    Asc(Copia(s, 1, 1))

     

     

     

     

    Adendo 2:

    Em 29/09/2023 às 16:14, Midori disse:
    Funcao Numero(Valor: caractere): Logico
    Var
       I:    Inteiro
       Num:  caractere
       Ret:  Logico
    
    Inicio
       I <- Compr(Valor)
       Ret <- Verdadeiro
       Enquanto I > 0 Faca
          Num <- Copia(Valor, I, 1)
          Se(Num < "0") Ou (Num > "9") então
             Ret <- Falso
          FimSe
          I <- I - 1
       FimEnquanto
       Retorne Ret

     

    Apenas para efeitos didáticos. Dá para interromper o laço após identificar o primeiro caractere inválido (que não é número). Exemplo:

     

             se (num < "0") OU (num > "9") então
                ret <- FALSO
                interrompa
             fimSe

     

    Obs.: tecnicamente não é uma boa prática utilizar o interrompa. Mas nesse contexto não tem problema.

     

     

    • Curtir 1
    • Obrigado 1
  17. Em 19/08/2023 às 16:18, Eli Almeidaa disse:

    @Simon Viegas , minha pergunta foi se a função asc só retorna o decimal da primeira letra da palavra, porque nesse código abaixo,

    a variável 'palavra' contém o nome "lógica" e quando executa asc(palavra), só retorna o decimal da primeira letra, no caso do "L".

     

    Só retorna o código da primeira letra, como destaquei na definição da função:

     

    Em 15/08/2023 às 21:36, Simon Viegas disse:

    image.png

     

    image.png

     

    Ou seja: no VisualG não existe um tipo específico para "um caractere" (char), tem apenas para "um conjunto de caracteres" (string), daí, a função Asc() foi desenvolvida para "automaticamente" extrair a primeira letra da cadeia de caracteres que foi enviada. Ela sempre recebe um conjunto de caracteres (mesmo que tenha tamanho 1) e usa apenas o primeiro deles.

     

     

     

     

    Em 19/08/2023 às 16:18, Eli Almeidaa disse:

    E enquanto a função carac minha dúvida é se ela só ler um decimal por vez, ou se pode ler um conjunto de decimais que forma uma palavra inteira, porque ao

    tentar retornar, por exemplo, o nome "Lógica" utilizando decimais que formam esse nome, dá erro . Como aqui :

     

    Um caminho é tentar buscar a definição da função:

     

     

    image.png

     

     

    Ou seja: ela recebe apenas UM inteiro. Logo, só tem como traduzir para UM caractere.

     

    Adendo

    Agora perceba: e mesmo assim, como o VisualG separaria onde começaria e onde terminaria cada código de caractere na "sequência" 761621031059997? O primeiro é 7 ou 76? Se o primeiro for 7, o próximo seria 6 ou 61? Se o primeiro for 76, o próximo seria 1 ou 16... ou 162? Saca?.... Esse tipo de "amadurecimento lógico" vai se criando a medida que vai se desenvolvendo.

    ,

    CONCLUSÃO

    Ambos só funcionando traduzindo uma código/caractere por vez.

     

    • Obrigado 1
  18. Sobre: 

    Em 14/09/2023 às 16:24, Palagar disse:

    Alguém sabe dizer o porquê do seguinte código está dando erro no visualg?

     

    Faltou informar "qual o erro" 🙂. Por exemplo: "quando informei um total de venda maior ou igual a 55000, o programa acusou esse erro:".

     

    image.png

     

     

    Não sei se foi esse erro, mas no caso um dos problemas é que faltou completar a estrutura do se, ou seja, colocar a expressão da condição e o então. (Além da questão que senao e se NÃO poderem ficar na mesma linha no VisualG. #confia)

     

    Em 14/09/2023 às 16:24, Palagar disse:
    senao se

     

     

     

     

    No novo código, o problema da "separação" persistiu:

     

    Em 16/09/2023 às 07:37, Palagar disse:
       senao se (total_vendido > 100000) então

     

    No VisualG comandos diferentes não podem ficar na mesma linha. Além disso está faltando um fimSe. O correto (em relação à sintaxe) seria algo como:

     

       se (total_vendido < 55000) então
          comissao <- 100
       senao
          se (total_vendido > 100000) então
             comissao <- 5000
          fimSe
       fimSe
       
       se (total_vendido >=55000) e (total_vendido <= 100000) então
          comissao <- total_vendido * 0.02
       fimSe

     

     

    Simplificando:

       se (total_vendido < 55000) então
          comissao <- 100
       senao
          se (total_vendido >= 55000) e (total_vendido <= 100000) então
             comissao <- total_vendido * 0.02
          fimse
       senao
          comissao <- 5000
       fimSe
  19. 12 horas atrás, LendaNoLinux disse:

    Assim fica melhor,eu já resolvi

     

    Show!

     

     

     

     

    12 horas atrás, LendaNoLinux disse:
    var mesesTrabalhados,salarioMensal,decimoTerceiro:real;
    
    begin
          mesesTrabalhados := StrToFloat(EditMesesTrabalhados.text);
           salarioMensal := StrToFloat(EditSalarioMensal.text);
           decimoTerceiro := (SalarioMensal/12)*mesesTrabalhados;
           EditDecimoTerceiro.text := FloatToStr(decimoTerceiro);
    
    
    
    end;          

     

    Procure também sempre manter o código organizado na indentação e espaçamento. Exemplo:

     

    var
       mesesTrabalhados, salarioMensal, decimoTerceiro:real;
    
    begin
       mesesTrabalhados := StrToFloat(EditMesesTrabalhados.text);
       salarioMensal := StrToFloat(EditSalarioMensal.text);
       decimoTerceiro := (salarioMensal/12)*mesesTrabalhados;
       EditDecimoTerceiro.text := FloatToStr(decimoTerceiro);
    end;

     

    Nesse exemplo utilizei 3 espaços para dar um dente (margem), mas poderia utilizar o padrão do "tab" aí na sua IDE. O importante que fique uniforme.

     

    Detalhe: "salarioMensal foi declarada iniciando com minúsculo. Mantenha também um padrão só.

     

    Quando mais organizado, mais simples.

     

    • Curtir 1
  20. Em 17/08/2023 às 16:12, LendaNoLinux disse:

    A formula do decimo terceiro salário está errada né? Era para ser a seguinte:

     

     

    A fórmula meio que vai depender dos requisitos do enunciado da questão ou das especificações do projeto etc.

     

    Abstraia que seria para criar um código... pesquisaria sobre o tema e se aprofundaria mais. Quais as leis que regulamentam o décimo terceiro e o que dizem? Dá uma lida!

     

     

    Aí depois para para implementar em alguma linguagem, ou seja, o código seria apenas para uma automação, mas os cálculos em si podem ser feitos da forma que quiser... (Papel, calculadora, Excel etc.)

     

     

     

    3 horas atrás, LendaNoLinux disse:

    Assim fica melhor:

     

    Basicamente, a ideia é que os códigos não precisem ter comentários.

     

    Original:

    3 horas atrás, LendaNoLinux disse:
        mes:=StrToFloat(Edit1.text);
        salario:=StrToFloat(Edit2.text);
        resultado:=mes*salario/12;
        Edit3.text:=FloatToStr(resultado);

     

    Que tal:

        qtdMeses := StrToFloat(Edit1.text);
        salarioMensal := StrToFloat(Edit2.text);
        decimoTerceiro := qtdMeses*salarioMensal/12;
        Edit3.text := FloatToStr(decimoTerceiro);

     

     

    Exemplo ainda mais sugestivo:

        mesesTrabalhados := StrToFloat(EditMesesTrabalhados.text);
        salarioMensal := StrToFloat(EditSalarioMensal.text);
        decimoTerceiro := (mesesTrabalhados/12)*salarioMensal;
        EditDecimoTerceiro.text := FloatToStr(decimoTerceiro);

    Obs.: matematicamente não precisa dos "()" ali na terceira linha, pode remover. Deixei para exemplificar que poderia destacar os membros da operação... 

    • Curtir 1
  21. A base de tudo é o tal ASCII... mas vou tentar detalhar uns pontos. Vamos lá:

     

     

    Em 14/08/2023 às 20:21, Eli Almeidaa disse:

    Essa função asc aí ela só retorna o número decimal da primeira letra da palavra, mesmo que a palavra tenha outra letras ?

     

    Pesquisou sobre a função? (Não estou criticando, apenas estimulando.)

     

    Veja:

    image.png

     

    image.png

     

    🙂

     

    Veja: nesse PDF eu tentei pesquisar por "asc()" e não achei. Daí coloquei um espaço no meio... 😉

     

    Entrando apenas num âmbito de uma mais alta "abstração". Independente do que esse "inteiro" (o retorno) venha representar, precisaria entender que existe uma "correlação" de um (caractere) para um (número). "Ele obtém um caractere e retorna um número de acordo com esse caractere, o que lá isso signifique".

     

     

     

     

    Em 14/08/2023 às 20:21, Eli Almeidaa disse:

    2º)Mesmo que a variável palavra tenha "Lógica", ela só retorna o decimal da primeira letra no caso, do "L" ?

     

    Ou a pergunta ficou repetida (mesmo conteúdo da primeira), ou eu não entendi bem o que quis dizer...

     

     

     

     

     

    Em 14/08/2023 às 20:21, Eli Almeidaa disse:

    3º)E  função carac só pode ler dois números por vez para representar um caractere ou três números por vezes para representar um caractere, não pode ler um conjunto de números para representar a palavra inteira ?

     

    Não. A função Carac() só recebe um valor (inteiro). Se você estiver se referindo a "dois dígitos", a resposta também é não. Ela recebe um "número qualquer" (uma eventual quantidade de dígitos seria outra questão)... e retorna um caractere que tem correção com esse número...

     

    Para entender o que poderia ser "esses números" ou "esses caracteres", precisa apenas "pesquisar um pouco mais sobre ASCII".

     

     

     

     

    Em 14/08/2023 às 20:21, Eli Almeidaa disse:

    Já que você mencionou a tabela ASCII. Tenho um pouco de dificuldade para entender. A tabela ASCII só funciona para dados do tipo caractere?

     

    Sobre o ASCII é isso.

    Pesquise mais sobre!. A proposta é essa mesma: ter contato com algo novo e, caso necessário, "vestir a roupa de sapo" para tentar entender o que é. Veja artigos sobre o tema, assista vídeos no Youtube até assimilar. "ISSO VALE PARA QUALQUER COISA... PARA QUALQUER CONTEXTO". Ao entender o ASCII, vai entender perfeitamente para que serve o Asc() e Carac(). Tipo, elas são funções "opostas". Mais uma vez abstraindo: um "traduz algo de um caractere para um número", o outro "traduz algo de um número para um caractere"... isso relacionado a uma mesma coisa (de uma tal tabela lá).

     

    É algo relativamente simples, é só ter um pouco mais de contato. Se aprofunde nos temas que venham a ocorrer no caminho.

     

    Ao entender o ASCII, vai também entender porque resolvi utilizar esses dois pares de pares de caractere:

     

    Em 14/08/2023 às 19:39, Simon Viegas disse:
    se (((cod >= 65) E (cod <= 90)) OU ((cod >= 192) E (cod <= 218))) então
    Em 14/08/2023 às 19:39, Simon Viegas disse:
    se (((cod >= 97) E (cod <= 122)) OU ((cod >= 224) E (cod <= 250))) então

     

    E o restante da lógica também

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