Сортировки, Помогите решить задачу |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Сортировки, Помогите решить задачу |
*alt |
27.04.2008 15:25
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Задача.
Дан список морфем, в котором указана сама морфема и её тип (приставка, корень, суффикс или окончание). В списке могут встречаться повторяющиеся морфемы. Написать программу, результатом работы которой должен быть список морфем, разбитый на группы для каждого типа. Внутри этих групп морфемы должны быть упорядочены в лексикографическом порядке. В группе корней одна и таже морфема может встречаться несколько раз, а в других группах морфемы должны быть уникальными. С чего начать??? Что сделать??? Как сделать??? Помогите..... |
*alt |
4.05.2008 12:12
Сообщение
#2
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Народ, ну помогите))
с чего начать???? |
klem4 |
4.05.2008 20:30
Сообщение
#3
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
{$B-} Цитата(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";'
|
Гость |
7.05.2008 12:51
Сообщение
#4
|
Гость |
klem4, а можно прокомментировать решение, а то я только учусь... не плохо было бы разобраться))))
|
klem4 |
8.05.2008 8:37
Сообщение
#5
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Хорошо, сегодня добавлю общие комметарии к программе.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
*alt |
10.05.2008 13:21
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Сразу извинюсь, за следующий вопрос.
Но всё же Что нужно изменить, чтобы программа компилировалась в делфи (консольное приложение)? |
volvo |
10.05.2008 13:34
Сообщение
#7
|
Гость |
Цитата Что нужно изменить, чтобы программа компилировалась в делфи (консольное приложение)? Убрать подключение модуля Crt (вместо него подключаем SysUtils), и убираем вызов ClrScr... |
*alt |
10.05.2008 13:42
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Ну я так и делал, но пишет
Цитата [Ïðåäóïðåæäåíèå] sort.dpr(33): Return value of function 'CmpStr' might be undefined Вот тот же код (на всякий случай):: Код program sort; {$APPTYPE CONSOLE} uses SysUtils, windows; { ôóíêöèÿ ñðàâíåíèÿ 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 {îáðàùåíèå ê ðóññêîìó ÿçûêó} setconsoleCp(1251); setconsoleOutputCp(1251); assign( morphFile, '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. |
volvo |
10.05.2008 14:05
Сообщение
#9
|
Гость |
И что? Warning от Error отличаешь? Оно просто тебя предупреждает, что функция написана так, что МОЖЕТ при каком-то совпадении условий не вернуть значение... Кстати, функция
function f(i: integer): boolean;выдаст точно такое же предупреждение, хотя будет прекрасно работать... |
*alt |
10.05.2008 14:24
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Она компилируется, но сразу же вылетает...
Значит что-то всё-таки не так... |
volvo |
10.05.2008 15:15
Сообщение
#11
|
Гость |
А ты перед последней строкой ReadLn добавить не пробовал? Оно просто отрабатывает, а ты результатов не видишь...
Сообщение отредактировано: volvo - 10.05.2008 15:15 |
*alt |
10.05.2008 15:21
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Спасибо, volvo
Всегда readln в конце проверяю, а щас не глянул.... |
*alt |
12.05.2008 10:04
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Ещё один вопрос...
Как описать всё то же, но без использования объекта?????? |
volvo |
12.05.2008 10:50
Сообщение
#14
|
Гость |
Например вот так:
uses sysutils; |
*alt |
12.05.2008 11:04
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Не работает...
Сначала пишет ошибку:: Constant object cannot be passed as var parameter здесь Цитата AppendToList(in_list[mt], value); и здесь Цитата PrintList(in_list[mt]); DestroyList(in_list[mt]); После исправления выдаёт чёрный экран..... |
volvo |
12.05.2008 11:09
Сообщение
#16
|
Гость |
*alt, ты мою подпись как следует читал? Перечитай еще раз! Добавлено через 3 мин. P.S. Compiler->Options->Assignable typed constants ставишь галочку, или в начале программы {$WRITEABLECONST ON} |
*alt |
13.05.2008 11:50
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
volvo, пожалуйста, вы не могли бы написать комментарии к основным блокам программы, чтобы было ясно, что происходит???
|
*alt |
20.05.2008 9:48
Сообщение
#18
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
volvo, ну напишите, пожалуйста, комментарии...
|
volvo |
20.05.2008 10:57
Сообщение
#19
|
Гость |
|
Текстовая версия | 20.04.2024 12:53 |