Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;


 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.012 c
2-1140975612
Volkodav
2006-02-26 20:40
2006.03.12
Полоса перемотки для MediaPlayer1


15-1140355402
Ruban
2006-02-19 16:23
2006.03.12
Ctrl+Z


11-1121017425
Serg777
2005-07-10 21:43
2006.03.12
WS_POPUP и ListBox = постоянная перерисовка


3-1135230595
vista
2005-12-22 08:49
2006.03.12
Удаленный доступ к серверу Oracle


2-1140530847
Korefey
2006-02-21 17:07
2006.03.12
преобразование числа в строку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский