powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Существует ли алгоритм склонения ФИО и должности по падежам
24 сообщений из 24, страница 1 из 1
Существует ли алгоритм склонения ФИО и должности по падежам
    #35321345
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перерыл весь интернет, не нарыл.
Пусть на любом языке, мы на нужный переложим.
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35321389
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот наш вариант склонения ФИО...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
Str(Str,Tp,Typ,Dlm)                    ; * Ф И О из именительного в другой падеж *
 N str
 ; Str - Фамилия Имя Отчество
 ; Tp  - Пол ( 1 -муж,  2 -жен)
 ; Typ - падеж (код из D_PDG)
 ; Dlm - разделитель
 S:$G(Tp)="" Tp= 1 
 s:$g(Typ)="" Typ="R"
 s:$g(Dlm)="" Dlm=" "
 S str=Str
 I $$YesIn() q str
 D FAM($P(Str,Dlm))
 D NAM($P(Str,Dlm, 2 ))
 D FAT($P(Str,Dlm, 3 ))
 Q str
YesIn()                                ; Уже есть инициалы
 i Str'["." q  0 
 n val
 s val=$P(Str,Dlm)
 I val["." D FAM($P(Str,Dlm, 2 ), 2 ) q  1 
 D FAM($P(Str,Dlm))
 q  1 
FAM(Str,Pos)                           ; склонение фамилии
 ; Pos - куда вставить фамилию
 N ind
 Q:Str=""
 s Pos=$G(Pos, 1 )
 S ind=Str_$C( 31 )_Tp_$C( 31 )_Typ
 I $D(^K("FAM","SETF",ind)) S $P(str,Dlm,Pos)=$$New("FAM") Q
 I $$R(Str, 1 )="О" S $P(str,Dlm,Pos)=Str Q
 I $$R(Str, 1 )="ОК" S $P(str,Dlm,Pos)=Str Q
 I Typ="R" D FAMR Q
 I Typ="D" D FAMD Q
 I Typ="T" D FAMT Q
 I Typ="W" D FAMW Q
 I Typ="P" D FAMP Q
 Q
FAMP                                   ;    предложный
 I Tp= 1  D FAMPM Q
 D FAMPW
 Q
FAMPM                                  ;       мужчины
 I $$R(Str, 2 )="ИН" S $P(str,Dlm,Pos)=Str_"Е" Q
 I $$R(Str, 2 )="ЫН" S $P(str,Dlm,Pos)=Str_"Е" Q
 I $$R(Str, 2 )="ЯК" S $P(str,Dlm,Pos)=Str_"Е" Q
 I $$R(Str, 2 )="ЕВ" S $P(str,Dlm,Pos)=Str_"Е" Q
 I $$R(Str, 2 )="ОВ" S $P(str,Dlm,Pos)=Str_"Е" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОМ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMPW                                  ;       женщины
 I $$R(Str, 3 )="ИНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЫНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЕВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ОВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 2 )="АЯ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОЙ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMW                                   ;    винительный
 I Tp= 1  D FAMWM Q
 D FAMWW
 Q
FAMWM                                  ;       мужчины
 I $$R(Str, 2 )="ИН" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЫН" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЯК" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЕВ" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ОВ" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОГО" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMWW                                  ;       женщины
 I $$R(Str, 3 )="ИНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"У" Q
 I $$R(Str, 3 )="ЫНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"У" Q
 I $$R(Str, 3 )="ЕВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"У" Q
 I $$R(Str, 3 )="ОВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"У" Q
 I $$R(Str, 2 )="АЯ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"УЮ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMT                                   ;    творительный
 I Tp= 1  D FAMTM Q
 D FAMTW Q
 Q
FAMTM                                  ;       мужчины
 I $$R(Str, 2 )="ИН" S $P(str,Dlm,Pos)=Str_"ЫМ" Q
 I $$R(Str, 2 )="ЫН" S $P(str,Dlm,Pos)=Str_"ЫМ" Q
 I $$R(Str, 2 )="ЯК" S $P(str,Dlm,Pos)=Str_"ОМ" Q
 I $$R(Str, 2 )="ЕВ" S $P(str,Dlm,Pos)=Str_"ЫМ" Q
 I $$R(Str, 2 )="ОВ" S $P(str,Dlm,Pos)=Str_"ЫМ" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"М" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMTW                                  ;       женщины
 I $$R(Str, 3 )="ИНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЫНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЕВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ОВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 2 )="АЯ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОЙ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMR                                   ;    родительный
 I Tp= 1  D FAMRM Q
 D FAMRW 
 Q
FAMRM                                  ;       мужчины
 I $$R(Str, 2 )="ИН" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЫН" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЯК" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ЕВ" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ОВ" S $P(str,Dlm,Pos)=Str_"А" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОГО" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMRW                                  ;       женщины
 I $$R(Str, 3 )="ИНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЫНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЕВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ОВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 2 )="АЯ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОЙ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMD                                   ;    дательный
 I Tp= 1  D FAMDM Q
 D FAMDW 
 Q
FAMDM                                  ;       мужчины
 s Str=$$Upper^zfunc(Str)
 I $$R(Str, 2 )="ИН" S $P(str,Dlm,Pos)=Str_"У" Q
 I $$R(Str, 2 )="ЫН" S $P(str,Dlm,Pos)=Str_"У" Q
 I $$R(Str, 2 )="УК" S $P(str,Dlm,Pos)=Str_"У" Q
 I $$R(Str, 2 )="ЕВ" S $P(str,Dlm,Pos)=Str_"У" Q
 I $$R(Str, 2 )="ОВ" S $P(str,Dlm,Pos)=Str_"У" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОМУ" Q
 S $P(str,Dlm,Pos)=Str
 Q
FAMDW                                  ;       женщины
 s Str=$$Upper^zfunc(Str)
 I $$R(Str, 3 )="ИНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЫНА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ЕВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 3 )="ОВА" S $P(str,Dlm,Pos)=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 2 )="АЯ" S $P(str,Dlm,Pos)=$$L(Str, 2 )_"ОЙ" Q
 S $P(str,Dlm,Pos)=Str
 Q
NAM(Str)                               ; склонение имени
 N ind
 Q:Str=""
 S ind=Str_$C( 31 )_Typ
 I $D(^K("NAM","SET",ind)) S $P(str,Dlm, 2 )=$$New("NAM") Q
 I Typ="R" D NAMR Q
 I Typ="D" D NAMD Q
 I Typ="W" D NAMW Q
 I Typ="P" D NAMP Q
 I Typ="T" D NAMT Q
 Q
NAMT                                   ;    творитеьный
 I Tp= 1  D NAMTM Q
 D NAMTW Q
 Q
NAMTM                                  ;       мужчины
 I $$R(Str, 2 )="ЕЛ" S $P(str,Dlm, 2 )=$$L(Str, 2 )_"ЛОМ" Q
 I $$R(Str, 1 )="Й" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"ЕМ" Q
 I $$Sg($$R(Str, 1 )) S $P(str,Dlm, 2 )=Str_"ОМ" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"ЕЙ" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"ЕМ" Q
 S $P(str,Dlm, 2 )=Str
 Q
NAMTW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"ОЙ" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"ЕЙ" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=Str_"Ю" Q
 S $P(str,Dlm, 2 )=Str Q
 Q
NAMP                                   ;    предложный
 I Tp= 1  D NAMPM Q
 D NAMPW Q
 Q
NAMPM                                  ;       мужчины
 I $$R(Str, 2 )="ЕЛ" S $P(str,Dlm, 2 )=$$L(Str, 2 )_"ЛЕ" Q
 I $$R(Str, 2 )="ИЙ" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 1 )="Й" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$Sg($$R(Str, 1 )) S $P(str,Dlm, 2 )=Str_"Е" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 S $P(str,Dlm, 2 )=Str
 Q
NAMPW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 2 )="ИЯ" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 S $P(str,Dlm, 2 )=Str Q
 Q
NAMW                                   ;    винительный
 I Tp= 1  D NAMWM Q
 D NAMWW Q
 Q
NAMWM                                  ;       мужчины
 I $$R(Str, 2 )="ЕЛ" S $P(str,Dlm, 2 )=$$L(Str, 2 )_"ЛА" Q
 I $$R(Str, 1 )="Й" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Я" Q
 I $$Sg($$R(Str, 1 )) S $P(str,Dlm, 2 )=Str_"А" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ю" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Я" Q
 S $P(str,Dlm, 2 )=Str
 Q
NAMWW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"У" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ю" Q
 S $P(str,Dlm, 2 )=Str Q
 Q
NAMR                                   ;    родительный
 I Tp= 1  D NAMRM Q
 D NAMRW Q
 Q
NAMRM                                  ;       мужчины
 I $$R(Str, 1 )="Й" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Я" Q
 I $$Sg($$R(Str, 1 )) S $P(str,Dlm, 2 )=Str_"А" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ю" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Я" Q
 S $P(str,Dlm, 2 )=Str
 Q
NAMRW                                  ;       женщины
 I $$R(Str, 2 )="ГА" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 2 )="КА" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 1 )="А" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ы" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 S $P(str,Dlm, 2 )=Str Q
 Q
