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

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

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

> Сортировки, Помогите решить задачу
сообщение
Сообщение #1


Новичок
*

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

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


Задача.
Дан список морфем, в котором указана сама морфема и её тип (приставка, корень, суффикс или окончание). В списке могут встречаться повторяющиеся морфемы.
Написать программу, результатом работы которой должен быть список морфем, разбитый на группы для каждого типа. Внутри этих групп морфемы должны быть упорядочены в лексикографическом порядке. В группе корней одна и таже морфема может встречаться несколько раз, а в других группах морфемы должны быть уникальными.


С чего начать???
Что сделать???
Как сделать???
Помогите.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Perl. Just code it!
******

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

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


{$B-}

uses crt;

{
функция сравнения 2-х строк в лексикографическом порядке
}
function CmpStr(const a, b: string): integer;
var
i, lenA, lenB: byte;

begin
lenA := length(a);
lenB := length(b);

i := 1;
while (i <= lenA) and (i <= lenB) and (a[i] = b[i]) do
inc(i);

if (i > lenA) and (i > lenB) then
CmpStr := 0
else if (i > lenA) or ((i <= lenB) and (a[i] < b[i])) then
CmpStr := -1
else if (i > lenB) or ((i <= lenA) and (a[i] > b[i])) then
CmpStr := 1;
end;

type
{ возможные виды морфем: приставка, корень, суффикс, окончание }
MorphemeType = (
PREFIX,
ROOT,
SUFFIX,
TERMINATION
);

MorphPtr = ^Morpheme;

{ структура, хранящая информацию о морфеме в списке морфем }
Morpheme = record
_type: MorphemeType; { вид морфемы }
_value: string; { значение морфемы }
next: MorphPtr; { указатель на следующую морфему в списке }
end;

{ объект - список морфем, фактически обычный однонаправленный список, вот только элементы
добавляются не в начало или конец списка, а добавляются таким образом, чтобы после добавления
очередного элемента в список, он (список) был упорядочен по полям _value в лексикографическом порядке
}
MorphemList = object
first: MorphPtr; // указатель на первый элемент списка

constructor Create; // создание пустого списка
destructor Free; // уничтожение списка

procedure Add(const mType: MorphemeType; const value: string); {
добавление морфемы в список (mType - тип морфемы), value - значение
}
procedure Print; // печать списка морфем
end;

constructor MorphemList .Create;
begin
first := nil;
end;

destructor MorphemList.Free;
var
head: MorphPtr;

begin
while first <> nil do begin
head := first;
first := first^.next;
dispose(head);
end;
end;

procedure MorphemList.Add(const mType: MorphemeType; const value: string);
var
p, prev, next: MorphPtr;
cmp: integer;
begin
new(p);

p^._type := mType;
p^._value := value;

if first = nil then begin
p^.next := nil;
first := p;
end else begin

prev := nil;
next := first;
cmp := CmpStr(next^._value, value);

while (next <> nil) and (cmp < 0) do begin
prev := next;
next := next^.next;

if next <> nil then
cmp := CmpStr(next^._value, value);
end;

if (cmp <> 0) or (mType = ROOT) then begin
if (prev = nil) then begin
p^.next := first;
first := p;
end else if (next = nil) then begin
p^.next := nil;
prev^.next := p
end else begin
p^.next := next;
prev^.next := p;
end;
end else dispose(p);

end;

end;

procedure MorphemList.Print;
var
p: MorphPtr;
begin
p := first;
while p <> nil do begin
writeln(p^._value);
p := p^.next;
end;
end;

{
в результате работы процедуры, на вход которой поступает строка S вида
<название_морфемы тип_морфемы>
будет запись типа_морфемы в переменную mType и самой морфемы в переменную value
}
procedure GetMorphemInfo(const s: string;
var mType: MorphemeType;
var value: string);
var
temp: string;
begin
temp := copy(s, pos(' ', s) + 1, 255);

if temp = 'ROOT' then
mType := ROOT
else if temp = 'PREFIX' then
mType := PREFIX
else if temp = 'SUFFIX' then
mType := SUFFIX
else mType := TERMINATION;

value := copy(s, 1, pos(' ', s) - 1);
end;


const
// символьное отображение названий видов морфем
// szMotphTypes[PREFIX] == "PREFIX" и т.д.
szMorphTypes: array [ MorphemeType ] of string =
('PREFIX',
'ROOT',
'SUFFIX',
'TERMINATION'
);

var
// массив списков морфем, каждый элемент массива - список морфем определенного вида,
// например mList[ROOT] - список корней
mList: array [ MorphemeType ] of ^MorphemList;
mt: MorphemeType; // дополнительная переменная
morphFile: Text; // текстовый файл с морфемами (пример содержания файла я привел)
temp, value: string; // дополнительный переменные

begin
clrscr;

assign( morphFile, 'c:\morphems.txt' );
reset( morphFIle ); // открываем файл с морфемами для чтения

for mt := PREFIX to TERMINATION do
new( mList[ mt ], Create ); // создаем все списки морфем

while not eof ( morphFile ) do begin // читаем строки из файла
readln( morphFIle, temp );
GetMorphemInfo(temp, mt, value); // выдергиваем из строки информацию о морфеме
mList[mt]^.Add(mt, value); // заносим морфему в соответствующий список
end;

for mt := PREFIX to TERMINATION do begin
writeln( szMorphTypes[ mt ], '''s:'); // подсказка показывает список какой из морфем сейчас будет выведен
mList[ mt ]^.Print; // печать очередного списка списка
writeln;
dispose( mList[ mt ], Free ); // удаление списка
end;

close( morphFile ); // не забываем закрыть файл
end.


Цитата(morphems.txt)
root1 ROOT
suffix1 SUFFIX
root2 ROOT
termination1 TERMINATION
root3 ROOT
prefix1 PREFIX
termination2 TERMINATION


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
*alt   Сортировки   27.04.2008 19:25
*alt   Народ, ну помогите)) с чего начать????   4.05.2008 16:12
klem4   {$B-} uses crt; { функция сравнения 2-х с…   5.05.2008 0:30
Гость   klem4, а можно прокомментировать решение, а то я т…   7.05.2008 16:51
klem4   Хорошо, сегодня добавлю общие комметарии к програм…   8.05.2008 12:37
*alt   Сразу извинюсь, за следующий вопрос. Но всё же Что…   10.05.2008 17:21
volvo   Убрать подключение модуля Crt (вместо него подключ…   10.05.2008 17:34
*alt   Ну я так и делал, но пишет Вот тот же код (на вся…   10.05.2008 17:42
volvo   И что? Warning от Error отличаешь? Оно просто тебя…   10.05.2008 18:05
*alt   Она компилируется, но сразу же вылетает... Значит …   10.05.2008 18:24
volvo   А ты перед последней строкой ReadLn добавить не пр…   10.05.2008 19:15
*alt   Спасибо, volvo Всегда readln в конце проверяю, а щ…   10.05.2008 19:21
*alt   Ещё один вопрос... Как описать всё то же, но без и…   12.05.2008 14:04
volvo   Например вот так: uses sysutils; type MorphemeT…   12.05.2008 14:50
*alt   Не работает... Сначала пишет ошибку:: Constant obj…   12.05.2008 15:04
volvo   :mad: *alt, ты мою подпись как следует читал? Пер…   12.05.2008 15:09
*alt   volvo, пожалуйста, вы не могли бы написать коммент…   13.05.2008 15:50
*alt   volvo, ну напишите, пожалуйста, комментарии...   20.05.2008 13:48
volvo   Комментарии добавлены:   20.05.2008 14:57


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

 





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