Помощь - Поиск - Пользователи - Календарь
Полная версия: Список построенный из элементов файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
AlexSun
Задание:
Цитата
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, перед этим получив их количество...
IUnknown
Цитата
Как переделать функцию 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);
AlexSun
Цитата(IUnknown @ 26.11.2011 15:23) *
Или сделать тип файла Text, и читать из него целочисленные данные обычным Read(f, int_var);

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

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

Нужно ли память освобождать в конце работы? Как?
AlexSun
Освобождение памяти:
procedure dlist(l: list);
var	t: list;
begin
	while l <> nil do begin
		t := l^.next;
		dispose(l);
		l := t;
	end
end;

Все верно?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.