NAMD                                   ;    дательный
 I Tp= 1  D NAMDM Q
 D NAMDW Q
 Q
NAMDM                                  ;       мужчины
 I $$R(Str, 2 )="ЕЛ" S $P(str,Dlm, 2 )=$$L(Str, 2 )_"ЛУ" Q
 I $$R(Str, 1 )="Й" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ю" Q
 I $$Sg($$R(Str, 1 )) S $P(str,Dlm, 2 )=Str_"У" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Ю" Q
 S $P(str,Dlm, 2 )=Str
 Q
NAMDW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 2 )="ИЯ" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 I $$R(Str, 1 )="Я" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"Е" Q
 I $$R(Str, 1 )="Ь" S $P(str,Dlm, 2 )=$$L(Str, 1 )_"И" Q
 S $P(str,Dlm, 2 )=Str
 Q
FAT(Str)                               ; склонение отчества
 N ind
 Q:Str=""
 S ind=Str_$C( 31 )_Typ
 I $D(^K("FAT","SET",ind)) S $P(str,Dlm, 3 )=$$New("FAT") Q
 I Typ="R" D FATR Q
 I Typ="D" D FATD Q
 I Typ="W" D FATW Q
 I Typ="T" D FATT Q
 I Typ="P" D FATP Q
 Q
FATP                                   ;    предложный
 I Tp= 1  D FATPM Q
 D FATPW Q
 Q
FATPM                                  ;       мужчины
 I $$R(Str, 1 )="Ч" S $P(str,Dlm, 3 )=Str_"Е" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATPW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 3 )=$$L(Str, 1 )_"Е" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATT                                   ;    винительный
 I Tp= 1  D FATTM Q
 D FATTW Q
 Q
FATTM                                  ;       мужчины
 I $$R(Str, 1 )="Ч" S $P(str,Dlm, 3 )=Str_"ЕМ" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATTW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 3 )=$$L(Str, 1 )_"ОЙ" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATW                                   ;    винительный
 I Tp= 1  D FATWM Q
 D FATWW Q
 Q
FATWM                                  ;       мужчины
 I $$R(Str, 1 )="Ч" S $P(str,Dlm, 3 )=Str_"А" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATWW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 3 )=$$L(Str, 1 )_"У" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATR                                   ;    родительный
 I Tp= 1  D FATRM Q
 D FATRW Q
 Q
