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

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

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

 
 Ответить  Открыть новую тему 
> Список построенный из элементов файла, Описать функцию, значением которой есть этот список
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Александр

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


Задание:
Цитата
type TE = <любой_тип>;
ff = file of TE;
список =^ звено;
звено = record
элемент: TE;
следующий: список;
end;
Описать функцию, значением которой есть список, построенный из элементов файла.


Моя программа:
uses	crt;
type TE = char;
ff = file of TE;
list =^ link;
link = record
element: TE;
next: list;
end;
var fname: string[79];
f: ff;
ch: TE;
l: list;

function flist(var f: ff): list;
var l, p, q: list;
x: TE;
begin
new(l);
read(f,x);
l^.element := x;
p := l;
while not eof(f) do begin
read(f,x);
new(q);
q^.element := x;
p^.next := q;
p := q
end;
p^.next := nil;
flist := l
end;

begin
clrscr;
write('Введите имя файла: ');
readln(fname);
assign(f,fname);
{I-}
reset(f);
{I+}
if IOResult <> 0 then begin
writeln('Введите текст:');
rewrite(f);
repeat
read(ch);
write(f,ch)
until ch = #10;
close(f);
reset(f)
end;
l := flist(f);
writeln('Элементы списка:');
while l <> nil do begin
write(l^.element);
l := l^.next
end;
readkey
end.


Как переделать функцию flist, чтоб не вылетала с ошибкой при пустом файле?

И еще вопрос, как лучше сделать ввод элементов списка.
При until ch = #10 в конец записывается символ \n, при until ch = #13 - \r, а они мне не нужны.
Или сделать тип элемента списка integer что ли, да вводить в цикле for, перед этим получив их количество...

Сообщение отредактировано: AlexSun -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Цитата
Как переделать функцию flist, чтоб не вылетала с ошибкой при пустом файле?
Тысячу раз говорено: не делайте разницы между первым и остальным элементами списка - потом не придется править вот такие огрехи!!! Первый элемент списка ничем не примечателен, он ТОЧНО такой же, как и второй, и как третий, и как последний. Почему третий элемент вводится в основном цикле, а первый - нет? Не надо разделять, "первый"/"не первый":
function flist(var f: ff): list;
var
l, p, q: list;
x: TE;
begin
l := nil;
while not eof(f) do
begin
read(f, x);
new(q);
q^.element := x;
q^.next := nil;
if l = nil then
l := q
else
p^.next := q;
p := q;
end;
flist := l
end;

Цитата
Или сделать тип элемента списка integer что ли, да вводить в цикле for, перед этим получив их количество...
Или сделать тип файла Text, и читать из него целочисленные данные обычным Read(f, int_var);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Александр

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


Цитата(IUnknown @ 26.11.2011 15:23) *
Или сделать тип файла Text, и читать из него целочисленные данные обычным Read(f, int_var);

Я имел ввиду этот кусочек кода:
repeat
read(ch);
write(f,ch)
until ch = #10;

При создании файла.
Файл обязательно типизированный (но его тип любой, я выбрал char).
В общем, until ch = '.' будет, точка признак конца текста.

Нужно ли память освобождать в конце работы? Как?

Сообщение отредактировано: AlexSun -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Александр

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


Освобождение памяти:
procedure dlist(l: list);
var t: list;
begin
while l <> nil do begin
t := l^.next;
dispose(l);
l := t;
end
end;

Все верно?

Сообщение отредактировано: AlexSun -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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