Помощь - Поиск - Пользователи - Календарь
Полная версия: Файлы!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Светлана
Здравствуйте! У меня тут такая задачка: "Заполнить файл последовательного доступа 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
Вылетаешь за рамки массива. Попробуй так
Цитата
if (a[i]<>a[i+1]) and (i+1<=n) then writeln(q,a[i]);

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

А если стоит директива {$B+}, или "Complete Boolean Eval" в настройках - то этот вариант вообще не сработает...
мисс_граффити
вот так компилируется, но работает неправильно.
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] (ты знаешь, что у тебя там находится? я бы не рискнула строить прогнозы)
Светлана
Цитата(ammaximus @ 22.12.2006 0:30) *

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

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


А почему решение неверное????
Светлана
Цитата(мисс_граффити @ 22.12.2006 0:35) *

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


Я что то наверно тож не рискнула бы.. Извините, а как тогда правильно исключить повторные вхождения чисел?
мисс_граффити
Сорри, это у меня настройки компилятора.
Тебе он, видимо, и не дает возможность прогнозирования smile.gif)

Вопросы такие:
1) если у нас был файл 1 2 2 3 4 3 5
должны получить 1 2 3 4 5
или 1 4 5
(то есть оставлять ли единственное вхождение повторных)?
2) как хочешь - с увеличением затрат по времени (работа чисто с файлами) или по памяти (с массивом)?
по-моему, заданию больше соответствует первый случай...
Светлана
Цитата(мисс_граффити @ 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) думаю, что желательно, чтобы работа чисто с файлами... то есть с увеличением затрат по времени...

Пасибо заранее!...
мисс_граффити
условно работает...
но ооочень медленно.
с кучей ненужных переводов из строки в число и обратно.
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 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.

Светлана
Цитата(volvo @ 22.12.2006 17:42) *

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


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

Ну, а fl - потому и boolean, что это есть флаг, показывающий, является ли значение value в файле одиночным (fl = true), или оно дублируется (тогда fl = false)...
Светлана
Цитата(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
no1.gif Ты пропустила где-то один Begin... Проверяй всю программу слово за словом, или скопируй ее, а не перепечатывай...

Теперь смотри, почему это происходит: файл File.in создавался, и ПЕРЕоткрывался, то есть, он гарантированно записан на диск, возможно НЕ последняя версия, но какая-то есть... А файл File.out закрывается ПОСЛЕ той точки, которую ты поставила, следовательно, буфер на диск НЕ записывается, и все данные потеряны... Вот так то...
Светлана
Хорошо! Сейчас проверю! Спасибо,я поняла свою ошибку!!!!
Светлана
Цитата(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 не выдает значения...
мисс_граффити
Что-то ты не то и не оттуда скопировала.
Возьми программку из сообщения 10.
Она работает...
volvo
Я присоединил файл в аттаче - ты опять в неправильном месте поставила Begin... Неужели НАСТОЛЬКО сложно скопировать? dry.gif

Сохранить файл разберешься, как?
Светлана
Цитата(volvo @ 22.12.2006 23:29) *

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

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


Да, разберусь.... извините пож-та.... чет мозги ваще уже не работают....
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.