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

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

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

> Список построенный из элементов файла, Описать функцию, значением которой есть этот список
AlexSun
сообщение 26.11.2011 15:57
Сообщение #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 - 26.11.2011 18:33
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
IUnknown
сообщение 26.11.2011 16:23
Сообщение #2


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
AlexSun
сообщение 26.11.2011 16:48
Сообщение #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 - 26.11.2011 16:50
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlexSun
сообщение 26.11.2011 22:25
Сообщение #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 - 26.11.2011 22:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

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