IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Файлы!
Светлана
сообщение 21.12.2006 23:39
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


Здравствуйте! У меня тут такая задачка: "Заполнить файл последовательного доступа 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ammaximus
сообщение 22.12.2006 0:30
Сообщение #2


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Вылетаешь за рамки массива. Попробуй так
Цитата
if (a[i]<>a[i+1]) and (i+1<=n) then writeln(q,a[i]);

dry.gif

Сообщение отредактировано: ammaximus - 22.12.2006 0:35


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.12.2006 0:33
Сообщение #3


Гость






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

А если стоит директива {$B+}, или "Complete Boolean Eval" в настройках - то этот вариант вообще не сработает...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.12.2006 0:35
Сообщение #4


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


вот так компилируется, но работает неправильно.
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] (ты знаешь, что у тебя там находится? я бы не рискнула строить прогнозы)


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 0:35
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


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

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

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


А почему решение неверное????
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 0:46
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


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

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


Я что то наверно тож не рискнула бы.. Извините, а как тогда правильно исключить повторные вхождения чисел?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.12.2006 0:50
Сообщение #7


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 7:37
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


Цитата(мисс_граффити @ 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) думаю, что желательно, чтобы работа чисто с файлами... то есть с увеличением затрат по времени...

Пасибо заранее!...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.12.2006 16:19
Сообщение #9


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.12.2006 17:42
Сообщение #10


Гость






Цитата(мисс_граффити @ 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.

 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 21:35
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


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

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


Спасибо большое! Не могли бы Вы пож-та только сказать еще, что означают переменные fl, value, curr. Я не поняла, что такое fl и почему boolean.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.12.2006 21:49
Сообщение #12


Гость






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

Ну, а fl - потому и boolean, что это есть флаг, показывающий, является ли значение value в файле одиночным (fl = true), или оно дублируется (тогда fl = false)...
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 22:11
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


Цитата(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 никаких значений нет...)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.12.2006 22:20
Сообщение #14


Гость






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

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


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


Хорошо! Сейчас проверю! Спасибо,я поняла свою ошибку!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 23:03
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


Цитата(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 не выдает значения...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.12.2006 23:29
Сообщение #17


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.12.2006 23:29
Сообщение #18


Гость






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

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


Прикрепленные файлы
Прикрепленный файл  prog.pas ( 709 байт ) Кол-во скачиваний: 177
 К началу страницы 
+ Ответить 
Светлана
сообщение 22.12.2006 23:33
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 60
Пол: Женский
Реальное имя: Света

Репутация: -  0  +


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

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

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


Да, разберусь.... извините пож-та.... чет мозги ваще уже не работают....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 17.07.2025 7:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"