![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
*alt |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Задача.
Дан список морфем, в котором указана сама морфема и её тип (приставка, корень, суффикс или окончание). В списке могут встречаться повторяющиеся морфемы. Написать программу, результатом работы которой должен быть список морфем, разбитый на группы для каждого типа. Внутри этих групп морфемы должны быть упорядочены в лексикографическом порядке. В группе корней одна и таже морфема может встречаться несколько раз, а в других группах морфемы должны быть уникальными. С чего начать??? Что сделать??? Как сделать??? Помогите..... |
*alt |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Народ, ну помогите))
с чего начать???? |
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
{$B-} Цитата(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";'
|
Гость |
![]()
Сообщение
#4
|
Гость ![]() |
klem4, а можно прокомментировать решение, а то я только учусь... не плохо было бы разобраться))))
|
klem4 |
![]()
Сообщение
#5
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Хорошо, сегодня добавлю общие комметарии к программе.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
*alt |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сразу извинюсь, за следующий вопрос.
Но всё же Что нужно изменить, чтобы программа компилировалась в делфи (консольное приложение)? |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Что нужно изменить, чтобы программа компилировалась в делфи (консольное приложение)? Убрать подключение модуля Crt (вместо него подключаем SysUtils), и убираем вызов ClrScr... |
*alt |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну я так и делал, но пишет
Цитата [Ïðåäóïðåæäåíèå] 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 |
![]()
Сообщение
#9
|
Гость ![]() |
И что? Warning от Error отличаешь? Оно просто тебя предупреждает, что функция написана так, что МОЖЕТ при каком-то совпадении условий не вернуть значение... Кстати, функция
function f(i: integer): boolean;выдаст точно такое же предупреждение, хотя будет прекрасно работать... |
*alt |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Она компилируется, но сразу же вылетает...
Значит что-то всё-таки не так... |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
А ты перед последней строкой ReadLn добавить не пробовал? Оно просто отрабатывает, а ты результатов не видишь...
Сообщение отредактировано: volvo - |
*alt |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо, volvo
Всегда readln в конце проверяю, а щас не глянул.... |
*alt |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ещё один вопрос...
Как описать всё то же, но без использования объекта?????? |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Например вот так:
uses sysutils; |
*alt |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
Не работает...
Сначала пишет ошибку:: Constant object cannot be passed as var parameter здесь Цитата AppendToList(in_list[mt], value); и здесь Цитата PrintList(in_list[mt]); DestroyList(in_list[mt]); После исправления выдаёт чёрный экран..... |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
![]() *alt, ты мою подпись как следует читал? Перечитай еще раз! Добавлено через 3 мин. P.S. Compiler->Options->Assignable typed constants ставишь галочку, или в начале программы {$WRITEABLECONST ON} |
*alt |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo, пожалуйста, вы не могли бы написать комментарии к основным блокам программы, чтобы было ясно, что происходит???
|
*alt |
![]()
Сообщение
#18
|
Новичок ![]() Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo, ну напишите, пожалуйста, комментарии...
|
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 19.02.2025 15:56 |