Показать сообщение отдельно
Старый 05.09.2006, 16:43   #6  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Библиотека, автор по моему - Пукин А.:
Код:
ФУНКЦИЯ  ТИП_СТРОКА: Склонение ( ПЕРЕМ ТИП_СТРОКА : Фамилия,Имя,Отчество,Пол,Падеж) 
Склонение=Фамилия+" "+Имя+" "+Отчество
       п=Пол
       имя=ЗАГЛ(Имя)                                                 
        L[1]="Б";
        L[2]="В";
        L[3]="Г";
        L[4]="Д";
        L[5]="Ж";
        L[6]="З";
        L[7]="К";
        L[8]="Л";
        L[9]="М";
        L[10]="Н";
        L[11]="П";
        L[12]="Р";
        L[13]="С";
        L[14]="Т";
        L[15]="Ф";
        L[16]="Х";
        L[17]="Ц";
        L[18]="Ч";
        L[19]="Ш";
        L[20]="Щ";
        //Гласные
        L[21]="А";
        L[22]="Е";
        L[23]="И";
        L[24]="Й";
        L[25]="О";
        L[26]="У";
        L[27]="Ы";
        L[28]="Э";
        L[29]="Ю";
        L[30]="Я";        
        L[31]="Ь";
        L[32]="Ъ";
      /////////////

      Фамилия=ЗАГЛ(Фамилия)
      Последняя=ПОДСТР(Фамилия,ДЛИНА(Фамилия),1)
      ДвеПоследних=ПОДСТР(Фамилия,ДЛИНА(Фамилия)-1,2)
      ТриПоследних=ПОДСТР(Фамилия,ДЛИНА(Фамилия)-2,3)

      Флаг=0;
       ЦИКЛ ДЛЯ(и=1,32)
       ЕСЛИ L[и]=Последняя ТО
       СТОП
       КОНЕЦ_ЕСЛИ;
       КОНЕЦ_ЦИКЛА
       ЕСЛИ и<=20 ТО
       ТипБуквы=1;//согласная
       ИНАЧЕ
       ТипБуквы=2;//гласная
       КОНЕЦ_ЕСЛИ
//////////////// Исключения ////////////////////
       ЕСЛИ ДЛИНА(Фамилия)<=2 ТО
       Родительный=Фамилия;//фамилии типа Ге, Че
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="ИХ") ИЛИ  (ДвеПоследних="ЫХ") ТО
       Родительный=Фамилия;//сибирские фамилии
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ Последняя="О" ИЛИ  Последняя="Ц" ТО
       Родительный=Фамилия;//украинские фамилии       Чубарец
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ ДвеПоследних="УА" ТО
       Родительный=Фамилия;//фамилии типа Стуруа
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ ДвеПоследних="ИА" ТО
       Родительный=Фамилия;//фамилии типа Туташхиа
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="ЖА") И (п="Ж") ТО
       Родительный=Фамилия;// женские фамилии типа Ганжа
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ ТриПоследних="ДЗЕ" ТО
       Родительный=Фамилия;//грузинские фамилии типа Гогадзе
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;            
       ЕСЛИ ТриПоследних="ИЛИ" ТО
       Родительный=Фамилия;//грузинские фамилии типа Габошвили
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="ОЙ") И (п="М") И (ДЛИНА(Фамилия)=3) ТО
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"Я";//фам. типа Цой
       Дательный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"Ю";
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="ОЙ") И (п="Ж") И (ДЛИНА(Фамилия)=3) ТО
       Родительный=Фамилия; //фам. типа Цой
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;
///////////////////////////////////////////////////////////////////////
       ЕСЛИ (п="М") И (ТипБуквы=1)  И (Последняя<>"Ц") ТО //мужскую склоняем  Чубарец
       Родительный=Фамилия+"А";
       Дательный=Фамилия+"У";
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (п="М") И (ДвеПоследних="ДЬ") ТО //В память о красноярском губернаторе
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"Я";//Лебедя
       Дательный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"Ю";
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (п="Ж") И (ТипБуквы=1) ТО //женскую не склоняем
       Родительный=Фамилия;
       Дательный=Фамилия;
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (п="Ж") И (Последняя="А") ТО
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"У";
       Дательный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"ОЙ";
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (п="М") И (Последняя="А") ТО //фам. типа Соткилава
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"У";
       Дательный= ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"Е";
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="ОЙ") И (п="М") И (ДЛИНА(Фамилия)>3) ТО
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"ГО";
       Дательный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-1)+"МУ";
       Флаг=1;    
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ (ДвеПоследних="АЯ") И (п="Ж") И (ДЛИНА(Фамилия)>3) ТО
       Родительный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-2)+"УЮ";
       Дательный=ПОДСТР(Фамилия,1,ДЛИНА(Фамилия)-2)+"ОЙ";
       Флаг=1;
       КОНЕЦ_ЕСЛИ;
       ЕСЛИ Флаг=0 ТО  //если не сработало ни одно условие
       Родительный=Фамилия;
       Дательный=Фамилия;
       КОНЕЦ_ЕСЛИ;

      //////////////
        // Склонение имени
        Последняя=ПОДСТР(имя,ДЛИНА(имя),1);
        ДвеПоследних=ПОДСТР(имя,ДЛИНА(имя)-1,2);
        Флаг=0;
        ЦИКЛ ДЛЯ(и=1,32)
        ЕСЛИ L[и]=Последняя ТО
        СТОП
        КОНЕЦ_ЕСЛИ;
        КОНЕЦ_ЦИКЛА;
        ЕСЛИ и<=20 ТО
        ТипБуквы=1;//согласная
        ИНАЧЕ;
        ТипБуквы=2;//гласная
        КОНЕЦ_ЕСЛИ;
        ЕСЛИ (п="М") И (ТипБуквы=1) ТО ///Иван, Петр и т.д.
        РодительныйИмя=имя+"А";
        ДательныйИмя  =имя+"У";
        Флаг=1;
        КОНЕЦ_ЕСЛИ;
        ЕСЛИ (п="М") И (Последняя="Й") ТО ///Сергей, Дмитрий и т.д.
        РодительныйИмя=ПОДСТР(имя,1,ДЛИНА(имя)-1)+"Я";
        ДательныйИмя  =ПОДСТР(имя,1,ДЛИНА(имя)-1)+"Ю";
        Флаг=1;
        КОНЕЦ_ЕСЛИ;
        ЕСЛИ (п="М") И (Последняя="А") ТО ///Фома
        РодительныйИмя=ПОДСТР(имя,1,ДЛИНА(имя)-1)+"У";
        ДательныйИмя  =ПОДСТР(имя,1,ДЛИНА(имя)-1)+"Е";
        Флаг=1;
        КОНЕЦ_ЕСЛИ;
        ЕСЛИ (п="М") И (Последняя="Я") ТО ///Илья
        РодительныйИмя=ПОДСТР(имя,1,ДЛИНА(имя)-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)+"Е";
    КОНЕЦ_ЕСЛИ;                
    ЕСЛИ Падеж="Р" ТО Склонение=Родительный+" "+РодительныйИмя+" "+РодительныйОтчество КОНЕЦ_ЕСЛИ
    ЕСЛИ Падеж="Д" ТО Склонение=Дательный+" "+ДательныйИмя+" "+ДательныйОтчество КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/