FATRM                                  ;       мужчины
 I $$R(Str, 1 )="Ч" S $P(str,Dlm, 3 )=Str_"А" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATRW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 3 )=$$L(Str, 1 )_"Ы" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATD                                   ;    дательный
 I Tp= 1  D FATDM Q
 D FATDW Q
 Q
FATDM                                  ;       мужчины
 I $$R(Str, 1 )="Ч" S $P(str,Dlm, 3 )=Str_"У" Q
 S $P(str,Dlm, 3 )=Str
 Q
FATDW                                  ;       женщины
 I $$R(Str, 1 )="А" S $P(str,Dlm, 3 )=$$L(Str, 1 )_"Е" Q
 S $P(str,Dlm, 3 )=Str
 Q
New(Id)                                ; новое значение из базы
 N urn,mg,nam
 S nam="SET"
 S:Id="FAM" nam="SETF"
 S urn=$O(^K(Id,nam,ind,""))
 S mg=$O(^K(Id,nam,ind,urn,""))
 Q $G(^D(urn,"NEW",mg))
Sg(Sym)                                ; * Согласная буква *
 Q "БВГДЖЗКЛМНПРСТУФХЦЧШЩ"[Sym
L(Str,N)                               ; * Len-N символов слева *
 Q $E(Str, 1 ,$L(Str)-N)
R(Str,N)                               ; * N символов справа *
 Q:N>$L(Str) Str
 Q $E(Str,$L(Str)-N+ 1 ,$L(Str))
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35321408
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для должностей отводим специальную табличку

Склонение должностиПадежНазвание

Пользователи сами ее заполняют...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35321430
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для ФИО еще имеем набор таблиц для "не стандартных" фамилий, имен и отчеств по типу должностей...
Т.ч. алгоритм склонения ФИО использует эти таблички...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35322663
Alexsalog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код на MUMPS-е (Cache нынче) ? :-)... Эх.. давно это было...
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35323623
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за код...
Правда язык странный, долго догонять надо, но вроде все понятно...
Дзенкую!
Перепишу на 1С!
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35325060
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FixinПравда язык странный
Не страннее остальных (языков)
Fixinдолго догонять надо
Это снепривычки...
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35328954
Фотография Angelein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, посмотрите, пожалуйста, наши варианты на 1С:

Функция РодительныйПадеж(ФИО) Экспорт
Фамилия = "";
Имя = "";
Отчество ="";
ФИО=СокрЛП(ФИО);
ОбщДлина=СтрДлина(ФИО);
//Проверим фио на пустоту
Если ОбщДлина=0 Тогда
Фио1="..............................................................";
Возврат ФИО1;
КонецЕсли;
//поделим на фамилию, имя и очество
// позиция первого пробела
ПервПроб = Найти(ФИО," ");
Если ПервПроб=0 Тогда
Фамилия = СокрЛ(ФИО);
Иначе
Фамилия = Лев(ФИО,ПервПроб);
ИО = Сред(ФИО,ПервПроб+1);
ИО = СокрЛП(ИО);
// позиция второго пробела
ВтПроб = Найти(ИО," ");
Если ВтПроб = 0 Тогда
Имя = СокрЛП(ИО);
Иначе
Имя = СокрЛ(Лев(ИО,ВтПроб-1));
Отчество =СокрЛ((Сред(ИО,ВтПроб+1)));
КонецЕсли;
КонецЕсли;

