|
|
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги! Я не претендую на очередное открытие Америки или изобретение велосипеда. Просто я знаю, как пустяковые препятствия тормозят большое дело. Предлагаю вам кой-какие наработки, кому надо. Код написан в C++ Builder5. Наверное будет интересно тем, кто работает с реальными паспортными и т. п. данными. Любые замечания и пожелания по предложенному, разумеется, будут учтены в срочнейшем порядке. Итак,.. //Функция подстановки первой заглавной буквы в собственные имена в кириллице //учтена возможность двойной фамилии (напр., Петров-Водкин) //неучтена возможность пустой строки и, наверное, еще чего-нибудь (пока не знаю, может вы подскажете) AnsiString asUpperFirst(AnsiString asArg) { AnsiString asUFResult=asArg.Trim(); int iUF=asUFResult.Length()-1; AnsiString asUFTemp=asUFResult.SubString(2,iUF).LowerCase(); asUFResult=asUFResult.SubString(1,1).UpperCase()+asUFTemp; iUF=asUFResult.Pos("-"); if(iUF!=0) //если это двойная фамилия { if((asUFResult.Pos("-оглы")==0)&&(asUFResult.Pos("-кызы")==0)) //азербайджанские отчества { int iDividerPos=iUF; asUFTemp=asUFResult; int iUF1=asUFTemp.Length(); iUF=asUFResult.Length()-(iUF1-iDividerPos)-2;//кол-во символов первой части asUFTemp=asUFResult.SubString(2,iUF).LowerCase(); asUFResult=asUFResult.SubString(1,1).UpperCase()+asUFTemp+"-"; iUF=asArg.Length()-iDividerPos-1;//кол-во символов второй части asUFTemp=asArg.SubString(iDividerPos+1,1).UpperCase()+asArg.SubString(iDividerPos+2,iUF).LowerCase(); asUFResult+=asUFTemp; iUF1=0; } } return asUFResult; } // P.S. Feci quod potui, faciant meliora potentes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 09:54 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
//Три функции подстановки в дательный падеж: для фамилии, имени и отчества //возможность двойной фамилии в разработке (доделаю – пришлю) //не учтена возможность пустой строки и, наверное, еще чего-нибудь (пока не знаю, может вы подскажете) //не учтена возможность пустой строки, азербайджанского отчества (-оглы, -кызы) и, наверное, еще чего-нибудь (пока не знаю, может вы подскажете) AnsiString LNtoDP(AnsiString argLN) { int iLNCounter, iLNLength=0, iLNPos=0; AnsiString asLNTerm=""; const AnsiString arrMaleLN[8]={"ов","ев","ин","кий","ий","ич","ый","а"}; const AnsiString arrMaleLNDP[8]={"ову","еву","ину","кому","ию","ичу","ому","е"}; const AnsiString arrFemaleLN[5]={"ова","ева","ина","ая","а"}; const AnsiString arrFemaleLNDP[5]={"овой","евой","иной","ой","е"}; AnsiString asLNResult=argLN; for(iLNCounter=0;iLNCounter<7;iLNCounter++) { iLNLength=arrMaleLN[iLNCounter].Length(); iLNPos=asLNResult.Length()-iLNLength+1; asLNTerm=asLNResult.SubString(iLNPos,iLNLength); if(asLNTerm==arrMaleLN[iLNCounter]) { asLNResult=asLNResult.SubString(1,iLNPos-1)+arrMaleLNDP[iLNCounter]; break; } } if(asLNResult==argLN) { for(iLNCounter=0;iLNCounter<4;iLNCounter++) { iLNLength=arrFemaleLN[iLNCounter].Length(); iLNPos=asLNResult.Length()-iLNLength+1; asLNTerm=asLNResult.SubString(iLNPos,iLNLength); if(asLNTerm==arrFemaleLN[iLNCounter]) { asLNResult=asLNResult.SubString(1,iLNPos-1)+arrFemaleLNDP[iLNCounter]; break; } } } return asLNResult; } //--------------------------------------------------------------------------- AnsiString FNtoDP(AnsiString argFN) { int iFNCounter, iFNLength=0, iFNPos=0; AnsiString asFNTerm=""; const AnsiString arrMaleFN[4]={"й","а","я","ь"}; const AnsiString arrMaleFNDP[4]={"ю","е","е","ю"}; const AnsiString arrFemaleFN[4]={"а","ия","я","ь"}; const AnsiString arrFemaleFNDP[4]={"е","ии","е","и"}; AnsiString asFNResult=argFN; for(iFNCounter=0;iFNCounter<4;iFNCounter++) { iFNLength=arrFemaleFN[iFNCounter].Length(); iFNPos=asFNResult.Length()-iFNLength+1; asFNTerm=asFNResult.SubString(iFNPos,iFNLength); if(asFNTerm==arrFemaleFN[iFNCounter]) { asFNResult=asFNResult.SubString(1,iFNPos-1)+arrFemaleFNDP[iFNCounter]; break; } } if(asFNResult==argFN) { for(iFNCounter=0;iFNCounter<3;iFNCounter++) { iFNLength=arrMaleFN[iFNCounter].Length(); iFNPos=asFNResult.Length()-iFNLength+1; asFNTerm=asFNResult.SubString(iFNPos,iFNLength); if(asFNTerm==arrMaleFN[iFNCounter]) { asFNResult=asFNResult.SubString(1,iFNPos-1)+arrMaleFNDP[iFNCounter]; break; } else { asFNResult=asFNResult.SubString(1,iFNPos-1)+"у"; break; } } } return asFNResult; } //--------------------------------------------------------------------------- AnsiString MNtoDP(AnsiString argMN) { int iMNCounter, iMNLength=0, iMNPos=0; AnsiString asMNTerm=""; const AnsiString asMaleMN="ич"; const AnsiString asMaleMNDP="ичу"; const AnsiString arrFemaleMN[2]={"вна","чна"}; const AnsiString arrFemaleMNDP[2]={"вне","чне"}; AnsiString asMNResult=argMN; iMNLength=asMaleMN.Length(); iMNPos=asMNResult.Length()-iMNLength+1; asMNTerm=asMNResult.SubString(iMNPos,iMNLength); if(asMNTerm==asMaleMN) asMNResult=asMNResult.SubString(1,iMNPos-1)+asMaleMNDP; if(asMNResult==argMN) { for(iMNCounter=0;iMNCounter<2;iMNCounter++) { iMNLength=arrFemaleMN[iMNCounter].Length(); iMNPos=asMNResult.Length()-iMNLength+1; asMNTerm=asMNResult.SubString(iMNPos,iMNLength); if(asMNTerm==arrFemaleMN[iMNCounter]) { asMNResult=asMNResult.SubString(1,iMNPos-1)+arrFemaleMNDP[iMNCounter]; break; } } } return asMNResult; } //P.S. Feci quod potui, faciant meliora potentes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 10:08 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
аndo//P.S. Feci quod potui, faciant meliora potentes. Вспомнилось из "Формулы любви"... ФарадаОооо... да ты тут латынь учишь вместо того, чтоб карету чинить.... Жакоб, мы отсюда никогда не уедем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 10:21 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
CEMb, издеваешься, да-а?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2004, 16:49 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Нет, просто вспомнилось из "Формулы любви" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2004, 07:49 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Может скажешь чего про функции-то? Я ж чайник! Коли плохо, - что именно, - учту, коли хорошо, - просто приятно будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 10:36 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Увы, ничё не скажу, не смотрел, нету у меня AnsiString-a в VC :) Вообще так, если тебе они жить помогают, значит хорошие функции, если нет - значит надо дороботать :) Я вот пишу некоторые программы для себя, они мне жизнь упрощают, вот и классно, значит хорошие :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 07:21 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Оптимизированная функция преобразования фамилии в дательный падеж: учтена возможность двойной фамилии. __________________________________ AnsiString LNtoDP(AnsiString argLN) { int iLNCounter, iLNLength=0, iLNPos=0; AnsiString asLNTerm=""; const AnsiString arrMaleLN[8]={"ов","ев","ин","кий","ий","ич","ый","а"}; const AnsiString arrMaleLNDP[8]={"ову","еву","ину","кому","ию","ичу","ому","е"}; const AnsiString arrFemaleLN[5]={"ова","ева","ина","ая","а"}; const AnsiString arrFemaleLNDP[5]={"овой","евой","иной","ой","е"}; AnsiString asLNResult=argLN; int iDivPos=asLNResult.Pos("-"); if(iDivPos>0){ AnsiString asSubLN=asLNResult.SubString(1,iDivPos-1); asLNResult=LNtoDP(asSubLN); asLNResult+="-"; asSubLN=argLN.SubString(iDivPos+1,argLN.Length()-iDivPos); asLNResult+=LNtoDP(asSubLN); } else{ for(iLNCounter=0;iLNCounter<7;iLNCounter++) { iLNLength=arrMaleLN[iLNCounter].Length(); iLNPos=asLNResult.Length()-iLNLength+1; asLNTerm=asLNResult.SubString(iLNPos,iLNLength); if(asLNTerm==arrMaleLN[iLNCounter]) { asLNResult=asLNResult.SubString(1,iLNPos-1)+arrMaleLNDP[iLNCounter]; break; } } if(asLNResult==argLN) { for(iLNCounter=0;iLNCounter<4;iLNCounter++) { iLNLength=arrFemaleLN[iLNCounter].Length(); iLNPos=asLNResult.Length()-iLNLength+1; asLNTerm=asLNResult.SubString(iLNPos,iLNLength); if(asLNTerm==arrFemaleLN[iLNCounter]) { asLNResult=asLNResult.SubString(1,iLNPos-1)+arrFemaleLNDP[iLNCounter]; break; } } } } return asLNResult; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2004, 09:44 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Срочно переходи на char* и wchar_t*. Они самое быстрое что может только быть в С/C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 17:30 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Ты знаешь, некий чайник попытался, используя char, работать с файлом через fwrite. Так он оплевался: функция пишет в файл 4 символа и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2004, 22:01 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
Пусть этот он достанет MSDN (можно найти с MS VisualC) и почитает про функию fwrite как она работает. Да и вообще ответы на любые вопросы по С/С++ он может там найти, т.к. MSDN наиболее полный ресурс посвященный С/С++. Это не реклама, а просто совет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 17:40 |
|
||
|
Строковые функции: берите, кому надо.
|
|||
|---|---|---|---|
|
#18+
авторТак он оплевался: функция пишет в файл 4 символа и все. Либо место на диске кончилось, либо он стока и просил писать :) Всю жизнь пишу чары в файл так, никаких проблем. PS offtop олимпиадный вопрос: чародейка это - такая тётка; - char *pc = new char[100]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 11:05 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32455985&tid=2035050]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 383ms |

| 0 / 0 |
