Форум » Для флейма » Склонение фамилии » Ответить

Склонение фамилии

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

Ответов - 2

Dima: Давно где то в инете нашел [pre2] ******************************************** * Преобразование мужской фамилии ******************************************** 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] [/pre2]

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



полная версия страницы