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

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

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

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


Новичок
*

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

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


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


С чего начать???
Что сделать???
Как сделать???
Помогите.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
*alt
сообщение 10.05.2008 13:42
Сообщение #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.
 Оффлайн  Профиль  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 15:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"