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

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

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

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


Новичок
*

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

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


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


С чего начать???
Что сделать???
Как сделать???
Помогите.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 4.05.2008 20:30
Сообщение #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 - 8.05.2008 18:24


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

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


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

 



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