:: Архив конференции по VFP до 2005 года
Падежные окончания ....ААА горю...
Niki

Сообщений: 208
Откуда: Великий Новгород
Дата регистрации: 13.05.2001
АААА, Братцыыыы.... горю.....завтра тему сдавать.....30% сделано, работы куча, помогайте....
Задачка простая, не торорясь написал бы сам, но нет времени......
В базе есть имя, фамилия, отчество Петров Иван Иванович - иминительный падеж...
Пупкина Любовь Петровна.....Пак Борис Петрович.....Сат Юрий Эйзирикпеевич...и т.д.
Нужно получить дательный - Петрову Ивану Ивановичу .....и т.д.
У кого может быть есть готовый модуль чтобы мне особо мозгами не приседать.....
Я пока основную тему попишу......
С меня море пива при встрече



[i][small][color=Gray]Отредактировано (23.10.03 20:10)


------------------
Со всем уважением к Вам, Niki
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Года два назад нашел чудную вещь:
www.delphikingdom.ru
Склоняет прекрасно во все падежи, только есть момент - если отчество задано полностью, то больше ничего не надо, а если только имя или фамилия и имя, то нужно указать пол. Есть настройка для всяких исключений в виде ini-файла, но за два года работы (таблица порядка 6 тысяч человек) ошибок не замечал...
Библиотека сделана на дельфи в виде DLL вызывается из фокса без проблем.



[i][small][color=Gray]Отредактировано (24.10.03 04:48)


------------------
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
ivan_kg

Сообщений: 152
Откуда: Москва
Дата регистрации: 22.11.2001
Хорошо, когда русские фамилии, да имена....
Пападись вам как у нас в киргизстане какой нибудь Нурбек уулу Болот или Нургуль кызы Трахторбек
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
Niki

Сообщений: 208
Откуда: Великий Новгород
Дата регистрации: 13.05.2001
matod !Спасибо !А примерчик использования не чиркнешь?

PS. Спасибо Михаилу Савину, то-же мне прислал, хорошую функцию....
Наверное теперь успею , хотя клава уже дымиться, и спать охота....
вечерком по



[i][small][color=Gray]Отредактировано (24.10.03 09:17)


------------------
Со всем уважением к Вам, Niki
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
Gliph
Автор

Сообщений: 554
Откуда: Сумы - Украина
Дата регистрации: 31.10.2002
Пишу - пишу, все инет вылетает.
Мож код большой.......
Если не выйдет - отправлю на мыло
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
Gliph
Автор

Сообщений: 554
Откуда: Сумы - Украина
Дата регистрации: 31.10.2002
*********************************************************
* Функция преобразования фамилии, имя, отчества
* в форму нужного падежа
*
* Аргументы:
* mFamily - фамилия
* mName - имя
* mSoName - отчество
* Pol - пол (допустимые значения "м", "ж")
* Padeg - падеж (допустимые значения 1..6)
* && 1-именительный
* && 2-родительный
* && 3-дательный
* && 4-винительный
* && 5-творительный
* && 6-предложный
*********************************************************

Function FIO
Parameter mFamily, mName, mSoName, Pol, Padeg

mFamily=AllTrim(mFamily)
mName=AllTrim(mName)
mSoName=AllTrim(mSoName)

If Between(Padeg, 1, 6)
Pol=Lower(Pol)
Do Case
Case Pol="м"
mFio=Fam_m(mFamily, padeg) && преобразуем фамилию
mFio=mFio + " " + Name_m(mName, padeg) && преобразуем имя
mFio=mFio + " " + SoName_m(mSoName, padeg) && преобразуем
отчество
Case Pol="ж"
mFio=Fam_w(mFamily, padeg) && преобразуем фамилию
mFio=mFio + " " + Name_w(mName, padeg) && преобразуем имя
mFio=mFio + " " + SoName_w(mSoName, padeg) && преобразуем
отчество
OtherWise && если не указан пол, выдаем сообщение об ощибке
mFio="Hеверно указан пол !"
EndCase
ELSE
mFio="Hедопустимое значение падежа !"
EndIf
Return mFio




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

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

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

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

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

***** перебираем другие окончания
Ok=Substr(Fam, Len-1, 2) && берем последние две буквы
If Ok="ий"
Fam=Substr(Fam, 1, Len-1) && формируем фамилию
Oki[1]="й"
Oki[2]="я"
Oki[3]="ю"
Oki[4]="я"
Oki[5]="ём"
Oki[6]="е"
Fam_m=Fam+Oki[Pad] && добавляем к фамилии окончание
Return Fam_m && возвращем результат
EndIf

Do Case
Case Ok="ын" .OR. Ok="ин" .OR. Ok="ев" .OR. Ok="ёв" .OR. Ok="ов"
Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ым"
Oki[6]="е"
Case Ok="ян" .OR. Ok="ан" .OR. Ok="он" .OR. Ok="ук" ;
.OR. Ok="юк" .OR. Ok="яр"
Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ом"
Oki[6]="е"
Case Ok="ок"
If Pad>1
Fam=Substr(Fam, 1 , len-2)+"к"
EndIf
Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ом"
Oki[6]="е"
Case Ok="ый" .OR. Ok="ой"
Fam=Substr(Fam, 1, Len-2)
Oki[1]=""
Oki[2]="ого"
Oki[3]="ому"
Oki[4]="ого"
Oki[5]="ым"
Oki[6]="ом"
Case Ok="ич"
Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ем"
Oki[6]="е"
EndCase
Fam_m=Fam+Oki[Pad]
Return Fam_m



