Ir ao conteúdo

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

Tudo que Simon Viegas postou

  1. Vou direto a alguns pontos: 0. sempre... sempre mantenha o código indentado. Existem diversos padrões, mas algum deve ser seguido. No VisualG pressione Ctrl+G para ter uma ajuda; 1. as nomenclaturas das funções devem ser Media() e Situacao(). Está explícito no enunciado; 2. acho não é necessário implementar "regras de negócios" por enquanto (se achar interessante, faz outro código sepadado). Fica implícito que só vai ser utilizado notas válidas (entre 0 e 10, inclusos); 3. eu acho que a função deveria retornar um "texto", apesar que achar que seria mais interessante retornar um "código de situação" também. Sobre o [3]: Em vez de: Sugeriria algo como: funcao Situacao(m: real): caractere inicio se (m >= 6) entao retorne ("APROVADO") fimSe se ((m >= 3) E (m < 6)) entao retorne ("RECUPERAÇÃO") fimSe se (m < 3) entao retorne ("REPROVADO") fimSe fimFuncao Exemplo de código completo: algoritmo "Ex:106 - Situação do aluno" //[96) Crie um programa que tenha uma função Media(), que vai receber as 2 //notas de um aluno e retornar a sua média para o programa principal.] //100) Melhore o exercício 96, criando além da função Media() uma outra função //chamada Situacao(), que vai retornar para o programa principal se o aluno //está APROVADO, em RECUPERAÇÃO ou REPROVADO. Essa nova função, vai receber //como parâmetro o resultado retornado pela função Media() funcao Media(n1, n2:real): real inicio retorne (n1+n2)/2 fimFuncao funcao Situacao(m: real): caractere inicio se (m >= 6) entao retorne ("APROVADO") fimSe se ((m >= 3) E (m < 6)) entao retorne ("RECUPERAÇÃO") fimSe se (m < 3) entao retorne ("REPROVADO") fimSe fimFuncao var nota1, nota2: real inicio escreva ("Digite a primeira nota:") leia(nota1) escreva ("Digite a segunda nota:") leia(nota2) escrevaL("") escrevaL(" Notas") escrevaL("1-", nota1:1:2) escrevaL("2-", nota2:1:2) escrevaL(" Media") escrevaL(Media(nota1, nota2)) escrevaL("") escrevaL("Situação do aluno: ", Situacao(Media(nota1, nota2))) fimAlgoritmo Observe que está invocando a função Media() duas vezes... estaria redundante. Poderia ser algo assim: var nota1, nota2: real m: real inicio escreva ("Digite a primeira nota:") leia(nota1) escreva ("Digite a segunda nota:") leia(nota2) m <- Media(nota1, nota2) escrevaL("") escrevaL(" Notas") escrevaL("1-", nota1:1:2) escrevaL("2-", nota2:1:2) escrevaL(" Media") escrevaL(m) escrevaL("") escrevaL("Situação do aluno: ", Situacao(m)) fimAlgoritmo Observe que essa variável m global não é a mesma variável declarada lá na em Situacao(), poderia ser diferente se quisesse... lá dentro da função vai ser utilizada a variável local (da própria função)... que para o contexto do código, eventualmente, vai ter o mesmo valor!!! Mas tecnicamente uma variável (a global) não tem nada a ver com a outra (a local). ADENDO 1 Seguindo a lógica do @kgin, mas utilizando constantes para deixar mais bonitinho... segue um exemplo: algoritmo "Ex:106 - Situação do aluno" //[96) Crie um programa que tenha uma função Media(), que vai receber as 2 //notas de um aluno e retornar a sua média para o programa principal.] //100) Melhore o exercício 96, criando além da função Media() uma outra função //chamada Situacao(), que vai retornar para o programa principal se o aluno //está APROVADO, em RECUPERAÇÃO ou REPROVADO. Essa nova função, vai receber //como parâmetro o resultado retornado pela função Media() const ALUNO_APROVADO = 1 ALUNO_RECUPERACAO = 2 ALUNO_REPROVADO = 3 funcao Media(n1, n2:real): real inicio retorne (n1+n2)/2 fimFuncao funcao Situacao(m: real): inteiro inicio se (m >= 6) entao retorne ALUNO_APROVADO fimSe se ((m >= 3) E (m < 6)) entao retorne ALUNO_APROVADO fimSe se (m < 3) entao retorne ALUNO_RECUPERACAO fimSe fimFuncao funcao LegendaSituacao(idSituacao: inteiro): caractere inicio //TODO: para traduzir o código da situacao para o texto correspondente fimFuncao var nota1, nota2: real m: real s: inteiro inicio escreva ("Digite a primeira nota:") leia(nota1) escreva ("Digite a segunda nota:") leia(nota2) m <- Media(nota1, nota2) escrevaL("") escrevaL(" Notas") escrevaL("1-", nota1:1:2) escrevaL("2-", nota2:1:2) escrevaL(" Media") escrevaL(m) escrevaL("") escreva ("Situação do aluno: ") s <- Situacao(m) se (s = ALUNO_APROVADO) entao escreval("APROVADO") fimSe se (s = ALUNO_RECUPERACAO) entao escreval("RECUPERACAO") fimSe se (s = ALUNO_REPROVADO) entao escreval("REPROVADO") fimSe fimAlgoritmo Obs.: nesse caso acima, não tem uma forma prática de enviar os valores das constantes pelos parâmetro para dentro da função, e meio que não teria problema em utilizar diretamente na função... (Isso tomando como princípio que uma função deve OU receber os valores por parâmetro, OU deve declarar as variáveis localmente, ou seja, evitar utilizar variáveis globais diretamente nas funções) ADENDO 2 Implementando a legenda... algoritmo "Ex:106 - Situação do aluno" //[96) Crie um programa que tenha uma função Media(), que vai receber as 2 //notas de um aluno e retornar a sua média para o programa principal.] //100) Melhore o exercício 96, criando além da função Media() uma outra função //chamada Situacao(), que vai retornar para o programa principal se o aluno //está APROVADO, em RECUPERAÇÃO ou REPROVADO. Essa nova função, vai receber //como parâmetro o resultado retornado pela função Media() const ALUNO_APROVADO = 1 ALUNO_RECUPERACAO = 2 ALUNO_REPROVADO = 3 funcao Media(n1, n2:real): real inicio retorne (n1+n2)/2 fimFuncao funcao Situacao(m: real): inteiro inicio se (m >= 6) entao retorne ALUNO_APROVADO fimSe se ((m >= 3) E (m < 6)) entao retorne ALUNO_RECUPERACAO fimSe se (m < 3) entao retorne ALUNO_REPROVADO fimSe fimFuncao funcao LegendaSituacao(idSituacao: inteiro): caractere inicio escolha idSituacao caso ALUNO_APROVADO retorne ("APROVADO") caso ALUNO_RECUPERACAO retorne ("RECUPERACAO") caso ALUNO_REPROVADO retorne ("REPROVADO") fimEscolha fimFuncao var nota1, nota2: real m: real s: inteiro inicio escreva ("Digite a primeira nota:") leia(nota1) escreva ("Digite a segunda nota:") leia(nota2) m <- Media(nota1, nota2) escrevaL("") escrevaL(" Notas") escrevaL("1-", nota1:1:2) escrevaL("2-", nota2:1:2) escrevaL(" Media") escrevaL(m) escrevaL("") escreva ("Situação do aluno: ", LegendaSituacao(Situacao(m))) fimAlgoritmo Obs.: claro que nessa versão final também poderia invocar a Media() diretamente (o que já citei que acharia redundante), mas daí seria algo assim: inicio escreva ("Digite a primeira nota:") leia(nota1) escreva ("Digite a segunda nota:") leia(nota2) escrevaL("") escrevaL(" Notas") escrevaL("1-", nota1:1:2) escrevaL("2-", nota2:1:2) escrevaL(" Media") escrevaL(Media(nota1, nota2)) escrevaL("") escreva ("Situação do aluno: ", LegendaSituacao(Situacao(Media(nota1, nota2)))) fimAlgoritmo Veja como é interessante... o VisualG vai executando de dentro para fora... Meio que o que importa é o valor que cada função traz... ou seja: a Media() retornar um inteiro, que é jogado na Situacao(), que por sua vez retorna outra inteiro, que é jogado em LegendaSituacao(), que por sua vez retorna um caractere, que por sua vez é jogado no escreva(), que é um procedimento. (procedimento = funcao que não tem retorno... OU pode-se dizer que função é um procedimento que tem um retorno nele mesmo... )...
  2. @Genilson20, qual a sua dúvida? Sobre: @Leandro ads, OK! Poste o código completo da parte que dá o resultado das raças... após, informe em qual parte está com dúvida para parte do média.
  3. @Leandro ads, vá fazendo aos poucos... poste o que já conseguiu fazer e em qual parte está com dúvidas. Um esboço inicial: algoritmo "Gerenciador bovino" //Questão extra: João cria bovinos de duas raças (1 e 2) em sua fazenda. Devido //a uma necessidade gerencial, ele deseja um algoritmo para calcular: // a quantidade de bois de cada raça; // a média de peso de cada raça; // o boi mais pesado e a sua raça; // e, o boi mais leve e a sua raça. //Para o funcionamento do algoritmo serão informados os seguintes dados, pelo //gerente da fazenda: //1) Primeiramente, e somente uma vez, a quantidade total de bois. //2) A raça (1 ou 2) e o peso de cada boi. //Diante do enunciado, forneça um algoritmo que atenda ao proposto e forneça //os resultados esperados. Observação: Submeta no campo de texto todo o //algoritmo que será corrigido no VISUALG. Vale 1 ponto na média. var qtdTotal: inteiro qtdRaca1, qtdRaca2: inteiro raca: inteiro i: inteiro inicio escreva ("Quantidade de bovinos: ") leia(qtdTotal) escrevaL("") escrevaL("") escrevaL("Informe a raça e o peso de cada boi") para i de 1 ate qtdTotal faca escrevaL("") escrevaL("Dados do bovino ", i:1, "") escreva ("Raça : ") leia(raca) fimPara fimalgoritmo Como poderia fazer para calcular a quantidade de cada raça? Uma forma seria usando uma estrutura de seleção (se). Exemplo: algoritmo "Gerenciador bovino" //Questão extra: João cria bovinos de duas raças (1 e 2) em sua fazenda. Devido //a uma necessidade gerencial, ele deseja um algoritmo para calcular: // a quantidade de bois de cada raça; // a média de peso de cada raça; // o boi mais pesado e a sua raça; // e, o boi mais leve e a sua raça. //Para o funcionamento do algoritmo serão informados os seguintes dados, pelo //gerente da fazenda: //1) Primeiramente, e somente uma vez, a quantidade total de bois. //2) A raça (1 ou 2) e o peso de cada boi. //Diante do enunciado, forneça um algoritmo que atenda ao proposto e forneça //os resultados esperados. Observação: Submeta no campo de texto todo o //algoritmo que será corrigido no VISUALG. Vale 1 ponto na média. var qtdTotal: inteiro qtdRaca1, qtdRaca2: inteiro raca: inteiro i: inteiro inicio escreva ("Quantidade de bovinos: ") leia(qtdTotal) escrevaL("") escrevaL("") escrevaL("Informe a raça e o peso de cada boi") para i de 1 ate qtdTotal faca escrevaL("") escrevaL("Dados do bovino ", i:1, "") escreva ("Raça (1 ou 2): ") leia(raca) se (raca = 1) entao qtdRaca1 <- qtdRaca1+1 fimSe se (raca = 2) entao qtdRaca2 <- qtdRaca2+2 fimSe fimPara fimalgoritmo Aí no final do programa, você coloca para exibir a resposta. Depois insere a lógica relacionada ao peso... Qualquer dúvida é só postar.
  4. Para melhorar a questão anterior, precisaria verificar se a resposta da questão anterior está correta, concorda?... Poste o enunciado completo da questão 88 e a sua resposta. Primeiro atua nela, depois atua na melhoria... Para adiantar... não deu para supor como estava antes, mas vamos nos basear que a função do procedimento seria exibir esse texto e com uma barra em cima e outra embaixo (ou que era só exibir o texto mesmo... tanto faz), ou seja, a "melhoria" seria apenas na questão de poder variar a barra (ou inserir barras e poder variar)... Um suposto código original: procedimento Gerador() inicio inicio escreval("=======================") escreval(" APRENDENDO PORTUGOL ") escreval("=======================") fimProcedimento Daí, uma melhoria poderia ser assim: algoritmo "Exercicio:89" procedimento Gerador(op: inteiro) var borda : caractere inicio escolha (op) caso 1 borda <- ("+-------=======------+") caso 2 borda <- ("~~~~~~~~:::::::~~~~~~~") caso 3 borda <- ("<<<<<<<<------->>>>>>>") fimEscolha escrevaL(borda) escrevaL(" APRENDENDO PORTUGOL ") escrevaL(borda) fimProcedimento var opcao: inteiro inicio escrevaL(" ==========================") escrevaL("| ESCOLHA UMA BORDA |") escrevaL("| 1 +-------=======------+ |") escrevaL("| 2 ~~~~~~~~:::::::~~~~~~~ |") escrevaL("| 3 <<<<<<<<------->>>>>>> |") escrevaL(" ==========================") escreva ("DIGITE UMA DAS opções: ") leia(opcao) limpaTela() Gerador(opcao) fimalgoritmo O gerador continuaria fazendo a mesma coisa (exibir um texto entre barras), só que agora com a possibilidade de escolher qual barra... Tem várias formas... mas meio que depende do enunciado anterior... Outro exemplo: procedimento Gerador(op: inteiro) var bordas : vetor [1..3] de caractere inicio bordas[1] <- ("+-------=======------+") bordas[2] <- ("~~~~~~~~:::::::~~~~~~~") bordas[3] <- ("<<<<<<<<------->>>>>>>") escrevaL(bordas[op]) escrevaL(" APRENDENDO PORTUGOL ") escrevaL(bordas[op]) fimProcedimento Outra forma, aproveitando o código do @kgin: procedimento Gerador(op: inteiro) funcao geradorBarras(opcao:inteiro): caractere inicio escolha (opcao) caso 1 escreval("+-------=======------+") caso 2 escreval("~~~~~~~~:::::::~~~~~~~") caso 3 escreval("<<<<<<<<------->>>>>>>") fimEscolha fimFuncao inicio escrevaL(geradorBarras(op)) escrevaL(" APRENDENDO PORTUGOL ") escrevaL(geradorBarras(op)) fimProcedimento Como a geração de barras seria uma funcionalidade específica do procedimento, poderia deixar a função dentro do procedimento... reparou nesse detalhe? . Se quiser colocar a função fora do procedimento vai funcionar da mesma forma... Outra forma: algoritmo "Exercicio:89" funcao geradorBarras(opcao:inteiro): caractere inicio escolha (opcao) caso 1 escreval("+-------=======------+") caso 2 escreval("~~~~~~~~:::::::~~~~~~~") caso 3 escreval("<<<<------------->>>>>") fimEscolha fimFuncao procedimento Gerador(barra: caractere) inicio escrevaL(barra) escrevaL(" APRENDENDO PORTUGOL ") escrevaL(barra) fimProcedimento var opcao: inteiro inicio escrevaL(" ==========================") escrevaL("| ESCOLHA UMA BORDA |") escrevaL("| 1 +-------=======------+ |") escrevaL("| 2 ~~~~~~~~:::::::~~~~~~~ |") escrevaL("| 3 <<<<<<<<------->>>>>>> |") escrevaL(" ==========================") escreva ("DIGITE UMA DAS opções: ") leia(opcao) limpaTela() Gerador(geradorBarras(opcao)) fimalgoritmo Etc
  5. Normalmente era para aceitar os comentários no lado, mas tem coisas que não funcionam bem no VisualG (toda versão tem uns bugs!). Deixando acima da linha ajuda a evitar.
  6. Recomendo utilizar a versão 3.6.0.5. Seria a mais estável... que dá menos problema. Download: https://sourceforge.net/projects/visualg30/files/ (baixe o VISUALG3_REV60.rar) ou Link direto: https://sourceforge.net/projects/visualg30/files/VISUALG3_REV60.rar/download Nas mensagens estão indicando a linha 13... que é a que está com problema... inicialmente voltaria a atenção para ela... no caso, faltou de fato declarar a variável. E, por uma questão estética e também evitar bugs, dê um espaço após o "(". Ex.: se (n > maior) entao maior <- n fimSe Adendo: como é uma sentença simples, esses "()" seriam facultativos. Particularmente prefiro usá-los.
  7. Em vez de usar "texto", que tal usar códigos? Ex.: algoritmo "Calculadora de aluguel de carro" var tipoCarro: caractere diasAluguel: inteiro kmPercorridos: inteiro valorASerPago: real inicio escrevaL("CALCULADORA DE ALUGUEL DE CARRO v0.01") escrevaL("") escrevaL("*** DADOS DO CARRO *** ") escrevaL("") escreva ("Tipo do carro ([1] Popular ou [1] Luxo): ") leia(tipoCarro) escreva ("Dias de alugel: ") leia(diasAluguel) escreva("km percorridos: ") leia(kmPercorridos) se (tipoCarro = "1") E (kmPercorridos <= 100) entao valorASerPago <- kmPercorridos*0.2 + diasAluguel*90 senao se (tipoCarro = "1") E (kmPercorridos > 100) entao valorASerPago <- kmPercorridos*0.1 + diasAluguel*90 senao se (tipoCarro = "luxo") E (kmPercorridos <= 200) entao valorASerPago <- kmPercorridos*0.3 + diasAluguel*150 senao se (tipoCarro = "luxo") E (kmPercorridos > 200) entao valorASerPago <- kmPercorridos*0.25 + diasAluguel*150 fimSe fimSe fimSe fimSe escrevaL("") escrevaL("Valor a ser pago: ", valorASerPago:1:2) fimAlgoritmo Caso deseje testar algumas modificações... Baseando nesse código acima ou no seu código, poderia inserir uma validação para só aceitar "tipo válidos", ou seja, ou só vai aceitar 1 ou 2, ou só vai aceitar "luxo" ou "popular". Caso informar um tipo inválido, solicitar a leitura desse dado novamente. Adendo: vale ressaltar que uma orientação geral é seguir apenas o que está no enunciado. Não precisa fazer a mais ou a menos... mas sim seguir os "requisitos do sistema". Alterações seria uma plus... uma versão separada. Adendo 2: o "tempo que perder" modificando um problema, pode ganhar ao começar a fazer outros, pois já terá as experiências mais ideias de possibilidades de como fazer...É muito mais fácil "copiar" soluções de problemas já conhecidos que "desvendar" problemas novos!
  8. Para indentar o código no VisualG, pressione CTRL+G. Sobre: Para que esses "()" na conta? Se quiser usar, uma sugestão seria manter a coerência... ou seja: Faria algo como: valor <- (km*0.2)+(dias*90) Ou faria: valor <- km*0.2+dias*90 Para ficar mais fácil de visualizar, poderia dar um espação entre o sinal de adição. Ex.: valor <- (km*0.2) + (dias*90) valor <- km*0.2 + dias*90 Adendo: esses espaços não fazem a menor diferença na conta. Seria apenas visual.
  9. O ":=" é a mesma coisa do "<-". Ex.: valor <- km*0.2+(dias*90) É o mesmo que: valor := km*0.2+(dias*90)
  10. Poste o que conseguiu fazer para analisarmos e também poder ser vi de base para futuros visitantes.
  11. É um exercício de quê? Seria para criar um problema? Por favor, poste também o enunciado completo. Outra coisa: quais assuntos já estudou? Creio que basicamente precisará de: Estrutura de seleção Vetores Registros Estrutura de repetição
  12. Qual erro está ocorrendo?
  13. Inserido calculo e exibição do IMC: algoritmo "Menus de opções" var //data atual diaAtual, mesAtual, anoAtual:inteiro //variáveis do usuário nome: caractere //variáveis cálculo imc imc, peso, altura, pesoIdeal: real anoNascimento, idade: inteiro op: caractere //opção do menu inicio escreva("Nome do usuário: ") //leia(nome) nome <- "Luiz Campos" escreval("") escreval("Insira a data de hoje exemplo: 01/01/2022: ") escreva("Insira o dia atual:") //leia(dia) diaAtual <- 14 escrevaL(diaAtual) escreva("Insira o mês atual:") //leia(mes) mesAtual <- 03 escrevaL(mesAtual) escreva("Insira o ano atual:") //leia(ano) anoAtual <- 2022 escrevaL(anoAtual) repita //limpaTela() escrevaL("") //--------------------------------------------------------------------------- //Menu de opções escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1,"/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("") escreval("Escolha alguma das opções abaixo!") escreval("") escreval("A - CALCULAR IMC----------------------") escreval("B - CALCULAR NÚMEROS------------------") escreval("C - CONVERTER CELSIUS PARA FAHREINHEIT") escreval("D - SISTEMA COTAÇÃO-------------------") escreval("E - FECHAR SISTEMA--------------------") leia(op) escreval("") se (op = "A") entao escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("Vamos abrir uma nova ficha para seu paciente:") escreval escreva ("Insira o nome de seu(a) paciente: ") //leia(nome) nome <- "Maria Joaquina" escrevaL(nome) escreva ("Insira a altura de seu(a) paciente: ") //leia(altura) altura <- 1.65 escrevaL(altura) escreva ("Insira o peso de seu(a) paciente: ") //leia(peso) peso <- 60 escrevaL(peso) escreva ("Insira a data de nascimento de seu(a) paciente: ") //leia(anoNascimento) anoNascimento <- 1990 escrevaL(anoNascimento) idade <- anoAtual - anoNascimento pesoideal<-(72.2*altura)-58 imc <- peso / (altura*altura) //resultados imc escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("Veja abaixo os resultados de seu paciente:") escreval("Nome : ", nome) escreval("Idade : ", idade:1, " anos") escreval("") escreval("Altura : ", altura:1:2, " m") escreval("Peso atual : ", peso:1:2, " kg") escreval("Peso ideal : ", pesoideal:1:2, " kg") escreval("") //abaixo do peso se (imc < 18) entao escreval("você está abaixo do seu peso ideal, seu imc é: " , imc:1:2) fimse //dentro do peso ideal se (imc >= 18) e (imc < 25) entao escreval("você está dentro do seu peso ideal, seu imc é: " , imc:1:2) fimse //acima do peso se (imc >= 25) entao escreval("") escreval("você está acima do seu peso ideal, seu imc é: " , imc:1:2) fimse fimse se (op = "B") entao escrevaL("Entrou opção 'B'") fimSe ate (op = "E") fimAlgoritmo Abaixo colocando os itens no menu em procedimentos (para organizar o programa principal): procedimento ItemMenuA() inicio escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("Vamos abrir uma nova ficha para seu paciente:") escreval escreva ("Insira o nome de seu(a) paciente: ") //leia(nome) nome <- "Maria Joaquina" escrevaL(nome) escreva ("Insira a altura de seu(a) paciente: ") //leia(altura) altura <- 1.65 escrevaL(altura) escreva ("Insira o peso de seu(a) paciente: ") //leia(peso) peso <- 60 escrevaL(peso) escreva ("Insira a data de nascimento de seu(a) paciente: ") //leia(anoNascimento) anoNascimento <- 1990 escrevaL(anoNascimento) idade <- anoAtual - anoNascimento pesoideal<-(72.2*altura)-58 imc <- peso / (altura*altura) //resultados imc escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("Veja abaixo os resultados de seu paciente:") escreval("Nome : ", nome) escreval("Idade : ", idade:1, " anos") escreval("") escreval("Altura : ", altura:1:2, " m") escreval("Peso atual : ", peso:1:2, " kg") escreval("Peso ideal : ", pesoideal:1:2, " kg") escreval("") //abaixo do peso se (imc < 18) entao escreval("você está abaixo do seu peso ideal, seu imc é: " , imc:1:2) fimse //dentro do peso ideal se (imc >= 18) e (imc < 25) entao escreval("você está dentro do seu peso ideal, seu imc é: " , imc:1:2) fimse //acima do peso se (imc >= 25) entao escreval("") escreval("você está acima do seu peso ideal, seu imc é: " , imc:1:2) fimse fimProcedimento procedimento ItemMenuB() inicio escrevaL("Entrou opção 'B'") fimProcedimento Observe pelo ItemMenuB() que basicamente foi inserido o que o "item B" faz dentro do procedimento, ou seja, lá para o "item A" simplesmente fiz o mesmo. Já no menu, basta chamar o procedimento: repita //limpaTela() escrevaL("") //--------------------------------------------------------------------------- //Menu de opções escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1,"/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("") escreval("Escolha alguma das opções abaixo!") escreval("") escreval("A - CALCULAR IMC----------------------") escreval("B - CALCULAR NÚMEROS------------------") escreval("C - CONVERTER CELSIUS PARA FAHREINHEIT") escreval("D - SISTEMA COTAÇÃO-------------------") escreval("E - FECHAR SISTEMA--------------------") leia(op) escreval("") se (op = "A") entao ItemMenuA() fimse se (op = "B") entao ItemMenuB() fimSe ate (op = "E") Observe como fica mais limpo!!! Daí pode ir criando outros procedimentos... (vou postar postariormente) Exemplo: em vez de calcular o IMC no código, criar uma função que retorna o valor do resultado. ... idade <- anoAtual - anoNascimento pesoideal<-(72.2*altura)-58 imc <- calcularIMC(altura, peso) //resultados imc escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("") ... Uma definição da função: funcao calcularIMC(altura, peso: real): real var imc: real inicio imc <- peso/(altura*altura) retorne imc fimFuncao Não tem mistério. A altura e o peso são os parâmetros necessários, daí eles podem vir por parâmetro. E foi criado uma nova variável para armazenar o resultado lá dentro da função. Após retorna o valor dessa variável. Lá no programa principal (código anterior) é atribuído o resultado da função na variável imc de lá. Mas porque tem duas variáveis imc no código, uma global e outra dentro da função? O VisualG permite isso, mas são variáveis distintas mesmo. A ideia é que a função deve ter tudo que ela precisa nela mesma!!!, ou seja, os valores externos chegam por parâmetro, e a variável auxiliar que vai armazenar o resultado é declarada dentro dela mesmo... Usei imc pois é uma nomenclatura adequada e também para justamente exemplificar que não tem problema ter nomenclaturas iguais para esses casos.
  14. @Luiz Campos, qual o enunciado completo da questão? Uma dica geral é tentar seguir o que está sendo pedido... Segue um exemplo de fluxo que sugeriria seguir: Crie esboços simples. Não precisa de muita filura: algoritmo "Menus de opções" var //data atual dia, mes, ano:inteiro //variáveis do usuário nome: caractere //variáveis cálculo imc imc, peso, altura, pesoIdeal: real anoNascimento, idade: inteiro op: caractere //opção do menu inicio escreva("Nomedo do usuário: ") //leia(nome) nome <- "Luiz Campos" escreval("") escreval("Insira a data de hoje exemplo: 01/01/2022: ") escreva("Insira o dia atual:") //leia(dia) dia <- 14 escreva("Insira o mês atual:") //leia(mes) mes <- 03 escreva("Insira o ano atual:") //leia(ano) ano <- 2022 limpaTela() //--------------------------------------------------------------------------- //Menu de opções escreval("Olá ", nome, ". Hoje é dia :", dia:1,"/", mes:1, "/", ano:1, ".") escreval("") escreval("") escreval("Escolha alguma das opções abaixo!") escreval("") escreval("A - CÁLCULAR IMC----------------------") escreval("B - CÁLCULAR NÚMEROS------------------") escreval("C - CONVERTER CELSIUS PARA FAHREINHEIT") escreval("D - SISTEMA COTAÇÃO-------------------") escreval("E - FECHAR SISTEMA--------------------") leia(op) limpaTela() fimAlgoritmo Observe que, como não importa o nome da pessoa, e que o "dia de hoje" não muda, dá para atribuir logo no código... tente evitar perder tempo digitando dados. Pronto, o código acima está rodando, mas não faz nada. Vou começar agora a implementar a parte do IMC... (vou postar em seguida) Inserido estrutura do menu: repita limpaTela() //--------------------------------------------------------------------------- //Menu de opções escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("") escreval("Escolha alguma das opções abaixo!") escreval("") escreval("A - CALCULAR IMC----------------------") escreval("B - CALCULAR NÚMEROS------------------") escreval("C - CONVERTER CELSIUS PARA FAHREINHEIT") escreval("D - SISTEMA COTAÇÃO-------------------") escreval("E - FECHAR SISTEMA--------------------") leia(op) escreval("") se (op = "A") entao escrevaL("Entrou opção 'A'") fimSe se (op = "B") entao escrevaL("Entrou opção 'B'") fimSe ate (op = "E") fimAlgoritmo Inserido obtenção dos dados para cálculo do IMC: algoritmo "Menus de opções" var //data atual diaAtual, mesAtual, anoAtual:inteiro //variáveis do usuário nome: caractere //variáveis cálculo imc imc, peso, altura, pesoIdeal: real anoNascimento, idade: inteiro op: caractere //opção do menu inicio escreva("Nome do usuário: ") //leia(nome) nome <- "Luiz Campos" escreval("") escreval("Insira a data de hoje exemplo: 01/01/2022: ") escreva("Insira o dia atual:") //leia(dia) diaAtual <- 14 escrevaL(diaAtual) escreva("Insira o mês atual:") //leia(mes) mesAtual <- 03 escrevaL(mesAtual) escreva("Insira o ano atual:") //leia(ano) anoAtual <- 2022 escrevaL(anoAtual) repita //limpaTela() escrevaL("") //--------------------------------------------------------------------------- //Menu de opções escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1,"/", mesAtual:1, "/", anoAtual:1, ".") escreval("") escreval("") escreval("Escolha alguma das opções abaixo!") escreval("") escreval("A - CALCULAR IMC----------------------") escreval("B - CALCULAR NÚMEROS------------------") escreval("C - CONVERTER CELSIUS PARA FAHREINHEIT") escreval("D - SISTEMA COTAÇÃO-------------------") escreval("E - FECHAR SISTEMA--------------------") leia(op) escreval("") se (op = "A") entao escreval("Olá ", nome, ". Hoje é dia :", diaAtual:1, "/", mesAtual:1, "/", anoAtual:1, ".") escreval("Vamos abrir uma nova ficha para seu paciente:") escreval escreva("Insira o nome de seu(a) paciente:") //leia(nome) nome <- "Maria Joaquina" escrevaL(nome) escreva("Insira a altura de seu(a) paciente:") //leia(altura) altura <- 1.65 escrevaL(altura) escreva("Insira o peso de seu(a) paciente:") //leia(peso) peso <- 60 escrevaL(peso) escreva("Insira a data de nascimento de seu(a) paciente:") //leia(anoNascimento) anoNascimento <- 1990 escrevaL(anoNascimento) idade <- anoAtual - anoNascimento //limpaTela() fimSe se (op = "B") entao escrevaL("Entrou opção 'B'") fimSe ate (op = "E") fimAlgoritmo Obteve os dados, agora vou implementar o cálculo e exibição dos resultados... (vou postar em seguida)
  15. Por favor, posta o que conseguiu fazer para analisamos e também poder ser de base para outros visitantes.
  16. Oi... vou ler a postagem com calma e responder...
  17. Sugiro fazer o programa por etapas. Por exemplo: primeiro faça simplesmente um programa que leia as linhas de um arquivo txt e escreve elas na tela. Consegue fazer isso?
  18. Segue um exemplo de refatoração: algoritmo "Exercício 56" //Exercício: Crie um programa que leia o nome, a idade e sexo de varias pessoas. //O programa vai perguntar se o usuário quer continuar ou não a cada pessoa. No //final mostre: //>> Qual a maior idade lida //>> Quantos homens foram cadastrados //>> Qual idade da mulher mais jovem //>> Qual a media da idade entre os homens // Autor : SkullKinght // Data : 04/03/2022 var nome: caractere idade :inteiro sexo: caractere maiorIdade: inteiro qtdHomens: inteiro idadeMulherMaisVelha: inteiro mediaIdadeHomens: real contador :inteiro resposta: caractere procedimento topo() inicio escrevaL("---------------------------") escrevaL(" IBGE ") escrevaL("---------------------------") fimProcedimento inicio resposta <- "S" enquanto (resposta = "S") faca topo() escrevaL("Deseja continuar?") leia(resposta) limpaTela() fimEnquanto fimAlgoritmo Daí só seguindo a estrutura: enquanto (resposta = "S") faca topo() escreva ("Nome : ") leia(nome) escreva ("Idade: ") leia(idade) escreva ("Sexo : ") leia(sexo) escrevaL("") escreva ("Deseja continuar? ") leia(resposta) limpaTela() fimEnquanto Por aí vai. Observações: A média só precisa calcular uma vez, ou seja, primeiro "soma" todos as idades, e quando terminar o laço de repetição (fora dele) calcula a média. Sobre: Não acho interessante utilizar a variável media servir para obter a soma, ou seja, média é média, soma é soma... No caso, evitar dar "duas funções diferentes para a mesma variável". Não tem necessidade, por exemplo, com o objetivo de "economizar variável"... já que é desprezível.
  19. Ah! Beleza... eu que dei uma moscada. Mas a dica da exibição tá valendo! kkkkkk Acho que essa estratégia de ter uma variável para cada "posição" um pouco complexa. Precisaria ficar atualizar o tempo todo elas entre si, já que precisam ficar em ordem. Uma boa estratégia seria criar uma copia da matriz e ordenar de modo decrescente. Daí bastaria pegar os 5 primeiros elementos. Lembrando que deve procurar não perder tempo preenchendo dados!!! Uma outra forma de preencher a matriz: para i de 1 ate 5 faca para j de 1 ate 10 faca escreva ("Digite a altura do atelta [",i:1, ",",j:2,"]: ") //leia(matriz[i,j]) matriz[i,j] <- 1.60 + (RandI(50)/100) escreval(matriz[i,j]:1:2) fimPara fimPara Daí você foca na lógica do algoritmo. Quando tiver pronto, se quiser digitar manualmente (que não vai fazer o menos sentido, mas vai lá), basta descomentar o leia() e comentar as duas linhas abaixo dele. Para perder ainda menos tempo: para i de 1 ate 5 faca para j de 1 ate 10 faca //escreva ("Digite a altura do atelta [",i:1, ",",j:2,"]: ") //leia(matriz[i,j]) matriz[i,j] <- 1.60 + (RandI(50)/100) //escreval(matriz[i,j]:1:2) fimPara fimPara Assim a matriz simplesmente será gerada. A "impressão na tela" da leitura é lenta e chata como quê. Na versão final ajusta. Segue abaixo um código resumido: algoritmo "Impressão 5 maiores valores de uma matriz" var matriz, matrizOrdenada: vetor[1..5,1..10] de real i, j: inteiro inicio para i de 1 ate 5 faca para j de 1 ate 10 faca //escreva ("Digite a altura do atelta [",i:1, ",",j:2,"]: ") //leia(matriz[i,j]) matriz[i,j] <- 1.60 + (RandI(50)/100) //escreval(matriz[i,j]:1:2) fimPara fimPara escrevaL("") para i de 1 ate 5 faca para j de 1 ate 10 faca escreva (matriz[i,j]:6:2) fimPara escrevaL("") escrevaL("") fimPara //aqui copia o vetor matriz para matrizOrdenada //aqui ordena o vetor matrizOrdenada de modo decrescente escreva ("Os 5 maiores atletas tem alturas: ") para j de 1 ate 4 faca escreva (matrizOrdenada[1,j]:1:2, "cm, ") fimPara escrevaL(matrizOrdenada[1,5]:1:2, ".") escrevaL("") fimAlgoritmo Como ordenar uma matriz? Google! Qual método de ordenação escolher? Use o Bubble Sort. Depois você para para pesquisar outros métodos de ordenação, mas 99% de certeza que vai escolher esse. Tela: PS: se alguém se perguntar porque o resultado final está zerado, você está no lugar certo (aqui no Fórum)!!! KKKKKKKKKKKKK Adendo: agora pense aí. Para chegar nessa configuração de exibição da matriz e o resultado final, eu testei mais de 10x. Imagine se precisasse preencher ou esperar a matriz se gerada a cada tentativa?
  20. @cassianotomasi, uma dica inicial: para ajudar nos testes, dá para gerar os números automaticamente: Depois só pressionar F9 normalmente. Para "imprimir uma matriz", uma boa alternativa é "formatar o número" delimitando uma quantidade mínima de caracteres. Ex.: para i de 1 ate 5 faca para j de 1 ate 10 faca escreva(matriz[i,j]:5) fimPara escreval("") fimPara Esse ":5" vai fazer que o número ocupe sempre pelo menos 5 caracteres na tela, inserindo espaços à esquerda quando necessário. Veja um resultado: Pode também colocar para pular duas linhas: Outro exemplo delimitando 3 espaços e ainda pulando 2 linhas: Etc.
  21. @Mauex7, seja bem vindo ao Fórum do Clube do Hardware. Deve ser algum bug da versão que está utilizando. Veja uma fonte: https://www.apoioinformatica.inf.br/produtos/item/13-comando-de-selecao-multipla A dica que dou é a mesma:
  22. @VictorHC82, qual versão do VisualG está utilizando? Funciona, sim! Veja: Sobre: Essa característica de funcionar com um só seria no Pascal (pai do VisualG). Pelo menos nas versões que conheço. No VisualG vai de boa. Sugiro utilizar a verão 3.6.0.5. Exemplo de fonte: https://sourceforge.net/projects/visualg30/files/ Baixe o VISUALG3_REV60.rar
  23. Alguns detalhes: A depender do contexto do exercício, é necessário especificar ou padronizar a "unidade de medida", por exemplo: solicitar que insira em metro (m). Se um retângulo tiver 1.2km por 600m de altura, o usuário não pode inserir 1.2 e 600. A resposta vai dá errada! OU deve inserir 1.2 e 0.6 (em quilômetros), OU inserir 1200 e 600 (em metros) etc. O cálculo sempre deve ser feito com unidades de medidas iguais. Outro ponto, ao escrever números na tela, o VisualG insere um espaço à esquerda. Vejam a imagem da postagem anterior. Tem espaços extras, daí precisa ajustar na hora de usar. Segue uma exemplificação: algoritmo "Cálculo área de um retângulo" var base, altura, area : real inicio escreva ("Insira valor para base: ") leia(base) escreva ("Insira valor para altura: ") leia(altura) area <- base*altura escreval("") escreval("Você digitou", base, " para a base e", altura, " para a altura.") escreval("Seu retângulo possui uma área de", area, "u.") fimAlgoritmo A unidade de medida precisa ser informada. Tipo, seria 28.26 o quê? Metros? Quilômetros? Anos-luz? No caso acima, usei "u", que seria uma tentativa para representar "unidade de medida", ou seja, esse retângulo teria 28.26 unidades de medidas. (Se os dados foram inseridos em metros, será metros. Se foi inserido em anos-luz, será anos-luz etc.) Adendo: talvez a sigla para "unidade de medidas" seja "u.m.". Eu não lembro e nem consegui encontrar facilmente. Adendo 2: O espaço que conta é o que está entre as " (aspas duplas). Utilizar como citados abaixo vai dar exatamente o mesmo resultado: escreval("Você digitou",base," para a base e",altura," para a altura.") escreval("Seu retângulo possui uma área de",area,"u.") ou assim: escreval("Você digitou" , base , " para a base e" , altura , " para a altura.") escreval("Seu retângulo possui uma área de" , area , "u.") ou assim: escreval("Você digitou" , base , " para a base e" , altura , " para a altura.") escreval("Seu retângulo possui uma área de" , area , "u.") Entretanto ficam estranho e difícil de ler. Melhor seguir o padrão da nossa língua portuguesa: "As vírgulas ficam coladas à esquerda e com um espaço a direita", assim como você já faz.
  24. Então, só é divisível quando a divisão é exata... Essa justamente a ideia. Exato, não é necessário imprimir os "...". Isso foi usado apenas para resumir o enunciado. Entra nos pontos que cheguei a comentar: abstração e contexto. Estaria bem claro que ele quer a lista completa... o "exatamente como mostrado abaixo" seria apenas uma pequena falha... um pequeno detalhe.. Outra coisa: esses "..." podem ter sido inseridos por outra pessoa, como o autor do post, ou o professor, que poderia ter usado apenas para não deixar o resultado todo pronto... sei lá. Ah! Ainda em relação ao "análise do contexto", eu falei sobre isso: Ou seja: se teve uma aula hoje sobre enquanto, aí o exercício está na lista do assunto, porque raios vai querer fazer com para? Está implícito que necessariamente tem que fazer com enquanto. Agora, se já estudou os 3 laços de repetições que citei e não está preso ao tema, aí o programador poderia escolher. Então, da mesma forma eu não poderia fazer isso!!! Veja aí: a resposta está certa!!!! Concorda? Eu exibi a lista como ele pediu... mas é (deveria estar) óbvio que está querendo que crie uma lógica que gere a sequência... No caso da solução encontrada. envolvendo "laços de repetições" (enquanto, para ou repita) e "estrutura de seleção" (se / senao). Daria para fazer só com se/senao, verificando cada número, mas ficaria tosco :D. O VisualG seria justamente o Pascal em Português. Basicamente meio que uma tradução dos comandos... A estrutura é bem parecida.. além da implementação de outras facilidades.. Mas infelizmente nem tudo funciona muito bem ainda. Um projeto semelhante seria o Portugol Studio. No site deles dá uma resumida no porque seria interessante usar em Português. (Meio que focar na lógica para os resultados... ficando mais atrativo) Site: http://lite.acad.univali.br/portugol/ Vídeo:
  25. Existem 2 pontos centrais: - Interpretação de texto X fazer o que está sendo pedido; - Exercício e uso da abstração. Para o primeiro, veja: Percebe? Ele que assim, e tem que ser feito assim... não tem algo a ver com informar se é divisível ou não. Ele quer apenas "destacar os divisíveis". Então, o que o exercício quer? Seria algo como: "Ele quer exibir uma lista decrescente, só que destacando os múltiplos de 4". Correto? Poderia começar com o mais simples: Exibir a lista sem destacar: Utilizando o para, como sugerido pelo @Midori: algoritmo "De 30 a 1, destacando os múltiplos de 4" var contador : inteiro inicio para contador de 30 ate 1 passo -1 faca escreva(contador) fimPara fimAlgoritmo Utilizando enquanto: algoritmo "De 30 a 1, destacando os múltiplos de 4" var contador : inteiro inicio contador <- 30 enquanto (contador >= 1) faca escreva(contador) contador <- contador-1 fimEnquanto fimAlgoritmo Observação: TUDO que faz com enquanto, dá para fazer com para ou repita. Apenas um vai ser "mais prático" que o outro, ok? Quando usar um ou outro? Vai do contexto. Por exemplo, se está estudando enquanto, tem que usar enquanto. (muito gente não consegue entender isso, mesmo no nível superior).. isso tem a ver com lógica! Mas, se não um exercício para um laço em específico, no caso acima, se quer simplificar, o para seria o melhor caminho. Hum! Um exemplo com repita: repita escreva(contador) contador <- contador-1 ate (contador < 1) Vê? Se for colocar no que seria do "melhor para o pior" para esse exercício: para (pois já controla o contador nele mesmo) > repita (pois vai exibir primeiro, para depois verificar) > enquanto (esse verifica primeiro, mas sabemos que sempre vai exibir na primeiro, logo perda de tempo) Tá, "já consegui listar os número", agora seria só "destacar os múltiplos de 4"... algo que já foi demonstrado em postagem anteriores. Adendo: Sobre: Isso, alguns tipos de dados o desenvolvedor do VisualG resolveu inserir um espaço antes da exibição. No Pascal (pai do VisualG) não é assim. Acho ruim isso. Forma de contornar: enquanto contador > 0 faca se contador % 4 = 0 entao escreva (" [", contador:1, "]") senao escreva (contador) fimSe contador <- contador-1 fimEnquanto Esse número após o ":" diz para o VisualG a quantidade de casas reservadas, como sempre tem uma casa, vai ficar colado à esquerda (retira o espaço). Tem gente que usa ":0". Eu não gosto.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!