Здравствуйте! У меня тут такая задачка: "Заполнить файл последовательного доступа f целыми чмслами, полученными с помощью генератора случайных чисел. Из файла f получить файл q, исключив повторные вхождения чисел. Вывести файл q на печать."
Вот мой вариант... но у меня ошибка высвечивается... Помогите пож-та подкорректировать.
Program FAIL5;
const n=30;
var f,q:text;
a:array[1..n] of integer;
i:integer;
begin
randomize;
for i:=1 to n do
a[i]:=random(100);
assign(f,'c:\celie.txt');
rewrite(f);
for i:=1 to n do
writeln(f,a[i]);
close(f);
reset(f);
assign(q,'c:\povtornye.txt');
rewrite(q);
while not (Eof(f)) do begin
readln(f,i);
if a[i]<>a[i+1] then writeln(q,a[i]); (--> ошибка Range check error)
close(f);
close(q);
writeln('poluchili:','c:\celie.txt','c:\povtornye.txt');
readln;
end;
end.
Вылетаешь за рамки массива. Попробуй так
вот так компилируется, но работает неправильно.
Program FAIL5;
const n=30;
var f,q:text;
a:array[1..n] of integer;
i:integer;
begin
randomize;
for i:=1 to n do
a[i]:=random(100);
assign(f,'c:\celie.txt');
rewrite(f);
for i:=1 to n do
writeln(f,a[i]);
close(f);
reset(f);
assign(q,'c:\povtornye.txt');
rewrite(q);
while not (Eof(f)) do
begin
readln(f,i);
if a[i]<>a[i+1] then
writeln(q,a[i]);
end;
close(f);
close(q);
writeln('poluchili:','c:\celie.txt','c:\povtornye.txt');
readln;
end.
readln(f,i);
if a[i]<>a[i+1] then
writeln(q,a[i]);
Сорри, это у меня настройки компилятора.
Тебе он, видимо, и не дает возможность прогнозирования )
Вопросы такие:
1) если у нас был файл 1 2 2 3 4 3 5
должны получить 1 2 3 4 5
или 1 4 5
(то есть оставлять ли единственное вхождение повторных)?
2) как хочешь - с увеличением затрат по времени (работа чисто с файлами) или по памяти (с массивом)?
по-моему, заданию больше соответствует первый случай...
условно работает...
но ооочень медленно.
с кучей ненужных переводов из строки в число и обратно.
program povtory;
uses crt;
const n=30;
var f,q:text;
s:string[2];
i,j,a,a_tec,err:integer;
fl:boolean;
begin
clrscr;
randomize;
assign(f,'fail.in');
rewrite(f);
for i:=1 to n do
begin
str(random(20),s);
writeln(f,s);
end;
close(f);
assign(q,'fail.out');
rewrite(q);
reset(f);
for i:=1 to n do
begin
fl:=true;
readln(f,s);
val(s,a,err);
while (not(EOF(f))) and fl do
begin
readln(f,s);
val(s,a_tec,err);
if a=a_tec then
fl:=false;
end;
close(f);
reset(f);
for j:=1 to i-1 do
begin
readln(f,s);
if fl then
begin
val(s,a_tec,err);
if a=a_tec then
fl:=false;
end;
end;
readln(f,s);
if fl then
begin
str(a,s);
writeln(q,s);
end;
end;
close(f);
close(q);
end.
program povtory;
uses crt;
const
n = 30;
var
f, q: text;
fl: boolean;
i, j, value, curr: integer;
begin
clrscr;
randomize;
assign(f,'fail.in'); rewrite(f);
for i:=1 to n do
writeln(f,random(20));
reset(f);
assign(q,'fail.out'); rewrite(q);
for i := 1 to n do begin
fl := true;
readln(f, value);
while not EOF(f) and fl do begin
readln(f, curr);
if value = curr then fl := false;
end;
reset(f);
for j:=1 to i-1 do begin
readln(f, curr);
if fl and (value = curr) then fl := false;
end;
readln(f, value);
if fl then
writeln(q, value);
end;
close(f);
close(q);
end.
value - то значение, которое будет проверяться на повторное вхождение
curr - это считываемые после него по порядку из файла значения (которые сравниваются с value), от current - текущий ...
Ну, а fl - потому и boolean, что это есть флаг, показывающий, является ли значение value в файле одиночным (fl = true), или оно дублируется (тогда fl = false)...
program povtory;
for j:=1 to i-1 do begin
readln(f, curr);
if fl and (value = curr) then fl := false;
end;
readln(f, value);
if fl then
writeln(q, value);
end; --> Здесь ошибка. error 94:"." expected.
close(f);
close(q);
end.
Ты пропустила где-то один Begin... Проверяй всю программу слово за словом, или скопируй ее, а не перепечатывай...
Теперь смотри, почему это происходит: файл File.in создавался, и ПЕРЕоткрывался, то есть, он гарантированно записан на диск, возможно НЕ последняя версия, но какая-то есть... А файл File.out закрывается ПОСЛЕ той точки, которую ты поставила, следовательно, буфер на диск НЕ записывается, и все данные потеряны... Вот так то...
Хорошо! Сейчас проверю! Спасибо,я поняла свою ошибку!!!!
program povtory;
for j:=1 to i-1 do begin
readln(f, curr);
if fl and (value = curr) then fl := false;
end;
может тут надо {begin}?
readln(f, value);
if fl then
writeln(q, value);
end;
close(f);
close(q);
end.
Что-то ты не то и не оттуда скопировала.
Возьми программку из сообщения 10.
Она работает...
Я присоединил файл в аттаче - ты опять в неправильном месте поставила Begin... Неужели НАСТОЛЬКО сложно скопировать?
Сохранить файл разберешься, как?
Прикрепленные файлы
prog.pas ( 709 байт )
Кол-во скачиваний: 224