Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

ФИО из базы данных в родительском падеже   Найти похожие ветки 

 
Homa_Programer ©   (2005-06-11 07:08) [0]

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

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


 
Defunct ©   (2005-06-11 07:53) [1]

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


 
Homa_Programer ©   (2005-06-11 08:23) [2]

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


 
Anatoly Podgoretsky ©   (2005-06-11 08:43) [3]

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


 
isasa ©   (2005-06-11 10:48) [4]

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

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


 
Homa_Programer ©   (2005-06-11 12:41) [5]

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


 
Koala ©   (2005-06-11 17:24) [6]

Попробуй эту функцию (делю на 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;


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

продолжение
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:27) [8]

Часть 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;


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



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

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


 
Sphinx ©   (2005-09-08 12:19) [11]

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


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

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


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

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


 
Kobik ©   (2005-09-08 20:15) [14]

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

>11.06.05 07:08


 
DDA ©   (2005-09-08 20:46) [15]


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


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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2005-09-08 22:36) [17]

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.049 c
15-1139951775
ArtemESC
2006-02-15 00:16
2006.03.12
Компиляторы...


15-1139941157
YurikGL
2006-02-14 21:19
2006.03.12
Путь модератора...


2-1140886598
Radagast
2006-02-25 19:56
2006.03.12
Invalid floating point operation


2-1140291757
ForX
2006-02-18 22:42
2006.03.12
Клиент - Сервер


15-1140025618
mr. Den
2006-02-15 20:46
2006.03.12
Люди ! Хелпь, плиз !