//Проверим остаток на вхождение точки т.е. на сокрашенния,
//если есть то дальше скланяем только фамилию
Если Найти(ИО,".")<>0 Тогда
ДлинаФам=СтрДлина(СокрЛП(Фамилия));
ПослСимвФам=Сред(Фамилия,ДлинаФам,1);
Если (ПослСимвФам="а") или (ПослСимвФам="я") Тогда
//женский род
Если (ПослСимвФам="о") или (ПослСимвФам="и") или (ПослСимвФам="х") или (ПослСимвФам="ч") или (ПослСимвФам="б")
или (ПослСимвФам="в") или (ПослСимвФам="г") или (ПослСимвФам="д") или (ПослСимвФам="ж") или (ПослСимвФам="з")
или (ПослСимвФам="п") или (ПослСимвФам="н") или (ПослСимвФам="м") или (ПослСимвФам="л") или (ПослСимвФам="к")
или (ПослСимвФам="р") или (ПослСимвФам="с") или (ПослСимвФам="т") или (ПослСимвФам="ф") или (ПослСимвФам="ц")
или (ПослСимвФам="ь") или (ПослСимвФам="щ") или (ПослСимвФам="ш") Тогда
//в этом случае не скланяеться
Фамилия1=СокрЛП(Фамилия);
ИначеЕсли (ПослСимвФам="я") Тогда
//обрезаем 2 символа и прибовляем "ой"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-2);
Фамилия1=СокрЛП(ФамилияОбрезанная)+"ой";
Иначе
//обрезаем 1 символа и прибовляем "ой"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-1);
Фамилия1=СокрЛП(ФамилияОбрезанная)+"ой";
КонецЕсли;
Иначе
Если (ПослСимвФам="о") или (ПослСимвФам="и") или (ПослСимвФам="х") или (ПослСимвФам="я") или (ПослСимвФам="а") Тогда
//в этом случае не скланяеться
Фамилия1=Фамилия;
ИначеЕсли (ПослСимвФам="й") Тогда
//обрезаем 2 символа и прибовляем "ого"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-2);
Фамилия1=ФамилияОбрезанная+"ого";
Иначе
//прибовляем "а"
Фамилия1=СокрЛП(Фамилия)+"а";
КонецЕсли;
КонецЕсли;
Фио1=Фамилия1+" "+ИО;
Возврат ФИО1;
КонецЕсли;

