Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

tremelique

duvida em relação ao um arquivo tipado

Recommended Posts

tremelique

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 by nunopicado

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
tremelique

Em relação ao uso do input ,output nos comandos writeln e readln é cobrado sim pelo professor.

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
tremelique

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 by tremelique

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
tremelique

É assim:

rewrite(arq);
Randomize;
for indice:= 1  to qtd do

Edited by nunopicado
Adicionadas tags GeShi

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
tremelique

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 by nunopicado
Adicionadas tags GeShi

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
tremelique

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 by nunopicado
Corrigidas as tags GeShi (removidos os espaços)

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
Leno

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.

Share this post


Link to post
Share on other sites
tremelique

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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.