On-line: Pasha, Haz, гостей 2. Всего: 4 [подробнее..]
АвторСообщение
Администратор




Пост N: 2478
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.08.12 08:33. Заголовок: Склонение фамилии


Не поделится ли кто-нибудь алгоритмом склонения ФИО в родительный/дательный падеж ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]


администратор




Пост N: 2495
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.08.12 09:40. Заголовок: Давно где то в инете..


Давно где то в инете нашел

 
********************************************
* Преобразование мужской фамилии
********************************************
Function Fam_m(Fam, Pad) // параметры фамилия в именит. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL OK,LEN,Fam_m:=""
LOCAL OKI:={"","","","","",""} // определяем массив окончаний

Len=Len(Fam) // определяем количество букв в фамилии

Ok=RIGHT(Fam, 3) // берем последние 3 буквы фамилии
If Ok="кий" .OR. Ok="ний"; // если окончание такое

Fam=LEFT(Fam, len-2) // то формируем фамилию
Do Case
Case Ok="кий"
Oki={"ий","ого","ому","ого","им","ом"}
Case Ok="ний"
Oki={"ий","его","ему","его","им","ем"}
EndCase
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf

***** перебираем другие окончания
Ok=RIGHT(Fam, 2) // берем последние две буквы
If Ok="ий"
Fam=LEFT(Fam, Len-1) // формируем фамилию
Oki={"й","я","ю","я","ем","и"}
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf

Do Case
Case Ok="ын" .OR. Ok="ин" .OR. Ok="ев" .OR. Ok="ёв" .OR. Ok="ов"
Oki={"","а","у","а","ым","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ян" .OR. Ok="ан" .OR. Ok="он" .OR. Ok="ук" ;
.OR. Ok="юк" .OR. Ok="яр"
Oki={"","а","у","а","ом","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ок"
If Pad>1
Fam=LEFT(Fam, len-2)+"к"
EndIf
Oki={"","а","у","а","ом","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ый" .OR. Ok="ой"
Fam=LEFT(Fam, Len-2)
Oki={OK,"ого","ому","ого","ым","ом"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
Case Ok="ич"
Oki={"","а","у","а","ем","е"}
Fam_m=Fam+Oki[Pad]
Return Fam_m
CASE OK=="ей"
If LEFT(RIGHT(FAM,3),1)=="л"//ПЕРЕД OK НАХОДИТСЯ МЯГКАЯ СОГЛАСНАЯ: ВОДОЛЕЙ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ея","ею","ея","ем","ее"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
Else //ПЕРЕД OK НАХОДИТСЯ ТВЕРДАЯ СОГЛАСНАЯ: ВОРОБЕЙ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ья","ью","ья","ьем","ье"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
EndIF
CASE OK=="ец"
IF LEFT(RIGHT(FAM,3),1)=="л"//ПЕРЕД OK НАХОДИТСЯ МЯГКАЯ СОГЛАСНАЯ: СТРЕЛЕЦ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ьца","ьцу","ьца","ьцом","ьце"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
ELSE //ПАСОВЕЦ
FAM=LEFT(FAM, LEN-2)
OKI={OK,"ца","цу","ца","цом","це"}
FAM_M=FAM+OKI[PAD]
RETURN FAM_M
ENDIF
EndCase

OK=RIGHT(FAM, 1) // берем последнию букву
DO CASE
CASE OK=="а"
Fam=LEFT(Fam, Len-1)
Oki={"а","ы","е","у","е","ой"}
//НУЛЕВОЕ ОКОНЧАНИЕ
CASE OK!="е" .AND. OK!="ё" .AND. OK!="и" .AND. OK!="о" ;
.AND. OK!="у" .AND. OK!="э" .AND. OK!="ю" .AND. OK!="я"
OKI={"","а","у","а","ом","е"}
ENDCASE
Fam_m=Fam+Oki[Pad]
Return Fam_m

********************************************
* Преобразование женской фамилии
********************************************
Function Fam_w(Fam, Pad) // параметры фамилия в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL OK,LEN,Fam_m:=""
LOCAL OKI:={"","","","","",""} // определяем массив окончаний


Len=Len(Fam) // определяем количество букв в фамилии

Ok=RIGHT(Fam, 2)
//Ok=Substr(Fam, Len-1, 2) // берем посление 3 буквы фамилии
If Ok="ая" .OR. Ok="яя"; // если окончание такое

Fam=LEFT(Fam,len-2) // то формируем фамилию
Do Case
Case Ok="ая"
Oki={"ая","ой","ой","ую","ой","ой"}
Case Ok="яя"
Oki={"яя","ей","ей","юю","ей","ей"}
EndCase
Fam_m=Fam+Oki[Pad] // добавляем к фамилии окончание
Return Fam_m // возвращем результат
EndIf


***** перебираем другие окончания

Ok=RIGHT(Fam, 3) // берем последние две буквы
//Ok=Substr(Fam, Len-2, 3) // берем последние две буквы

If Ok="ова" .OR. Ok="ева" .OR. Ok="ёва" .OR. Ok="ина"
Fam=LEFT(Fam, Len-1) // формируем фамилию
Oki={"а","ой","ой","у","ой","ой"}
EndIf

Fam_m=Fam+Oki[Pad]
Return Fam_m

**************************************************
* Функция преобразования мужского имени
*
*
**************************************************

Function Name_m(Name, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL Oki[6] // определяем массив окончаний
LOCAL OK

Ok=RIGHT(Name, 1) // смотрим окончание
IF Ok="й"
Oki={OK,"я","ю","я","ем","е"}
Name=LEFT(Name, Len(Name)-1)
ELSE
Oki={"","а","у","а","ом","е"}
ENDIF
Return Name+Oki[Pad]

**************************************************
* Функция преобразования женского имени
*
*
**************************************************

Function Name_w(Name, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL Oki[6] // определяем массив окончаний
LOCAL OK

Ok=RIGHT(Name, 1) // смотрим окончание
Do Case
Case Ok="а"
Oki={OK,"ы","е","у","ой","е"}
OK=RIGHT(NAME,2) //ОЛЬГА
IF OK=='ка'.OR. OK=='га' .OR. OK=='жа' .OR. ;
OK=='ха' .OR. OK=='ша' .OR. OK=='ща'
OKI[2]="и"
ENDIF
Name=LEFT(Name, Len(Name)-1)
Case Ok="я"
IF RIGHT(NAME,2)="ия"
Oki={"я","и","и","ю","ей","и"}
ELSE
Oki={OK,"и","е","ю","ей","и"}
ENDIF
Name=LEFT(Name, Len(Name)-1)
CASE OK=="и"
OKI={"","","","","",""}
EndCase
Return Name+Oki[Pad]

**************************************************
* Функция преобразования мужского отчества
*
*
**************************************************

Function SoName_m(SoName, Pad) // параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL Oki[6] // определяем массив окончаний
LOCAL OK

OK=RIGHT(SONAME, 1) // смотрим окончание
Oki={"","а","у","а","ем","е"}
Return SoName+Oki[Pad]

**************************************************
* Функция преобразования женского отчества
*
*
**************************************************

Function SoName_w(SoName, Pad) //параметры: имя в имен. падеже
// и требуемый падеж
// 1-именительный
// 2-родительный
// 3-дательный
// 4-винительный
// 5-творительный
// 6-предложный

LOCAL Oki[6] // определяем массив окончаний
LOCAL OK

Ok=RIGHT(SoName, 1) // смотрим окончание
If Ok="а"
Oki={"а","ы","е","у","ой","е"}
SoName=LEFT(SoName, Len(SoName)-1)
EndIf
Return SoName+Oki[Pad]


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2479
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.08.12 10:55. Заголовок: Спасибо, работает вп..


Спасибо, работает вполне прилично, хоть и не идеально.
Некоторые мужские фамилии склоняет неправильно, но это можно допилить

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 447
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет