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

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Класс,потомок,список.
Searcher
сообщение 26.10.2008 11:14
Сообщение #1


Новичок
*

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

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


Что-то не получается...
Условие
Пусть элемент списка представлен следущим образом:
Telem=class
private
   Left,Right:Telem;
protected
   // Здесь, возможно, описаны методы.
public
   // Здесь, возможно, определены методы.
end;
Построить двунаправленный список таким образом, чтобы, определив потомков класса Telem и не переопределяя сам список, можно было решить следующую задачу: по заданной строке текста сформировать список из элементов, соответсвующих типу потомка, и вывести на экран. Решение задачи должно быть представленно как метод класс Список:
Определить потомка TStrElem (звено,содержащие строку). Выбираются только те слова, которые не могут быть трактованы как целый числа или как логические значения (true и false).

Решение:
модуль:
unit Uelem;
interface


uses
  SysUtils,Classes;

type
  TStr=string[255];
  pTelem=^Telem;
  Telem=class
  private
	Left,Right:pTelem;
  public
	constructor Create(var Elem:Tstr);
  end;

  Thead=class
  private
	First,Last:pTelem;
  public
	constructor Create;
	procedure ProcessStr(var temp:textfile);
	procedure Add(El:pTelem);
	//procedure PrintList;
	//destructor Destroy;
  end;

  pTStrElem=^TStrElem;
  TStrElem=class(Telem)
  info:TStr;
  public
	constructor Create(var Elem:TStr);
  end;

implementation

  constructor Telem.Create;
  begin
	Left:=nil;
	Right:=nil;
  end;

  constructor Thead.Create;
  begin
	First:=nil;
	Last:=nil;
  end;

  procedure Thead.Add(El:pTelem);
  begin
	if First=nil then
	begin
	  First:=El;
	  Last:=El;
	end else
	begin
	  Last.Right:=El;
	  El.Left:=Last;
	  El.Right:=nil;
	end;
  end;

  constructor TStrElem.Create(var Elem:TStr);
  begin
	info:=Elem;
  end;

  procedure Thead.ProcessStr(var temp:textfile);
  const razdeliteli=[' ',',','.','!','?','-',';'];
  var str,cur_word:TStr; i,z:integer; ok_int,ok_bool:boolean;newEl: pTStrElem;
  begin
	reset(temp);
	readln(temp,str);
	cur_word:='';i:=1;
	while i<=length(str) do
	begin
	  while str[i] in razdeliteli do inc(i);
	  while (i<=length(str)) and not (str[i] in razdeliteli) do
	  begin
		cur_word:=cur_word+str[i];
		inc(i);
	  end;
	  ok_int:=false;
	  ok_bool:=false;
	  for z:=1 to i do
		if (cur_word[z]>='0') and (cur_word[z]<='9') then ok_int:=true;
	  if (cur_word='true') or (cur_word='false') then ok_bool:=true;
	  if (not ok_int) and (not ok_bool) then
	  begin
		new(newEl);
		newEl:=TStrElem.Create(cur_word);
		Add(newEl);
	  end;
	end;
	closefile(temp);
  end;
end.


главная программа:
program Project1;

uses
  windows,
  Uelem,Classes;

var
  Head:Thead;
  f:textfile;

begin
  setconsolecp(1251);
  setconsoleoutputcp(1251);
  AssignFile(f,'input.txt');
  Head:=Thead.create;
  Head.ProcessStr(f);
end.
Не могли бы мне подсказать, как это сделать. И возможно ли преобразование типов? И что не так у меня с классом как список?

Сообщение отредактировано: volvo - 28.11.2009 11:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2008 12:23
Сообщение #2


Гость






Цитата
Что-то не получается...
Что именно не получается, можно уточнить? Не компилируется? Не работает? Неправильно работает? В чем проблема?

Что из себя представляет тот файл, с которым ты запускаешь программу? Ну почему все эти вопросы надо задавать постоянно? Что, сразу догадаться нельзя??? Написать: вот код ..., при запуске вместо "..." делает "...", вот на таких данных: ...
 К началу страницы 
+ Ответить 
Searcher
сообщение 26.10.2008 12:31
Сообщение #3


Новичок
*

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

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


Цитата(volvo @ 26.10.2008 12:23) *

Что именно не получается, можно уточнить? Не компилируется?

Мне бы хотелось узнать как это сделать... Не компилируется.
Цитата(volvo @ 26.10.2008 12:23) *

Что из себя представляет тот файл, с которым ты запускаешь программу? Ну почему все эти вопросы надо задавать постоянно? Что, сразу догадаться нельзя??? Написать: вот код ..., при запуске вместо "..." делает "...", вот на таких данных: ...

Просто не получается сделать список как класс,. В предыдущей теме я видел, как вы приводили пример список как класс,, но как я заметил был только interface, а implementation и главной программы не было.

З.Ы. Возможно я неправильно понял условие...

Сообщение отредактировано: Searcher - 26.10.2008 12:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2008 14:00
Сообщение #4


Гость






Ты делаешь ошибку, работая с указателями на класс... Класс сам по себе - указатель...

При описании типов:
type
  Telem=class
  private
    Left,Right:Telem;
  public
    constructor Create(var Elem:Tstr);
  end;

  Thead=class
  private
    First,Last:Telem;
  public
    constructor Create;
    procedure ProcessStr(var temp:textfile);
    procedure Add(Var El:Telem);
  end;

  TStrElem=class(Telem)
  info:TStr;
  public
    constructor Create(var Elem:TStr);
  end;


Добавление в список может происходить так:
      if (not ok_int) and (not ok_bool) then
      begin
        newEl:=TStrElem.Create(cur_word);
        Add(TElem(newEl));
      end;
Кроме этого, у тебя есть небольшие ошибки при сканировании строки и при добавлении элемента в список.
 К началу страницы 
+ Ответить 
Searcher
сообщение 26.10.2008 15:31
Сообщение #5


Новичок
*

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

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


Спасибо. Разобрался, что к чему. А ошибки исправил.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

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