Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Комментарии






Все функции, оперирующие со строками типа AnsiString, учитывают локали­зацию и поэтому могут с равным успехом работать как для латинских букв, так и для кириллицы. В этом их большое преимущество перед многими функциями, ра­ботающими со строками типа char *.

Несколько замечаний о приведенных в таблице функциях. В функциях IsDelimiter и IsPathDelimiter индексы отсчитываются от 1 (вопреки утверждени­ям встроенной справки C++Builder). Соответственно 1 — это первый символ стро­ки, 2 — второй и т.д.

Функция IsDelimiter удобна для просмотра всех символов строки и замены каких-то одних символов на другие. Например, код

AnsiString S, Delimiters;

Delimiters = " '";

S =...;

for(int i = 1; i < = StrLen(S.c_str()); i++)

if(IsDelimiter(Delimiters, S, i)) S[i] = " ";

заменит в строке S все символы одинарных кавычек на двойные кавычки.

В этой функции в строке Delimiters не обязательно должны быть именно раз­делители. В нее могут быть занесены любые символы. Например, если приведен­ный код изменить следующим образом:

AnsiString S, Delimiters; Delimiters = " 123456789"; S =...;

for(int i = 1; i < = StrLen(S.c_str()); i++) if(IsDelimiter(Delimiters, S, i)) S[i] -= 1;

то все символы цифр в строке, кроме 0, будут уменьшены на 1.

Функция StringReplace возвращает строку S с заменой подстроки OldPattern на NewPattern. Если параметр Flags не включает флаг rfReplaceAll, то функция заменят только первое вхождение подстроки OldPattern. Если параметр Flags включает флаг rfIgnoreCase, то операции выполняются без учета регистра. Напри­мер, оператор

S1 = StringReplace(S, OldPattern, NewPattern,

TReplaceFlags () «rfReplaceAll);

поместит в строку S1 текст строки S с заменой в ней всех подстрок OldPattern на NewPattern.

Функция WrapText разбивает заданный текст Line на строки. В качестве сим­волов конца строки используются символы, заданные параметром BreakStr. Пара­метр MaxCol задает максимальное количество символов в строке. Разбиение на строки производится вставкой BreakStr после одного из символов, имеющихся в множестве BreakChars. Вставка производится после того из символов в текущей строке, который обеспечивает ее максимальную длину в пределах MaxCol. Если ни одного символа из BreakChars не встретилось, длина строки может превысить MaxCol. Например, операторы

TSysCharSet bchars;

bchars «' ' «'.' «', ' «'; ' «'+' «'-';

AnsiString S, S1;

S =...;

S1 = WrapText(S, " \n\r", bchars, 10);

обеспечивают запись в S1 текста S, разбитого на строки длиной до 10 символов, причем разбиение проводится после пробелов и знаков пунктуации. Если в S запи­сать текст: «Этот тест показывает разбиение на строки, в частности — на символах + и —.», то результат будет следующим:

" Этот тест " " показывает " " разбиение "

" на строки, " и в ••

" частности " " - на " " символах +" " и -. "

Можно заметить, что вторая строка содержит 11 символов, включая пробел, т.е. ее размер больше заданного.

Конечно, в этом примере указана очень маленькая длина строки и поэтому разбиение выглядит не красиво. При нормальной для печати длине строк разбие­ние получается лучше.

 

Пример 2.1. Дана строка символов (считывается с Edit1). Группа символов между пробелами считается словом.

Рисунок-28. Исходная форма

1.Подсчитать количество слов в строке.

Из условия понятно, что задачу можно решить, перебирая строку посимвольно. Сравнивая каждый символ с пробелом, можно подсчитать их количество. Количество слов будет на одно больше. Например, строка «МАМА МЫЛА РАМУ» содержит два пробела и три слова. Программу можно записать так:

AnsiString st, s2, del=" ";

// char *ptr;

int i=0, k=0, n=0;

 

st=TrimLeft(Edit1-> Text); // TrimLeft убирает начальные пробелы

 

if (RadioButton1-> Checked) { //определить кол-во слов в строке st

for (i=1; i< =StrLen(st.c_str()); i++)

if (IsDelimiter(del, st, i)) k++;

Edit3-> Text=IntToStr(k+1); }

else Edit3-> Text=" ";

 

if (RadioButton2-> Checked) {

i=st.Length(); // или i=StrLen(st.c_str()); - возращает длину строки

Edit4-> Text=IntToStr(i); }

else Edit4-> Text=" ";

 

2.Определить, длину строки

if (RadioButton2-> Checked) {

i=st.Length(); // или i=StrLen(st.c_str()); - возращает длину строки

Edit4-> Text=IntToStr(i); }

else Edit4-> Text=" ";

 

3.Сколько раз в тексте встречается подстрока S2.

if (RadioButton3-> Checked) {

s2=Edit2-> Text;

i=st.AnsiPos(s2);

while (i)

{

k++;

n+= i+s2.Length();

i=st.SubString(n, 255).Pos(s2); }

if (k! =0) Edit5-> Text=IntToStr(k);

else Edit5-> Text=" подстрока не найдена"; }

else Edit5-> Text=" ";

 

4. Проверить, является слово словом полндромом.

if (RadioButton4-> Checked) {

i=st.Length()/2;

s2=st;

if (st.Length()/2*2! =st.Length()) //проверяем на четность длинк строки

{ st.Delete(1, i); // если длина строки нечетная

s2.Delete(i+2, i);

}

else {st.Delete(1, i); // если длина строки четная

s2.Delete(i+1, i+1);

}

s2=AnsiString(strrev(s2.c_str()));

k= AnsiCompareText(st, s2); // или k=AnsiStrIComp(st.c_str(), s2.c_str());

if (k==0) Edit6-> Text=" слово полиндром";

else Edit6-> Text=" слово не полиндром";

}

else Edit6-> Clear();

 

Пример 2.2. Написать программу, которая выполняла бы на выбор одной из действий

- проверить, является ли введенная строка целым числом

- проверить, является ли введенная строка вещественным числом

- проверить, является ли введенная строка двоичным числом

- проверить, является ли введенная строка шестнадцатеричным числом

Так как на выбор должно выполняться одно из действий, то для выбора используем компоненту RadioButton (рисунок 29).

 

Рисунок 29. Исходная форма

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.