Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» ФИО в родительный падеж

Автор: Privetik
Дата сообщения: 06.04.2004 20:34
Понадобилась такая штука для 1С, но знать бы алгоритм - или хотя бы листинг на языке - перевести сумею.
Автор: Sleepwalker
Дата сообщения: 07.04.2004 08:27
кхы..
типа Дмитрий Валентинович - Дмитрия Валентиновича?

ну... в принципе, я думаю, т.к. меняется только окончание - составить таблицу соответствий... фамилии ведь тоже конечное число окончаний имеют
Автор: UncoNNecteD
Дата сообщения: 07.04.2004 18:57
Это задача близкая к ИИ
Автор: EAS
Дата сообщения: 07.04.2004 19:17
Думается есть два варианта:
1. Как предлагает Sleepwalker.
2. См. алгоритмы по склонению слов в учебнике по русскому языку , что суть тоже самое, т.к. IMHO самая простая их реализация будет табличная

Правда при любых раскладах найдется человек с таким ФИО, что ни по каким правилам не просклоняешь (ну, какой-нить папуас)
Автор: Sleepwalker
Дата сообщения: 08.04.2004 09:15
UncoNNecteD
надо заметить: только для русского языка в том же англ-ом такой проблемы вообще нет
Автор: UncoNNecteD
Дата сообщения: 08.04.2004 11:13
Ага.
Именно по этому не люблю русскоязычные программы/игры и прочую лабуду, типа языка программиррования 1С
Автор: Kokoc
Дата сообщения: 08.04.2004 13:21
Кстати, фамилии сколняются по другому алгоритму, чем имена и отчества (например, окончание на -ий).
Для имени и отчества может подойти такая функция:


Код:
char *pad(char *out,unsigned char op, char *in) {
register unsigned char *w, *ws;
int s;

*out=0;
w=ws=in;
for (;*w && *w!=' ';w++);
if (w==ws) return(in);
s=w-ws;
memmove(out,ws,s);
out[s--]=0;
w--;
if (op==(unsigned char)'р') {
if (*w==(unsigned char)'а')
strcpy(out+s,"ы");
else if (memcmp(w-1,"ль",2)==0)
strcpy(out+s-1,"ля");
else if (*w==(unsigned char)'ь')
strcpy(out+s,"я");
else if (memcmp(w-1,"ая",2)==0)
strcpy(out+s-1,"ой");
else if (memcmp(w-1,"яя",2)==0)
strcpy(out+s-1,"ей");
else if (memcmp(w-1,"ий",2)==0)
strcpy(out+s-1,"ия");
else if (memcmp(w-1,"ай",2)==0)
strcpy(out+s-1,"ая");
else if (memcmp(w-1,"ей",2)==0)
strcpy(out+s-1,"ея");
else if (*w!=(unsigned char)'о')
strcpy(out+s+1,"а");
}
else if (op==(unsigned char)'д') {
if (*w==(unsigned char)'а')
strcpy(out+s,"е");
else if (memcmp(w-1,"ть",2)==0)
strcpy(out+s-1,"ти");
else if (*w==(unsigned char)'ь')
strcpy(out+s,"ю");
else if (memcmp(w-1,"ая",2)==0)
strcpy(out+s-1,"ой");
else if (memcmp(w-1,"ий",2)==0)
strcpy(out+s-1,"ию");
else if (memcmp(w-1,"ай",2)==0)
strcpy(out+s-1,"аю");
else if (memcmp(w-1,"ей",2)==0)
strcpy(out+s-1,"ею");
else if (*w!=(unsigned char)'о')
{out[s]=*w;strcpy(out+s+1,"у");}
}
return(out);
}
Автор: Sleepwalker
Дата сообщения: 08.04.2004 13:47
ужас какой...
Автор: Blins
Дата сообщения: 08.04.2004 15:27
IMHO задача алгоритмически корректно решена быть не может, т.к. "редкие" фамилии на самом деле не так уж редко встречаются. Напр. фамилия МИХАЙ - как определить мужская или женская? Иностранцев, лиц кавказской наружности - все больше к тому же.
Проще всего позволить пользователю задать (один раз, т.к. нужен только родит. падеж) эту самую форму родит. падежа - и наслаждаться успехом (не морочиться по поводу несклоняемых женских фамилий, типа БУРАВИЧ). Запомнить это в базе и потом подставлять найденное в следующий раз. Т.к. это 1С, то вряд-ли пополняется большим количеством новых контрагентов за день...
Автор: Infection
Дата сообщения: 09.04.2004 07:16
че вы голову морочите?

возьмите правила от ispell, который Лебедем намутил

http://www.yandex.ru/yandsearch?text=ispell+%CB%E5%E1%E5%E4%E5%E2&stype=&nl=0
Автор: Privetik
Дата сообщения: 15.04.2004 12:34
Есть другая программа. ОЧЕНЬ хорошая - склоняет по всем падежам. В виде dll и модулей для word и excel. Кому надо - пишите pal_ok@mail.ru

Страницы: 1

Предыдущая тема: Прогресбар и поиск в базе


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.