//иначе если точек нет определяем род по отчеству
ДлинаОтчества=СтрДлина(СокрЛП(Отчество));
ПослСимвОтч=Сред(Отчество,ДлинаОтчества,1);
Если ПослСимвОтч="ч" Тогда
Мужской=1;
Иначе
Мужской=0;
КонецЕсли;
Если Мужской=1 Тогда
//фамилия
ДлинаФам=СтрДлина(СокрЛП(Фамилия));
Если ДлинаФам<>0 Тогда
ПослСимвФам=Сред(Фамилия,ДлинаФам,1);
Если (ПослСимвФам="о") или (ПослСимвФам="и") или (ПослСимвФам="х") или (ПослСимвФам="я") или (ПослСимвФам="а") Тогда
//в этом случае не скланяеться
Фамилия1=Фамилия;
ИначеЕсли (ПослСимвФам="й") Тогда
//обрезаем 2 символа и прибовляем "ого"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-2);
Фамилия1=ФамилияОбрезанная+"ого";
Иначе
//прибовляем "а"
Фамилия1=СокрЛП(Фамилия)+"а";
КонецЕсли;
КонецЕсли;
//имя
ДлинаИмени=СтрДлина(СокрЛП(Имя));
Если ДлинаИмени<>0 Тогда
ПослСимвИмени=Сред(СокрЛП(Имя),ДлинаИмени,1);
Если (ПослСимвИмени="й") или (ПослСимвИмени="ь") Тогда
//обрезаем 1 символ и прибовляем "я"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=ИмяОбрезанное+"я";
Иначе
//прибовляем "а"
Имя1=СокрЛП(Имя)+"а";
КонецЕсли;
КонецЕсли;
//отчество
Если ДлинаОтчества<>0 Тогда
//прибовляем "а"
Отчество1=СокрЛП(Отчество)+"а";
КонецЕсли;
ИначеЕсли Мужской=0 Тогда
//фамилия
ДлинаФам=СтрДлина(СокрЛП(Фамилия));
Если ДлинаФам<>0 Тогда
ПослСимвФам=Сред(Фамилия,ДлинаФам,1);
Если (ПослСимвФам="о") или (ПослСимвФам="и") или (ПослСимвФам="х") или (ПослСимвФам="ч") или (ПослСимвФам="б")
или (ПослСимвФам="в") или (ПослСимвФам="г") или (ПослСимвФам="д") или (ПослСимвФам="ж") или (ПослСимвФам="з")
или (ПослСимвФам="п") или (ПослСимвФам="н") или (ПослСимвФам="м") или (ПослСимвФам="л") или (ПослСимвФам="к")
или (ПослСимвФам="р") или (ПослСимвФам="с") или (ПослСимвФам="т") или (ПослСимвФам="ф") или (ПослСимвФам="ц")
или (ПослСимвФам="ь") или (ПослСимвФам="щ") или (ПослСимвФам="ш") Тогда
//в этом случае не скланяеться
Фамилия1=СокрЛП(Фамилия);
ИначеЕсли (ПослСимвФам="я") Тогда
//обрезаем 2 символа и прибовляем "ой"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-2);
Фамилия1=СокрЛП(ФамилияОбрезанная)+"ой";
Иначе
//обрезаем 1 символа и прибовляем "ой"
ФамилияОбрезанная=Сред(Фамилия,1,ДлинаФам-1);
Фамилия1=СокрЛП(ФамилияОбрезанная)+"ой";
КонецЕсли;
КонецЕсли;
//имя
ДлинаИмени=СтрДлина(СокрЛП(Имя));
Если ДлинаИмени<>0 Тогда
ПослСимвИмени=Сред(СокрЛП(Имя),ДлинаИмени,1);
ПредПослСимвИмени=Сред(СокрЛП(Имя),ДлинаИмени-1,1);
Если (ПослСимвИмени="а") Тогда
//в этом случае разбиваем на два
Если (ПредПослСимвИмени="и") или (ПредПослСимвИмени="г") Тогда
//обрезаем 1 символ и прибовляем "и"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=СокрЛП(ИмяОбрезанное)+"и";
Иначе
//обрезаем 1 символ и прибовляем "ы"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=СокрЛП(ИмяОбрезанное)+"ы";
КонецЕсли;
ИначеЕсли (ПослСимвИмени="я") Тогда
//в этом случае разбиваем на два
Если (ПредПослСимвИмени="и") Тогда
//обрезаем 1 символ и прибовляем "и"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=СокрЛП(ИмяОбрезанное)+"и";
Иначе
//обрезаем 1 символ и прибовляем "и"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=СокрЛП(ИмяОбрезанное)+"и";
КонецЕсли;
ИначеЕсли (ПослСимвФам="ь") Тогда
//обрезаем 1 символ и прибовляем "и"
ИмяОбрезанное=Сред(СокрЛП(Имя),1,ДлинаИмени-1);
Имя1=СокрЛП(ИмяОбрезанное)+"и";
Иначе
//не изменяется
Имя1=СокрЛП(Имя);
КонецЕсли;
КонецЕсли;
//отчество
Если ДлинаОтчества<>0 Тогда
//обрезаем 1 символа и прибовляем "ы"
ОтчествоОбрезанное=Сред(Отчество,1,ДлинаОтчества-1);
Отчество1=СокрЛП(ОтчествоОбрезанное)+"ы";
КонецЕсли;
КонецЕсли;
ФИО1=Фамилия1+" "+Имя1+" "+Отчество1;
Возврат ФИО1;
КонецФункции
//-------------------------------
///////////////////////////////////////////////////////////////////////////
//
Функция ПадежС(z1,z2=2,z3="*") Экспорт
// z1 - существительное, z2 - номер падежа, z3 - НЕ УКАЗЫВАЕТСЯ
z4=Прав(z1,2);z5=?(z3="1",?(z4="ая",8,9),?(z4="ия",7,Найти(".чайяь",Прав(z4,1))));z6=СтрДлина(z1)-2;
Возврат ?((z2=1)или(Найти("ьжан итай",Прав(z1,4))>0),z1,?(z5>2,Лев(z1,z6+?(z5=8,0,1)),?(z4="ел",Лев(z1,z6)+"л",?((z4="ев")и(z3<>"2"),Лев(z1,z6)+"ьв",z1)))+СокрП(Сред("а у а "+?(z3="2",Сред("оыыыее", Найти(" внтч",Прав(z4,1))+1,1),"о")+"ме а у а еме "+?(Найти("гжкхш",Лев(z4,1))>0,"и","ы")+" е у ойе я ю я еме и е ю ейе и и ь ьюи и и ю ейи ойойуюойойойойу ойой",10*?((z5=6)и(z3<>"а"),4,z5)+2*z2-3,2)))
// !-- ЗДЕСЬ МОЖНО ЗАДАТЬ ДРУГИЕ НЕСКЛОНЯЕМЫЕ ИМЕНА по последним четырем буквам - Гульжан Гульчитай
КонецФункции



Функция Падеж(Знач z1,Знач z2=2,z3=3) Экспорт
// z1 - фамилия имя отчество например Железняков Юрий Юрьевич
// Падеж
// 2 - родительный ( нет кого? ) Железнякова Юрия Юрьевича
// 3 - дательный ( кому? ) Железнякову Юрию Юрьевичу
// 4 - винительный ( вижу кого? ) Железнякова Юрия Юрьевича
// 5 - творительный ( кем? ) Железняковым Юрием Юрьевичем
// 6 - предложный ( о ком? ) Железнякове Юрие Юрьевиче
// Если задать Z2 меньше 0, то на выходе получим от -1=Железняков Ю. Ю. до -6=Железнякове Ю. Ю.
// Параметр Пол может не указываться, но при наличии фамилий с
// инициалами точное определение пола невозможно, поэтому предлагается задавать пол этим
// параметром
// 1 - мужской
// 2 - женский
// ДЛЯ СКЛОНЕНИЕ ПРОФЕССИЙ ИСПОЛЬЗУЙТЕ КОНСТРУКЦИЮ Падеж(Профессия,Падеж,4)
// Бибик Галушка Цой Николайчик Наталия Петровна Герценберг Кривошей
z1=НРег(СокрЛП(z1));
z3=Сред("ча"+Прав(z1,1)+"ч",z3,1);
z4=Найти(z1+" "," ");
//участок преобразования Фамилия Имя Отчество --> Фамилия И. О.
z1=?(z2>0,z1,СтрЗаменить(Лев(z1+" ",z4+1)+". "+Сред(z1,Найти(Сред(z1+" ",z4+2)," ")+z4+2,1)+"."," .",""));z2=Макс(z2,-z2);
// участок преобразования фамилия имя отчество --> Фамилия Имя Отчество
z9=z4+Найти(Сред(z1+" ",z4+1)," "); z1=ВРег(Лев(z1,1))+Сред(z1,2,z4-1)+Врег(Сред(z1,z4+1,1))+Сред(z1,z4+2,z9-z4-1)+ВРег(Сред(z1,z9+1,1))+Сред(z1,z9+2,СтрДлина(z1)-z9);
//
z5=Лев(z1,z4-1);z6=Прав(z5,3);z7=Прав(z6,2);z8=Прав(z7,1);
z5=?(z3="а",?((z8="а")и(z6<>"ула")или(z7="ая"),ПадежС(z5,z2,"1"),z5),?((Найти("ой ый ий",z7)>0)и(z6<>"Цой"),Лев(z5,z4-3)+СокрП(Сред(" огоомуого"+?((z7="ий")или(z6="гой")или(z6="хой"),"и","ы")+"м омегоемуегоим ем",?(Найти("чшщ",Сред(z5,z4-3,1))>0, 14,0) +z2*3-2,3)),?(Найти("оеиую",z8)+Найти("аа еа ёа иа оа уа ыа эа юа яа",z7)=0,ПадежС(z5,z2,"2"),z5)));
Возврат ?((z3="ч")и(z4=СтрДлина(z1)+1),ПадежС(z1,z2),z5)+" "+ПадежС(Сред(z1,z4+1,z9-z4-1),z2,z3)+" "+ПадежС(Сред(z1,z9+1,СтрДлина(z1)-z9),z2,z3)
КонецФункции // Функция Падеж(z1,z2=2,z3=3)
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35328960
Фотография Angelein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FixinПерепишу на 1С!

