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

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

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

 
 Ответить  Открыть новую тему 
> Файлы!
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


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

dry.gif

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


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


Гость






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

А если стоит директива {$B+}, или "Complete Boolean Eval" в настройках - то этот вариант вообще не сработает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


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

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

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


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


Пионер
**

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

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


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

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


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


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

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

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


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

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


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

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


Пионер
**

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

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


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

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


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


Гость






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

Ну, а fl - потому и boolean, что это есть флаг, показывающий, является ли значение value в файле одиночным (fl = true), или оно дублируется (тогда fl = false)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






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

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


Пионер
**

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

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


Хорошо! Сейчас проверю! Спасибо,я поняла свою ошибку!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


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

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

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


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


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


Гость






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

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


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


Пионер
**

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

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


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

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

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


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

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

 





- Текстовая версия 22.09.2020 15:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name