-
Posts
3.940 -
Cadastrado em
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que Simon Viegas postou
-
VisualG Erro no Visualg, não consigo detectar
Simon Viegas respondeu ao tópico de Gabriel Pancaldi em Programação - iniciantes
@Gabriel Pancaldi, aquele seu primeiro código é o completo, ou só parte? Para adiantar: - cada expressão do se é separada por colchetes "()", ex.: se (a>b) e (b>c) ENTÃO - é necessário declarar o nome do programa e as variáveis que você está utilizando, ex.: algoritmo "Nome do meu algoritmo" //nome do algoritmo var a,b,c :inteiro //é necessário declarar as variáveis que serão usadas inicio fimalgoritmo O seu código fica entre o "inicio" e "fimalgoritmo". *** Tente fazer as correções e poste seu código completo e onde está com dúvidas. No aguardo. -
VisualG Menor número digitado no Visualg
Simon Viegas respondeu ao tópico de FreeBsd em Programação - iniciantes
Olá @George Rogner. Certinho! . Essa solução é justamente o @Math.Pi sugeriu... Apenas uns adendos: 1) SOBRE "SOLUÇÕES" Na verdade seria "uma" solução... tecnicamente existem infinitas. 2) ESTRUTURAS DE REPETIÇÕES A princípio o seu código está certo, mas levando pelas características do seu código e dos laços de repetições disponíveis na linguagem, talvez seja mais interessante trocar o enquanto por para, pois este último poderia controlar a variável ContaNumero automaticamente, ou seja, na própria estrutura do para. 3) INDENTAÇÃO Um ponto importante na programação a indentação. Os códigos devem sempre está bem indentados. Ex.: Algoritmo "O menor número" Var ContaNumero, NumeroDigitado, SomaNumero, MenorNumero: inteiro Inicio ContaNumero <- 1 MenorNumero <- 100000 Enquanto ContaNumero <= 5 Faca Escreva("Digite o", ContaNumero,"º número: ") Leia(NumeroDigitado) Se (NumeroDigitado < MenorNumero) ENTÃO MenorNumero <- NumeroDigitado FimSe ContaNumero <- ContaNumero + 1 SomaNumero <- SomaNumero + NumeroDigitado FimEnquanto EscrevaL("O menor número digitado foi ", MenorNumero) Escreva("Resultado da soma de todos os números é de ",SomaNumero) Fimalgoritmo Perceba que o quê está dentro do Enquanto fica um dente pra dentro, assim como o quê está dentro do se, vai um dente também... -
VisualG Algoritmo quiz
Simon Viegas respondeu ao tópico de Pablo Queiroz Dias em Programação - iniciantes
Olá a todos... Só uns adendos: 1) CONDIÇÕES MUTUAMENTE EXCLUDENTES Assim como foi usado o SE/ENTÃO/SENÃO para o acertos ou erros, deveriam-se também usar para o Menu, ou seja, lá está com um conjunto de SE/ENTÃO, mas deveria ser SE/ENTÃO/SENÃO (não pode ser 0, 1 ou 2 ao mesmo tempo)... ou como sugerido por @devair1010, usar o ESCOLHA/CASO. (que é uma espécie de se/então/senão mais sofistica). 2) VARIÁVEIS Ao usar o hanking, os vetores vetnome e vetpontos passaram a não ser mais úteis, logo, apagar lá da declaração. 3) VALIDAÇÃO DE ITEM Antes de iniciar o Ranking, poderia fazer uma verificação se já existe alguma partida já finalizada, ou seja, com "cont<>1". Isso inclusive já evitaria essa verificação: Obs.: pelo que eu entendi, quando nenhuma partida ainda foi feita, o cont conterá 1, daí ao fazer cont-1, ele iria para 0. *** Por enquanto é isso. No aguardo. -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Olá @Helen Fernanda de Souza, um ponto importante é a definição de como você vai excluir os números dos vetores. No seu código você declarou o vetor_excluir lá na linha 5, mas não está utilizando em momento algum. Ou seja, ou você adapta o algoritmo para usar o vetor, ou apaga essa variável. Pelo código, verifiquei que está "apagando" o número do próprio vetor, como visto na linha 38: vetor_normal[ c ] := 0 Pronto, vamos tomar como base que vai "zerar" a posição que foi apagada. Desse modo, o vetor_exclur pode ser apagado. Outro ponto seria reorganizar as nomenclaturas das variáveis, deixando um pouco mais sugestiva... algo como: var vetor_60 :vetor [1..60] de inteiro //vetor armazena 60 posiçoes vetor_30_1 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_30_2 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_30_3 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_10_1 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_10_2 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_10_3 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_3_1 :vetor [1..3 ] de inteiro //vetor armazena 3 posições vetor_3_2 :vetor [1..3 ] de inteiro //vetor armazena 3 posições vetor_3_3 :vetor [1..3 ] de inteiro //vetor armazena 3 posições Seguindo esses princípios, creio que os passos podem ser mais ou menos estes: - Gera 60 números para o vetor_60; - Exclui 10 número do vetor_60; - Sorteia 30 números para o vetor_30_1 do vetor_60; - Sorteia 30 números para o vetor_30_2 do vetor_60; - Sorteia 30 números para o vetor_30_3 do vetor_60; - Exclui 10 número do vetor_30_1; - Exclui 10 número do vetor_30_2; - Exclui 10 número do vetor_30_3; - Sorteia 10 números para o vetor_10_1 do vetor_30; - Sorteia 10 números para o vetor_10_1 do vetor_30; - Sorteia 10 números para o vetor_10_1 do vetor_30; - Sorteia 3 números para o vetor_3_1 do vetor_10; - Sorteia 3 números para o vetor_3_2 do vetor_10; - Sorteia 3 números para o vetor_3_3 do vetor_10; Para tentar ajudar, caso queira usar essa estrutura, adiantei parte do código..: algoritmo "Algoritmo exercicio de numeracao2" var vetor_60 :vetor [1..60] de inteiro //vetor armazena 60 posiçoes vetor_30_1 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_30_2 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_30_3 :vetor [1..30] de inteiro //vetor armazena 30 posições vetor_10_1 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_10_2 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_10_3 :vetor [1..10] de inteiro //vetor armazena 10 posições vetor_3_1 :vetor [1..3 ] de inteiro //vetor armazena 3 posições vetor_3_2 :vetor [1..3 ] de inteiro //vetor armazena 3 posições vetor_3_3 :vetor [1..3 ] de inteiro //vetor armazena 3 posições p :inteiro //auxiliar para posicionar o vetor i,j :inteiro //auxiliar para percorrer o vetor OK :logico //flag para verificar se a etapa foi realizada com sucesso excluir :inteiro //número a ser excluído do vetor {aguardar:caracter} //variável criada apenas para aguardar um ENTER na interação com o usuário Inicio //gera os 60 números do vetor inicial escreval("GERANDO OS 60 NÚMEROS INICIAIS...") para p de 1 ate 60 faca vetor_60[p]:=p fimpara escreval("NÚMEROS GERADOS COM SUCESSO!") //exibe os 60 números gerados escreval() escreval("Aqui estão os 60 números iniciais") p:=1 para i de 1 ate 3 faca //cada linha para j de 1 ate 10 faca //cada coluna escreva(vetor_60[p]:2," - ") p:=p+1 fimpara escreval//para pular para a linha de baixo fimpara //"Remove" 10 números do vetor inicial escreval() escreval("REMOVENDO 10 NÚMEROS DO VETOR INICIAL...") para i de 1 ate 10 faca repita OK:=verdadeiro //inicializa a flag como OK escreva("Digite o ",i:2," número de 1 a 60 para deletar: ") ALEATORIO ON //HABILITA O RECURSO DE GERAR VALORES ALEATÓRIOS aleatorio -20,80 //DEFINIE A FAIXA DE NÚMERO QUE PODEM SER GERADOS leia(excluir) ALEATORIO OFF //DESABILITA O RECURSO //OBS.: para faltar a ler pelo teclado, basta remover essas linhas se (excluir<1) ou (excluir>60) ENTÃO //se o número está fora da faixa válida escreval("Só pode ser número de 1 a 60") OK:=falso //marca como inválido {escreva("Digite ENTER para retornar")} //acho que não é necessário {leia(aguardar) //apenas para aguarda um ENTER} senao se vetor_60[excluir]=0 ENTÃO //se posição já está removida escreval("Esse número ja foi removido, escolha outro") OK:=falso //marca como inválido {escreva("Digite ENTER para retornar")} //acho que não é necessário {leia(aguardar) //apenas para aguarda um ENTER} senao vetor_60[excluir]:=0 //remove o número do vetor fimse fimse ate OK fimpara escreval("NÚMEROS REMOVIDOS COM SUCESSO") //exibe os 10 números que foram removidos escreval() escreval("Aqui estão os 10 números removidos") para p de 1 ate 60 faca se vetor_60[p]=0 ENTÃO //se tiver zero ENTÃO o número foi removido escreva(p:2," - ") //exibe a posição do número (que representa o próprio número) fimse fimpara escreval() //exibe os 50 números que sobraram após ser removido os 10 escreval() escreval("Aqui estão os 50 números que sobraram") p:=1 para i de 1 ate 6 faca para j de 1 ate 10 faca se vetor_60[p] <> 0 ENTÃO escreva(vetor_60[p]:2," - ") senao escreva(" "," - ") fimse p:=p+1 fimpara escreval() fimpara //Sorteia os 30 números do primeiro vetor de 30 posições fimAlgoritmo Esse trecho é referente às duas primeiras etapas: - Gera 60 números para o vetor_60; - Exclui 10 número do vetor_60; Daí tente entender essas sugestões, e caso deseje, dar continuidade seguindo os mesmos princípios. Obs.: a indentação está configurada para dar 3 espaços. Qualquer dúvidas sobre esse código ou sugestões, é só postar. Obs2.: Tente fazer o programa por partes.. por exemplo, crie a parte que irá sortear os 30 números do primeiro vetor de 30 posições e a parte que irá exibir esses números... só após tiver tudo certo, vá para próxima etapa, que é criara o segundo vetor de 30 posições. (será praticamente uma cópia, só mudando o nome do vetor)... por ai vai... No aguardo. -
VisualG Calcular valor da hora trabalhada
Simon Viegas respondeu ao tópico de Igor Emanoel Junqueira em Programação - iniciantes
Olá @Igor Emanoel Junqueira. 1) INDENTAÇÃO Esses se e os caso deveriam ficar alinhados, ou seja, no mesmo "dente", pois eles estão no mesmo nível em relação ao outro. Exemplo de código indentado: Algoritmo "FolhaDePagamento" // Descrição : Programa para calcular folha de pagamento // Autor(a) : Igor Emanoel .G. Junqueira // Data atual : 04/09/2017 Var codigo :inteiro //codigo do funcionário horas_trab :inteiro //número de horas trabalhadas turno :caracter //turno de trabalho categoria :caracter //categoria do funcionário sal_minimo :real //salario minimo valor_hora :real //valor da hora trabalhada sal_inicial :real //valor salario inicial aux_aliment :real //valor do auxílio alimentação sal_final :real //valor do salário final i: inteiro //i do comando de repetição Inicio para i <-1 ate 400 faca //leitura de dados do funcionário Escreval("Informe seu codigo:") Leia(codigo) Escreval("Informe o numero de horas trabalhadas no mês:") Leia(horas_trab) Escreval("Digite G para gerente e F para funcionario") Escreval("Informe sua categoria:") Leia(categoria) Escreval("Digite M para Matutino e V para Vespertino N para Noturno") Escreval("Informe seu Turno:") Leia(turno) Escreval("Informe o Salario Minimo:") Leia(sal_minimo) Se (categoria = "G") e (turno = "N")então valor_hora <- sal_minimo * 0.06 fimse se (categoria = "G") e (turno = "M")então valor_hora <- sal_minimo * 0.04 fimse se (categoria = "G") e (turno = "V")então valor_hora <- sal_minimo * 0.04 fimse se (categoria = "F") e (turno = "N")então valor_hora <- sal_minimo * 0.02 fimse se (categoria = "F") e (turno = "M")então valor_hora <- sal_minimo * 0.01 fimse se (categoria = "F") e (turno = "V")então valor_hora <- sal_minimo * 0.01 fimse //formula para calcular o salario inicial sal_inicial <- horas_trab * valor_hora escolha (sal_inicial) {Caso 1 ate 800} //creio que seja a partir do 0 Caso 0 ate 800 aux_aliment <- sal_inicial * 0.25 Caso 801 ate 1200 aux_aliment <- sal_inicial * 0.20 Caso 1201 ate 9999999 aux_aliment <- sal_inicial * 0.15 outrocaso escreval ("Opção Invalida") fimescolha sal_final <- sal_inicial + aux_aliment Escreval("Codigo:",codigo," Horas Trabalhadas:",horas_trab) Escreval("Valor da Hora Trabalhada:",valor_hora," Salario Inicial:",sal_inicial) Escreval("Auxilio Alimentação:",aux_aliment," Salario Final:",sal_final) fimpara Fimalgoritmo Obs.: Recomendo que desabilite a "Tabulação inteligente" lá em "Manutenção/Configurações". Sugiro usar 3 espaços. 2) ESTRUTURA CONDICIONAL SE Cada um dos se são mutualmente excludentes, ou seja, se for um das opções, não poderá ser mais uma outra, logo, deve-se usar o SENÃO neles. E o enunciado pede ele. Exemplo de estrutura: se <expressão-lógica-1> então <seqüência-de-comandos-1> senao se <expressão-lógica-2> então <seqüência-de-comandos-2> senao se <expressão-lógica-3> então <seqüência-de-comandos-3> {senao //pode usar ou não} {<seqüência-de-comandos-4>} fimse fimse fimse Repare que nesse caso, cada senão está vinculado ao se anterior, a linha que vem depois, está "dentro" do senão, por isso vai um dente pra frente. O terceiro se está dentro do senão do segundo se, logo, vai um dente pra frente também.. por ai vai... 3) COMBINAÇÃO DE EXPRESSÕES Creio que o que eu vou citar agora não seja tão trivial, mas também não é complicado... veja: Na tabela diz que se "G" e "N" então é 6%... você já está tratando como uma conjunção, e usando o seu respectivo operador lógico para relacionar essas condições. Mas da mesma forma, para o 4% existe, além de outra conjunção, uma disjunção para a condição do turmo, ou seja, é possível relacionar diretamente, não precisando dividir em duas condições. Ex.: // conjunção disjunção se (categoria = "G") e ((turno = "M") ou (turno = "V")) então valor_hora <- sal_minimo * 0.04 Perceba que antes tinha: se A e B então agora temos: se C e D mas D é um: se E ou F Logo, podendo ficar: se C e (E ou F) então Veja que o parênteses é fundamental... Qualquer coisa é só postar. No aguardo. -
Pascal Alguém poderia me ajudar com um algorítimo em Pascalzim.
Simon Viegas respondeu ao tópico de Denis Alves de Oliveira em Programação - outros
Olá @Denis Alves de Oliveira, A média para passar é 7 ou 8? se for 7, seria seria 0..6 mesmo. Lembrando que, apesar de conceitualmente errado, a média está sendo arredonda, logo, quem perde tirou 0, 1, 2, 3, 4, 5 ou 6. Se tirou 7 ele passou. Vai passar porque você está tratando a média final, em vez das notas individualmente. Cada uma das notas devem ficar entre 0 e 10. A verificação é antes da média... obs.: a média final necessariamente vai está também entre 0 e 10, daí não faz sentido esse else no case. Para outro código, por favor, crie um NOVO TÓPICO. obs.: vou remover o trecho da postagem. No aguardo. -
Outro Fazer download de PDF direto do MSdos
Simon Viegas respondeu ao tópico de Jessé P. de Melo em Programação - outros
@DiF e @Jessé P. de Melo ... Duas sugestões: 1) TENTAR USAR RESPOSTA DO WGET O wget deve retornar algum erro quando não consegue encontrar o arquivo ou não consegue baixar... daí daria para verificar essas respostas e agir de acordo com tal... Acho que um comando que consegue pegar o texto... acho que < ou > no batch.. Supondo que consiga obter esse status, e este seja de "0" ou algo que signifique "sucesso", iniciaria um FOR, por exemplo, de 1 a 300 (ou algum valor coerente), daí se for diferente disso "sucesso", interromperia o FOR... não sei como seria, talvez com o tipo de "break" ou um GOTO / LABEL para outra parte do código. 2) APROVEITAR O PRÓPRIO WGET Pelo que o vi aqui, o wget pode usar recursividade... ai tentava baixar toda a pasta. Vide aqui: https://www.vivaolinux.com.br/dica/Baixando-sites-recursivamente É provável que a pasta só contenhas as páginas. Se tiver muitas outras coisas, tentar algo como "*.pdf", sacou? 3) REFERENTE A AUTOMAÇÃO Em relação a automação, verificar se dar para pegar a data do computador e usar para compor o endereço, algo como: SET ANO=(fórmula_que_pega_ano_via_data_do_computador) SET MES=(fórmula_que_pega_mes_via_data_do_computador) SET DIA=(fórmula_que_pega_dia_via_data_do_computador) SET url=http://diariooficial.imprensaoficial.com.br/doflash/prototipo/%ANO%/%MES%/%DIA%/exec1/pdf/pg_ -
VisualG Condicional com vários E lógicos
Simon Viegas respondeu ao tópico de deathcon4 em Programação - iniciantes
Olá. Sobre: Respondendo: Justamente, pois cada lado tem que ser maior que o módulo de algo, logo necessariamente esse lado tem que ser maior que 0. (pois 0 não pode ser maior que abs(0), ou seja, o não é maior que 0, e nem muito maior que abs("numero_negativo"), ou seja, 0 não é maior que algo maior que 0). Respondendo: No caso seria o oposto... como demonstrado acima, está correto sempre negar, já que é impossível um número menor ou igual a zero ser maior que o módulo de qualquer número real!. O módulo de algo é sempre maior ou igual a zero (também chamado de "não negativo", ou seja, positivos mais o 0)! Sobre: Respondendo: Na verdade não só os irracionais, pode ser qualquer valor real positivo... Ex.: 0,0000000000001; 2,35; 425,847251, pi, etc. obs.: raízes de índices ímpares podem ser negativos, ex.: raiz_cúbica(-27) = -3. -
VisualG Calcular valor da hora trabalhada
Simon Viegas respondeu ao tópico de Igor Emanoel Junqueira em Programação - iniciantes
Olá @Igor Emanoel Junqueira. Desculpe pela demora... Vamos lá: 1) NOMENCLATURAS DE VARIÁVEIS Sugiro utilizar nomenclaturas mais sugestíveis... ex.: var codigo :inteiro //codigo do funcionário horas_trab :inteiro //número de horas trabalhadas turno :caracter //turno de trabalho categoria :caracter //categoria do funcionário sal_minimo :real //salario minimo valor_hora :real //valor da hora trabalhada sal_inicial :real //valor salario inicial aux_aliment :real //valor do auxílio alimentação sal_final :real //valor do salário final i: inteiro //i do comando de repetição 2) ESTRUTURAS DE SELEÇÃO Ou "estrutura condicional'... no seu enunciando ele sugere utilizar os dois... o "se..então..senão" e "escolha..caso". Então, a sintaxe do desse escolha não é válida... pois o ele só aceita uma variável, mas você está utilizando duas. Você poderia utilizar um escolha dentro do outro, mas acho mais conveniente usar o se, ex.: se (categoria="G") e (turno="N") ENTÃO Além disso, as opções seriam separadas por "," (não por "e".. Obs.: o correto seria "ou", já que um caractere não pode ser duas coisas ao mesmo tempo)... ou para número, é possível usar uma faixa, ex: caso 800 ate 1200 Dê uma olhada na sintaxe do escolha aqui. Logo, use o se..então..senão para calcular o valor da hora trabalhada e escolha..caso para calcular o valor de auxílio alimentação. (obs.: mas dá para inverter também, usar escolha..caso primeiro e se..senão depois... importante que use os 2...) 3) FÓRMULAS PARA CÁLCULO O salário inicial é calculado por você, mas você está pedindo: Ou seja, com o escolha..caso você preparar para calcular o "salário inicial", e vai usar esse valor para calcular o "auxílio alimentação". *** Para te ajudar dei uma reformulada... qualquer adapte ao seu gosto: inicio para i <-1 ate 400 faca //leitura de dados do funcionário Escreval("Informe seu codigo:") Leia(codigo) Escreval("Informe o numero de horas trabalhadas no mês:") Leia(horas_trab) Escreval("Digite M para Matutino e V para Vespertino N para Noturno") Escreval("Informe seu Turno:") Leia(turno) Escreval("Digite G para gerente e F para funcionario") Escreval("Informe sua categoria:") Leia(categoria) Escreval("Informe o Salario Minimo:") Leia(sal_minimo) //processamento do valor da hora trabalhada {aqui você vai usar o escolha..caso} //processamento do valor do salário inicial {aqui só fazer a conta} //processamento do valor do auxílio alimentação {aqui vai usar o se..então..senão} Escreval("Codigo:",codigo," Horas Trabalhadas:",horas_trab) Escreval("Valor da Hora Trabalhada:",valor_hora," Salario Inicial:",sal_inicial) Escreval("Auxilio Alimentação:",aux_aliment," Salario Final:",sal_final) fimPara fimAlgoritmo Clique aqui para dar uma olhada na referência do VisuAlg; Clique aqui para ver uma tabela de salário mínimo. (mais pra frente você poderia fazer outro programa que solicita o estado, daí o programa calculará sozinho). No aguardo. -
Pascal Alguém poderia me ajudar com um algorítimo em Pascalzim.
Simon Viegas respondeu ao tópico de Denis Alves de Oliveira em Programação - outros
Olá @Denis Alves de Oliveira. Seja bem vindo ao Fórum do Clube do Hardware. 1) INDENTAÇÃO Sugiro que ao indentar não use o TAB (tabulação), pois costuma desconfigurar o código de um programa para o outro. Prefira usar espaços. 2) FAIXA DE NOTAS Você está duplicando os casos, ou seja, 7 está sendo possível para mais de um caso. Por sinal, no Free Pascal Compiler, está dando "Error: duplicate case label". No PascalZim está passando em branco (mas não deveria... é um erro de fato) Use de 0..6 para o primeiro caso. 3) TEXTO NO LUGAR ERRADO Dentro do primeiro caso, você deixou um "writeln ('Informe notas de zero a dez!');"... creio eu que por engano, já que esse é o texto da "média inválida". Apenas apague essa linha. 4) CONDIÇÃO DE NOTA FINAL Veja, no seu case, você está verificando apenas a nota final, mas se ele informar, por exemplo, [42, 0, 0, 0] a média será 10, daí diria que foi aprovado, mesmo com uma nota inválida. Logo, a verificação de faixa válida deveria ser feita para nota em si, ou seja, a nota tem que ser maior igual a 0 E menor igual a 10. Isso para CADA NOTA! 5) ARREDONDAMENTO DE MÉDIA Tem algum motivo especial para fazer esse arredondamento? Teoricamente a nota deveria ser arredonda apenas nas casas dos centésimos, ou seja, com duas casas decimais, ex.: 7,80. *** No aguardo. -
Outro Fazer download de PDF direto do MSdos
Simon Viegas respondeu ao tópico de Jessé P. de Melo em Programação - outros
Tem o wget no Windows? como você está fazendo? obs.: não manjo muito de MS Dos, senão eu mesmo te ajudava, rs. Mas sei que dá para criar variáveis para, por exemplo, você informar o ano, mês e o dia, e deixar o stript "universal". -
VisualG Condicional com vários E lógicos
Simon Viegas respondeu ao tópico de deathcon4 em Programação - iniciantes
Isso... é uma questão de "linguagem" (sintaxe). A sua proposta está correta (sensata), apenas que o VisuAlg não entende. ADENDO 1: No papel a interpretação não necessariamente vai da esquerda para direita, ela é uma pouco mais complexa... Na expressão (abs(b - c) < a < b + c), abstraímos de forma que seria equivale a: "'a' é maior que o módulo de "b-c" E "a" é maior menor que "b+c", ou seja, o VisuAlg entende da forma que nós entendemos, não da forma como escrevemos, rs. ADENDO 2: Será que essa "condição de existência" já protege contra lados negativos ou nulos (igual a 0)? Deixo com vocês.. ADENDO 3: Eu não tinha nem reparado, mas analisando com mais calma, precisaria de um pequenos ajustes em ambos os códigos.. Baseado no seu: var {a,b,c,sub1,sub2,sub3:real} //variáveis "sub"s não utilizadas a,b,c :real Inicio escreval("Entre com o 1º lado") leia(a) escreval("Entre com o 2º lado") leia(b) escreval("Entre com o 3º lado") leia(c) { Condição de existência de um Triângulo } //apenas para servir como base { | b - c | < a < b + c } { | a - c | < b < a + c } { | a - b | < c < a + b } {se (abs(b - c) < a < b + c) e (abs(a - c) < b < a + c) e (abs(a - < c < a +} {então} //Além do já citado por devair1010, no VisuAlg, o ENTÃO tem que fica na mesma linha se ((a > abs(b-c)) e (a < b+c)) e ((b > abs(a-c)) e (b < a+c)) e ((c > abs(a-b)) e c < a+b) ENTÃO escreval("A figura é um triângulo.") senao escreval("A figura não é um triângulo") fimse Fimalgoritmo Código "enxuto": var a,b,c :real Inicio escreval("Entre com o 1º lado") leia(a) escreval("Entre com o 2º lado") leia(b) escreval("Entre com o 3º lado") leia(c) { Condição de existência de um Triângulo } //apenas para servir como base { | b - c | < a < b + c } { | a - c | < b < a + c } { | a - b | < c < a + b } se ((a > abs(b-c)) e (a < b+c)) e ((b > abs(a-c)) e (b < a+c)) e ((c > abs(a-b)) e c < a+b) ENTÃO escreval("A figura é um triângulo.") senao escreval("A figura não é um triângulo") fimse Fimalgoritmo Em relação ao código do @devair1010: - Acho que o tipo devem ser real mesmo, pois os lados de um triângulo não são apenas inteiros. (de um modo geral, é claro) - Algumas comparações estão erradas, como: Pois, considerando-se o ADENDO 2, "o módulo de um número menos outro, SEMPRE será menor que esse mesmo número mais outro mesmo número". Essa condição sempre será verdadeira. obs.: não parei para analisar as consequência disso, pois estou com um pouco de dor de cabeça, rs. Deixo também para vocês analisarem se estou certo e quais seriam as consequências, como por exemplo quais categorias de triângulos que seriam inválidos poderiam dar falsos positivos. No aguardo. -
VisualG Calcular valor da hora trabalhada
Simon Viegas respondeu ao tópico de Igor Emanoel Junqueira em Programação - iniciantes
Olá @Igor Emanoel Junqueira. obs.: ao postar um código, clique antes no botão <>, e cole o código. No aguardo. -
VisualG organização algoritmo
Simon Viegas respondeu ao tópico de vinifla81 em Programação - iniciantes
Olá. É normal... a proposta é que justamente vá aprendendo a interpretar as orientações, assim como é necessário interpretar os requisitos do problema, ou seja, aquilo que está sendo pedido... Eu posso, por exemplo, não está explicando bem (no sentido de transmitir minhas propostas), faz parte! A ideia é que tente absorver pelo que está sendo passado... interagir... saber coletar as informações... saber se expressar para demonstrar o quê não está entendendo etc... Vamos lá: Vou tentar criar uma análise. obs.: nesse momento não estou me preocupando com o resultado, as fórmulas ou qualquer coisa relacionada ao problema em si, mas apenas a estruturas das etapas. No seu código já tem umas separação das etapas.. Em "// Entradas", você coleta os dados que dependem do usuário. OK. Após com essas leituras (teoricamente) já terá tudo que você precisa para retornar uma resposta ao usuário. Em "// Processamento" você está pré-calculando o que você chamou de area, que antes estava também pre-calculando o que chamou de qtd, ou seja, o que comentei lá na primeira postagem, ainda se manteve: que complemento: Veja, não estou afirmando que essa deveria ser única forma que poderia ser feita, mas que seria uma sugestão que poderia ser avaliada por você... No seu novo código, você apenas fez algumas "melhorias", mas meio que não levou em consideração a sugestão em si, ou seja, a sugestão meio que foi ignorada (no bom sentido da palavra)... ou por não ter entendido, ou por não ter percebido, ou por ser apenas ignorado mesmo... Ainda nessa questão do "pré-cálculo", nesse ponto entra a observação que poderia evitar essa conta desnecessária, pois você só vai utilizar uma das areas (ou dos "qtd"s), logo as outras seriam feitas sem necessidade (trabalho extra). Como cada condição utiliza uma fórmula diferente, essa conta poderia ficar dentro do seu respectivo se. Algo como: obs.: vou usar o código do qtd, pois ao adaptar para areas, eu teria que fazer outras resolvas... ... escreval("Informe o comprimento desejado do muro em metros a ser construído") leia (cm) escreval("Informe a altura desejada do muro em metros a ser construído") leia (am) // Saidas se (op = 1) e (d = 1) então qtd<-(cm * am)/(0.2394) escreval("Você precisará de:",qtd," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd * 0.35) + 35 * (qtd/250)+1:5:2, " ") fimse se (op = 2) e (d = 1) então qtd1<-(cm * am)/(0.4104) escreval("Você precisará de:",qtd1," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd1+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd1/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd1 * 0.50) + 35 * (qtd1/250)+1:5:2, " ") fimse se (op = 3) e (d = 1) então qtd2<-(cm * am)/(0.7714) escreval("Você precisará de:",qtd2," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd2+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd2/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd2 * 0.80) + 35 * (qtd2/250)+1:5:2, " ") fimse se (op = 1) e (d = 2) então qtd3<-((cm * am)/(0.2394)) * 2 escreval("Você precisará de:",qtd3," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd3+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd3/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd3 * 0.35) + 35 * (qtd3/250)+1:5:2, " ") fimse se (op = 2) e (d = 2) então qtd4<-((cm * am)/(0.4104)) * 2 escreval("Você precisará de:",qtd4," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd4+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd4/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd4 * 0.50) + 35 * (qtd4/250)+1:5:2, " ") fimse se (op = 3) e (d = 2) então qtd5<-((cm * am)/(0.7714)) * 2 escreval("Você precisará de:",qtd5," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd5+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd5/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd5 * 0.80) + 35 * (qtd5/250)+1:2:0, " ") fimse fimalgoritmo Percebe a diferença? Pronto. Com as alterações acima, resolveria o "problema" do "pré-cálculo". Mas ainda tem a questão da repetição de código, como visto abaixo. Em // Saidas você exibe os resultados. Nela você exibe os resultados de acordo com as opções. Aqui está um outro problema, que provavelmente é o citado pelo professor: Ou seja, você está exibindo EM CADA UM DOS SE as 4 respostas necessárias, sendo que ajustando alguns respectivos pequenos detalhes. Mas acontece que essas estruturas dos resultados são iguais para todas as possibilidades, mudando apenas algumas variáveis, logo, você está repetindo praticamente o mesmo código em cada se. Possivelmente foi o que ele tava tentando te repassar... dizer que a saída em si não precisa de se, já é uma única resposta.. e que os se deveriam servi apenas para "selecionar" o que vai para essa resposta no final. Seria como deixar os se na etapa de processamento, e deixar apenas os 4 escreval() na saída. Algo como: A "saída", como postado na outra postagem, poderia ser basicamente assim: E no "processamentos" ficaria algo assim: // Processamento se (op = 1) e (d = 1) ENTÃO valor_de_alguma_coisa <- 0.2394 multiplicador <- 1 fimSe se (op = 2) e (d = 1) ENTÃO valor_de_alguma_coisa <- 0.4104 multiplicador <- 1 fimSe ... area <- (cm * am) qtd <- (area/valor_de_alguma_coisa) * multiplicador No aguardo. -
VisualG Aceitando senha diferente da condição
Simon Viegas respondeu ao tópico de Gabriel S Muniz em Programação - iniciantes
Olá @Gabriel S Muniz. Seja bem vindo ao Fórum do Clube do Hardware. Antes um aviso: para postar um código no Fórum, utilize a tag CODE. Basta clicar antes no botão "<>" e cola o código. Vamos lá: Resumidamente seria: você está usando o operador lógico "e", onde, deveria ser "ou". Uma sugestão para uma verificação seria efetuar "testes de mesas". Poderia ser algo assim: Fiz testes das 4 possibilidades possíveis. A coluna 5 é baseada na tabela verdade do "e", a coluna 6 seria "o que deveria acontecer"... ou seja, a "expressão lógica" contida no se (coluna 5) não está satisfazendo a sua necessidade (conferindo com o esperado). Ai teria que analisar o que está errado... Então, quando deveria dar "Senha invalida"? Deveria dar quando o "nome" está errado OU a "senha" está errada, ou seja, basta pelo menos um dos dois esteja errado para ser "senha inválida", mas no seu código você usou o e (quando ambos estão errados). Sugiro que tente fazer essa mesma tabela no Excel (ou Word) usando o OU no lugar do E lá na coluna 5 e veja se vai conferir com a coluna 6. Outro ponto importante é sempre manter o código bem indentado. Ex.: var nome : caractere senha, cont: inteiro inicio senha <- 0 cont <- 0 enquanto cont< 3 faca escreval( "Digite seu login" ) leia(nome) escreval ("Digite sua senha") leia(senha) se (nome <> "T") e (senha <> 99) ENTÃO escreval("Senha invalida") cont <- cont+1; senao cont <- 3 fimse fimenquanto fimalgoritmo No aguardo. -
VisualG Calcular valor da hora trabalhada
Simon Viegas respondeu ao tópico de Igor Emanoel Junqueira em Programação - iniciantes
Olá @Igor Emanoel Junqueira. Seja bem vindo ao Fórum do Clube do Hardware. Podemos ajudar... poste o que já conseguiu fazer e onde está com dúvidas. No aguardo. -
VisualG organização algoritmo
Simon Viegas respondeu ao tópico de vinifla81 em Programação - iniciantes
Seu código está estruturalmente igual ao anterior... e o que eu proponho é uma mudança para evitar as repetições... Por favor, dê uma relida na minha postagem anterior, caso não tenha entendido alguma parte, favor sinalizar. No aguardo. adicionado 12 minutos depois Adendo: Veja que o conteúdo desses 2 se são praticamente iguais... Você precisa deixar esse trecho de "exibição de resultado" no final, uma única vez... e as partes que são variáveis, serem selecionadas nos se. -
VisualG organização algoritmo
Simon Viegas respondeu ao tópico de vinifla81 em Programação - iniciantes
Olá @vinifla81. Não entendi muito bem.. mas você está efetuando cálculos sem necessidade e repetindo várias vezes o mesmo trecho de algoritmo. Veja: // Processamento qtd<-(cm * am)/(0.2394) qtd1<-(cm * am)/(0.4104) qtd2<-(cm * am)/(0.7714) qtd3<-((cm * am)/(0.2394)) * 2 qtd4<-((cm * am)/(0.4104)) * 2 qtd5<-((cm * am)/(0.7714)) * 2 O resultado da quantidade é uma só... o que muda são os parâmetros, ou seja, de acordo com as resposta do usuário, você calculará a quantidade. Nesse caso acima, você está pré-calculando todas as possibilidades para usar uma delas quando conveniente... todas as outras contas foram feitas em vão. Se tomássemos a sua linha de raciocínio dos seus se, cada uma dessas contas deveria está apenas dentro do seu respectivo se, ou seja, só faria a conta que é necessária quando o se "fosse aceito". Algo como: se (op = 1) e (d = 1) então qtd<-(cm * am)/(0.2394) escreval("Você precisará de:",qtd," tijolos para constuir o muro") escreval("Para não faltar, compre:",1.1 * qtd+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd * 0.35) + 35 * (qtd/250)+1:5:2, " ") fimse Entretanto, é notável que tanto essa conta do qtd, quanto a exibição do resultado, estão repetidos... está reescrevendo (praticamente) a mesma coisa em cada se! O que muda de um cálculo do qtd para o outro? só aquele número fracionado e um multiplicador (por 2 ou não). Então, ao comentar: pode está se referindo que essas respostas não precisam estar em cada um dos se. Os se só precisam servi para "selecionar" o quê é diferente.. que no caso é esse número quebrado lá (que eu não sei para que serve - obs.: não é relevante) A resposta poderia ficar algo do tipo: qtd <- ((cm*am)/(valor_de_alguma_coisa))*multiplicador escreval("Você precisará de:",qtd," tijolos para construir o muro") escreval("Para não faltar, compre:",1.1 * qtd+1:2:0, " tijolos ") escreval("Você precisará também de:",qtd/250+1:2:0," saco(s) de cimento") escreval("O custo médio é de: R$" ,(qtd * outro_valor_de_alguma_coisa) + 35 * (qtd/250)+1:5:2, " ") Dentro dos se, você só verifica esse "valor_de_alguma_coisa", o multiplicador (que será 1 ou 2) e o outro_valor_de_algum_coisa. A ideia seria mais ou menos essa. Por favor, tente corrigir e poste seu código atual (lembrar de usar a tag CODE, botão <>). No aguardo. -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Olá a todos. Para mim, os requisitos do algoritmo ainda não está bem definido, ou seja, sem entender muito bem o que se quer, fica mais difícil conseguir ajudar. Então, pelo que eu entendi desse código do @devair1010, a base do algoritmo se comporta mais ou menos assim: Os 60 números iniciais são fixos; Obtém do usuário 10 números (ou posições) que serão considerados excluídos; Dos 50 que sobram, sorteia 30 números; Exibe os 30 números (separados em 3 linhas de 10 números cada). obs.: apesar de especificado no código, 30 números separados em 3 de 10, é diferente de 3 de 10 sorteados de 30, ou seja, nessa segunda possibilidade, os números podem se repetir em relação as outras linha. Bem resumidamente falando, seria algo como: "de 60 removo 10, dos 50 sorteio 30". @devair1010, essa minha interpretação está correta? @Helen Fernanda de Souza, supondo que sim, seria isso que você precisa? Mas eu analisando o que foi comentado por @Helen Fernanda de Souza: Interpretaria mais ou menos assim: De 60 números; //faltou especificar quais números.... se são aleatórios OU de 1 a 60 OU se você informa etc; Remove 10, ficando com 50; //faltou especificar se são aleatórios OU você informa quais números etc; Dos 50, sorteia 30 números 3 vezes; De cada um dos 3 conjuntos de 30, remove 10; //faltou especificar se são aleatórios OU você informa quais números etc; De cada um dos 3 conjuntos de 20, sorteia 3. Exibe 0s 3 conjuntos de 3 números. Bem resumidamente falando, seria algo como: "de 60 removo 10, dos 50 sorteio 3 vez 30 números, de cada 30 removo 10, de cada 20 sorteio 3". Comparando essa duas interpretações, o código do @devair1010 não se encaixaria totalmente, ou seja, o código poderia está "certo" em relação à primeira interpretação, mas divergente em relação a segunda. @Helen Fernanda de Souza, para tentar refinar o algoritmo, é necessário primeiro redefinir esses "requerimentos"... é preciso saber o que você quer/precisa. Sem isso, tentado fazer uma analogia, seria como um médico fazer uma super operação de sucesso no fígado, enquanto o problema é num rim. Após alinharmos o que você precisa, você, como autor da proposta, pode tentar ir modificando e tirando dúvidas com nós colaboradores. RESUMINDO: Inicialmente tente reformular a descrição do que você que fazer, e poste o seu código atual e em qual parte está com dúvidas ou precisa de auxílios ou sugestões. No aguardo. -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Olá @Helen Fernanda de Souza. Então, na postagem que contém: Lá tem uma imagem e o erro nela aponta para linha 78. Na linha 78 você está "ATRIBUINDO" um valor, ou seja, deve utilizar "<-" OU ":=". Já na postagem que contém: O erro está na linha 70 (outra linha, e outro "problema"). Lá você está "COMPARANDO VALORES", ou seja, não pode usar o ":=", use apenas "=". Qualquer coisa posta seu código completo e onde está com dúvidas. No aguardo. -
VisualG Dizer qual é o maior número
Simon Viegas respondeu ao tópico de Vinícius V. em Programação - iniciantes
Olá @viniciusv21. 1) ESCOPO DE VARIÁVEIS Ao declarar o vetor vetorA dentro do procedimento lervetor() você estipulou o seu escopo como local, ou seja, é só "enxergada" para quem está dentro do procedimento. É a famosa "variável local". Para que o vetor seja utilizável em outros procedimentos ou funções é necessário que a variável esteja declarada como "variável global". Para que uma variável global interaja nos procedimentos tem pelo menos 2 formas: 1) passa a variável pelo parâmetro; 2) usa ela diretamente, aproveitando do escopo global. Então, como no seu contexto está utilizando vetores, a primeira opção não é válida... ou pelo menos eu não sei como faz para declarar uma variável lá nos parâmetros do procedimento... Para a segunda opção, basta que a declaração da variável, lá no var, esteja acima do procedimento, ou seja, a declaração dessa variável que vai ser usada dentro dos procedimentos deve ser declara antes da declaração do procedimento em si. Esse trecho poderia ficar mais ou menos assim: Algoritmo "Dizer o maior número" var //variáveis em escopo GLOBAL vetorA: vetor[1..5] de inteiro //Procedimento para efetuar a leitura dos dados (preencher o vetor) procedimento lervetor() var //variáveis em escopo local ("só existem" dentro do procedimento) {vetorA: vetor[1..5] de inteiro} //passou a ser global {p : inteiro} //por convenção, é comum utilizar o "i" para essa atividade i :inteiro //auxiliar para percorrer o vetor inicio para i de 1 ate 5 faca {escreva("Digite um valor:", "[" , p , "de 5]")} //abaixo pequenos ajustes... escreva("Digite um valor: [",i," de 5 ]: ") leia(vetorA[i]) fimpara fimprocedimento inicio lerVetor() Fimalgoritmo Já na função: Você está usando o procdimento letvetor() de forma incompatível de como ela foi projetada... então, como o letvetor() funciona? A "assinatura" do seu procedimento estava assim: Ou seja, b recebe um valor inteiro de fora... mas perceba que em nenhum momento você está utilizando b dentro da função. Na prática essa informação não está tendo utilidade. Ainda nesse procedimento, como o restante do procedimento se comporta? Lá tem: Ou seja, vai preencher todo as 5 posições do vetor... a funcionalidade do letvetor() seria ler os 5 números que o vetor conterá... resumindo: ao fim do procedimento, o vetor estará com as 5 posições preenchidas. Mas lá na função você tenta usar: Ou seja, como se lervetor() estivesse retornando o valor da posição, mas como citado acima, ela não foi programada para funcionar assim! Para esse contexto poderia usar algo assim: se vetorA[x] < vetorA[y]) ENTÃO Percebeu a diferença? RESUMINDO: - lervetor() irá preencher o vetorA. - dizer_maior_numero() irá retornar o maior valor do vetorA. Logo, para usar o segundo, tem que antes usar o primeiro. No aguardo. -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Olá. Em que linha está dando o erro? Vou tentar analisar e explicar... Aqui deu na linha 70. Na sua postagem anterior, estava dando na 78... são linhas diferentes E são erros diferentes também... Erro: Então... nem sempre o VisuAlg indica exatamente o erro que ocorreu, mas costuma dar um bom indicativo... (nessa ele acertou) Veja, o se precisa de algo que resulte em VERDADEIRO ou FALSO. É comum utilizarem "expressões lógicas". . Algo como "se expressão que estou avaliando resultar em verdadeiro, eu deixo o computador executar o que está 'dentro de mim', se a expressão resultar em falso, não deixo executar...". Daí justamente que remete essa definição de "estrutura de seleção".. algo que seleciona se outros algos serão executados ou não. Uma forma de criar uma expressão lógica é utilizando OPERADORES RELACIONAIS, ou seja, estes "são utilizados em expressões lógicas para se testar a relação entre dois valores do mesmo tipo".. os disponíveis são: "=", "<", ">", "<=", ">=", "<>", mas no trecho da imagem, você está utilizando o um operador inválido... Veja que utilizou ":=". Veja citação: No erro anterior, da linha 78, você estava utilizando um operador relacional (o "=") no lugar de um COMANDO DE ATRIBUIÇÃO (o ":="). Veja citação: RESUMINDO: - Nos se utilizam-se "=" (sem os ":") - Nas atribuições utilizam-se "<-" ou ":=". No aguardo. -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Pelo que vi na imagem, o código está utilizando "=" para atribuir um valor, mas no VisuAlg utilizam-se ":=" ou "<-". obs.: O "=" é utilizado para comparar, por exemplo, nos se. No aguardo. adicionado 1 minuto depois Por favor, caso necessite, poste o código completo para podermos analisar também. -
Portugol Estrutura de Dados - s valores válidos para a entrada de dados referente...
Simon Viegas respondeu ao tópico de Eng Soft Aprendiz em Programação - iniciantes
Caro usuário, Seja bem-vindo ao Fórum do Clube do Hardware. No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware. Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício. Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Fórum do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários.. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal. Esperamos que compreenda. Atenciosamente, Equipe Clube do Hardware -
VisualG Construção algoritmo de numeração
Simon Viegas respondeu ao tópico de Vengefull em Programação - iniciantes
Olá a todos. @devair1010, pelo que observei, mesmo que caia no [1] "//numero foi deletado ", ele estaria executando, sem necessidade, o [2] "//verifica os trinta numeros no vetor_3"... e também o [3] "//vetor_3 armazena o numero gerado"... No aguardo.
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