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

> ВНИМАНИЕ!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Класс,потомок,список.
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
сообщение
Сообщение #2


Гость






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

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


Новичок
*

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

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


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

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

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

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

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

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

Сообщение отредактировано: Searcher -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
Кроме этого, у тебя есть небольшие ошибки при сканировании строки и при добавлении элемента в список.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


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

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

 





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