Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.944
  • Cadastrado em

Tudo que Simon Viegas postou

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Olá furlantx500 tx. Alguns pontos que podem ser revisados: PROGRAMA medmulh;var nomedoaluno :string; sexo,continuar :char; idade,cont,soma:integer; media :real;BEGINcont:=0;soma:=0;repeat repeat writeln('Digite seu nome'); //O NOME DO ALUNO NÃO PRECISA SER RELIDO! APENAS A IDADE readln(nomedoaluno); writeln('Digite a idade. Apenas idade maior igual a 15'); readln(idade); until idade>=15; writeln('Digite seu sexo M ou F'); //O SEXO TAMBÉM DEVE SER VERIFICADO, ASSIM COMO A IDADE!!! readln(sexo); sexo:= upcase(sexo); if sexo='F' then begin cont:=cont+1; soma:=soma+idade; end else //NÃO PRECISA DESSE ELSE, SIMPLESMENTE APAGUE! begin cont:=cont+0; //0 é o elementro neutro da adição, logo, não tem nenhum efeito soma:=soma+0; end; writeln(nomedoaluno,' e do sexo ',sexo,' e tem ',idade,' anos'); //isso não é pedido* writeln('Deseja continuar? S ou N'); readln(continuar); continuar:= upcase(continuar);until continuar=('N');writeln('O numero de mulheres entrevistadas e ',cont); //isso não é pedido*writeln('A soma das idades e ',soma); //isso não é pedido*media:= soma/cont; //cuidado, se cont for igual a 0, vai da problema!Writeln('A media de idade das mulheres entrevistadas e ',media:10:2); //isso não é pedido*readln;END. A requisição do enunciado é: E isso não foi respondido... * talvez não tenha problema inserir detalhes a mais (que já estão no programa), mas devem-se no mínimo fazer o que se pediu, ou seja, o "foco" é fazer o que se pede, e a depender da proposta, poderá fazer algo a mais... (eu por exemplo quando estava na faculdade, quando não sabia exatamente o que poderia fazer a mais, eu entregada duas versões diferentes para não ter desculpa, rs) Por ai vai. No aguardo.
  6. Olá michael00110, favor descrever melhor a sua dúvida. No aguardo.
  7. Olá. Só complementando. Então, depende da proposta para o «Eu estava querendo fazer um programa simples para calcular a raiz quadrada de um número com precisão de duas casas decimais, procurando pela internet achei o seguinte programa:» Se for seguir o que está sendo pedido, o segundo código TALVEZ NÃO SEJA VÁLIDO, pois ele não está "calculando com precisão de duas casas decimais", mas sim "exibindo um resultado com precisão de duas casas decimais". Na minha opinião são duas coisas diferentes... um calcula dessa forma, o outro calcula um valor aproximado (se não for exato, SEMPRE será uma valor irracional, logo terá que ter aproximação), e após é feito um "arredondamento" pela formatação ":x:y" lá na hora de exibir... (a precisão do cálculo é muito maior, apenas é aproximado depois). Em fim, na minha opinião, a primeira forma é mais elegante e faz mais sentido, pois no segundo está basicamente "utilizando uma função pronta e pronto". Um é mais didático, outro mais simples. Obs.: Se for apenas para "saber a resposta", usa a calculado do Windows, por exemplo... *** Como citado New Nerd, dá para implementar outro detalhes interessantes para "verificação dos valores de entrada" como o "caracteres e valores inválidos". Você já implementou para os valores negativos, mas dá também para "letras" e outros caracteres (precisa de comando especiais... não tão conhecidos para iniciantes)... por ai vai. Para o primeiro código, é fácil verificar que o código não está muito otimizado, já que ele apenas está meio que comparando valores de "0.01" em "0.01"... e isso de forma crescente!!, ou seja, para calcular a raiz de 100.000, serão feitos mais de 300.000 cálculos... dá para reduzir e muito essa conta!!!! ou pensar ou "pegar" outra forma de cálculo e implementar. No aguardo. Abraços
  8. Olá. Não precisa, basta colocar um só antes do "END." (ou logo após a estrutura do último if). Haja vista que somente uma write deverá ser executado.. (e independente de qual for, precisará para uma vez). PS: De certo modo, todos os if poderiam ficar associados em uma estrutura só, já que são "respostas mutuamente exclusivas"¹. 1 se for uma resposta, não pode ser outra. (ex.: se é sexo masculino, não pode ser feminino. Se for par, não pode ser ímpar etc). if (n1>n2) and (n1>n3) then if (n2>n3) then write('Os numeros em ordem crescente são ', '',n1,'', n2,'', n3) else write('Os numeros em ordem crescente são ', '',n1,'', n3,'', n2)else if(n2>n1)and(n2>n3) then if(n1>n3) then write('Os numeros em ordem crescente são ', '',n2,'', n1,'', n3) else write('Os numeros em ordem crescente são ', '',n2,'', n3,'', n1) else if(n3>n1)and(n3>n2) then if(n1>n2) then write('Os numeros em ordem crescente são ', '',n3,'', n1,'', n2) else write('Os numeros em ordem crescente são ', '',n3,'', n2,'', n1); Obs.: Não necessariamente já é uma resposta final, por exemplo se tiverem 2 ou mais valores iguais, com certeza já não ia funcionar. Obs.2: Não estou com compilador, mas acredito que a estrutura esteja correta...
  9. Olá. Sudder Natsu (ou qualquer outro)... Quer tentar corrigir o programa e postar aqui para ir tentando corrigir/melhorando? Então, já aproveitando o que já foi postado... Vou tentar complementar a sua resposta. Pode ser que você já conheça ou não algumas coisas, mas de qualquer sorte alimenta a postagem Em: Existe uma outra boa solução para essa questão da "distinção entre maiúsculo e minúsculo"¹, que seria usar um "UpCase()"². Ex.: readln(RESP);RESP:=UpCase(RESP); Daí nos ifs da vida, bastaria testar apenas com o maiúsculo. if (RESP='S') then begin end; ou poderia também colocar no ifs diretamente, ex: if (UpCase(RESP)='S') then begin end; Para esse contexto eu prefiro colocar logo após a leitura, pois se a variável for utilizada em outro momento (sem ser alterada, é claro), não precisaria usar um UpCase() novamente onde for testar... 1 alguns chamam de "sensível ao caso", ou seja, que diferente um do outro. No Pascal, por exemplo as variáveis, NÃO SÃO sensíveis ao caso, daí tanto faz usar "RESP" como Resp ou "REsp" etc que o "programa" vai entender. Em outras linguagem como Java, isso não ocorre. 2 Function que pertence à unit CRT ou WinCRT (em alguns casos precisa carregar a biblioteca lá no início do programa). Tem a finalidade de retornar o valor correspondente em maiúsculo do caractere. *** Em: De um certo modo, ao "estipular uma formatação de dados" para serem exibidos, poderiam-se utilizar apenas um "0" na primeira parte, ex.: writeln('Sua conta final do orçamento é: ',TOTAL:0:2,' reais'); Ou seja, ao utilizar um "variavel_do_tipo_real:X:Y", esse X="casas reservadas a esquerda da vírgula (ou mais ou menos isso)" e Y="números de casas decimais". Ao utilizar um valor para o "X", o texto acabará sendo deslocado para direita, ficando um espaço entre o texto a esquerda e a variável.... uma boa utilização de um valor (relativamente alto) seria para "alinhar o texto a direita, ou seja, se vários valores forem impressos a partir da mesmo posição, a parte da direita (no caso a decimal) ficarão (tendem a ficar) alinhados... *** Por ai vai.... No aguardo.
  10. Ok. Obrigado pelo feedback. Qualquer coisa é só postar... Abraços
  11. Olá. Boa tarde. Vamos lá... primeiramente sobre o erro em si: Venha cá... o "com sucesso" foi em relação a "tentativa de escrita" ou "arquivo não aberto"??? para o primeiro caso, OK... parabéns, o computador tentou. Mas provavelmente deve ser o segundo, ou seja, o erro está em "tentar escrever em arquivo que não está aberto (para escrita)". Logo........ o problema deve estar na "abertura do arquivo para escrita". Provavelmente no "caminho completo" utilizado: 'C:\Users\Allan\Desktop\Programas\pascalzim\Meus\programa novounb\DADOS.TXT' O computador não tá achando o arquivo!! (o caminho é inválido ou algo do tipo) Sugiro que tente usar um "caminho relativo", ex;: Algo como: assign (TXT, 'DADOS.TXT'); Desta forma, a "assinalação" apontará para a pasta onde está o programa*, ou seja, o arquivo deverá estar (ou será criado) na mesma pasta onde está o ".exe" (geralmente onde está o .pas). PS: Pelo que o eu vi, o PascalZim, compilador que provavelmente você está utilizando, cria um arquivo automaticamente... a vantagem é que facilita, mas ao mesmo tempo é ruim, pois meio que deixa o programador sem o controle disso, já que teoricamente ele quem deveria verificar e criar um arquivo novo ou não... No aguardo.
  12. Olá. Ainda precisa de ajuda? Caso sim, poste onde está com dúvidas e o código para tentarmos ajudar... No aguardo.
  13. Olá @ricskyred. Depois do then não tem ";"... Esse código, abaixo: if (n1>n2) and (n1>n3) then; if (n2>n3) then write('Os numeros em ordem crescente são ', '',n1,'', n2,'', n3) else write('Os numeros em ordem crescente são ', '',n1,'', n3,'', n2); Seria equivalente a if (n1>n2) and (n1>n3) then begin end;if (n2>n3) then write('Os numeros em ordem crescente são ', '',n1,'', n2,'', n3)else write('Os numeros em ordem crescente são ', '',n1,'', n3,'', n2); Ou seja, a verificação do primeiro if não vai resultar em nada. (se false, ele pula. Se true não executa nada).
  14. Olá. Depende como você deseja... mas basicamente poderia ser um uma estrutura de seleção mesmo (if e/ou case). Ex.: tecla:=UpCase(ReadKey); //UpCase = retorna o correspondente em maiúsculo. (c->C. e=E, F=F mesmo etc)if (tecla='D') then GotoXY(x+1,y)else if (tecla='A') then GotoXY(x-1,y); É apenas um exemplo da ideia... Claro que você precisa tratar as variáveis, como no "x" e "y", e também os limites da "matriz da tela" (resolução da tela do Pascal, geralmente é 80x25 se não me engano)... e por ai vai. Outros comandos que podem ser úteis: WhereX e WhereY \\caso não conheça, basta dá uma pesquisada No aguardo.
  15. Olá. Tenta agora efetuar o próximo.. Dica: tente usar um if dentro do laço, ou seja, de modo que alternadamente efetue uma adição, subtração, adição, subtração... PS1: perceba que você precisa verificar uma forma dessa alternância funcionar... por exemplo verificando se o loop atual é par ou ímpar... se ímpar, adição, ser for par, subtração, entendeu? ou outra forma que você imaginar... PS2: Como pode haver mais de uma instrução no for, seria necessário inserir um begin/end. (obs.: não necessariamente precisaria, mais para efeito prático, utilize um begin/end, se desejar, depois explico isso caso for necessário...) for i := 1 to n do begin end; Depois, tenta fazer o terceiro: No aguardo.
  16. Olá. Ainda precisa de ajudar com referente a esta postagem? No aguardo.
  17. Olá. A dica é simples: mantenha o seu código identado. No meu padrão ficaria assim: BEGINfor i := 1 to 4 do for j := 1 to 3 do begin write('Digite os números: '); readln(mat[i,j]); end;maior:=mat[1,1];pos_mai:=1;pos_maj:=1;for i:=2 to 4 do for j:=2 to 3 do begin if maior<mat[i,j] then maior:=mat[i,j]; pos_mai:=i; pos_maj:=j; end;menor:=mat[1,1];pos_mei:=1;pos_mej:=1;for i:=2 to 4 do for j:=2 to 3 do begin if menor>mat[i,j] then menor:=mat[i,j]; pos_mei:=i; pos_mej:=j; end; soma:=0;k:=0;for i:=1 to 4 do for j:=1 to 3 do begin if mat[i,j] MOD 2=0 then soma:=soma+mat[i,j]; k:=k+1; end;media:=soma/k;writeln('O maior número e ‚: ' ,maior,' e sua posiçao e : ' ,pos_mai ,pos_maj);writeln('O menor numero e ‚: ' ,menor,' e sua posiçao e : ' ,pos_mei ,pos_mej);writeln('A media dos numeros pares e : ',media*2);END. Então, pela estrutura do código, já percebi algo que pode está faltando, ex.: Será que essas 3 linhas abaixo do if não deveriam está vinculados a ele? if maior<mat[i,j] then maior:=mat[i,j]; pos_mai:=i; pos_maj:=j; Se for o caso, precisaria do begin/end. if maior<mat[i,j] then begin maior:=mat[i,j]; pos_mai:=i; pos_maj:=j; end; No aguardo.
  18. Olá. Faça algo e poste seu código aqui... Como nivelamento, sugiro que tente fazer um mais simples: "1) Fazer um programa que calcule a soma dos N primeiros número; ex.: N=8, logo seria: 1+2+3+4+5+6+7+8." A partir daí poderia ir verificando onde tem dúvidas..., após, creio que para editar para a versão final ficará mais fácil. No aguardo.
  19. Olá, qual a sua dúvida? Poste o que já conseguiu fazer e onde está com dúvidas... PS: Observe que o cálculo é análogo a uma sequência de inteiro, ex: 1-2+3-4+5-6+7-8. Esse cálculo seria algo como: Sendo N, iniciado em 1, e incrementado em 1 a cada novo loop, teríamos: N - N + N - N + N - N + N - N Deu para entender? A diferença, é que cada sequência está sendo dividida pelo próprio número acrescido de 1. Algo como: N/N+1 - N/N+1 + N/N+1 - N/N+1 + N/N+1 - N/N+1 + N/N+1 - N/N+1 Minha sugestão inicial seria fazer exercícios mais simples, e aos poucos ir incrementando.. 1) Fazer um programa que calcule a soma dos N primeiros número; ex.: N=8, logo seria: 1+2+3+4+5+6+7+8. Depois, 2) Fazer um programa que calcule o somatório como da tarefa, ou seja, alternando entre adição e subtração, ex.: N=9, logo seria: 1-2+3-4+5-6+7-8+9. 3) Fazer um programa que calcule com utilizando frações como na tarefa... (1/2-2/3 + 3/4 – 4/5..) Por ai vai No aguardo.
  20. Olá. Comecei a responder ontem... mas durante a composição, o meu PC travou e não tá ligando mais... rs Vou tentar resumir: Creio que o código está certo, faço apenas alguns comentários: 1) Evite esses espaços entre as linhas, deixa o código muito "sujo"; 2) Por que usou while, em vez de for no fatorial? Não está errado, apenas sugiro uma reflexão (supondo que "deveria" ser for). Então, existem basicamente 3 estruturas de repetição: while, for e repeat. Tudo que dá para fazer em um, dá para fazer em outro (resumindo: só precisaria existir um, correto?). A questão é que um é mais adequado/prático para cada contexto... Daí, precisa analisar qual seria o mais propício e/ou qual justificativa para usar um outro. (cada um tem suas qualidades e limitações, e que é justamente o que estou colocando em discussão). Sugiro que também converse com seu orientador sobre isso... 3) Sobre o "sair", qual contexto se refere? uma desistência? Se for, poderia usar por exemplo o "0"... daí, se o valor informado for esse, não continua... para tratar, usa um if... O comando exit e halt também pode ser usados... mas tem que ver se não dá uma quebra na lógica, ou seja, talvez seja mais correto fazer o programa "pula o que não quer", e não simplesmente fechar... Qualquer coisa é só postar; No aguardo.
  21. Olá andreza.gomes, Seu mesmo código, só que endentado, para facilitar a leitura : PROGRAM A;uses CRT;var n,x,p:integer; s:real;function calculo (p:real):real; var f,u:integer; begin f:=1; for u:= 1 to x do begin f:=f*u end; p:=1+1/f; s:=p+s; end;BEGINwriteln('Informe o numero');readln(n);for x:= 1 to n do begin writeln('O Resultado sera',s); writeln('Precione qualquer tecla para finalizar'); readkey; end;END. Você criou a function e nenhum momento está utilizando ela. Deve funcionar assim: você chama o procedimento, passando o parâmetro que ele precisa, e utiliza o valor retornado por ela, ou seja, a function funciona como uma variável, que retorna um valor nela mesma. Outra coisa, você declarou que a function retorna um real, mas onde está retornando esse valor? Então, a conta é "S = 1 + 1/fatorial(1) + 1 /fatorial(2) + 1/fatorial(3) + ⋯ + 1 /fatorial(N)", correto? para organizar, cria uma function que calcula o fatorial... Cria outra function que faz essa conta, e que vai utilizar a function fatorial para calcular o fatorial... Fiz um exemplo de cálculo de fatorial e com um programa utilizando ela. Tentem entender como funciona uma function e criem um programa que faz o cálculo de S. PROGRAM exemplo;uses CRT;function fatorial(n:integer):integer; var i, //para controlar o for fat :integer; //usado no cálculo e resultado do fatorial begin fat:=N; //inicializa a variável (primeiro valor) for i:=N-1 downto 1 do // *1 fat:=fat*i; //ele mesmo vezes o próximo valor fatorial:=fat; //retorna o valor na function end;//*1 = vai de "próximo" até o "1" [ex.: N=4. N*(3*2*1)]//claro que não precisa multiplicar por 1, mas deixei apenas para ficar didático var num: integer; BEGINClrScr;writeln('Digite o valor de N');readln(num);writeln('Fatorial de ',num,'=',fatorial(num)); //*2ReadKey;//*2 veja, está chamado fatorial, passando o valor que ele precisa no num. A própria function retorna o valor, ou seja, fatorial funciona também como uma variável.END. ... O princípio da soma S é a mesma coisa... será um laço de repetição que vai somando cada pedaço da conta... No aguardo.
  22. Olá. 1) - Você precisa transformar a procedure em function; (a ÚNICA diferença é que a function retorna sempre um valor nela mesma, procedure não) - O valor utilizado pela função deve ser passado por parâmetro, e não usando variável global. - O trecho que calcula o fatorial pode ficar separado, ou seja, cria uma outra função para fazer esse cálculo. Daí, a function do cálculo, chama a function do fatorial. Obs.1: A função do fatorial tem que ser criada antes (acima) da função do calculo, pois o Pascal vai aprendendo de "de cima para baixo"; Obs.2: No Pascal é possível criar uma sub-rotina, da sub-rotina, a função do fatorial pode ficar dentro da função do calculo (é fácil entender, é da mesma forma que você usou um var dentro da função, você também pode criar um function também, ou seja, essa função seria enxergada apenas por essa função - da mesma forma que as variáveis são enxergadas apenas nela também...) 2) - acho que você deveria ler os 10 números de uma vez e depois efetuar as contas. Sugiro usar array. - creio que aqui você também deva passar o valor para cálculo pela procedure, e não usando variável global. (ao passar o valor do array, passe a posição, e não o array todo); - creio que ao ler um valor inválido (numero<0), você deve ler um novo número, e não apenas ignorá-lo. (você poderia usar um repeat, validando o valor) *** Por ai vai No aguardo.
  23. Olá Joao Carlos de Oliveira, Na primeira postagem, você fala em VETOR. Mas no seu código está utilizando ARQUIVOS. Ou seja, está pedindo uma coisa e fazendo outra... Então, acho que a assinatura poderia ficar mais ou menos assim: (ajuste ao seu gosto) Program Taxi;uses WinCRT;type Dados_Motoristas = record nome :string[10]; num_taxi:integer; codigo :integer; kper :real; end;var dados :array[1..3] of Dados_Motoristas; i :integer;BEGINEND. Daí ajusta o código... MINHA SUGESTÃO Ajuste o programa para funcionar com array (vetor), posta o código aqui e onde tem dúvidas. Depois tenta inserir as Function e Procedure. Essa é a parte mais fácil... não tem mistério. No aguardo.
  24. Olá Conrado Saud, você poderia responder ao tópico inserindo a nova informação, em vez de editar a postagem em si.. Como já está solvido, vou marcar como solucionado. Caso necessário, é só abrir uma nova postagem. Abraços

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!