-
Posts
3.940 -
Cadastrado em
Tipo de conteúdo
Artigos
Selos
Fabricantes
Livros
Cursos
Análises
Fórum
posts postados por Simon Viegas
-
-
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
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
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:
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.- 2
- 1
-
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:
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:
Aí vai sair zerado mesmo...
- 1
-
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: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
-
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:
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.
- 1
-
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.
- 1
-
Show! Só um detalhe: ao informar um nome de produto inexistente, o programa "não faz nada".
Poderia dar uma arrumada nisso.
-
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:
Adendo 2: não, não nos pergunte como configurar as listas. PESQUISE!!!
No aguardo.
- 1
-
No caso:
System.out.println("Seu sistema está em " + idioma);
Seria equivalente a:
System.out.print("Seu sistema está em "); System.out.println(idioma);
- 1
-
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".
O produtoCadastrado() pode seguir a mesma lógica.
- 1
- 1
-
@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
- 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.
- 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).
- 3
- 1
-
@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.
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".
- 2
- 1
-
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
-
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.
- 2
- 1
-
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:
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á!).
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
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.
- 1
-
@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:
Se estiver cheio:
Se estiver cheio e for um nome repetido:
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.
- 3
- 1
-
@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
- 1
-
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.
- 1
- 1
-
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: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:
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.
- 1
-
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:".
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
-
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.
- 1
-
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...
- 1
-
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:
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
-
@Caio Felipe Souza da Silva, baixa novamente o VisualG para ver.
Por favor, poste o texto do código para podermos testar também.
-
@kgin, topzeira...
Detalhe: "por que 'B' para ocupado?". Meu palpite foi que o enunciado teria sido traduzido do inglês. Esse "B" seria de "Buzy".
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
Calculo de valor da hora trabalhada
em Programação - iniciantes
Postado
Opa! Vou tentar detalhar alguns pontos.
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:
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:
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:
Print de tela indicando menu, do VisualG, onde consta a item "Indentação Ctrl+G"
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:
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):
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:
Pontos para verificar posteriormente:
No aguardo.