Logo Hardware.com.br
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas

como verificar se um arquivo já existe (Pascal)

#1 Por Felipe Fonte... 22/05/2006 - 13:46
Eu fiz um programinha que calcula primos em pascal...

ele usa 2 arquivos para armazenar os primos (um binário e outro em TXT)

eu usei 2 arquivos pois o TXT é para mera visualização dos números primos e o binário eu uso para acessá-los

o algoritimo do programa é o seguinte: ele verifica se um numero é primo ou não dividindo por todos os primos menores que a raiz quadrada do número até dar uma divisão exata.

o programa é esse:
Program primos;
USES WINCRT;

function primo(n: longint):boolean; {cria uma função para verifiar se o numero é primo ou não...}
var
ARQ_PRI: file of longint;
count,den: longint;
begin
assign(ARQ_PRI, 'PRIMOS.BI');
reset(ARQ_PRI);
count:=-1;
repeat
count:=count+1; {divide o numero pelos primos já guardados no arquivo}
seek(ARQ_PRI,count);
read(ARQ_PRI,den);
until((count = (filesize(ARQ_PRI)-1))OR((n mod den)= 0)OR(den >= (trunc(sqrt(n))+1)));

if (count = (filesize(ARQ_PRI)-1))then {caso o arquivo de primos acabe}
begin
repeat
den:=den+1; {continua as divisões mas agora de 1 em 1 ao invés de primo em primo}
until (den >= (trunc(sqrt(n))+1))OR((n mod den)= 0);
if (den >= (trunc(sqrt(n))+1)) then primo:=TRUE
else primo:=FALSE
end
else begin
if ((n mod den)= 0)then primo:=FALSE;
if (den >= (trunc(sqrt(n))+1)) then primo:=TRUE;
end;
close(ARQ_PRI);
end;

var
ARQ_PRI : file of longint;
quant,count,num: longint;
PRI_TXT: text;
ans: char;

begin
ans:='S';
repeat
clrscr;
assign(ARQ_PRI, 'PRIMOS.BI');
reset(ARQ_PRI);

assign(PRI_TXT, 'PRIMOS.TXT');
reset(PRI_TXT);
append(PRI_TXT);
writeln('Calculadora de primos.');
writeln('Já foram calculados ',filesize(ARQ_PRI),' Primos!');
writeln('Entre com a quantidade de primos a ser calculada:');
readln(quant);
seek(ARQ_PRI,(filesize(ARQ_PRI)-1));
read(ARQ_PRI,num);
count:=0;
repeat
num:=num+1;
if (primo(num)) then
begin
count:=count+1;
append(PRI_TXT);
writeln(PRI_TXT,num);
seek(ARQ_PRI,filesize(ARQ_PRI));
write(ARQ_PRI,num);
clrscr;
writeln(((count*100)div(quant)),'%');
end;
until count = quant;
close(PRI_TXT);
close(ARQ_PRI);
repeat
writeln('Deseja calcular mais primos?(S/N)');
ans:=READKEY;
if NOT(((ans='N') OR (ans='n')) OR ((ans='S') OR (ans='s'))) then writeln('Opção inválida!');
until (((ans='N') OR (ans='n')) OR ((ans='S') OR (ans='s')));
until ((ans='N') OR (ans='n'));
writeln('Pronto!');
end.


O problema é que esse programa presisa dos 2 arquivos já prontos antes de rodar...
eu queria que ele verificasse se esses arquivos existem e caso contrário criá-los

eu sei que tem a função rewrite mas eu não quero que ele apage o arquivo caso ele já exista...

galera caso eu tenha cometido alguma gafe nesse codigo me falem (eu estou aprendendo ainda) :roll:

PS. vcs sabiam que o numero 108276907 é primo?
Responder
magaupe
magaupe Super Participante Registrado
1.2K Mensagens 0 Curtidas
#2 Por magaupe
22/05/2006 - 14:01
Vixi meu.. esse teu programa pra achar numeros primos é muito complicado. Eh só ir dividindo o numero ate ele mesmo utilizando MOD (Acha o resto). Cada vez que o resto for 0 vc faz cont:=cont+1 e no final se cont:=2 então o numero é primo porque o numero primo só é divisivel por 1 e ele mesmo.
Olha o codigo:


program primos;
uses crt;
var num,cont,i:longint;

begin
clrscr;
writeln('Qual o numero?');
readln(num);
for i:=1 to num do
begin
if num MOD i=0 then
begin
cont:=cont+1;
end;
end;
if cont=2 then
begin
writeln('Esse numero eh primo.');
end
else
begin
writeln('Esse numero nao eh primo.');
end;
readkey;
end.
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas
#3 Por Felipe Fonte...
22/05/2006 - 14:23
Seu programa não faz o que o meu faz...

o seu vc entra com um numero e ele verifica se é primo...

o meu gera primos e guarda-os em um TXT...

sem falar que o seu programa é muito mais ineficiente do que o meu...

aliás vou te dar umas dicas de como melhorar o teu...
1° não precisa dividir até o numero, basta até a raiz dele (use o comando trunc para transformar a raiz em numero inteiro e adicione 1 porque o trunc quebra o número, isso significa que um numero truncado vai ser sempre menor que o original, adicionando 1 vc assegura que é pelo menos maior... ex: ao invés de
for i:=1 to num do
ponha isso:
for i:=1 to (trunc(sqrt(num))+1) do

2° não precisa incrementar de 1 em 1, se vc assegurar que o numero não é divisivel por 2, incremente de 2 em 2 (tomando um numero impar de partida)
And the heavens shall tremble

"Life can only be understood backwards, but it must be lived forwards." Soren Kierkegaard
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal