Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

Tudo que Simon Viegas postou

  1. Cadê o vetor? Vamos lá: o maior segredo é exercitar e praticar a abstração. E de um modo geral, é preciso entender o problema antes de tentar achar uma solução. Como o enunciado exige que tenha um vetor, uma dúvida que poderia surgir seria: "como utilizo vetores?". Entende? Mas além do uso de vetores, em o cerne do problema em si, que seria calcular lá o valor da mesa e exibir uma resultado adequado. Observe que são duas coisas distintas: usar vetores e calcular o que seja. Daí, podemos simplificar e tentar só calcular. Exemplo: /* 1) No restaurante do hotel é oferecida uma cortesia para os hospedes. Em toda refeição o hotel paga R$ 30,99 reais do valor gasto pelos hospedes. Caso o hospede gaste menos que R$ 30,99 ou exatamente esse valor ele não precisa pagar nada. Caso o valor da mesa seja maior que R$ 30,99 o hóspede precisa pagar a diferença (o valor da refeição descontando a cortesia). No sistema primeiro precisamos solicitar para o usuário e armazenar o valor de 4 mesas e guardar dentro de um vetor esses valores. Posteriormente precisamos verificar os valores armazenados para retornar para o usuário se a mesa precisa pagar ou não algum valor. Caso nenhum valor precise ser pago deve ser retornada a mensagem "Nada a pagar!", caso a mesa precise pagar algum valor deve ser retornado "A mesa precisa pagar: " e logo em seguida ser retornado quanto a mesa deve. Lembrando que precisamos fazer isso para todas as mesas. */ programa { funcao inicio () { real valorMesa escreva("Valor da mesa: ") leia(valorMesa) se (valorMesa <= 30.99) escreva("Nada a pagar!") senao escreva("A mesa precisa pagar: ", valorMesa-30.99) } } Exemplos de resultados: E para adiantar, observe que no teu código não estava sendo considerado o igual. Abaixo o teste com meu código: Observe que já posso fazer pequenos ajustes... inseri o "R$" e remover um espaço extra ao ler o valor da mesa: escreva("Valor da mesa: R$") leia(valorMesa) senao escreva("A mesa precisa pagar: R$", valorMesa-30.99) Dai, tua missão agora seria avançar na abstração. Que tal calcular para duas ou mais mesas? Dica: utilize uma variável para cada mesa, exemplo: valorMesa1, valorMesa2, valorMesa3 etc. Já perceba que a lógica meio que será bem parecida. Só organizar a ordem dos comandos, ou seja, primeiro ler as mesas, depois calcula os resultados. Com uma variável só não conseguiria fazer isso (pois o valor da mesa anterior iria se perder). Tenta aí posta aqui. Após, só será substituir as variáveis por um único vetor. Mas oh!, não tente fazer com vetor agora.
  2. @Gustavo Yuushi, seja bem vindo ao Fórum do Clube do Hardware. Sem saber qual é o sintoma do problema, fica mais complicado para diagnosticar e buscar uma solução... Ocorre o quê, não está compilado? Aqui testei com o FPC 3.2.2 (Free Pascal Compiler) e só precisou de pequenos ajustes para rodar certinho (compilar e executar - não analisei a lógica). No aguardo.
  3. Desculpe pera demora. Rodei o código. Olha o erro: Aí vai lá na linha 19. Tem esse conteúdo que foi citado. Tá, onde essa variável AnoAtual foi declara? Resposta: a princípio não é uma "variável de sistema", ou seja, que o próprio VisualG cria sozinho (exemplo: pi já tá lá. Tem o valor "3.14159265358979"). Logo, você estaria tentando usar uma variável que não foi criada OU digitou a nomenclatura errada por engano. (Parece ser o primeiro caso.) Basta declarar a variável e ajustar o código..... e testando e ajustando... Uma dica geral que dou (lá ele) é: vá fazendo o algoritmo aos poucos, e ao mesmo tempo vá fazendo testes. Exemplo: algoritmo "Idade em algarismos romanos" var dia, mes, ano: inteiro diaAtual, mesAtual, anoAtual: inteiro idade: inteiro inicio escrevaL("Digite seu dia de nascimento (dd): ") leia(dia) escrevaL("Digite seu mes de nascimento (mm): ") leia(mes) escrevaL("Digite seu ano de nascimento (aaaa): ") leia(ano) escrevaL("Digite o dia atual de nascimento (dd): ") leia(diaAtual) escrevaL("Digite mes atual de nascimento (mm): ") leia(mesAtual) escrevaL("Digite ano atual de nascimento (aaaa): ") leia(anoAtual) // Calcula a idade com base na data atual idade <- AnoAtual-ano escrevaL(idade) fimAlgoritmo Inseri a data da atual Constituição do Brasil e a data de hoje, respectivamente: funcionou. Pronto... "tenho uma noção que o cálculo da data parece está funcionando". Depois avança para um outro teste. Exemplo: Inserir e testar o trecho que calcular "se já comemorou aniversário no ano atual". se ((mes > mesAtual) OU ((mes = mesAtual) E (dia > diaAtual))) então idade <- idade-1 fimSe Vai fazendo os testes e ajustando... Depois insere uma nova coisa... vai inserindo (lá ele) e testando. Dica 1: a sugestão é fazer a maior quantidade de testes possíveis. A medida que vai pegando a prática, vai diminuindo os testes. Outro ponto bacana é que vai também parando para "otimizar" esses testes, exemplo: Ora! Essa data será sempre a mesma. Inclusive pode fazer o mesmo para data do nascimento, ou seja, colocar datas fixas para testa o resultado por extenso, entende? Aí fica focando apenas em ajustar o resultado.. depois altera os valores no código para testar outras possibilidades... só deixar para "ler do teclado" quando o código tiver mais maduro.
  4. Como sugerido no código: Estaria "convertendo um número em decimal para número em binário". Tente entender mais a fundo como funciona essa conversão. Sobre o VisualG: para que serve o mod? Se não sabe, pesquisa na internet. Para que serve o div? Se não sabe, pesquisa na internet. Entendendo como pode ser feita essa conversão de bases numéricas e entendendo como funciona os comandos, conseguirá entender a variável.
  5. Faça testes e descubra... Imagine que alguém tenha lhe perguntado isso e você precisa responder... é isso: se acostume a vestir a roupa de sapo.
  6. @Matheus Barros, poste o que já conseguiu fazer e onde está com dúvidas.
  7. @Eli Almeidaa, desative a "tabulação inteligente". Você pode definir quantos espaços quiser... o padrão seria 3
  8. Sim. É a mesma coisa. e Após o "é" tecnicamente precisa de um espaço. Acho mais coerente deixá-lo entre as aspas do que utilizar do espaço que o VisualG insere nos números. É por uma questão de coerência, por exemplo, se fosse uma variável do tipo caractere, o espaço ficaria dentro das aspas... daí, apenas sugiro o mesmo princípio... RESUMINDO Tanto faz. Use da forma que achar mais agradável. Apenas recomendo utilizar "com espaço dentro das aspas e remover o espaço que não deveria existir do número", utilizando a formatação com o :x.
  9. @Maria Vitória, teu código ficou muito bom! Uma sugestão que daria é em relação à semântica para as nomenclaturas de variáveis... veja: cod (que teria vindo "código", certo?) não tem nada a ver com dinheiro, e de um modo geral você não deveria "reutilizar essa variável" para outra função!!! Não misturar as coisas. Não precisaria, tipo, "tentar economizar variável". Só criar uma nova. O mais importante é tentar sempre deixar o código bem claro (no caso deixando as coisas "fazer sentido" - bem semânticos...). Exemplo de sugestão de nomenclaturas de variáveis: var codigo : inteiro valorProduto, valorPago, troco : real Observe que as nomenclaturas das variáveis sugeridas seriam meio que aquilo que elas representam. Daí só ajustar o código: algoritmo "Mercearia da Esquina" var codigo : inteiro valorPago, valorProduto, troco : real inicio escreval(" REFRIGERANTES COD VALORES") escreval(" | | ") escreval(" Coca-Cola | 1 | R$ 5,00") escreval(" Fanta | 2 | R$ 5,50") escreval(" Conquista | 3 | R$ 6,00") escreval(" Antartica | 4 | R$ 6,50") escreval(" Guaratuba | 5 | R$ 7,00") escreval(" -------------------------------------------") escreval() escreva ("Código : ") leia(codigo) escreval() se (codigo = 1) então valorProduto <- 5.00 escreval("Coca-Cola R$ 5,00") escreval() escreva("Seu Dinheiro R$") leia(valorPago) senao se (codigo = 2) então valorProduto <- 5.50 escreval("Fanta R$ 5,50") escreval() escreva("Seu Dinheiro R$") leia(valorPago) senao se (codigo = 3) então valorProduto <- 6.00 escreval("Conquista R$ 6,00") escreval() escreva("Seu Dinheiro R$") leia(valorPago) senao se (codigo = 4) então valorProduto <- 6.50 escreval("Antartica R$ 6,50") escreval() escreva("Seu Dinheiro R$") leia(valorPago) senao se (codigo = 5) então valorProduto <- 7.00 escreval("Guaratuba R$ 7,00") escreval() escreva("Seu Dinheiro R$") leia(valorPago) fimSe fimSe fimSe fimSe fimSe se (valorPago < valorProduto) então troco <- valorProduto-valorPago escreval ("FALTAM R$", troco:1:2) senao troco <- valorPago-valorProduto escreval() escreval("TROCO R$", troco:1:2) fimSe fimAlgoritmo "Ué, dizer que faltam ou que tem troco seria a mesma coisa?". Creio que não!!! Talvez refinar ainda mais a semântica.. Poderia por exemplo mudar de troco para diferenca. var codigo : inteiro valorProduto, valorPago, diferenca : real Saca? Ou utilizar uma variável para o troco, e outra variável para o valor faltante... tipo: var codigo : inteiro valorProduto, valorPago, troco, falta : real
  10. @Eli Almeidaa, o ":" é facultativo. Então, efetue alguns testes... com espaços, sem espaços, com o ":", sem os ":"... muda os valores após os ":"... etc. Vai futucando.
  11. Vou comentar ponto a ponto: Inicialmente respondo com outra pergunta: você pesquisou sobre "o que é cameCase"? (Isso foi um pergunta retórica. Seria apenas uma forma de tentar instigar ainda mais. Um dos pontos principais já acho interessante: "ter curiosidade". Faltaria apenas o "pesquisar mais a fundo sobre os temas" .) Vamos lá... Depende o sentido de "obrigatório". Se for em relação à interpretação do algoritmo pelo VisualG, não. Não é obrigatório. Por sinal, o VisualG não diferencia maiúsculas de minúsculas para variáveis, ou seja, não é case-sensitive. (<--- sugiro ler e se aprofundar um pouco sobre.) Já no Java as letras maiúsculas e minúsculas, para nomenclaturas de variáveis, seriam coisas distintas. Veja: Fonte: https://pt.wikipedia.org/wiki/Case-sensitive Exemplo: corOlhos e corolhos... qual das duas nomenclaturas está mais clara? Naturalmente a primeira aparenta que o maiúsculo "divide as palavras". O que alguém acharia que serviria uma variável que tem "cor olhos" no nome? Já na segunda, poderia vir: "que raios significa corolhos? Parece aquele palavrão... ah! não, deve ser cor e olhos juntos... eu acho". Saca? RESUMINDO Seria um padrão relativamente popular e bem funcional. Recomendo. No mínimo, para um mesmo código, tente seguir apenas um padrão interessante, como o que usou: Daí, meio que "todas as variáveis ficariam nesse mesmo padrão". Esse padrão seria snakecase ou underscorecase. Dá um google!! Sugiro dar uma pesquisa geral sobre "convenções de nomenclaturas variáveis". Tem que deixar esse espaço? Depende o sentido de "tem que deixar". Se for em relação à interpretação do algoritmo pelo VisualG, não. Mas acho que fica estranho. Não faz diferença para análise léxica lá na declaração de variáveis. Tratar-se-ia também apenas de outra boa prática. É assim ("vírgula colada à esquerda e com um espaço á direita") que normalmente escrevemos textos (pelas normas cultas)... E meio que seria assim que comumente são escritos os códigos. Veja por exemplo esse artigo: https://www.clubedoportugues.com.br/tem-espaco-antes-e-depois-da-virgula/ Outro exemplo: é comum ver sequer colocarem a vírgula antes do "mas"... É um crime? Não, mas não seria da "norma culta". É OK! E depender do contexto está tudo certo!!! (Numa redação já perderia alguns pontos. Aqui no Fórum ou em ambientes menos formais, sem problemas - tem o lance também do "o costume do cachimbo deixa a boca torta". Por aí vai.) Só para frisar: não é obrigatório, entretanto entendo que seria no mínimo mais coerente e esteticamente mais atraente. Pode existir sim uma liberdade e "um toque pessoal". Seguir um padrão tende a facilitar as coisas... Acho muito mais fácil de ler quando está num padrão. Fica mais fluído. PS: só para exemplificar outro padrão, observe que depois do ":" as palavras devem* iniciar em minúscula. Talvez não seja comum. Até onde sei seria assim mesmo... RESUMINDO Seguir uma "norma" de espaçamento seria um padrão popular e bem funcional. Fica mais fácil de ler. Aqui entra o exercício da abstração... ao pressionar Ctrl+G, o que acontece no código? Na prática, o VisualG insere espaços à esquerda das linhas, meio que tentando deixar o código indentando... seguindo suas próprias regras.. Dá no mesmo indentar na mão, ou com auxílio do Ctrl+G... esse recurso funciona de modo instantâneo e pode ser utilizando quantas vezes quiser... serve como bom indicativo para ver se não tá faltando alguma coisa... tipo: se o código ficar "todo torto", pode ser que esqueceu de colocar um fimSe, por exemplo. Eu prefiro dar os espaçamentos sugeridos pelo VisualG... assim, posso utilizar o Ctrl+G quando eu quiser... 90% das vezes funciona muito bem! *** Adendo Segue teu código com padrões que recomendaria: algoritmo "Sua Idade" var ano_atual, ano_nasc, idade : inteiro inicio escreval(" Informe o ano atual") leia(ano_atual) escreval(" Informe o teu ano de nascimento") leia(ano_nasc) idade <- ano_atual-ano_nasc escreval(" A sua idade é ", idade:1, " anos") fimAlgoritmo Observe que você também pediu a "data de nascimento", que é diferente de "ano de nascimento". Fica "semanticamente errado". O usuário poderia digitar dia, mês e ano. RESUMINDO Procure manter uma semântica boa no código. Pois assim, você tenderá a perder menos tempo em entender o próprio código, ajudando a evitar bugs e má interpretações... Entenda que isso é apenas por abstração. O computador não se importa com semântica, mas nós seres humanos sim. (Ou acho que deveríamos.)
  12. @Eli Almeidaa, reforçando as dicas importantes: - use o camelCase para as nomenclaturas de variáveis; - as virgulas devem seguir o padrão de escrita, ou seja, colado à esquerda, e um espaço à direita; - ir já acostumando usar nomenclaturas de variáveis mais semânticas. Veja um exemplo: algoritmo "Censo habitacional" //Faça um algoritmo que determine e escreva: //- a maior idade dos habitantes //- a quantidade de indivíduos do sexo feminino cuja idade está entre 18 e 35 //anos inclusive e que tenham olhos verdes e cabelos louros. //O final do conjunto de habitantes é reconhecido pelo valor -1 entrada como //idade. var idade, maiorIdade : inteiro num, qtdFem18a35OlhosVerdesCabelosLoiros : inteiro sexo, corOlhos, corCabelos : caractere inicio enquanto (idade <> -1) faca escrevaL("Informe a sua idade ou digite -1 para encerrar ") leia(idade) se (idade > -1) então escrevaL("Informe o seu sexo") leia(sexo) escrevaL("Informe a cor de seus olhos") leia(corOlhos) escrevaL("Informe a cor de seus cabelos") leia(corCabelos) se (idade > maiorIdade) então maiorIdade <- idade fimse se ((sexo="feminino") E (idade>=18) E (idade<=35) E (corOlhos="verdes") E (corCabelos="louros")) então qtdFem18a35OlhosVerdesCabelosLoiros <- qtdFem18a35OlhosVerdesCabelosLoiros +1 fimSe fimSe fimEnquanto escrevaL("A maior idade da população é: ", maioridade:1) escreva ("A quantidade de indivíduos do sexo feminino cuja idade está entre") escreva (" 18 e 35 anos inclusive e que tenham olhos verdes e cabelos louros") escrevaL(" é: ", qtdFem18a35OlhosVerdesCabelosLoiros:1) fimAlgoritmo ADENDO: "Pessoal, tentei usar ALATORIO nesse código, mas não deu muito certo para variáveis do tipo caractere. Ele sempre só gera 5 caracteres aleatórios. Como faria para gerar, por exemplo, o sexo?". Temos duas* formas de contornar: utilizando o RandI() para gerar "códigos", e depois "traduzir para algum texto", exemplo: 0 para masculino e 1 para feminino. E uma utilizando LISTAS (uma espécie de aleatório). Esse primeiro deixo para vocês, caso queiram tentar. Para lista, segue um exemplo abaixo: Primeiramente precisa existir as listas cadastradas no VisualG. O recurso fica lá nas configurações. Aí cria uma nova lista, definindo um nome e o seu conteúdo. Segue uma relação: SEXO Masculino Feminino COR DOS OLHOS Azuis Azuis-Esverdeados Cinzas Castanhos Verdes COR DOS CABELOS Loiros Ruivos Castanhos Pretos Grisalhos Exemplo: algoritmo "Censo habitacional" //Faça um algoritmo que determine e escreva: //- a maior idade dos habitantes //- a quantidade de indivíduos do sexo feminino cuja idade está entre 18 e 35 //anos inclusive e que tenham olhos verdes e cabelos louros. //O final do conjunto de habitantes é reconhecido pelo valor -1 entrada como //idade. const QTD_USUARIOS = 30 var idade, maiorIdade : inteiro num, qtdFem18a35OlhosVerdesCabelosLoiros : inteiro sexo, corOlhos, corCabelos : caractere cont : inteiro inicio enquanto (idade <> -1) faca escrevaL() escrevaL("Informe a sua idade ou digite -1 para encerrar ") ALEATORIO 16, 40 leia(idade) se (idade > -1) então escrevaL("Informe o seu sexo") ALEATORIO ON LISTA "SEXO" leia(sexo) escrevaL("Informe a cor de seus olhos") LISTA "COR DOS OLHOS" leia(corOlhos) escrevaL("Informe a cor de seus cabelos") LISTA "COR DOS CABELOS" leia(corCabelos) ALEATORIO OFF se (idade > maiorIdade) então maiorIdade <- idade fimse se ((sexo = "feminino") E (idade >= 18) E (idade <= 35) E (corOlhos = "verdes") E (corCabelos = "loiros")) então qtdFem18a35OlhosVerdesCabelosLoiros <- qtdFem18a35OlhosVerdesCabelosLoiros +1 fimSe fimSe cont <- cont + 1 se (cont > QTD_USUARIOS) então interrompa() fimSe fimEnquanto escrevaL("A maior idade da população é: ", maioridade:1) escreva ("A quantidade de indivíduos do sexo feminino cuja idade está entre") escreva (" 18 e 35 anos inclusive e que tenham olhos verdes e cabelos louros") escrevaL(" é: ", qtdFem18a35OlhosVerdesCabelosLoiros:1) fimAlgoritmo Ah! Como essa última condição seria algo muito específico, poderia deixar as cores com apenas dois itens cada, assim aumentando as chance de ocorrer. COR DOS OLHOS Verdes Castanhos COR DOS CABELOS Loiros Pretos Exemplo de resultado: As listas seriam análogos ao ALEATORIOS, só que em vez de sortear números, é sorteado um item da lista definida. ADENDO 2: Daria também para criar uma estrutura para incluir o número -1 como idade, dessa forma fazendo "finalizar numa quantidade aleatória" (automatizaria alguém podendo digitar o -1 para finalizar), e assim seguindo mais o enunciado. Mas, para exemplificar, utilizei uma quantidade fixa... ao mesmo tempo que já tem um contato com o conceito de constantes.. que nada mais são que "variáveis de valores fixos"... e "que têm valores definidos logos na sua declaração". Não tem mistério.
  13. Esqueceu de ler a matrícula. Algo como: escreval ("Informe o número da matrícula do" ,i:2, "° aluno") leia(matri) Já ajuste as sentenças para englobarem todos os números reais possíveis... como citado na minha postagem anterior. Exemplo: Ou deixe como tá.. tanto faz. @Midori, é isso. Nessa fase de implementação, é trabalhoso ficar digitando dados. Perde tempo (e paciência). Existe portanto já duas formas de melhorar isso: 1) utilizando o RandI(limite). Que "retorna um número inteiro gerado aleatoriamente, maior ou igual a zero e menor que limite.". 2) utilizando a estrutura ALEATORIO. Que "ativa a geração de valores aleatórios que substituem a digitação de dados. A palavra-chave on é opcional. A faixa padrão de valores gerados é de 0 a 100 inclusive. Para a geração de dados do tipo caractere, não há uma faixa pré-estabelecida: os dados gerados serão sempre strings de 5 letras maiúsculas." Tomando como exemplo o trecho abaixo: escrevaL("Informe o número da matrícula do ", i:1, "° aluno") leia(matri) repita escrevaL("Informe a nota final do ", i:1, "° aluno") leia(nota) ate (nota >= 0) e (nota <= 10) Ou seja: digitaria a matrícula, depois a nota, isso para cada aluno! Toda vez que for testar!... se a nota for inválida, digitaria até ser uma válida... Agora imagine que quero inserir valores de 10000 a 99999 para a matrícula e notas de 0 a 10 (inteiros) Primeiro um exemplo automatizando utilizado o ALEATORIO. escrevaL("Informe o número da matrícula do ", i:1, "° aluno") ALEATORIO 10000, 99999 leia(matri) ALEATORIO OFF repita escrevaL("Informe a nota final do ", i:1, "° aluno") ALEATORIO 0, 10 leia(nota) ALEATORIO OFF ate (nota >= 0) e (nota <= 10) Observe que é só envolver a variável que deseja com os comandos... Para parar de usar, só deixar como comentários. Exemplo: escrevaL("Informe o número da matrícula do ", i:1, "° aluno") //ALEATORIO 10000, 99999 leia(matri) //ALEATORIO OFF repita escrevaL("Informe a nota final do ", i:1, "° aluno") //ALEATORIO 0, 10 leia(nota) //ALEATORIO OFF ate (nota >= 0) e (nota <= 10) Entende? Após testar algumas vezes com o ALETORIO, e quiser testar sem... só desativar os comandos. Ou entregar assim, quando for testar... "Oh! desative aqui o comando aleatório que assim ele gerará os valores sozinho. Fica brabo!. Aprendi isso num fórum quando estava estudando." Um exemplo com o RandI(). escrevaL("Informe o número da matrícula do ", i:1, "° aluno") //leia(matri) matri <- RandI(1000) + 10000 escrevaL(matri) repita escrevaL("Informe a nota final do ", i:1, "° aluno") //leia(nota) nota <- RandI(11) escrevaL(nota) ate (nota >= 0) e (nota <= 10) É análogo. Quando quiser desativar, ajusta. escrevaL("Informe o número da matrícula do ", i:1, "° aluno") leia(matri) //matri <- RandI(1000) + 10000 //escrevaL(matri) repita escrevaL("Informe a nota final do ", i:1, "° aluno") leia(nota) //nota <- RandI(10)+1 //escrevaL(nota) ate (nota >= 0) e (nota <= 10) PS: por que tem um escrevaL() a mais? Pois o RandI() serve apenas para retornar um valor... daí, pegamos esse valor e jogamos na variável... está escrevendo na tela para aparecer o que foi sorteado (e atribuído à variável). ADENDO IMPORNTE: Não, não nos pergunte porque "RandI(1000) + 10000" ou "RandI(11)"... apenas pare para entender... se não descobrir, tente mais um pouco! Só deixo a dica que deixei destacada: "Agora imagine que quero inserir valores de 10000 a 99999 para a matrícula e notas de 0 a 10 (inteiros)". Agora porque essa fórmula maluca? Ela está certa? Isso é com você! ADENDO 2: Absorva bem essa questão da automatização para os testes... vai facilitar muito a sua vida... foque nisso. Entenda bem! Já começa usar nesse e outros novos projetos!!! Ajuda muuuuito!!! Aí, só depois de dominar isso, pare para você tentar descobrir um meio de Com a automatização, meio que vai focar só nisso... (vai ajustando os código e testando, ajustando e testando...). Pense numa lógica... vale também pesquisar no fórum e/ou google. Mas sempre procurando entender qual a linha de raciocínio, que aí melhora ou ajusta para o teu contexto.
  14. @Eli Almeidaa, se atente que a definição de uma nova nomenclatura para uma variável não tem nada a ver com a lógica do algoritmo. Só para deixar claro a importância dos contextos!! As variáveis podem ter qualquer nome válido (por exemplo, não começando com números já é um bom caminho). Se você chamar de banana ou igog7fayug35ae, vão funcionar exatamente da mesma forma. Escolher um boa nomenclatura está relacionada à organização e padrões de projetos. Quanto "mais semânticos" (dando uma indicação para que a variável serve) melhor. Um outro padrão é utilizar o tal do camelCase, que basicamente serve para deixar a leitura do código mais agradável. O camelCase também ajuda na semântica, pois fica claro a divisão das palavras. Veja: Ou seja: basicamente o código que postei foi o mesmo que o teu... É você que, primeiramente, precisa identificar o problema. Uma boa referência foi o "a altura menor sempre aparece sendo 0". Daí, você precisaria parar para tentar descobrir o que está ocorrendo... É normal!!! É justamente esse processo de tentar identificar e corrigir que está sendo desenvolvendo! Tente me entender: - Eu peguei teu código original e adicionei uma melhoria para automatizar os testes, ou seja, não precisar ficar digitando valores para cada testes; - Daí, você alterou a nomenclatura de uma variável (que eu tinha também sugerido), testou, identificou um problema, e depois? Não teria feito nada. . (Pelo menos não indicou muito bem o que fez. Não tem problema em errar ou "faz algo na da ver"... mas tem que tentar e tentar.) Vou tentar exemplificar um modo de pensar... Antes: Remova esse bagulhos: // Seção de Declarações das variáveis // Seção de Comandos, procedimento, funções, operadores, etc... Não tem serventia alguma... Além de poluir o código...É óbvio que esses seções são isso... Sempre são isso!. Só remover! Um código NÃO deve precisar ter comentários. Veja por exemplo o código do @devair1010, está tudo bem claro lá!!! Ele só deixou esses comentários para você e outros visitantes assimilarem mais rápido, mas se for implementar no código, eles não devem vir, pois o próprio código já está dizendo isso que está no comentário, saca? Por exemplo: o quê o i estaria representando? "Um controlador de quantidade de loops. Oras! Se i = 1, logo é o primeiro loop. É desnecessário um comentário. "Hum! Quando for a primeira verificação, vai atribuir um valor inicial para as duas variáveis". Os comentários estão ali apenas para serem ainda mais didáticos. PS: é para ir acostumando. Na prática, comentários podem tender a atrapalhar, ou seja, a explicação pode está errada/pouco precisa ou confusa. Vamos lá: Execute esse código mentalmente... pede um código do sexo, informa 1. Ler a altura, informa 1.80.. verifica qual o sexo informado (o que não importa para a menor idade), verifica a idade (o que tb não importa), e chegamos onde importa: Tá..., o quê significa essa expressão aí no se? Foi você que implementou... Já conseguiu assimilar o que está aí? OK... qual o valor de altura e alturaMenor nesse ponto? A primeira vai está com o valor que digitei mentalmente: 1.80. E qual valor está em alturaMenor? "Vixe! Não sei". Pronto! É só arrumar um jeito de descobrir! Simples, não?. (Já citamos algumas vez qual valor fica ao iniciar, mas supondo que não sabemos.) Como o resultado está dando zero... posso inicialmente imaginar que tem 0 ali em alturaMenor. Algo como: se (1.80 < 0) então Ué? A altura tem um valor natural (não é menor que 0). Então, como qualquer valor que eu digitar vai ser menor que 0? Vixe!! Já tá mei caminho andado. Caso identifique a necessidade de verificar o valor de uma variáveis, vamos parar pensar em algo..: Exemplo 1: Ou seja: exibi o valor da variável antes, e o valor depois. No antes já consigo meio que concluir que ele já estava com 0. Mas veja: em nenhum momento anterior do código foi dado esse valor!! "Oh!!! Então já descobri que o VisualG já faz isso por mim". Exemplo 2: Aqui só declarei as variáveis e rodei. Ó, lá os valores das variáveis. Próximo passo: Já imagino que o problema é que "o valor inicial da variável alturaMenor nunca está sendo maior que os valores que digito. O que posso fazer?" (lá ele) Já sei.. vou inicializar com o primeiro valor! Do segundo em diante, vai sendo comparado e atualizado, caso necessário. Aqui seria o que o @devair1010 já deu a dica. ou Pensei em outra forma: inicializo a variável alturaMenor com um valor maior que o maior valor possível. Segue abaixo: Um ser humano não chega de 3, certo?. Jogar logo um valor exagerado: inicio alturaMenor <- 999 para i de 1 ate 4 faca ou Penso em outra forma.... Pronto! Refazendo o exercício mental de execução do código, vai haver atualizações e aparentemente funcionar corretamente. Adendo: claro que cada abordagem por ter suas vantagens e seus problemas, cabe a nós, programadores, identificar os pontos. Por exemplo: se em algum contexto não for informado altura alguma, a menor altura pode ser exibida como sendo 999. Para o caso de inicializar no primeiro loop, isso está fazendo que, a cada loop, esteja verificando se é o primeiro, deixando o cálculo da menor altura mais trabalhosa*. (Seria uma passo a mais para cada loop extra... mais trabalho pro computador...) RESUMINDO: Você sempre primeiro precisaria tentar descobrir sozinho(a)... Após não conseguir, tenta mais um pouco... depois, dá um google... tenta assimilar bem o que achar... em caso de insucesso, depois, parte pros fóruns . Porque isso? Pois ao ter de cara uma suposta boa resposta pronta (que eu sei que ninguém quer isso), perderá a oportunidade de ter se desenvolvido mais a habilidade de se virar ou até mesmo "trazer algo mais interessante ou inédito" para resolver um problema.
  15. Qual erro está dando? @Eli Almeidaa, alguns pontos: - se acostume a utilizar o camelCase (lowCamelCase) para as nomenclaturas de variáveis. Um padrão geral; - para ajudar nos testes, insira o conceito para gerar os dados automaticamente; - depois das ",", tem um espaço. - evite deixar comentários desnecessários no código. Só faz poluir. (Aqueles que aparecem no início do VisualG seria apenas uma apresentação inicial.) Abaixo um esboço. algoritmo "Pesquisar sobre habitantes" // Descrição : Foi feita uma pesquisa entre os habitantes de uma região e // coletados os dados de altura e sexo (0=masc, 1=fem) das pessoas. Faça um // programa que leia 50 dados diferentes e informe: // // - a maior e a menor alturas encontradas; // - a média de altura das mulheres; // - o percentual de homens na população; var i, num, sexoFeminino, sexoMasculino : inteiro altura, alturaMaior, alturaMenor : real inicio para i de 1 ate 4 faca escrevaL(" Informe 0 para sexo masculino ou 1 para sexo feminino") ALEATORIO 0, 1 leia(num) ALEATORIO OFF escrevaL(" Informe a altura") ALEATORIO 150, 190 leia(altura) altura <- altura/100 ALEATORIO OFF se (num = 1) então sexoFeminino <- sexoFeminino+1 senao se (num =0) então sexoMasculino <- sexoMasculino+1 fimse fimSe se (altura > alturaMaior) então alturaMaior <- altura fimSe se (altura < alturaMenor) então alturaMenor <- altura fimSe fimPara escrevaL("A maior altura encontrada é :", alturaMaior:1:2) escrevaL("A menor altura encontrada é :", alturaMenor:1:2) fimAlgoritmo É o mesmo código, apenas com alguns ajustes que citei mais acima... daí, teste e identifique qual erro está ocorrendo e tente corrigir. Caso não, informe qual o problema que identificou e qual a dificuldade. Adendo: para a variável do sexo, utilize uma nomenclatura mais semântica. Exemplo: codSexo : inteiro Só substituir o num por codSexo.
  16. Poderia ser algo assim: se (nota >= 0.0) e (nota < 5.00) então senao se (nota >= 5.00) e (nota < 7) então senao se (nota >= 7.00) e (nota < 9.00) então senao se (nota >= 9.00) e (nota <= 10.00) então fimse fimse fimse fimse fimPara Algo como: escrevaL("Informe o número da matrícula do ", i:1, "° aluno") leia(matri) repita escrevaL("Informe a nota final do ", i:1, "° aluno") leia(nota) ate ((nota >= 0) E (nota <= 10))
  17. Seria o citado na seção: Essa é justamente a ideia.. "ler os dados sozinho". Não precisar ficar digitando valores. Vai "automatizar os testes". Sem isso, toda vez que alguém for usar o programa, teria que digitar 150 valores! Já pensou a trabalheira? No mínimo, utilizaria esse recurso de gerar automaticamente nos testes quando estiver implementando. Ah! Quando tiver dúvidas, tenta deduzir/inferir.. se não avançar muito no entendimento, vai no Google... Exercite a abstração... É comum termos contatos com coisas que nunca vimos ou não lembramos, mas analisando o contexto, dá para já ter uma boa ideia... Chegou perto. O comando ALEATORIO serve para gerar valores aleatórios, certo?... Esse valor seria apenas relacionado à faixa de valores que quero que sorteie e seja atribuído à variável que está sendo utilizada, ou seja, vai gerar valores entre 0 e 10000. Não é que "só pode ser", mas apenas que "quero que gere esses valores" naquela caso. São coisas distintas. É análogo. Gerar valores de 0 a 10... Como dá para perceber, poderia ter colocado apenas 10... já que o 0 fica implícito. Se fosse outra faixa que não comece em 0, basta especificar assim com a vírgula. Tem outro comando para gerar números aleatórios: RandI(). Dá um google... Show! Mas nesse caso aí, ao identificar uma nota inválida, simplesmente iria finalizar o laço de repetição. A ideia aqui é que solicite uma nova nota até que esteja dentro da faixa aceita. Exemplo: digitou 11, informa que inválido e solicita outra nota... até que uma nota entre 0 e 10 (inclusos) seja informada. Tem a dica lá: Algo como: "repita até que o valor da nota seja maior ou igual a 0 e valor da nota menor ou igual a 10". Vai funcionar também, mas não seria bem assim. Você deu uma olhada sobre o que citei? Revisa lá o que são conjuntos abertos e conjuntos fechados. A proposta é que as verificações abranjam TODOS os números entre 0 e 10. (Entendendo os tais conjuntos, vai entender o que estou falando.)
  18. Show de bola! Eu gostei! Alguns detalhes extras: 1) Indentação de código Sempre mantenha seu código indentado. No VisualG, pressione Ctrl+G. Já ajuda bastante! Veja a diferença: Var matri,i:inteiro nota:real Inicio para i de 1 ate 75 faca escreval ("Informe o número da matrícula do" ,i:2, "° aluno") leia(matri) escreval (" Informe a nota final do",i: 2, "° aluno") leia(nota) se (nota>=0.0) e (nota<=4.9) então escreval (" Conceito D") senao se (nota>=5.0) e (nota<=6.9) então escreval (" Conceito C") senao se (nota>=7.0) e (nota<=8.9) então escreval ("Conceito B") senao se (nota >= 9.0) e (nota <=10) então escreval ("Conceito A") fimse fimse fimse fimse fimPara Fimalgoritmo Removi também os comentários desnecessários e linhas em branco. 2) Texto truncado Veja: Como está formatando, seria mais apropriado dar um espaço após "do". E reservar o espaço que achar adequado. Vide apêndice 1 para outros detalhes. 3) Texto de resultado Como está lendo a matrícula, seria interessante exibir a matrícula no resultado. Caso contrário, fica parecendo um "leitura de dados inútil". Poderia utilizar a matrícula no texto que ler a nota, ou na hora de exibir o conceito. 4) Ir além Após está com uma boa versão final, poderia partir para testar as possíveis melhorias. A sugestão seria implementar: - uma validação para não permitir notas menores que 0 ou maior que 10; (Dica: ler o dados dentro de um laço de repetição.) - implementar uma verificação de toda faixa de nota entre 0 e 10; (Dica: dê uma revisada sobre conjuntos abertos e conjuntos fechados. Tem a ver com utilizar ">" ou ">=", por exemplo) Observe que eu já deixei separado. NÃO tente implementar as duas coisas ao mesmo tempo. Ou faz primeiro uma, ou faz a outra. Nunca* ao mesmo tempo. 5) Automatização de testes O VisualG tem um recurso bem bacana para automatiza leitura de dados. Para números inteiros é bem simples. Basta colocar entre comandos ALEATORIO (respeitando a sintaxe). Veja o exemplo: escreva ("Informe o número da matrícula do ", i:1, "° aluno: ") ALEATORIO 10000 leia(matricula) ALEATORIO OFF escreva ("Informe a nota final do ", i:1, "° aluno: ") ALEATORIO 0, 10 leia(nota) ALEATORIO OFF Exemplo no apêndice 2. *** APÊNDICE 1. As variáveis numéricas no VisualG meio que são impressas com um espaço à esquerda. Exemplo: Eu particularmente acho isso um desserviço, mas é assim. Daí, ao "formatar o número com os ':'", esse espaço extra some, ficando apenas os espaços ocupados pelo próprio número, mais os espaços que sobram do que foi reservado. No exemplo do teu código, reservou 2, logo, entre 1 e 9, vai ter um espaço à esquerda (justamente para ocupar pelo menos 2). O que tiver mais caracteres, vai ocupar normalmente (sem o espaço extra). É isso. Outra detalhe importante: procurar seguir as mesmas regras do português brasileiro para as vírgulas. Veja: Em vez de: escreval ("Informe o número da matrícula do" ,i:2, "° aluno") Usar algo como: escreval ("Informe o número da matrícula do", i:2, "° aluno") A vírgula é colada à esquerda, e dá um espaço à direita. Já corrigindo tudo: escrevaL("Informe o número da matrícula do ", i:1, "° aluno") 2. Exemplo de código algoritmo "Classificação de notas" var matricula, i : inteiro nota : real inicio para i de 1 ate 75 faca //para i de 1 ate 5 faca escreva ("Informe o número da matrícula do ", i:1, "° aluno: ") ALEATORIO 10000 leia(matricula) ALEATORIO OFF escreva ("Informe a nota final do ", i:1, "° aluno: ") ALEATORIO 0, 10 leia(nota) ALEATORIO OFF escrevaL() escrevaL("Aluno : ", matricula:1) escrevaL("Nota : ", nota:1) escreva ("Conceito: ") se ((nota >= 0.0) e (nota <= 4.9)) então escreval ("D") senao se ((nota >= 5.0) e (nota <= 6.9)) então escreval ("C") senao se ((nota >= 7.0) e (nota <= 8.9)) então escreval ("B") senao se ((nota >= 9.0) e (nota <= 10)) então escreval ("A") fimSe fimSe fimSe fimSe escrevaL("---------- ---------- ----------") escrevaL() fimPara escrevaL("TABELA DE CONCEITOS") escrevaL("0,0 - 4,9 D") escrevaL("5,0 - 6,9 C") escrevaL("7,0 - 8,9 B") escrevaL("9,0 - 10 A") fimAlgoritmo Nesse código inserir outros exemplos de melhorias/alterações na exibição. Não inclui os itens citados no tópico 4, e deixei para você caso queria incluir a parte fracionada (aí está só gerando inteiros). Teria que pensar em alguma lógica.
  19. Sugiro tentar entender tudo. Se tiver algum ponto que não entendeu, para para entender. Geralmente as bases dos problemas se repetem... ou seja: melhor tentar ir assimilando no início, quando se deparar com algo semelhantes, já vai menos dificuldade. Qual parte não entendeu? Adendo: aqui não estamos estudando VisualG, mas sim técnicas de programação (é universal). Que inclui também "técnicas de entender coisas que ainda não entendemos" .
  20. Qual erro? (Pergunta retórica.) Tente entender o erro informado, daí tente achar uma solução. Tenta primeiro analisar... aí, posta o que está ocorrendo e o quê tentou fazer... Exemplo: Quando digito primeiramente -5, apresenta esse erro: O VisualG não aponta em qual linha ocorreu, e agora?... Mas está exibindo a mensagem de erro "Invalid floating point operation". Hum!!! Pode ser que ajude! Que tal pesquisar no Google? visualg Invalid floating point operation Entende? Tá! Vi que provavelmente seria algo relacionado à "divisão por zero". Matematicamente essa operação é problemática... ou dá indeterminado, ou é impossível (se não lembra ou não entende o motivo, pesquisa sobre "divisão por zero". Isso é importante!). Computadores não se dão muito bem com essa situação (o VisualG não foi programado para tratar esses casos). Vamos analisar o código: ao se "digitar primeiramente -5", vai interromper o laço de repetição, certo? A próxima linha é: Percebe que o denominador de uma divisão é a soma dos valores de duas variáveis? Oras! Quais os valores de contpar e contimpar nesse momento? Valem 0. Só para relembrar: Dá para ver os valores também lá na "Áreas das variáveis de memória": Ambas estão zeradas. Logo, irá utilizar "0" lá na denominador (da divisão que calcula a média), ou seja, 0 + 0 = 0. O VisualG travará. (Pois.....). Se quiser testar o passo a passo: Cada vez que vai apertando F8, o VisualG vai executando uma linha... ai você vai acompanhando o fluxo do código. Antes de executar a linha, veja os valores das variáveis. RESUMINDO: É preciso dar um tratamento à possibilidade da divisão por zero. Exemplo: se (contpar+contimpar > 0) então mediageral <-(somarpar+somarimpar)/(contpar+contimpar) fimSe Dessa forma estaria "garantindo" que o denominador seja diferente de zero (que é cerne do problema). Veja que tudo é uma abstração. É uma forma de entendermos os comportamentos. Ao fazer isso acima, a média deve dar zero. Isso é certo? Não sei, mas aí busca uma solução. PS: quando digo "vai dar zero", seria porque "vai exibir que a média é zero"? Vai ocorrer isso porque, hem? Hem? (Dica: veja o valor da variável no momento que vai exibir o resultado.) PS 2: por que estou verificando a soma, em vez de verificar cada variável? Está assim: E por que não assim? Não sei! Eu apenas abstrair o problema. O que não pode ser 0 é o denominador... seria algo como: se (denominador > 0) então Como o denominador é uma soma, eu inseri a tal soma... as duas sentenças acima serão semelhantes. Certo? Observe que tudo é uma questão de abstração, pois pode ser que nem sempre tenham o mesmo comportamento. Tipo, se as variáveis tiverem números opostos, exemplo: 4 e -4? A soma vai dar zero. Não iria passar na condição de cima, mais iria passar na condição de baixo. (Ao mesmo tempo, tecnicamente a soma não deve dar negativa, concorda? Entra outra questão: quem disse que uma soma não pode dar negativo?
  21. Links para baixar Fontes para versão 3.0.6.5 (versão mais recomendada*) https://sourceforge.net/projects/visualg30/files/VISUALG3_REV60.rar/download http://visualg3.com.br/download/2090/ Fonte para versão 2.5 https://dicasdeprogramacao.com.br/download/visualg-2-5.zip Fontes para versão 3.0.7.0 (essa versão tem alguns defeitos (bugs) relevantes) https://sourceforge.net/projects/visualg30/files/visualg3.0.7.rar/download http://visualg3.com.br/download/2086/ Telas de cada versão: Versão 3.0.6.5 Versão 2.5 Versão 3.0.7.0
  22. Na postagem citada @Midori cita essa postagem: Ou seja: na versão 3.0.7.0, o escolha deve comparar corretamente se o caso (o texto na variável estacao) informado estiver todo em MAIÚSCULO. Testa aí para ver. Exemplo: "INVERNO". Sugiro a versão 3.0.6.5. É a mais comum e estável. A 2.5 também tem um monte de problemas (alguns meio que foram ajustados na 3.0.6.5, mas daí veio a 3.0.7.0 novos problemas )
  23. @amanda_farias00, seja bem vindo(a) ao Fórum do Clube do Hardware. A tua dúvida é no entendimento do problema, ou implementar o algoritmo de uma solução que encontrou? O problema seria isso: Quantidade pessoas: 320 Quantidade de banheiros: x Quantidade de bares: y Qual o valor de x e o valor de y para satisfazer a estimativa. Veja que isso não tem nada a ver com algoritmo. Seria responder como se fosse, por exemplo, uma questão do ENEM. Após entender o problema e saber resolver, aí sim partiria para o VisualG. SPOILER: seriam 6 ou 7 banheiros. Daí precisaria encontrar a resposta correta e justificar. Repito: não pense em algoritmo, apenas pense em como se fosse um problema real no dia-a-dia.
  24. Se for ler uma quantidade ilimitada ou ler 10, a lógica para verificar o maior, em si, é a mesma. No tópico abaixo detalho sobre. Dá uma olhada lá.
  25. De um modo geral, o código ficou muito bom... Me parece que já fez algo bem relacionado ao que foi pedido. Vamos só dar uma focada nos requisitos específicos do enunciado: No teu código estaria lendo os dados para apenas um aluno. Não está tratando dessa questão dos "75 alunos". Analise essa questão e insira no algoritmo. É isso aí. Só removeria esse se do "maior que 10". Isso não está no enunciado. Está errado? Creio que não, mas não foi pedido! Foque apenas no que foi pedido... depois pode acrescentar essas pontos extras. Veja: e se nota for menor que 0? É inválido também e não está no código... e se inserir uma nota 8.95? É uma nota válida, e também não está sendo coberto pelo algoritmo! Entende? Sugiro: que não se preocupe por enquanto com esses detalhes. Foque apenas nos requisitos impostos. Depois de feito o que foi pedido, aí poderia criar uma cópia do código e implementando melhorias. Resumindo: Faça o programa ler a nota dos 75 alunos. Já adianto algo como: "Vixe, ficar digitando 75 notas". Então, tudo isso faz parte do processo de aprendizagem. Como seria muito trabalho, implemente um programa de esboço que só ler 2 ou 3 notas!!! Na versão final muda para 75. (Oras! Se funcionar com 3, deve funcionar com 75. ) Remova essa validação de nota inválida. Pressuponha que só serão inseridos notas válidas.

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