tremelique Posted April 21, 2013 at 12:38 AM Report #504207 Posted April 21, 2013 at 12:38 AM (edited) A questão pede o seguinte:Type ArqDeInteiros = File of integer; Desenvolva um programa em Pascal que leia do usuário: o nome de um arquivo (N), a quantidade de números (X) e a faixa (valor mínimo e valor máximo) de variação dos números a serem gerados e gravados no arquivo. O programa deverá: (1) Criar um arquivo do tipo ArqDeInteiros de nome N, contendo X inteiros, dentro da faixa informada, gerados aleatoriamente; (2) Mostrar o arquivo gerado na tela; (3) Remover todos os números primos do arquivo produzido; e (4) Mostrar o arquivo após a remoção. Definição: Um número é primo se e somente se for maior que 1 e divisível apenas por 1 e por ele mesmo. codigo que fiz: program tipado(input{teclado},output{video}); const precisao=1000; type ArqDeInteiros=file of integer; procedure mostrar(var arq{e}: ArqDeInteiros); var num: integer; begin reset(arq); while not eof(arq) do begin read(arq, num); writeln(output, num:2); end; writeln(output); close(arq); end; procedure criar(var arq{s}: ArqdeInteiros; qtd{e}: integer; valor_min{e}, valor_max{e}:integer); var indice: integer; begin rewrite(arq); for indice:= 1 to qtd do write(arq, valor_min+ random(valor_max-valor_min)); close(arq); end; procedure removerPrimos(var arq{e/s}:ArqDeInteiros;qtd{e}: integer; valor_min{e}, valor_max{e}: integer); var i,prox,num:integer; primo:boolean; begin reset(arq); while not eof (arq) do begin primo:=true; i:=2; while (primo) and (i<=(num div 2)) do begin if (num mod i)=0 then primo:=false; i:=i+1; end; if primo then begin for i:=valor_min+1 to valor_max-1 do begin seek(arq,i); read(arq,prox); seek(arq,i-1); write(arq,prox); end; dec(valor_max); seek(arq,valor_max); truncate(arq); seek(arq,valor_min); end; end; close(arq); end; var n: ArqDeInteiros; nome: string; qtd: integer; valor_min,valor_max: integer; begin write(output, 'Diga o nome do arquivo: '); readln(input,nome); write(output, 'Diga a quantidade de valores: '); readln(input, qtd); write(output, 'Diga o valor minimo: '); readln(input, valor_min); write(output, 'Diga o valor maximo: '); readln(input, valor_max); assign(n, nome); mostrar(n); removerPrimos(n, qtd, valor_min,valor_max); mostrar(n); readln(input); end. obs:o que eu não to conseguindo fazer é mostrar o arquivo gerado,remover,e mostrar depois de removido Edited April 21, 2013 at 08:33 AM by nunopicado
nunopicado Posted April 21, 2013 at 09:59 AM Report #504217 Posted April 21, 2013 at 09:59 AM Antes de mais, acrescentei-te as tags de código GeShi, para melhor visualização do código. Depois, uma curiosidade: É a primeira vez que vejo alguém programar em "Pascal Standard", com os inputs e outputs a serem usados no writeln e readln. Isto não é uma critica, apenas uma curiosidade: Foi um professor que te instruiu assim? Adiante, ao problema em si. Para começar, falta-te chamar o procedimento criar. Ele está a tentar mostrar um ficheiro que não está a criar, pelo que, se não o tiveres já feito antes, vai dar erro. Corrigindo isso, já te faz o primeiro mostrar. Depois, tens alguns problemas no remover: 1. Não estás a ler o ficheiro. Logo, o ficheiro nunca chega ao fim, a condição do primeiro while nunca é satisfeita, e tens um ciclo infinito. 2. Deves, antes de começar a remover, guardar a posição do ficheiro onde estás. Para tal, tens a função FilePos. Lembra-te, que se o usares depois do read(arq,num), ele já estará a indicar a posição seguinte à actual, porque o read mexe a posição do ficheiro). 3. Estás a usar o valor_min e valor_max como parametros do ciclo for. Ora, essas variaveis guardam o minimo e máximo dos valores, e não a quantidade de valores que o ficheiro tem. Logo, não podes usar essas para remover o numero primo. Tens sim de percorrer o ficheiro, desde a posição seguinte à actual (FiloPos+1) até à última posição (FileSize-1 - Não podes aqui usar o Qtd, porque o ficheiro vai sendo encolhido durante o processo. Assim, o FileSize dá-te sempre o tamanho actual do ficheiro; É -1 porque as posições usadas pelo Seek começam em 0 e não em 1). 4. Há, parece-me, um pormenor na tua formula de calculo de numeros primos: O nº 1 não é considerado primo, por ter apenas um divisor natural, mas a tua formula assume-o como tal. A matemática não é o meu forte, mas parece-me que para ser primo, tem de ter exactamente 2 divisores naturais. No geral, estavas no bom caminho. Os erros encontrados parecem-me ser fruto de falta de experiencia, e alguma confusão sobre o funcionamento dos ficheiros, mas nada que não consigas resolver. Se precisares de mais alguma coisa, avisa. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 21, 2013 at 09:44 PM Author Report #504251 Posted April 21, 2013 at 09:44 PM Em relação ao uso do input ,output nos comandos writeln e readln é cobrado sim pelo professor.
nunopicado Posted April 21, 2013 at 09:49 PM Report #504252 Posted April 21, 2013 at 09:49 PM Imaginei que sim... 🙂 O resto, conseguiste? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 21, 2013 at 11:08 PM Author Report #504257 Posted April 21, 2013 at 11:08 PM (edited) agora só to duvida em relaçao para gerar numeros aleatorios . write(arq, valor_min+ random(valor_max-valor_min));usando esse código imprime tudo zero o que posso fazer para melhorar? Edited April 21, 2013 at 11:19 PM by tremelique
nunopicado Posted April 21, 2013 at 11:26 PM Report #504258 Posted April 21, 2013 at 11:26 PM Insere o comando Randomize; logo a seguir ao rewrite (antes do FOR). O comando random, sozinho, não dá grandes resultados. Random e Randomize devem trabalhar em conjunto. Experimenta com isso se te ajuda! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 21, 2013 at 11:35 PM Author Report #504259 Posted April 21, 2013 at 11:35 PM (edited) É assim: rewrite(arq); Randomize; for indice:= 1 to qtd do Edited April 21, 2013 at 11:36 PM by nunopicado Adicionadas tags GeShi
nunopicado Posted April 21, 2013 at 11:36 PM Report #504260 Posted April 21, 2013 at 11:36 PM Sim, experimenta isso! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 22, 2013 at 01:51 AM Author Report #504261 Posted April 22, 2013 at 01:51 AM (edited) ficou assim: program questao2_ad2(input{teclado},output{video}); type ArqDeInteiros=file of integer; procedure mostrar(var arq{e}: ArqDeInteiros); var num: integer; begin reset(arq); while not eof(arq) do begin read(arq, num); writeln(output, num:2); end; writeln(output); close(arq); end; procedure criar(var arq{s}: ArqdeInteiros;qtd{e}:integer; valor_min{e}, valor_max{e}:integer); var indice: integer; begin rewrite(arq); Randomize; for indice:= 1 to qtd do write(arq,valor_min +random(valor_max-valor_min)); close(arq); end; procedure removerPrimos(var arq{e/s}:ArqDeInteiros;qtd{e}: integer; valor_min{e}, valor_max{e}: integer); var i,prox,num:integer; primo:boolean; begin reset(arq); while not eof (arq) do begin primo:=true; i:=2; while (primo) and (i<=(num div 2)) do begin if (num mod i)=0 then primo:=false; i:=i+1; end; if primo then begin for i:=valor_min+1 to valor_max-1 do begin seek(arq,i); read(arq,prox); seek(arq,i-1); write(arq,prox); end; dec(valor_max); seek(arq,valor_max); truncate(arq); seek(arq,valor_min); end; end; close(arq); end; var n: ArqDeInteiros; nome: string; qtd: integer; valor_min,valor_max: integer; begin write(output, 'Diga o nome do arquivo: '); readln(input,nome); write(output, 'Diga a quantidade de valores: '); readln(input, qtd); write(output, 'Diga o valor minimo: '); readln(input, valor_min); write(output, 'Diga o valor maximo: '); readln(input, valor_max); assign(n, nome); criar(n, qtd, valor_min,valor_max); mostrar(n); removerPrimos(n, qtd, valor_min,valor_max); mostrar(n); readln(input); end. Edited April 22, 2013 at 08:46 AM by nunopicado Adicionadas tags GeShi
nunopicado Posted April 22, 2013 at 08:48 AM Report #504267 Posted April 22, 2013 at 08:48 AM hmmmm É da minha vista ou a diferença para o primeiro é apenas o randomize? Todos os outros problemas estão lá ainda. PS: Começa a colocar as tags GeShi sempre que meteres código. No caso do pascal, colocas: [ CODE=Pascal ] no inicio, e [ /CODE ] no fim (sem espaços entre os [] e as letras. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 27, 2013 at 12:34 AM Author Report #504984 Posted April 27, 2013 at 12:34 AM (edited) e queria saber qual das formas está correta. write(arq,valor_min +random(valor_max-valor_min)) nesse da tudo zero. write(valor_min +random(valor_max-valor_min):5) gera os numeros aleatoriamente. Edited April 27, 2013 at 11:40 AM by nunopicado Corrigidas as tags GeShi (removidos os espaços)
nunopicado Posted April 27, 2013 at 11:49 AM Report #504994 Posted April 27, 2013 at 11:49 AM A nivel dos numeros aleatorios, estão as duas iguais. Apenas numa escreves para a consola (ecrã) e outra para o ficheiro "arq". Essa formula vai dar-te os valoers aleatorios entre o valor minimo e o valor máximo -1, pelo que deves fazer um pequeno ajuste: writeln(valor_min+random(valor_max-valor_min+1)); // Leva o +1 aqui, para compensar. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
tremelique Posted April 27, 2013 at 04:31 PM Author Report #505005 Posted April 27, 2013 at 04:31 PM vale!!!depois vc tira uma dúvida sobre arquivo texto?
nunopicado Posted April 27, 2013 at 04:54 PM Report #505006 Posted April 27, 2013 at 04:54 PM Claro... Cria um topico novo quando quiseres! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Leno Posted May 2, 2013 at 10:42 PM Report #505671 Posted May 2, 2013 at 10:42 PM Eu estou fazendo o mesmo curso q vc, olha como ficou meu código. acho q ficou mais simples q o seu, mas sera q ficou menos funcional ? program Ad2_Q2; uses crt; Type ArqDeInteiros = File of integer; function primo(x{e}: integer): boolean; var metade, varre: integer; begin metade:= x div 2; varre := 2; while ((varre <= metade) and ((x mod varre)<>0)) do varre:= varre + 1; primo:= (x>1) and (varre>metade); end; Procedure GeraArq (var Arq: ArqDeInteiros; Qtd,NumMim,NumMax: integer); var i, x:integer; begin rewrite (Arq); randomize; for i := 1 to Qtd do begin x := NumMim+random(NumMax-NumMim)+1; write(Arq,x); end; close (Arq); end; Procedure mostrar(Var a{e}: ArqDeInteiros); var linha: integer; begin reset(a); while not eof(a) do begin read(a, linha); writeln( linha); end; writeln ('____________________________________________________________________________'); writeln(' '); close(a); end; Procedure Remover (Var a: ArqDeInteiros); var Temp: ArqDeInteiros; num: integer; begin assign (Temp, 'Temporario'); rewrite(Temp); reset (a); while not eof(a) do begin read (a, num); if not primo(num) then write (Temp,num); end; close (Temp); close(a); reset (Temp); rewrite (a); while not eof(Temp) do begin read (Temp, num); write (a, num); end; close(Temp); close(a); erase (Temp); end; Var QtdX, NumMim, NumMax: integer; NomeN: string; Arq: ArqDeInteiros; Begin writeln ('Escreva o nome do arquivo N:'); read (NomeN); assign (Arq, NomeN); rewrite (Arq); writeln ('Escreva a quantidade de numeros que vai gerar o arquivo:'); read (QtdX); writeln ('Escreva o valor minimo do arquivo:'); read (NumMim); writeln ('Escreva o valor maximo do arquivo:'); read (NumMax); GeraArq(Arq,QtdX,NumMim,NumMax); writeln ('Arquivo gerado:'); Mostrar (Arq); Remover (Arq); writeln ('Arquivo sem os numeors primos:'); Mostrar (Arq); readkey; End.
tremelique Posted May 3, 2013 at 12:48 AM Author Report #505676 Posted May 3, 2013 at 12:48 AM ficou bem melho que o meur deu até pra ve onde errei obrigado pela ajuda.agente tem que ajuda um ao outro o que precisa tentarei cooperar.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now