Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ФИО из базы данных в родительском падеже [D6, D7, Win2k, WinXP]


Homa_Programer ©   (2005-06-11 07:08:00) 

постановка задачи таккая:
в БД имеются ФИО (3 поля) в иминительном падеже
требуется алгоритм перевода ФИО в родительный падеж

помогите кто чем сможет!!!


Anatoly Podgoretsky   (2005-09-08 22:36:00) [1]

Frost (Freak)   (08.09.05 12:12) [10]
Если говорить об алгоритмаъ, а именно о них и речь, то форум называется Игры и Алгоритмы.


isasa   (2005-09-08 22:16:00) [2]

70 000 / 1 268 000 * 100% = 5,5% - много, мало?

Почитай правила склонения имен, не правила а сплошное исключение.


DDA   (2005-09-08 20:46:00) [3]


> Уникальных немного.


ничего себе немного

у меня база жителей области 1 млн 268 тыс

дак вот из них уникальных 70 тыс где то
И все эти фамилии в ручную думаю не очень быстро поправить


Kobik   (2005-09-08 20:15:00) [4]

Да это наверно глюк форума. Дату гляньте :)

>11.06.05 07:08


Frost (Freak)   (2005-09-08 12:45:00) [5]

Ага, делает визуализацию перевода ФИО в родительный падеж :)))))


DeadMeat   (2005-09-08 12:36:00) [6]

А может он на OpenGL это дело мутит...


Sphinx   (2005-09-08 12:19:00) [7]

Я так понял эту ветку переместили...
Но почему в Игры ? :0


Frost (Freak)   (2005-09-08 12:12:00) [8]

Что за прикол? Дружок, ты форумом не ошибся? Какое отношение твой вопрос имеет к играм?


ольга   (2005-09-08 10:45:00) [9]


Koala   (2005-06-11 17:27:00) [10]

Часть 3
function GetDeclensionName (Name : string; Sex : integer;
                           CaseName : integer) : string;
var
i1 : integer;
s1 : string;
begin
 i := Length(Name);
 s := copy(Name,i,1);
 i := 1;
while s <> alphavit[i] do
 i := i +1;
case sex of
0 : begin // мужской пол
      if i <= 20 then  // Иван, Петр, Ярослав...
        begin
          case CaseName of
            0 : Result := Name + 'а';  // родительный падеж
            1 : Result := Name + 'у';  // дательный падеж
          end;
        end
      else
       begin
         case i of
           24 : begin   // 'й' - Сергей, Дмитрий...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'я';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'ю';
                        end;
                  end;
                end;
           21 : begin   // 'а' - Фома...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'у';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'е';
                        end;
                  end;
                end;
           30 : begin   // 'я' - Илья...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'ю';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'е';
                        end;
                  end;
                end;
           31 : begin   // 'ь' - Игорь...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'ю';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'я';
                        end;
                  end;
                end;
         end;
       end;
    end;
1 : begin // женский пол
      i1 := Length(Name);
      s1 := copy(Name,i1-1,2);
      if s1 = 'ия' then // Виктория.....
         case CaseName of
            0 : begin // родительный падеж
                  i := Length(Name);
                  Name := copy(Name,1, i - 1);
                  Result := Name + 'ю';
                end;
            1 : begin // дательный падеж
                  i := Length(Name);
                  Name := copy(Name,1, i - 1);
                  Result := Name + 'и';
                end;
         end;
         case i of
           21 : begin   // 'а' - Татьяна, Людмила...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'у';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'е';
                        end;
                  end;
                end;
           30 : begin   // 'я' - Зоя...
                  case CaseName of
                    0 : begin // родительный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'ю';
                        end;
                    1 : begin // дательный падеж
                          i := Length(Name);
                          Name := copy(Name,1, i - 1);
                          Result := Name + 'е';
                        end;
                  end;
                end;
         end;
    end;
end;
end;

function GetDeclensionFathername (Fathername : string; Sex : integer;
                                 CaseFathername : integer) : string;
begin
case sex of
0 : begin // мужской пол
       case CaseFathername of
        0 : Result := Fathername + 'а';  // родительный падеж
        1 : Result := Fathername + 'у';  // дательный падеж
       end;
    end;
1 : begin // женский пол
       case CaseFathername of
        0 : begin // родительный падеж
              i := Length(Fathername);
              Fathername := copy(Fathername,1, i - 1);
              Result := Fathername + 'у';
            end;
        1 : begin // дательный падеж
              i := Length(Fathername);
              Fathername := copy(Fathername,1, i - 1);
              Result := Fathername + 'е';
            end;
       end;
    end;
end;


Koala   (2005-06-11 17:26:00) [11]

