Ir para o conteúdo
  • 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

Mensagens Recomendadas

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

Editado por nunopicado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por tremelique

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tremelique

É assim:

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

Editado por nunopicado
Adicionadas tags GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por nunopicado
Adicionadas tags GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por nunopicado
Corrigidas as tags GeShi (removidos os espaços)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.