Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Строковые функции: берите, кому надо. / 12 сообщений из 12, страница 1 из 1
16.03.2004, 09:54
    #32442871
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Уважаемые коллеги!
Я не претендую на очередное открытие Америки или изобретение велосипеда.
Просто я знаю, как пустяковые препятствия тормозят большое дело.
Предлагаю вам кой-какие наработки, кому надо.
Код написан в 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.
...
Рейтинг: 0 / 0
16.03.2004, 10:08
    #32442891
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
//Три функции подстановки в дательный падеж: для фамилии, имени и отчества
//возможность двойной фамилии в разработке (доделаю – пришлю)
//не учтена возможность пустой строки и, наверное, еще чего-нибудь (пока не знаю, может вы подскажете)
//не учтена возможность пустой строки, азербайджанского отчества (-оглы, -кызы) и, наверное, еще чего-нибудь (пока не знаю, может вы подскажете)

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.
...
Рейтинг: 0 / 0
16.03.2004, 10:21
    #32442918
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
аndo//P.S. Feci quod potui, faciant meliora potentes.

Вспомнилось из "Формулы любви"...

ФарадаОооо... да ты тут латынь учишь вместо того, чтоб карету чинить....
Жакоб, мы отсюда никогда не уедем...
...
Рейтинг: 0 / 0
22.03.2004, 16:49
    #32451744
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
CEMb, издеваешься, да-а?!
...
Рейтинг: 0 / 0
23.03.2004, 07:49
    #32452253
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Нет, просто вспомнилось из "Формулы любви" :)
...
Рейтинг: 0 / 0
24.03.2004, 10:36
    #32454301
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Может скажешь чего про функции-то?
Я ж чайник!
Коли плохо, - что именно, - учту, коли хорошо, - просто приятно будет.
...
Рейтинг: 0 / 0
25.03.2004, 07:21
    #32455985
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Увы, ничё не скажу, не смотрел, нету у меня AnsiString-a в VC :)

Вообще так, если тебе они жить помогают, значит хорошие функции, если нет - значит надо дороботать :)
Я вот пишу некоторые программы для себя, они мне жизнь упрощают, вот и классно, значит хорошие :)
...
Рейтинг: 0 / 0
14.04.2004, 09:44
    #32480316
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Оптимизированная функция преобразования фамилии в дательный падеж:
учтена возможность двойной фамилии.
__________________________________

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;
}
...
Рейтинг: 0 / 0
22.04.2004, 17:30
    #32492557
arthur1981
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Срочно переходи на char* и wchar_t*. Они самое быстрое что может
только быть в С/C++
...
Рейтинг: 0 / 0
24.04.2004, 22:01
    #32495542
ando
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Ты знаешь, некий чайник попытался, используя char, работать с файлом через fwrite. Так он оплевался: функция пишет в файл 4 символа и все.
...
Рейтинг: 0 / 0
27.04.2004, 17:40
    #32499276
arthur1981
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
Пусть этот он достанет MSDN (можно найти с MS VisualC) и почитает
про функию fwrite как она работает. Да и вообще ответы на любые вопросы
по С/С++ он может там найти, т.к. MSDN наиболее полный ресурс посвященный С/С++. Это не реклама, а просто совет.
...
Рейтинг: 0 / 0
28.04.2004, 11:05
    #32500047
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Строковые функции: берите, кому надо.
авторТак он оплевался: функция пишет в файл 4 символа и все.
Либо место на диске кончилось, либо он стока и просил писать :)

Всю жизнь пишу чары в файл так, никаких проблем.


PS offtop

олимпиадный вопрос:
чародейка это

- такая тётка;
- char *pc = new char[100];
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Строковые функции: берите, кому надо. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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