********************************************
* Преобразование женской фамилии
********************************************
Function Fam_w

Parameter Fam, Pad && параметры фамилия в имен. падеже
&& и требуемый падеж
&& 1-именительный
&& 2-родительный
&& 3-дательный
&& 4-винительный
&& 5-творительный
&& 6-предложный

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

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

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

Fam=Substr(Fam, 1, len-2) && то формируем фамилию
Do Case
Case Ok="ая"
Oki[1]="ая"
Oki[2]="ой"
Oki[3]="ой"
Oki[4]="ую"
Oki[5]="ой"
Oki[6]="ой"
Case Ok="яя"
Oki[1]="яя"
Oki[2]="ей"
Oki[3]="ей"
Oki[4]="юю"
Oki[5]="ей"
Oki[6]="ей"
EndCase
Fam_m=Fam+Oki[Pad] && добавляем к фамилии окончание
Return Fam_m && возвращем результат
EndIf


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

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

If Ok="ова" .OR. Ok="ева" .OR. Ok="ёва" .OR. Ok="ина"
Fam=Substr(Fam, 1, Len-1) && формируем фамилию
Oki[1]=Ok
Oki[2]="ой"
Oki[3]="ой"
Oki[4]="у"
Oki[5]="ой"
Oki[6]="ой"
EndIf

Fam_m=Fam+Oki[Pad]
Return Fam_m



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

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

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

Name=Proper(Name)
Len=Len(Name)

Ok=Substr(Name, Len, 1) && смотрим окончание
Do Case
Case Ok="й"
Oki[1]=""
Oki[2]="я"
Oki[3]="ю"
Oki[4]="я"
Oki[5]="ем"
Oki[6]="е"
Name=Substr(Name, 1, Len-1)
OtherWise
Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ом"
Oki[6]="е"
EndCase
Name_m=Name+Oki[Pad]
Return Name_m



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

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

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

Name=Proper(Name)
Len=Len(Name)

Ok=Substr(Name, Len, 1) && смотрим окончание
Do Case
Case Ok="а"
Oki[1]=""
Oki[2]="ы"
Oki[3]="е"
Oki[4]="у"
Oki[5]="ой"
Oki[6]="е"
Name=Substr(Name, 1, Len-1)
Case Ok="я"
Oki[1]=""
Oki[2]="и"
Oki[3]="е"
Oki[4]="ю"
Oki[5]="ей"
Oki[6]="и"
Name=Substr(Name, 1, Len-1)
EndCase
Name_m=Name+Oki[Pad]
Return Name_m




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

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

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

SoName=Proper(SoName)
Len=Len(SoName)

Oki[1]=""
Oki[2]="а"
Oki[3]="у"
Oki[4]="а"
Oki[5]="ем"
Oki[6]="е"

SoName_m=SoName+Oki[Pad]
Return SoName_m




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

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

Declare Oki(6) && определяем массив окончаний
Store "" to Oki

SoName=Proper(SoName)
Len=Len(SoName)

Ok=Substr(SoName, Len, 1) && смотрим окончание
If Ok="а"
Oki[1]="а"
Oki[2]="ы"
Oki[3]="е"
Oki[4]="у"
Oki[5]="ой"
Oki[6]="е"
SoName=Substr(SoName, 1, Len-1)
EndIf
SoName_w=SoName+Oki[Pad]
Return SoName_w
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
Niki

Сообщений: 208
Откуда: Великий Новгород
Дата регистрации: 13.05.2001
Ну, завалили решениями, ну спасибо !
Вот чего мне у нас нравиться (хоть нас все и хают) так это скорая помощь....которую не встретишь на других языках.....
Это наверное потому что наш фоксяра от Мфох+ да Рбэйсов (коммунистических времен) далеко не ушел, чувствуется воспитание....
А вообще эту тему в решения надо положить, чтоб не париться кому то лишний раз.
Ладно, работать всем.
Всем спасибо, все свободны....




------------------
Со всем уважением к Вам, Niki
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Пример использования padeg.dll. Эта самое простое применение этой библиотеки. Предполагается, что ФИО задано полностью и надо получить родительный падеж.
function RODFIO
lparameters tc
Declare INTEGER GetFIOPadegFSAS IN padeg.dll As GetPadeg ;
STRING @pFIO, LONG nPadeg, STRING @pResult, LONG @nLen
local res, lcRet, ln
lcRet = replicate(' ',255)
res=1
ln = len(m.lcRet)
res = GetPadeg( @tc, 3, @lcRet, @ln )
res = at(chr(0),m.lcRet)
if m.res>0
lcRet = substr( m.lcRet, 1, m.res-1 )
endif
return padr(m.lcRet, 50, ' ' )
DLL-ка само-собой должна лежать в пределах видимости (обычно Windows\System или в текущем каталоге программы)
Ratings: 0 negative/0 positive
Re: Падежные окончания ....ААА горю...
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
А вот интересно действительно, будет эта библиотека на таких фамилиях правильно работать? Вообще в доке к ней написано, что по крайней мере Кызы и Оглы она понимает правильно .
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 6 (Гостей: 6)

© 2000-2024 Fox Club 
Яндекс.Метрика