И переписывать ничего не надо будет! :)
У нас в 1С всё работает. Попробуйте!
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35328964
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще про наш код говорили, что странный...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35329635
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашибись... что-же теперь, всем изучать Кашу?

P.S. Пойду выпью пива с досады...
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35329774
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗашибись... Пойду выпью пива с досады...Дахулипиво... (Нармуд.)
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35330138
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗашибись... что-же теперь, всем изучать Кашу?
Каждый уважающий себя студент изучал mumps/diams(?)
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35330237
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonчто-же теперь, всем изучать Кашу?
Это жисть покажет...
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35330262
А может подойдет это? Уже готовая библиотека и работает везде
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=412
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35379843
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость форумаА может подойдет это? Уже готовая библиотека и работает везде
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=412

Спасибо за алгоритм на каше.
Взял за основу и реализовал на 1С.

Вообще да, есть универсальный в дельфи кингдом.
Но там через ОЛЕ, мне хочется чисто в алгоритмическом виде.

http://infostart.ru/profile/8089/projects/2031/
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35386418
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FixinСпасибо за код...
Правда язык странный, долго догонять надо, но вроде все понятно...
Дзенкую!
Перепишу на 1С!
AngeleinВот, посмотрите, пожалуйста, наши варианты на 1С:

ROFL!
Простите за оффтоп, никого не хочу обидеть, но я плакал...
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35398461
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите за оффтоп, никого не хочу обидеть, но я плакал...

ТЫ почему плакал, тебя кто-то обидел?
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35457741
oldodin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый автор алгоритма для 1С, я понимаю что вопрос тупой, но помогите пожалуйста!
Есть переменная ФИО, как правильно вызвать Вашу функцию?
ФИО: Лапина Наталья Алексеевна, пытаюсь получить это фио в детальном падеже
Пишу так:

ТаблицаДок.ФИО = Падеж(Док.Выдана.Наименование, 3);

Результат: Лапин Наталиой Алексеевню
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35459017
Фотография ДмиДми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FixinПерерыл весь интернет, не нарыл.И не нароешь. Его нет и быть не может. Только словарь. Кстати, одна и та же фамилия изменяется по-разному для мужчин и для женщин.

Сомневаешься - сходи на подфорум, скажем, Вече (раньше был подфорум "Русский язык и информационные технологии", сейчас он только в архиве ) форума в домене Грамота.ру (это - как бы неофициально - форум, организованный Институтом русского языка им. Виноградова при Академии наук РФ) и поспрошай.
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35525542
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oldodinУважаемый автор алгоритма для 1С, я понимаю что вопрос тупой, но помогите пожалуйста!
Есть переменная ФИО, как правильно вызвать Вашу функцию?
ФИО: Лапина Наталья Алексеевна, пытаюсь получить это фио в детальном падеже
Пишу так:

ТаблицаДок.ФИО = Падеж(Док.Выдана.Наименование, 3);

Результат: Лапин Наталиой Алексеевню

Спрашивайте на infostart.ru
За комментами слежу только там.
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35803979
morpher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот готовое решение для .NET: http://morpher.ru

Склоняет ФИО, должности и практически все, что склоняется в русском языке :)
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35812041
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же говорил английский язык рулит.
...
Рейтинг: 0 / 0
Существует ли алгоритм склонения ФИО и должности по падежам
    #35901779
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoЯ же говорил английский язык рулит.
Это вы к чему?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Существует ли алгоритм склонения ФИО и должности по падежам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]