Ir ao conteúdo

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

Tudo que Simon Viegas postou

  1. Olá. Ainda precisa de ajuda? No aguardo.
  2. Olá. Ainda precisa de ajuda? se sim, está com dúvidas em qual parte? caso não, se possível poste seu código aqui para servir de base para outros usuários. No aguardo
  3. Olá. Qual a sua dúvida? por favor, poste o que já conseguiu fazer e onde está com dificuldades, ok?
  4. Ola. Para esse tarefa não precisa de nenhuma função específica... basicamente vai precisar de uma laço de repetição. Tente entender o enunciado. Vamos supor que digite o número 5. Quais são os valores a serem apresentados? No caso 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, 6, 7, 8, 9, 10, 11, 12, 13, 14 e 15. Esse valores antecessores e sucessores estão em função do valor informado... existem várias formas gerar esses números, creio que a forma mais simples seria utilizando um laço de repetição mesmo. Sugiro que tente fazer algo da forma que você imaginou e poste aqui onde está com dúvidas. No aguardo.
  5. Olá. Acho que talvez você que não entendeu o que postei... Então, como o arquivo é pequeno, você pode jogar linha por linha num array (cada posição uma linha), depois recria o arquivo e vai reescrevendo linha por linha a partir do array, só que verificado nessa linhas se uma delas é que quer apagar, daí, ou colocar um # no início da linha ou simplesmente não escreve a linha. Outra forma seria usar uma cópia do arquivo. Pegar linha por linha de um e ir analisando e escrevendo no outro. No aguardo.
  6. Olá. Até onde em sei, arquivos de texto não são editáveis, daria apenas dar um "append", ou seja, adicionar informações ao fim do texto. No momento penso em duas possibilidades: 1) reescreve todo o conteúdo da forma que deseja, ou seja, você pode pegar o conteúdo do arquivo atual, e reescreve linha por linha no arquivo com as modificações que deseja. No caso, não precisaria ter no código fonte as informações do arquivo, elas viriam do próprio arquivo. Quer apagar uma linha? apenas coloca um "#" no início da linha, ou simplesmente não escreve a linha no arquivo, pula para próxima... Um detalhe que pode ajudar seria, "toda linha que começa com "#", o programa já poderia reescrever automaticamente". Sobra apenas para verificar as linhas que não tem o "#" no início... Algo como: Imagine que queria remover a linha 127.0.0.1, então, "se primeira letra da linha não começa com #, então verifique se na linha contém 127.0.0.1. Se encontrar, então reescreva a linha com um # no início. (ou não escreve a linha). Entende? 2) testa a possibilidade de abrir o arquivo como binário, em vez de text. Não sei se vai funcionar... algo como abrir como "file of String". Não sei dizer de dará certo ou se tem riscos de corromper o arquivo... No aguardo.
  7. Olá Victor H Alves. A ideia é que você tente fazer algo e tire dúvidas aqui no fórum. Pele menos monte estrutura base do programa e indique onde está com dúvidas. Então.. pelo que eu entendi, precisa fazer uma seleção, ou seja, um if, e exibir a resposta correspondente. se DOMINGO então escreva "frase de domingo" senão se SEGUNDA então escreva "frase de segunda" senão se TERÇA então escreva "frase de terça" etc No aguardo.
  8. Além dessa dica do Math.Pi, dá também usando a seleção (if ou case) com as categorias de caracteres mesmo. De 'a' até 'z', de 'A' até 'Z' e de 0 até 9. Os dois primeiros são letras, o terceiro número e se não for um desses é caractere especial. Sugiro usar um CASE, ficará mais fácil e organizado. Não vou postar o case como deve ficar, pois senão já seria a resposta pronta. Obs.: O case também tem else, por sinal nem precisa de begin/end nele, mas se colocar não tem problema. PS: sugiro tentar fazer das duas formas. "Mata dois coelhos com uma caixa d'água". Qualquer coisa é só postar.
  9. Olá. Efetuei uma compilação pelo PascalZim 6.0.2 e vi esse erro. Mas o erro em si está em outro local! Veja, você precisa corrigir alguns writeln, pois para imprimir um texto, é necessário que ele fique entre aspas simples. ex.: write('Por favor! Digite o valor de compra: ); //está faltando a aspa do final writeln(Por favor! Digite o valor de venda: ); //já aqui está faltando as aspas do inicio e final Por ai vai. MINHA SUGESTÃO Refaça o programa e vá compilando de tempos em tempos, ex.: program ATS_SegundaQuestao;uses CRT;const MAXIMO = 10;type RgProduto = record Nome :string; PrecoCompra:real; PrecoVenda :real; end; tpProdutos = array[1..MAXIMO] of RgProduto;var produtos :tpProdutos; n :integer; continuar:char; {salariofixo: real; comissao: real; INPS: real; salariobruto: real; valorretido:real; salarioliquido: real; tvdecores:integer; tvpretoebranco:integer; n:integer; inscricao: integer; tipo:char;}BEGINn:=0;repeat n:=n+1; ClrScr; writeln('Por favor! Digite o Salário fixo do funcionário! : ', n:2); repeat writeln('Deseja continuar? (s/n).: '); readln(Continuar) until Continuar in ['S', 's', 'N', 'n'];until (n = Maximo) or (Continuar in ['N', 'n']);END. Daí vai inserindo mais algumas coisas e vai testando (compila)... se compilar, significa que "não tem" erro de sintaxe. Daí vai inserindo mais outras coisas e compila novamente... se der erro, corrige e compila...ou seja, a compilação vai servir para verificar se tem erro de sintaxe... com o tempo, vai se acostumando e vai diminuindo a quantidade de testes... Por exemplo, inserir mais um trecho e compilei. OK... depois inserir mais outros e compilei, de seu erro: => Erro semântico na linha 46...=> O identificador 'PRODUTO' não foi declarado dentro do escopo de PROGRAM! program ATS_SegundaQuestao;uses CRT;const MAXIMO = 10;type RgProduto = record Nome :string; PrecoCompra:real; PrecoVenda :real; end; tpProdutos = array[1..MAXIMO] of RgProduto;var Produtos :tpProdutos; //array para cadastrar os produtos n :integer; //controle da quantidade de produtos cadastrados continuar:char; salarioFixo :real; //valor do salário fixo do funcionário {salariofixo: real; comissao: real; INPS: real; salariobruto: real; valorretido:real; salarioliquido: real; tvdecores:integer; tvpretoebranco:integer; n:integer; inscricao: integer; tipo:char;}BEGINn:=0;repeat n:=n+1; ClrScr; writeln('Por favor! Digite o Salário fixo do funcionário! : ', n:2); readln(salarioFixo); write('Por favor! Digite o nome da Mercadoria!: '); readln(Produtos[n].Nome); write('Por favor! Digite o valor de compra: '); readln(Produtos[n].PrecoCompra); writeln('Por favor! Digite o valor de venda: '); readln(Produto[n].PrecoVenda); writeln; repeat writeln('Deseja continuar? (s/n).: '); readln(Continuar) until Continuar in ['S', 's', 'N', 'n'];until (n = Maximo) or (Continuar in ['N', 'n']);END. E agora? analise o erro e tenta corrigir. Nesse caso, foi que digitei "Produto" em vez de "Produtos". Entende? Daí revisa... os passos até ai estão certo? parece que sim... e continua inserindo e testando...inserindo e testando... Fique atento: nem sempre o erro informado no PascalZim aponto para o erro em si. Daí tem que revisar o código todo! Se anteriormente foi feito os testes, provavelmente o erro deve está na parte nova que você inseriu. No aguardo.
  10. Olá. É, analisando o código aqui, acho que tem algo erro mesmo... estou sem compilador aqui para fazer um novo teste, mas provavelmente eu testei errado. Mas vamos lá: Provavelmente se trata dessa instrução: readln(salariofixo[n].Nome); A variável é salariofixo, correto? Ele está declarado como tipo real. Veja: var salariofixo, comissao, INPS,salariobruto,valorretido,liquido: real;tvcores,tvpreto,n,inscricao: integer;tipo:char; Daí já verificamos duas coisas: 1) a instrução citada está usando um "[n]" na variável salariofixo. Esse colchete (com um valor inteiro* no meio) está meio que sugerindo que a variável é uma ARRAY (ou uma String, que se comporta como uma array e possibilita esse acesso com [] também), mas como sabemos, salariofixo é apenas um real, logo não aceitando esse "[]"!!! 2) além de não ser um array, a instrução também está usando um "." depois dos "[]". Esse "ponto" está meio que sugerindo que a variável salariofixo é um RECORD (no caso, um array de um record, já tem o []), mas como sabemos, salariofixo é apenas um real, logo não aceitando esse "."!!! ou seja. salariofixo não é uma array (não aceita "[]"), e nem é um record (não aceita "."). ### Da mesma forma que a instrução: readln(Produto[n].PrecoCompra); Deve não funcionar, já que Produto não está declarado. Analisando superficialmente, caso a lógica fosse para usar essa variável mesmo, a declaração dela poderia ficar mais ou menos assim: type RgProduto = record Nome: string; PrecoCompra, PrecoVenda: real; end; tpProdutos = array [1..10] of RgProduto; //AQUI DECLARAÇÃO DO TIPO "ARRAY", QUE É DO TIPO "RECORD"var produtos :tpProdutos; //AQUI DECLARAÇÃO DA VARIÁVEL COM SEU RESPECTIVO TIPO salariofixo, comissao, INPS, salariobruto, valorretido, liquido :real; tvcores, tvpreto, n, inscricao :integer; tipo :char; O uso do type basicamente serve para facilitar o reuso, ou seja, se outra variável utilizar esse tipo também. Mas poderia ser declarado direto. Ex.: var produtos :array [1..10] of RgProduto ou até mesmo var produtos :array [1..10] of record Nome: string; PrecoCompra, PrecoVenda: real; end; Em fim. Precisa primeiramente organizar a declaração das variáveis. Depois reajustar o programa. No aguardo.
  11. Olá. O primeiro código compilou e rodou normalmente. O que que ocorre quando compila ai? Em relação ao segundo código, apenas corrigir uns pequenos detalhes. Informações no próprio código. program ATS_TerceiraQuestao;uses CRT;var empresa : string; N,I : integer; Item, Q : array [1..200] of integer; v : array [1..200] of real; vp :Real;beginwriteln('Informe o nomne da empresa');readln(empresa);repeat writeln('Informe o número de itens'); readln(n);{until (n > 0) and (<= 200);} //faltou inserir o n na segunda sentençauntil (n > 0) and (n<= 200);for i:=1 to n do { end;} //????? begin writeln('Informe o código do produto'); readln(item[i]); writeln('O valor unitário'); {read(v[i]);} //não use read, use somente readln readln(v[i]); end;vp:=0;for i:=1 to n do vp:= vp+q[i]*v[i];ClrScr;{writeln('Empresa: ', empresa)} //faltou o ";"writeln('Empresa: ', empresa);writeln ('valor patrimonial:', vp:8:2);readkey;end. No aguardo Abraços
  12. Vamos conversar por mensagens privadas. Eu enviei uma mensagem ("Enviar Mensagem") para você , por favor, responda a mensagem. Qualquer coisa envia uma mensagem para mim pelo meu perfil.
  13. Olá. andreza.gomes, como se trata de um outra dúvida, por favor, crie um NOVO TÓPICO para ela, ok? e aguarde ajuda lá. Abraços
  14. Olá. Testei no Pascal Zim 6.0.2, compilou e executou normalmente. Qual erro que está apresentando ai?
  15. Olá. Seu código está compilando e executando normalmente aqui.. qual o seu compilador? No aguardo.
  16. Olá. @Fabio Aragao O mais importante é que o código em si fique identado. Claro que é bom que fique identado no fórum, mas não é foco! Não se preocupe com isso. Já aproveitando sobre a questão do alinhamento, abaixo usei um programa que tenho aqui que consigo mostrar as "tabulações" (Tab) e os "espaços". Espaços = "." e Tabulação = ">>" Perceba que existem tanto um quanto outro misturados... a minha sugestão é que tente usar apenas um. Ou só tabulação, ou só espaços... Então, a tabulação é meio que um código, e cada "exibidor" tem uma forma de interpretar esse código. Por exemplo, aqui para mim, o Fórum/Navegador está exibindo um espaçamento equivalente a 8 espaços. Já na imagem que postei, está exibindo com espaçamento de 4. Talvez o seu programa use outra quantidade de espaços... etc. Tanto tabulação, tanto espaço, tem as suas vantagens e desvantagens... como digo, como sugestão tente usar somente um outro outro... (claro que me referido ao espaçamento da identação... do alinhamento a esquerda...) O Pascal possui basicamente 3 tipos de laços de repetição: 1) For 2) Repeat 3) While Na prática, "O QUE DÁ PARA IMPLEMENTAR COM UM, DÁ PARA FAZER COM UM OUTRO", ou seja, bastaria existir um, certo? Só que acontece que cada um deles tem as suas características, que são mais práticas ou simples para executarem determinadas tarefas.. No seu código inicial, ele foi perfeito para leitura dos dados, já que dos 3 é o mais prático para tal feito (quantidade fixas de loop). Já para o caso da "pesquisa", ele caiu nesse "problema" de talvez precisar interromper no meio do caminho... E essa interrupção (uso do break) pode não ser considerado uma boa prática, ou seja, quebrando (fazendo um trocadilho com o break) o princípio do for que é fazer N laços... entende? (obs.: não sei exatamente dizer se usar o break é válido ou não... eu particularmente não gosto da ideia para esse caso) Em relação a como usar o repeat é simples. Dê uma pesquisada/revisada sobre esses três laços: FOR, REPEAT e WHILE. Tente entender as diferenças antes de tentar fazer. Acho que dá uma resposta pronta não tenha graça... mas para para ajudar....:você precisará de duas (ou mais) condições no until. Tenta ai. Caso não consiga, é só postar onde está com dificuldades que tentamos te ajudar.. UPDATE PS: Só aproveitando, perceba que para "entrar" o nome tem que está escrito exatamente da mesma forma que foi digitado... caso ache interessante, dá para implementar para ele não diferenciar letras maiúsculas e minúsculas (Ex.: "Maria" acharia com "MARIA" ou "MAria" etc) e também verificar se "contém" a palavra (Ex.: Maria acharia em "Maria Joaquina" ou "Joaquina" acharia em "Maria Joaquina" também" etc). Mas caso deseja, deixe para depois... por enquanto o foco é utilizar implementar o laço. No aguardo.
  17. Olá. Vamos lá. Alguns pontos que achei importante: 1) mantenha seu código sempre bem identado. Para facilitar, evite usar "TAB" (tabulação); 2) de fato, usar o break não é uma boa prática. Para esse contexto, utilize o Repeat ou While (no lugar do For) . Recomendo o Repeat! 3) use sempre apenas readln, nunca* read. Por enquanto não precisa entender a diferença entre um e outro. Abaixo identei o seu código (no meu padrão). Veja a diferença visual... obs.: identação também pode ser critério de avaliação. Program Exerc_4_slide;var vet :array [1..3] of string; i :integer; R, nome :string; beginfor i := 1 to 3 do begin write('Digite o ',i,'o. nome: '); readln(vet[i]); end; write('Digite o nome que voce quer procurar: ');readln(nome); for i := 1 to 3 do begin if (nome = vet[i]) then begin R:='Achei!!!'; break; end else R:='Não achei!!!'; end;write(R);end. No aguardo.
  18. Olá; Acho que tem várias formas, uma delas pode ser pelo método getFreeSpace da classe File. Ex.: public static void main(String[] args) { // Pegar o espaço livre do HD System.out.println(new File("d:\\").getFreeSpace()); // Pegar o espaço que está sendo usado do HD System.out.println(new File("d:\\").getTotalSpace() - new File("d:\\").getFreeSpace()); } PS: peguei esse código na internet, mas creio que seja algo do tipo. PS2: acho que usado temo método getUsableSpace(). Em fim... Link da API da versão 7
  19. Beleza... Qualquer coisa estamos ai! Abraços
  20. Olá Os comandos usados em si não tem nada a ver... o uso de procedure foi basicamente para "facilitar o reuso". Um exemplo: procedure aguardarEnter; begin writeln('Pressione ENTER para continuar'); readln; end; Daí, no programa chamaria somente o aguardarEnter;, seria o mesmo que essas duas linhas tivessem lá onde o comando foi chamado. Nesse contexto, a procedure facilitará em: - evitar repetição de texto: posso utilizar o comando quantas vezes quiser, e não precisará colocar linha por linha onde usaria. - facilidade para edição: basta mudar na procedure. Sem ela, teria que ir no código procurar e mudar linha por linha. - organização: pode deixar o código fica mais organizado. - etc *** O byte, assim como o integer ou real, é um "tipo de dado". Cada tipo tem suas características. Ex.: Integer: aceita valores de -32768 a 32767. Ocupa 2 bytes da memória; Real: acho que aceita 15 dígitos, incluído número decimal.. Ocupa 8 bytes; Byte: vai de 0 a 255. Ocupa 1 byte; Etc Ou seja, um integer abrange o byte. Da mesma forma que o real abrange os dois. Na prática, poderia usar integer mesmo, o byte é apenas mais preciso (menor desperdício). Uma analogia seria usar um String onde poderia se usar um char, ou seja, a String seria desperdício. Mas também funcionaria. obs.: não sei exatamente a capacidade e tamanho de cada um... mais seria mais ou menos isso. E também varia em alguns compiladores... (incluindo entre arquiteturas 16, 32 e 64bits) *** Exatamente!!! Isso. A "diretiva" {$I-} serve para mudar a configuração, ou seja, passando a deixar de travar caso haja erro de I/O. IOResult é uma function. O que é um function? Exatamente a mesma coisa que uma procedure, só muda que ela ao mesmo tempo retorna um valor nela mesma, ou seja, como se fosse uma variável. Exemplos de function: UpCase(); //retorna o "char" correspondente em maiúsculo que foi passado sqrt(); //raiz do número passado sqr(); //quadrado do número passado ReadKey; //tecla digitada IOResult; //código do resultado da última operação de entrada e saída. etc Ou seja, "comandos" que além de fazer algo internamente (ou não), retorna algo nela mesma. Como se fosse uma "variável-comando". Não!! IOR foi uma variável declarada por mim. Nada mais que isso. Como já sugerido, byte poderia ser trocado por integer. Criei como IOR, para deixar a nomenclatura mais sugestível. IO = Input/Output=Entrada/Saída e R=Result=Resultado. Mas o nome poderia ser qualquer outro. Lembra que o IOResult é uma function? e o que elas fazem? "retornam algo"! Daí, utilizei de uma variável qualquer, que é compatível com o que o IOResult retorna (um byte - valores de 0 a 255), e armazenei nele! Veja o exemplo: if IOResult<>0 then writeln('Deu um erro ai meu jovem'); Nesse caso, o IOResult é executado. Ele retorna um valor de 0 a 255 nele... vai se comportar no if como se fosse uma variável. Só que nesse caso, eu perderei o valor que saiu do IOResult, e não poderia usar depois!. Se chamar o IOResult novamente, ele poderá retornar outro valor, logo, no programa foi usado uma variável para armazenar antes... *** Qual o compilador que você usa. A princípio recomendo usar o mesmo usado no curso. Em fim, poderíamos analisar qual erro deu e tentar corrigir... Primeiro imprime os dados de leitura de uma vez (em vez de perguntar, depois ler, perguntar, depois ler). Depois dá um GotoXY() antes de dar o readln correspondente. Os write vão exibir o layout, certo. daí quando for ler por exemplo o nome, antes de dar o readln(nome); Dá um GotoXY() para posição correspondente onde o texto deve ir saindo quando for digitando. Depois dá um novo GotoXY() para um próximo, readln(idade), ai o texto do teclado vai ser exibido no lugar correspondente... por ai vai.. Se for tentar implementar, tente ir testando digitando sempre os valores sem erros. Deixe para tratar os possíveis erros depois!!! Pois, ao digitar errado, pode bagunçar a tela toda. PS: para achar a posição, com o var = vai como referência sem o var = vai como valor No primeiro, é como se a própria variável estivesse no programa, ou seja, a variável que está sendo usada no parâmetro do procedimento, meio que vai apontar para a mesma variável que foi passada no parâmetro. Tudo que fiz na variável da procedure, vai mudar na variável que foi passada. Já no segundo, a variável do procedimento vai fazer uma cópia do VALOR que está na variável que está passada, logo a variável de origem fica intacta. Ex.: No writeln ele vai pegar os textos ou valores que estão no parâmetro e vai jogar na tela. Vai ser alterado alguma coisa nessas variáveis e que precisariam ser salvas? não, logo, a variável* que foi declara na procedure writeln ficam SEM O VAR. O que importa é somente os valores... e não a variável em si. O mesmo vale para o readln, GotoXY, sqrt, sqr, upcase etc. Já no inc() e dec(), por exemplo, eles estão pegando recebendo uma variável e estão alterando o valor dela, ou seja, tem que ter o VAR para "salvar" essa alteração!!! OBSERVAÇÃO IMPORTANTE As variáveis dos procedimentos são independentes das variáveis Globais. Inclusive podem ter o mesmo nome. Ex.; procedure imprime3vezes(texto :string); begin writeln(texto); writeln(texto); writeln(texto); end; Eu poderia ter uma variável de nomenclatura também como texto lá no VAR do início do programa (das variáveis globais). Daí no meio do programa eu uso assim: imprime3vezes(texto); Esse texto ai é da variável do programa!!! que vai passar o seu VALOR (conteúdo) para variável da procedure, que coincidente também tem nomenclatura texto. Não existe correlação entre um nome e outro. São independente. Eu poderia usar assim: imprime3vezes(meuTexto);imprime3vezes(aaaa);imprime3vezes(texto); //essa variável não é a mesma que foi declarada lá na procedure!!! Muita gente se confunde com isso!!!!!imprime3vezes('Forum do Clube do Hardware'); //aqui passando um texto sem variável Por ai vai. No aguardo.
  21. Olá a todos. Sim, é Pascal; (é também) Sim e não. Poderia ser também. São duas situações diferentes; Então, do jeito que está, usa o "caminho relativo", ou seja, basicamente onde está o executável. Da forma que você sugere, seria um "caminho absoluto", ou seja, o "caminho completo" de onde deve "assinalar". **** claudemi, faltou dizer qual é o erro... vou tentar resumir alguns pontos: 1) seria melhor abrir o arquivo no inicio do programa e não após "todo o trabalho". Se der algum erro, vai dá logo no início! 2) você não está verificado se o arquivo existe, logo tem que garantir que o arquivo esteja onde você estipulou no Assign() exista (e esteja acessível; não esteja como somente leitura... bla bla bla). Como está usando um caminho relativo, provavelmente deve ficar na mesma pasta onde está o executável (esse caminho relativo pode modificado internamente, mas acho que por padrão fica na mesma pasta do executável). RESUMIDAMENTE: deixe um arquivo de texto vazio lá na pasta como o nome "cliente.txt", ou crie um programa pelo código, tem o rewrite() que pode ajudar. Para facilitar, fiz alguma modificações: program comb;uses CRT;var x,y,z,a,b,c :integer; cont :integer; arqCliente :text;BEGINAssign(arqCliente, 'cliente.txt'); //assinala arquivo com o seu caminhoAppend(arqCliente); //abre o arquivo para escrita OBS.: O arquivo tem que já está no local !!!ClrScr; //limpa a telax:=0; y:=0; z:=0; a:=0; b:=0; c:=0; cont:=0; //zera as variáveis (teoricamente não precisa, o Pascal já zera automaticamente, mas não custa nada!)for x:=1 to 10 do for y:=x+1 to 10 do for z:=y+1 to 10 do for a:=z+1 to 10 do for b:=a+1 to 10 do for c:=b+1 to 10 do begin cont:=cont+1; writeln('Numeracao: ',x,' - ',y,' - ',z,' - ',a,' - ',b,' - ',c,' = Total: ',cont); //na tela writeln(arqCliente,'Numeracao: ',x:2,' - ',y:2,' - ',z:2,' - ',a:2,' - ',b:2,' - ',c:2,' = Total: ',cont:3); //no arquivo end;Close(arqCliente); //fecha o arquivoReadKey; //aguarda uma tecla ser pressionadaEND. Se tiver alguma dúvida sobre o código ou como implementar a "verificação" e/ou "criação/recriação" do arquivo é só perguntar. No aguardo.
  22. Olá. Show! Por mim tá ótimo! daí em diante só para "melhorias". Para complementar, alguns outros ponto extras: 1) Poderia utilizar nomenclaturas de variáveis mais sugestivas, ex.: De cont para contF: De cont2 para contF25. 2) A título de curiosidade, dá para fazer o cálculo direto no wirte, ex.: writeln('A % de mulheres acima de 25anos e ',cont2*100/cont:0:2,'%'); ou para ficar mais "formal", com os parênteses: writeln('A % de mulheres acima de 25anos e ',(cont2*100/cont):0:2,'%'); Obs.: Talvez não seja preciso essa % no final, pois já está sendo informado no texto... ou seja, "a porcentagem de mulheres é 30", e não "30%". Veja, foco isso como detalhe linguístico (como opinião, é claro). Apenas para refletir... 3) Parei para analisar e acabei criando algumas sugestões. Abaixo fiz umas modificações no seu código APENAS PARA DEMONSTRAR OUTROS CONCEITOS. A ideia é para analisar e quem sabe assimilar e aproveitar. (seu código está bom. Aproveitei para demonstrar que dá para ir evoluindo - ir além) PROGRAM medMulh;uses CRT; //biblioteca com comandos/funções/etc extrasvar //DADOS DO ALUNO nome :string; //nome do aluno sexo :char; //sexo idade :integer; //idade //DADOS PARA APURAÇÃO contT, //total de alunos cadastrados contF, //contador de mulheres contF25 :integer; //contador de mulheres com mais de 25 anos porcF25 :real; //porcentagem de mulheres com mais de 25 anos (em relação as mulheres com mais de 15 anos) //AUXILIARES continuar :char; //usado para confirmações IOR :byte; //armazenar Resultado da operação de entrada e saida (I/O = Input/Output) / byte=0 a 255 (que pode ser usado na idade)(*Obs.: Essa estrutura abaixo é relativamente avançada. Não precisa se preocupar em enteder ou mesmo colocar em uso (tipo, o professor tem que autorizar). É bem simples. Onde for chamado o comando, será executado tudo que tem dentro dele. Seria o mesmo que copiar essas linhas de dentro, e colocar no lugar... Dentro do programa tem os exemplos...*) //PROCEDIMENTO PARA LIMPAR MENSAGEM APÓS ERRO (E DEIXAR A RELEITURA LIMPA) procedure LimpaMensagem; begin ReadKey; //function que retorna a tecla pressionada (usado aqui para servi como um "pause" GotoXY(1,WhereY-1); //posiciona na linha anterior (mensagem) ClrEol; //apaga a linha a partir do cursor (já que está na coluna 1, apaga a linha toda) GotoXY(1,WhereY-1); //posicionada mais uma linha acima, linha da "pergunta" ClrEol; //apaga a linha a partir do cursor (no caso servindo para limpar a linha toda, antes de ser reescrita. Sem isso, a resposta ficará escrita no lado end; BEGINTextColor(White); //cor do texto. White=15, que representa o branco. (acho que as cores vão de 0 a 15)TextBackGround(1); //cor do fundo ao escrever. Blue=1, representa o azul.ClrScr; //limpar a tela (pertece a CRT)contF:=0; //de certo modo não precisa, pois no Begin principal, o Pascal já zera as variáveis, mas é bom acostumar, pois em "procedimentos" não ocorre isso. (outras linguagens obriga zerar tb, etc)contF25:=0; repeat ClrScr; writeln; writeln(' *** BEM VINDO ***'); writeln; writeln; write('NOME DO ALUNO : '); readln(nome); //não precisa fica no lado, apenas subi o readln para ficar visualmente mais claro que vai ficar no lado a leitura repeat write('IDADE : '); {$I-}readln(idade);{$I-} //$I = diretiva de I/O. O "-" desativa, o "+" ativa (mais ou menos isso); (ativo = travar quando dá erro) IOR:=IOResult; //function que retorna o código do resultado da última operação de I/O. if IOR<>0 then //0 = "tudo certo", logo, se for diferente, deu alguma ***** no processo... begin writeln('ERRO ',IOR,' - idade invalida. Digite apenas numeros'); //de certo modo, poderia remover esse if todo... apenas usado para "tratar o possível erro", ou seja, além de não travar, avisa que tem algo errado. //cada código representa um erro, ao digitar letras deu aqui 106 (acho que é Type Mismatch" - tipo incompatível). Isso travaria o programa! LimpaMensagem; //chama a procedure que foi criada end else if (idade<15) then begin TextColor(Yellow); //Yellow=14 writeln('Estrando, alunos sao maiores de 15 anos. Cadastra isso direito!'); TextColor(White); {LimpaMensagem;} //aqui tb chamo o comando. Mas apenas deixe o conteúdo dela abaixo para exemplificar que seria a mesma coisa, ou seja, em vez desses comandos todos, poderia deixar só o comando. Entende? ReadKey; //function que retorna a tecla pressionada (usado aqui para servi como um "pause") GotoXY(1,WhereY-1); ClrEol; GotoXY(1,WhereY-1); ClrEol; end else if (idade>120) then writeln('Leva essa coroa pro Guinness, rs'); until (idade>=15) and (idade<=120); repeat write('SEXO (M ou F): '); readln(sexo); sexo:=UpCase(sexo); //aqui deixei sem aquele efeito de "exibir mensagem e apagar depois", veja a diferença na execução until (sexo in ['F','M']); contT:=contT+1; if sexo='F' then contF:=contF+1; if (idade>=25) and (sexo='F') then inc(contF25); //acho que dá para deduzir o que a procedure inc() faz... existe tb o comando "dec()". writeln('Deseja continuar? S ou N'); readln(continuar); continuar:= UpCase(continuar);until continuar=('N');TextColor(Yellow);writeln('Pressione qualquer tecla para exibir o resultado final');TextColor(White);ReadKey;ClrScr;writeln;if contF=0 then writeln('Nenhuma mulher entrevistada')else begin writeln('O numero de mulheres entrevistadas acima de 25 anos e ',contF25); writeln('A % de mulheres acima de 25 anos é ',contF25*100/contF:0:2); end;readln;END. 4) Lembrando, o código é apenas para exemplificar conceitos... Mas se tiver interesse, podemos ir passar maiores explicações e tentar também outras ideias... um exemplo legal seria exibir as todas as "perguntas" e depois ir lendo... ex.: Ai o "cursor" pularia para onde ficaria o nome... ao digitar, ficaria algo assim: *** BEM VINDO ***NOME DO ALUNO : Maria JoaquinaIDADE : <--após o ENTER, ir para aqui!SEXO (M ou F): Tá entendo? Então, eu sei que extrapolei a proposta da postagem, tô apenas tentado demonstrar como pode ser ainda mais interessante o desenvolvimento e abrindo a imaginação. Qualquer coisa é só postar! No aguardo.
  23. Olá. PROGRAM medmulh;var nomedoaluno :string; sexo,continuar :char; idade,cont,cont2:integer; porcentagem :real;BEGINcont:=0;cont2:=0;repeat writeln('Digite seu nome'); readln(nomedoaluno); repeat writeln('Digite a idade. Apenas idade maior igual a 15'); readln(idade); until (idade>=15) and (idade<=120); repeat writeln('Digite seu sexo M ou F'); readln(sexo); sexo:= upcase(sexo); until (sexo='F') or (sexo='M'); if sexo='F' then cont:=cont+1; if idade>=25 then //aqui está contando mesmo se não for feminino cont2:=cont2+1; writeln('Deseja continuar? S ou N'); readln(continuar); continuar:= upcase(continuar);until continuar=('N');if cont=0 then writeln('Nenhuma mulher entrevistada')else begin writeln('O numero de mulheres entrevistadas acima de 25 anos e ',cont2); porcentagem:=(cont2*100/cont); writeln('A % de mulheres acima de 25anos e ',porcentagem:10:2,'%'); //sugiro formatar com :0:2 (para que 10 espaços?) end;readln;END. No aguardo.
  24. Olá. Faz sentido. Mas tem um porém, pois existem duas validações: a) se a idade é válida, algo como como "maior igual a zero" (e menor que 100, 150? sem máxima?) se é a "esperada", ou seja, se é maior que 15. O seu código estará se comportando como "se digitou algo errado, vai ter que tudo do início". Daí tem que ver se deixa assim mesmo, ou se modifica para "se digitou algo errado, ler apenas o que está errado". Percebe a diferença? Veja o enunciado: Ou seja, precisa garantir que seja "M" ou "F". Sendo que OS DOIS SÃO VÁLIDOS, logo, o repeat deverá aceitar os dois. Mas o programa só vai "calcular" para o "F". Obs.: Na hora de calcular a porcentagem, tem que verificar antes se "cont" é diferente de zero!!! (mesmo que venha a "ter certeza" que não vai ser). 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!