:: Архив конференции по VFP до 2005 года
Склонение фамилии по падежам
Vladimir_Knyr
Автор

Сообщений: 1711
Откуда: г. Енисейск
Дата регистрации: 15.12.2003
Готовая рабочая процедура - дело за малым (может я не все случаи учел для разных хитрых фамилий, имени отчеств)
(фамилии бывают очень разные)
если кто-то примет участие в выявлении этих самых хитрых фамилий, буду очень благодарен
* процедура тестирования функции "SclonFio"
close tables
if !file('sotrpageg.dbf')
create table sotrpageg (pol n(1),fam c(15),im c(15),father c(15))
use
endif
use sotrpageg in 0
select sotrpageg
browse && для ввода тестовых фамилий
pp = 5 && номер тестируемого падежа
local f,i,o
scan
f = fam
i = im
o = Father
SclonFio(@f,@i,@o,pp,pol,.t.)
wait f+' '+i+' '+o window
endscan
use
return && конец процедуры тестирования функции "SclonFio"
function SclonFio && функция склонения Ф.И.О. по падежам русского языка
lparameters c_fam,c_im,c_ot,p,rod,f_sclon
* c_fam фамилия
* c_im Имя
* c_ot Отчество
* p Падеж (2,3,4,5,6 - Род., Дат., Вин., Твор., Пред. соответ-но)
* rod Пол (0 - муж. другое значение - жен)
* f_sclon Нужно ли склонение фамилии (для мужчин)
local o1,o2
* o1 - предпоследняя буква
* o2 - последняя буква
* тест входных параметров
c_fam = iif(type('c_fam')='C' and len(c_fam)>1,iif(p=6 and f_sclon,'о ','')+alltrim(c_fam),'')
c_im = iif(type('c_im')='C' and len(c_im)>1,alltrim(c_im),'')
c_ot = iif(type('c_ot')='C' and len(c_ot)>1,alltrim(c_ot),'')
p = iif(type('p')='N',p,2)
rod = iif(type('rod')='N',rod,0)
f_sclon = iif(type('f_sclon')='L',f_sclon,.f.)
o1 = left(right(c_fam,2),1) && предпоследняя буква
o2 = right(c_fam,1) && последняя буква
if rod = 0 && муж.
if f_sclon and !empty(c_fam)&& надо склонять фамилию
if !(o2$'уыеаоэяию') && если на конце согласная
do case
case o2 = 'й' && убираем окончание 2 или 1 букву и добавляем окончание по падежу
c_fam = substr(c_fam,1,len(c_fam)-iif(o1$'иы',2,1)) +;
iif(o1$'иы',iif(p=2 or p=4,'ого',iif(p=3,'ому',iif(p=5,o1+'м','ом'))),;
iif(p=2 or p=4,'я',iif(p=3,'ю',iif(p=5,'ем','е'))))
case o2 = 'ь'
c_fam = substr(c_fam,1,len(c_fam)-1)+iif(p=2 or p=4,'я',iif(p=3,'ю',iif(p=5,'ем','е')))
case o1+o2$'ец'
c_fam = substr(c_fam,1,len(c_fam)-2)+'ьц'+iif(p=2 or p=4,'а',iif(p=3,'у',iif(p=5,'ом','е')))
case o1+o2$'ок'
c_fam = substr(c_fam,1,len(c_fam)-2)+'к'+iif(p=2 or p=4,'а',iif(p=3,'у',iif(p=5,'ом','е')))
otherwise
c_fam = c_fam+iif(p=2 or p=4,'а',iif(p=3,'у',iif(p=5,'ом','е')))
endcase
else
do case
case o2 = 'я'
c_fam = substr(c_fam,1,len(c_fam)-1)+iif(p=2 or p=4,'и',iif(p=3,'е',iif(p=5,'ей','е')))
otherwise
c_fam = c_fam
endcase
endif
endif
if !empty(c_im)
o2 = right(c_im,1)
if !(o2$'уыеаоэяию') && Обработка Имени
if o2 = 'й'
c_im = substr(c_im,1,len(c_im)-1) + iif(p=2 or p=4,'я',iif(p=3,'ю',iif(p=5,'ем','е')))
else
c_im = c_im + iif(p=2 or p=4,'а',iif(p=3,'у',iif(p=5,'ом','е')))
endif
endif
endif
if !empty(c_ot)
if !(right(c_ot,1)$'уеыаоэяию')
c_ot = c_ot + iif(p=2 or p=4,'а',iif(p=3,'у',iif(p=5,'ем','е')))
endif
endif
else && жен.
* Обработка Фамилии
if !empty(c_fam)
if o2='а' && если на конце буква 'а'
c_fam = substr(c_fam,1,len(c_fam)-1) + iif(p=2 or p=4,'у','ой')
else
if o2='я'
if o1 = 'а'
c_fam = substr(c_fam,1,len(c_fam)-2) + iif(p=2 or p=4,'ую','ой')
else
c_fam = substr(c_fam,1,len(c_fam)-1) + iif(p=2 or p=4,'и',iif(p=3,'е',iif(p=5,'ей','е')))
endif
endif
endif
endif
if !empty(c_im)
o2 = right(c_im,1) && Обработка Имени
do case
case o2 ='а'
c_im = substr(c_im,1,len(c_im)-1) + iif(p=2 or p=4,'у',iif(p=3,'е',iif(p=5,'ой','е')))
case o2 ='ь'
c_im = iif(p<>5,substr(c_im,1,len(c_im)-1)+'и',c_im+'ю')
case o2 ='я'
c_im = substr(c_im,1,len(c_im)-1)+iif(p<>5,'и','ей')
endcase
endif
if !empty(c_ot)
if right(c_ot,1)='а' && Обработка Отчества
c_ot = substr(c_ot,1,len(c_ot)-1) + iif(p=2 or p=4,'у',iif(p=3,'е',iif(p=5,'ой','е')))
endif
endif
endif
return && SclonFio




