Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Файлы!

Автор: Светлана 22.12.2006 3:39

Здравствуйте! У меня тут такая задачка: "Заполнить файл последовательного доступа 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.

Автор: ammaximus 22.12.2006 4:30

Вылетаешь за рамки массива. Попробуй так

Цитата
if (a[i]<>a[i+1]) and (i+1<=n) then writeln(q,a[i]);

dry.gif

Автор: volvo 22.12.2006 4:33

Цитата
Вылетаешь за рамки массива.
При твоем способе будет то же самое - надо поменять условия местами, чтобы не было Range Check-а...

А если стоит директива {$B+}, или "Complete Boolean Eval" в настройках - то этот вариант вообще не сработает...

Автор: мисс_граффити 22.12.2006 4:35

вот так компилируется, но работает неправильно.

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]);

то есть, допустим, первое число в f равно 7
если а[7]<>a[8], то записываем a[7] в q
разве это то, что от нас требовалось в задаче?
а если в f записано 99, то будем пытаться сравнить a[99] и а[100] (ты знаешь, что у тебя там находится? я бы не рискнула строить прогнозы)

Автор: Светлана 22.12.2006 4:35

Цитата(ammaximus @ 22.12.2006 0:30) *

Вылетаешь за рамки массива. Попробуй так

Только решение неверное...


А почему решение неверное????

Автор: Светлана 22.12.2006 4:46

Цитата(мисс_граффити @ 22.12.2006 0:35) *

будем пытаться сравнить a[99] и а[100] (ты знаешь, что у тебя там находится? я бы не рискнула строить прогнозы)


Я что то наверно тож не рискнула бы.. Извините, а как тогда правильно исключить повторные вхождения чисел?

Автор: мисс_граффити 22.12.2006 4:50

Сорри, это у меня настройки компилятора.
Тебе он, видимо, и не дает возможность прогнозирования smile.gif)

Вопросы такие:
1) если у нас был файл 1 2 2 3 4 3 5
должны получить 1 2 3 4 5
или 1 4 5
(то есть оставлять ли единственное вхождение повторных)?
2) как хочешь - с увеличением затрат по времени (работа чисто с файлами) или по памяти (с массивом)?
по-моему, заданию больше соответствует первый случай...

Автор: Светлана 22.12.2006 11:37

Цитата(мисс_граффити @ 22.12.2006 0:50) *

Вопросы такие:
1) если у нас был файл 1 2 2 3 4 3 5
должны получить 1 2 3 4 5
или 1 4 5
(то есть оставлять ли единственное вхождение повторных)?
2) как хочешь - с увеличением затрат по времени (работа чисто с файлами) или по памяти (с массивом)?
по-моему, заданию больше соответствует первый случай...


1) Нет, надо, чтобы из файла f получился файл q, в котором будут ИСКЛЮЧЕНЫ повторные вхождения, т.е. надо, чтобы получилось 1 4 5.
2) думаю, что желательно, чтобы работа чисто с файлами... то есть с увеличением затрат по времени...

Пасибо заранее!...

Автор: мисс_граффити 22.12.2006 20:19

условно работает...
но ооочень медленно.
с кучей ненужных переводов из строки в число и обратно.

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.

Автор: volvo 22.12.2006 21:42

Цитата(мисс_граффити @ 22.12.2006 15:19)
с кучей ненужных переводов из строки в число и обратно.
А зачем эти переводы, если из текстового файла (тем более такого, в котором информация записана в отдельных строках) можно читать сразу в число?

Вот полный аналог твоей программы:
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.


Автор: Светлана 23.12.2006 1:35

Цитата(volvo @ 22.12.2006 17:42) *

Вот полный аналог твоей программы:


Спасибо большое! Не могли бы Вы пож-та только сказать еще, что означают переменные fl, value, curr. Я не поняла, что такое fl и почему boolean.

Автор: volvo 23.12.2006 1:49

value - то значение, которое будет проверяться на повторное вхождение
curr - это считываемые после него по порядку из файла значения (которые сравниваются с value), от current - текущий ...

Ну, а fl - потому и boolean, что это есть флаг, показывающий, является ли значение value в файле одиночным (fl = true), или оно дублируется (тогда fl = false)...

Автор: Светлана 23.12.2006 2:11

Цитата(volvo @ 22.12.2006 17:42) *


Вот полный аналог твоей программы:
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.



(Я поставила точку... не знаю, правильно ли... но у меня выводятся значения в файле file.in , а в файле file.out никаких значений нет...)

Автор: volvo 23.12.2006 2:20

no1.gif Ты пропустила где-то один Begin... Проверяй всю программу слово за словом, или скопируй ее, а не перепечатывай...

Теперь смотри, почему это происходит: файл File.in создавался, и ПЕРЕоткрывался, то есть, он гарантированно записан на диск, возможно НЕ последняя версия, но какая-то есть... А файл File.out закрывается ПОСЛЕ той точки, которую ты поставила, следовательно, буфер на диск НЕ записывается, и все данные потеряны... Вот так то...

Автор: Светлана 23.12.2006 2:32

Хорошо! Сейчас проверю! Спасибо,я поняла свою ошибку!!!!

Автор: Светлана 23.12.2006 3:03

Цитата(volvo @ 22.12.2006 17:42) *


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.



А так все правильно скопировала. Но file.out не выдает значения...

Автор: мисс_граффити 23.12.2006 3:29

Что-то ты не то и не оттуда скопировала.
Возьми программку из сообщения 10.
Она работает...

Автор: volvo 23.12.2006 3:29

Я присоединил файл в аттаче - ты опять в неправильном месте поставила Begin... Неужели НАСТОЛЬКО сложно скопировать? dry.gif

Сохранить файл разберешься, как?


Прикрепленные файлы
Прикрепленный файл  prog.pas ( 709 байт ) Кол-во скачиваний: 224

Автор: Светлана 23.12.2006 3:33

Цитата(volvo @ 22.12.2006 23:29) *

Я присоединил файл в аттаче - ты опять в неправильном месте поставила Begin... Неужели НАСТОЛЬКО сложно скопировать? dry.gif

Сохранить файл разберешься, как?


Да, разберусь.... извините пож-та.... чет мозги ваще уже не работают....