![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ФИО из базы данных в родительском падеже [D6, D7, Win2k, WinXP]
Homa_Programer © (2005-06-11 07:08:00)постановка задачи таккая:
в БД имеются ФИО (3 поля) в иминительном падеже
требуется алгоритм перевода ФИО в родительный падеж
помогите кто чем сможет!!!
Anatoly Podgoretsky (2005-09-08 22:36:00) [1]Frost (Freak) (08.09.05 12:12) [10]
Если говорить об алгоритмаъ, а именно о них и речь, то форум называется Игры и Алгоритмы.
isasa (2005-09-08 22:16:00) [2]70 000 / 1 268 000 * 100% = 5,5% - много, мало?
Почитай правила склонения имен, не правила а сплошное исключение.
DDA (2005-09-08 20:46:00) [3]
> Уникальных немного.
ничего себе немного
у меня база жителей области 1 млн 268 тыс
дак вот из них уникальных 70 тыс где то
И все эти фамилии в ручную думаю не очень быстро поправить
Kobik (2005-09-08 20:15:00) [4]Да это наверно глюк форума. Дату гляньте :)
>11.06.05 07:08
Frost (Freak) (2005-09-08 12:45:00) [5]Ага, делает визуализацию перевода ФИО в родительный падеж :)))))
DeadMeat (2005-09-08 12:36:00) [6]А может он на OpenGL это дело мутит...
Sphinx (2005-09-08 12:19:00) [7]Я так понял эту ветку переместили...
Но почему в Игры ? :0
Frost (Freak) (2005-09-08 12:12:00) [8]Что за прикол? Дружок, ты форумом не ошибся? Какое отношение твой вопрос имеет к играм?
ольга (2005-09-08 10:45:00) [9]
Koala (2005-06-11 17:27:00) [10]Часть 3
function GetDeclensionName (Name : string; Sex : integer;
CaseName : integer) : string;
var
i1 : integer;
s1 : string;
begin
i := Length(Name);
s := copy(Name,i,1);
i := 1;
while s <> alphavit[i] do
i := i +1;
case sex of
0 : begin // мужской пол
if i <= 20 then // Иван, Петр, Ярослав...
begin
case CaseName of
0 : Result := Name + 'а'; // родительный падеж
1 : Result := Name + 'у'; // дательный падеж
end;
end
else
begin
case i of
24 : begin // 'й' - Сергей, Дмитрий...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'я';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'ю';
end;
end;
end;
21 : begin // 'а' - Фома...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'у';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'е';
end;
end;
end;
30 : begin // 'я' - Илья...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'ю';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'е';
end;
end;
end;
31 : begin // 'ь' - Игорь...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'ю';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'я';
end;
end;
end;
end;
end;
end;
1 : begin // женский пол
i1 := Length(Name);
s1 := copy(Name,i1-1,2);
if s1 = 'ия' then // Виктория.....
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'ю';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'и';
end;
end;
case i of
21 : begin // 'а' - Татьяна, Людмила...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'у';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'е';
end;
end;
end;
30 : begin // 'я' - Зоя...
case CaseName of
0 : begin // родительный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'ю';
end;
1 : begin // дательный падеж
i := Length(Name);
Name := copy(Name,1, i - 1);
Result := Name + 'е';
end;
end;
end;
end;
end;
end;
end;
function GetDeclensionFathername (Fathername : string; Sex : integer;
CaseFathername : integer) : string;
begin
case sex of
0 : begin // мужской пол
case CaseFathername of
0 : Result := Fathername + 'а'; // родительный падеж
1 : Result := Fathername + 'у'; // дательный падеж
end;
end;
1 : begin // женский пол
case CaseFathername of
0 : begin // родительный падеж
i := Length(Fathername);
Fathername := copy(Fathername,1, i - 1);
Result := Fathername + 'у';
end;
1 : begin // дательный падеж
i := Length(Fathername);
Fathername := copy(Fathername,1, i - 1);
Result := Fathername + 'е';
end;
end;
end;
end;
Koala (2005-06-11 17:26:00) [11]продолжение
if (s2 = 'жа') and (Sex = 1) then // Ганжа...
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
if (s3 = 'онь') and (Sex = 0) then // Белоконь...
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
if (s3 = 'дзе') or (s3 = 'или') then // Грузинские фамилии
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
if (s2 = 'ой') and (Sex = 0) and (i = 3) then // Цой...
begin
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'я';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'ю';
end;
end;
end;
if (s2 = 'ой') and (Sex = 1) and (i = 3) then // Цой...
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
i1 := 1;
while s1 <> alphavit[i1] do
i1 := i1 +1;
if (sex = 0) and (i1 <= 20) then
case CaseSurname of
0 : Result := Surname + 'а'; // родительный падеж
1 : Result := Surname + 'у'; // дательный падеж
end;
if (sex = 0) and (s2 = 'дь') then // Лебедь
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'я';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'ю';
end;
end;
if (sex = 1) and (i1 <= 20) then
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
if (sex = 1) and (s1 = 'а') then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'у';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'ой';
end;
end;
if (sex = 0) and (s1 = 'а') then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'у';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'е';
end;
end;
if (sex = 0) and (s2 = 'ой') and (i > 3) then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'го';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'му';
end;
end;
if (sex = 1) and (s2 = 'ая') and (i > 3) then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'ую';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 1);
Result := Surname + 'ой';
end;
end;
if (sex = 0) and (i > 3) and (s2 = 'ий') or (s2 = 'ый')then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 2);
Result := Surname + 'ого';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 2);
Result := Surname + 'ому';
end;
end;
if (sex = 1) and (i > 3) and (s2 = 'ая') then
case CaseSurname of
0 : begin // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 2);
Result := Surname + 'ую';
end;
1 : begin // дательный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 2);
Result := Surname + 'ой';
end;
end;
end;
Koala (2005-06-11 17:24:00) [12]Попробуй эту функцию (делю на 2 части):
const
alphavit : array[1..32] of string =
('б','в','г','д','ж','з','к','л','м','н','п','р','с','т','ф','х','ц','ч','ш','щ',
'а','е','и','й','о','у','ы','э','ю','я','ь','ъ');
Функции для склонения фамилии, имени, отчества
Пол (Sex) 0: мужской //
// 1: женский //
// //
// Падеж (Getcase) 0: родительный //
// 1: дательный
function GetDeclensionSurname (Surname : string; Sex : integer;
CaseSurname : integer) : string;
var
s1, s2, s3 : string;
i1 : integer;
begin
i := Length(Surname);
if i <= 2 then
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
s1 := copy(Surname,i,1);
s2 := copy(Surname,i-1,2);
s3 := copy(Surname,i-2,3);
if (s2 = 'их') or (s2 = 'ых') then // Сибирские фамилии
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
exit;
end;
if (s3 = 'кая') and (Sex = 1) then // Лобановская...
begin
case CaseSurname of
0,1 : begin // дательный падеж // родительный падеж
i := Length(Surname);
Surname := copy(Surname,1, i - 2);
Result := Surname + 'ой';
exit;
end;
end;
end;
if (s1 = 'о') then // Украинские фамилии
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
exit;
end;
if (s2 = 'уа') then // Стуруа...
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
if (s2 = 'иа') then // Тутухиа...
begin
case CaseSurname of
0 : Result := Surname; // родительный падеж
1 : Result := Surname; // дательный падеж
end;
end;
Homa_Programer (2005-06-11 12:41:00) [13]Удалено модератором
isasa (2005-06-11 10:48:00) [14]Способа решения два ;)
Первый - писать функцию перевода, реализующую правила,
второй - выборка имен по
select ... group ...
и быстренько ручками перевести.
Второй вариант, даже на базах больших объемов дает неплохой результат.
Уникальных немного.
И если учитывать многие неожиданные исключения из правил,
на мой взгляд предпочтительнее
Anatoly Podgoretsky (2005-06-11 08:43:00) [15]Предлагаешь нам поискать учебник?
Но это уже услуга, а не ответ в конференции, соответсвенно с этим уже в другую конференцию.
По вопросу, задача решения не имеет.
Homa_Programer (2005-06-11 08:23:00) [16]> Defunct ©
не смешно! да и их под руками нету :(
Defunct (2005-06-11 07:53:00) [17]книжки "русский язык" за 2-й и 3-й класс Вам исчерпывающе помогут.
на полном серьезе.