Jump to content

Recommended Posts

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

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.

Posted

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.

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

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.

Posted

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.

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

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.

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

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.

Posted

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.

Posted

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.

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
×
×
  • Create New...

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.