Понадобилась такая штука для 1С, но знать бы алгоритм - или хотя бы листинг на языке - перевести сумею.
» ФИО в родительный падеж
кхы..
типа Дмитрий Валентинович - Дмитрия Валентиновича?
ну... в принципе, я думаю, т.к. меняется только окончание - составить таблицу соответствий... фамилии ведь тоже конечное число окончаний имеют
типа Дмитрий Валентинович - Дмитрия Валентиновича?
ну... в принципе, я думаю, т.к. меняется только окончание - составить таблицу соответствий... фамилии ведь тоже конечное число окончаний имеют
Это задача близкая к ИИ
Думается есть два варианта:
1. Как предлагает Sleepwalker.
2. См. алгоритмы по склонению слов в учебнике по русскому языку , что суть тоже самое, т.к. IMHO самая простая их реализация будет табличная
Правда при любых раскладах найдется человек с таким ФИО, что ни по каким правилам не просклоняешь (ну, какой-нить папуас)
1. Как предлагает Sleepwalker.
2. См. алгоритмы по склонению слов в учебнике по русскому языку , что суть тоже самое, т.к. IMHO самая простая их реализация будет табличная
Правда при любых раскладах найдется человек с таким ФИО, что ни по каким правилам не просклоняешь (ну, какой-нить папуас)
UncoNNecteD
надо заметить: только для русского языка в том же англ-ом такой проблемы вообще нет
надо заметить: только для русского языка в том же англ-ом такой проблемы вообще нет
Ага.
Именно по этому не люблю русскоязычные программы/игры и прочую лабуду, типа языка программиррования 1С
Именно по этому не люблю русскоязычные программы/игры и прочую лабуду, типа языка программиррования 1С
Кстати, фамилии сколняются по другому алгоритму, чем имена и отчества (например, окончание на -ий).
Для имени и отчества может подойти такая функция:
Код:
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);
}
Для имени и отчества может подойти такая функция:
Код:
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);
}
ужас какой...
IMHO задача алгоритмически корректно решена быть не может, т.к. "редкие" фамилии на самом деле не так уж редко встречаются. Напр. фамилия МИХАЙ - как определить мужская или женская? Иностранцев, лиц кавказской наружности - все больше к тому же.
Проще всего позволить пользователю задать (один раз, т.к. нужен только родит. падеж) эту самую форму родит. падежа - и наслаждаться успехом (не морочиться по поводу несклоняемых женских фамилий, типа БУРАВИЧ). Запомнить это в базе и потом подставлять найденное в следующий раз. Т.к. это 1С, то вряд-ли пополняется большим количеством новых контрагентов за день...
Проще всего позволить пользователю задать (один раз, т.к. нужен только родит. падеж) эту самую форму родит. падежа - и наслаждаться успехом (не морочиться по поводу несклоняемых женских фамилий, типа БУРАВИЧ). Запомнить это в базе и потом подставлять найденное в следующий раз. Т.к. это 1С, то вряд-ли пополняется большим количеством новых контрагентов за день...
че вы голову морочите?
возьмите правила от ispell, который Лебедем намутил
http://www.yandex.ru/yandsearch?text=ispell+%CB%E5%E1%E5%E4%E5%E2&stype=&nl=0
возьмите правила от ispell, который Лебедем намутил
http://www.yandex.ru/yandsearch?text=ispell+%CB%E5%E1%E5%E4%E5%E2&stype=&nl=0
Есть другая программа. ОЧЕНЬ хорошая - склоняет по всем падежам. В виде dll и модулей для word и excel. Кому надо - пишите pal_ok@mail.ru
Страницы: 1
Предыдущая тема: Прогресбар и поиск в базе
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.