------------------
хороший код работать будет и обязан, а плохой не жалко.
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
nikser
Фамилии, оканчивающиеся на _ов склоняются неверно(петров-петровом,а не петровым)
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Por

Сообщений: 91
Дата регистрации: 28.07.2003
Соловьев-Седой
Склодовская-Кюри
Мамин-Сибиряк
Демут-Малиновский
Муравьев-Апостол
Леонардо Да-Винчи
Антуан де Сент-Экзюпери






------------------
Лень - двигатель прогресса.
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Пол человека по отчеству русскому можно однозначно определить.
Есть сайт - "Королевство Делфи"
www.delphikingdom.ru , мне предложенное решение очень понравилось. Посмотри, может проще будет, чем самому придумывать. Или почитай документацию к библиотеке, там можно полезные идеи подсмотреть.
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Vladimir_Knyr
Автор

Сообщений: 1711
Откуда: г. Енисейск
Дата регистрации: 15.12.2003
Спасибо всем. Доку посмотрел полезная.
На счет "самому делать" согласен, подумаю, а может и действительно не надо.




------------------
хороший код работать будет и обязан, а плохой не жалко.
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Alex Roublev

Сообщений: 3695
Откуда: Ярославль
Дата регистрации: 28.09.2002
Был такой министр внутренних дел в начале минувшего века по фамилии Плеве. Тут и вовсе не просклоняешь (непреклонный был человек). Плеве - он и в Африке Плеве (IMHO)...
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AFAIK есть и такие фамилии, которые могут склоняться, а могут и не склоняться - т.е. в зависимости от предпочтений их носителя (что ещё спорно), страны происхождения человека (что уже является правилом русского языка!), пола человека (а кто есть тот-же Сент-Экзюпери - мужчина или женщина? Поди ты по фамилии определи А ещё и имена иногда по паспорту дают ребёнку не Александр(а) а скажем Саша). Достаточно в поисковике спросить "(не)склоняемые фамилии" как получится масса материала к размышлению.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Vladimir_Knyr
Автор

Сообщений: 1711
Откуда: г. Енисейск
Дата регистрации: 15.12.2003
Плеве - он и в Африке Плеве
чего-то сразу растерялся, эта ситуауия как раз учтена и склоняться не будет
Пол человека по отчеству русскому можно однозначно определить
не всегда есть полное отчество - часто одни инициалы
могут склоняться, а могут и не склоняться
пока это просто параметр
f_sclon && Нужно ли склонение фамилии (для мужчин)

Еще раз спасибо всем (это не прекращение темы)
======================================
А все таки эту функцию делать я буду это же простое ветвление
(почему у дельфина есть, а у лисы нету)
это же не та ситуация, что бы без постороннего средства нельзя было обойтись !

Достаточно в поисковике спросить
вот эт не допетрил, а именно предпочел диалог




------------------
хороший код работать будет и обязан, а плохой не жалко.
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цитата:
А все таки эту функцию делать
Ну делать то оно конечно можно... Я бы даже сказал что реализовать алгоритм - это на фоксе элементарно делается, другой вопрос как сам алгоритм построить Как учесть кого можно склонять, а кого нельзя... Тут то как раз даже у филологов 100% согласия нету, о чём и можно посмотреть в инете... Возможно для программ где это критично, стоит:
а) Вместе с человеком хранить признак - склоняется его фомилия или нет (проставляемый при вводе фамилии автоматически, но который можно поправить, если вдруг выяснится, что этот конкретный человек не желает чтоб его склоняли - в хорошем смысле этого слова )
б) Тут-же при вводе показывать как именно будет выглядеть ФИО в разных падежах - тогда сразу будет видна ошибка, если она есть в алгоритме...
P.S. Блин насколько-же проще всё в Английском языке то




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Склонение фамилии по падежам
region
В Парусе, кстати, так и сделано - есть поля для галочек склонять или нет.
Ratings: 0 negative/0 positive


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

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

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