Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2012, 23:18
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию Расстановка окончаний слова у его падежей

В WoW (и других линейках наверное тоже), когда вводишь ник персонажа, появляется оконце со всеми его падежами и правильно подставленными окончаниями...

Необходимо сделать такое же в делфи...

Может есть какие-то у кого решения или заготовки, мысли?
Ответить с цитированием
  #2  
Старый 14.01.2012, 23:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Создаёшь по падежам массив со всеми возможными окончаниями и при необходимости подставляешь.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 15.01.2012, 02:42
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

у нас 3 рода, единичное и множественное число.. потом надо как-то отделить окончание у слова от корня, суффикса, приставок и тп, определить его род... потом, если словосочитание, еще надо определить какое там слово главное, типа "база данных" склонятся будет только "база", но как это все определить?
Ответить с цитированием
  #4  
Старый 15.01.2012, 02:52
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Делать полностью с соблюдениями всех правил русского языка, как мне кажется, будет накладно. Проще сделать некий упрощённый вариант. Хорошо, если заранее известен набор слов, иначе нужно иметь некую базу (можно и от какого-нибудь переводчика) и от неё "танцевать".
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 15.01.2012, 03:30
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

наверное надо набор правил сделать какой-то... хотя, наверное реально же сделать массив ж.род, состоящий из массивов ед.число и мн.число, каждый из которых состоит из массивов падежей, в которых содержаться окончания?))) и для остальных родов так же...
а для прилагательных один массив со всеми возможными окончаниями, чтобы можно было узнать, прилагательное это или нет, для словосочитаний...
Ответить с цитированием
  #6  
Старый 17.01.2012, 02:35
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

что-то сделал, кроме исключений вроде более менее работает, сойдет)

только проблема с повторяющимися значениями. Нужно удалить повторяющиеся элементы, делал через второй массив:

word:array[0..11] of string - исходный массив с повторами,
findword:array of string - новый массив, где не должно быть повторов

Код:
for i:=0 to Length(word)-1 do
 begin
   flag:=true;

   for k:=0 to Length(finword)-1 do
    begin
     if word[i]=finword[k] then
     begin
      flag:=false;
      break;
     end;
      if flag=true then
       begin
        SetLength(finword,Length(finword)+1);
        finword[length(finword)-1]:=word[i];

       end;
    end;
 end;
не работает. погуглил в интернете, там у кого-то точно такой же код, вроде, и работает... Не подскажите, что не так?

Последний раз редактировалось ShutTap, 17.01.2012 в 03:49.
Ответить с цитированием
  #7  
Старый 17.01.2012, 02:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Пользуйся тегом "{CODE}{/CODE}", не используй служебные слова в своих вариациях
Код:
// word[0..11] - исходный массив с повторами
флаг flag не используется, так как команда Break прекращает выполнения цикла и следующая проверка не произойдёт.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 17.01.2012, 03:40
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

без break вообще не работает
Ответить с цитированием
  #9  
Старый 17.01.2012, 03:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Имеется в виду, что флаг flag не нужен в данном случае вообще.
Код:
  for i:=0 to Length(word)-1 do
  begin
    for k:=0 to Length(finword)-1 do
    begin
      if word[i]=finword[k] then
        break;

        SetLength(finword,Length(finword)+1);
        finword[length(finword)-1]:=word[i];
    end;
 end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 17.01.2012 в 03:57.
Ответить с цитированием
  #10  
Старый 17.01.2012, 13:21
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

Код:
SetLength(finword,0);

   for i:=0 to Length(word)-1 do
    for k:=0 to Length(finword)-1 do
    begin
     if word[i]=finword[k] then
      break;

      SetLength(finword,Length(finword)+1);
      finword[length(finword)-1]:=word[i];
    end;


что-то не копирует.. в итоге длина нового массива = 0

Последний раз редактировалось ShutTap, 17.01.2012 в 17:08.
Ответить с цитированием
  #11  
Старый 17.01.2012, 19:32
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

Что-то никак не получается...
Ответить с цитированием
  #12  
Старый 17.01.2012, 21:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И не будет, я только лишнюю переменную убрал, а алгоритм не посмотрел толком, а зря
Код:
for k:=0 to Length(finword)-1 do
...
      SetLength(finword,Length(finword)+1);
изначально массив равен 0, а увеличение массива происходит внутри цикла, после проверки его длины, котороя ВСЕГДА 0.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 17.01.2012, 22:25
ShutTap ShutTap вне форума
Прохожий
 
Регистрация: 14.01.2012
Сообщения: 19
Репутация: 10
По умолчанию

так работает

Код:
   for i:=j to Length(word)-1 do begin
     flag:=true;

    for k:=0 to Length(finword)-1 do
     if word[i]=finword[k] then
      flag:=false;

      if flag=true then
       begin
        SetLength(finword,Length(finword)+1);
        finword[length(finword)-1]:=word[i];
       end;
end;

break в самом начале был лишним,и флаг не в том месте стоял... спасибо за помощь)

Последний раз редактировалось ShutTap, 17.01.2012 в 22:41.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025