продолжение
if (s2 = 'жа') and (Sex = 1) then  // Ганжа...
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
 if (s3 = 'онь') and (Sex = 0) then  // Белоконь...
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
if (s3 = 'дзе') or (s3 = 'или') then  // Грузинские фамилии
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
if (s2 = 'ой') and (Sex = 0) and (i = 3) then  // Цой...
 begin
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'я';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'ю';
         end;
   end;
 end;
if (s2 = 'ой') and (Sex = 1) and (i = 3) then  // Цой...
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
i1 := 1;
while s1 <> alphavit[i1] do
 i1 := i1 +1;
if (sex = 0) and (i1 <= 20) then
   case CaseSurname of
     0 : Result := Surname + 'а';  // родительный падеж
     1 : Result := Surname + 'у';  // дательный падеж
   end;
if (sex = 0) and (s2 = 'дь') then  // Лебедь
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'я';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'ю';
         end;
   end;
if (sex = 1) and (i1 <= 20) then
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
if (sex = 1) and (s1 = 'а') then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'у';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'ой';
         end;
   end;
if (sex = 0) and (s1 = 'а') then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'у';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'е';
         end;
   end;
if (sex = 0) and (s2 = 'ой') and (i > 3) then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'го';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'му';
         end;
   end;
if (sex = 1) and (s2 = 'ая') and (i > 3) then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'ую';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 1);
           Result := Surname + 'ой';
         end;
   end;
if (sex = 0) and (i > 3) and (s2 = 'ий') or (s2 = 'ый')then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 2);
           Result := Surname + 'ого';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 2);
           Result := Surname + 'ому';
         end;
   end;
if (sex = 1) and (i > 3) and (s2 = 'ая') then
   case CaseSurname of
     0 : begin // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 2);
           Result := Surname + 'ую';
         end;
     1 : begin // дательный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 2);
           Result := Surname + 'ой';
         end;
   end;
end;


Koala   (2005-06-11 17:24:00) [12]

Попробуй эту функцию (делю на 2 части):

const
alphavit : array[1..32] of string =
('б','в','г','д','ж','з','к','л','м','н','п','р','с','т','ф','х','ц','ч','ш','щ',
'а','е','и','й','о','у','ы','э','ю','я','ь','ъ');


Функции для склонения фамилии, имени, отчества  
                     Пол (Sex)    0: мужской                             //
//                                     1: женский                             //
//                                                                                 //
//                    Падеж (Getcase)  0: родительный               //
//                                             1: дательный  

function GetDeclensionSurname (Surname : string; Sex : integer;
                              CaseSurname : integer) : string;
var
s1, s2, s3 : string;
i1         : integer;
begin
i := Length(Surname);
if i <= 2 then
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
s1 := copy(Surname,i,1);
s2 := copy(Surname,i-1,2);
s3 := copy(Surname,i-2,3);
if (s2 = 'их') or (s2 = 'ых') then  // Сибирские фамилии
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
   exit;
 end;
 if (s3 = 'кая') and (Sex = 1) then  // Лобановская...
 begin
   case CaseSurname of
     0,1 : begin // дательный падеж  // родительный падеж
           i := Length(Surname);
           Surname := copy(Surname,1, i - 2);
           Result := Surname + 'ой';
           exit;
         end;
   end;
 end;
if (s1 = 'о') then  // Украинские фамилии
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
   exit;
 end;
if (s2 = 'уа') then  // Стуруа...
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;
if (s2 = 'иа') then  // Тутухиа...
 begin
   case CaseSurname of
     0 : Result := Surname;  // родительный падеж
     1 : Result := Surname;  // дательный падеж
   end;
 end;


Homa_Programer   (2005-06-11 12:41:00) [13]

Удалено модератором


isasa   (2005-06-11 10:48:00) [14]

Способа решения два ;)
Первый - писать функцию перевода, реализующую правила,
второй - выборка имен по
select ... group ...
и быстренько ручками перевести.

Второй вариант, даже на базах больших объемов дает неплохой результат.
Уникальных немного.
И если учитывать многие неожиданные исключения из правил,
на мой взгляд предпочтительнее


Anatoly Podgoretsky   (2005-06-11 08:43:00) [15]

Предлагаешь нам поискать учебник?
Но это уже услуга, а не ответ в конференции, соответсвенно с этим уже в другую конференцию.
По вопросу, задача решения не имеет.


Homa_Programer   (2005-06-11 08:23:00) [16]

> Defunct ©
не смешно! да и их под руками нету :(


Defunct   (2005-06-11 07:53:00) [17]

книжки "русский язык" за 2-й и 3-й класс Вам исчерпывающе помогут.
на полном серьезе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо