Сортировки, Помогите решить задачу |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Сортировки, Помогите решить задачу |
*alt |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Задача.
Дан список морфем, в котором указана сама морфема и её тип (приставка, корень, суффикс или окончание). В списке могут встречаться повторяющиеся морфемы. Написать программу, результатом работы которой должен быть список морфем, разбитый на группы для каждого типа. Внутри этих групп морфемы должны быть упорядочены в лексикографическом порядке. В группе корней одна и таже морфема может встречаться несколько раз, а в других группах морфемы должны быть уникальными. С чего начать??? Что сделать??? Как сделать??? Помогите..... |
*alt |
Сообщение
#2
|
Новичок Группа: Пользователи Сообщений: 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. |
Текстовая версия | 28.03.2024 22:35 |