![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Комментарии
Все функции, оперирующие со строками типа 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. Исходная форма
|