- •2 . Пример
- •Лабораторная работа № 2
- •1 Содержание работы
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2. Пример
- •Лабораторная работа№ 3
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •Часть вторая: Оператор выбора
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •Группа а Таблица 7
- •Группа в
- •2. Примеры
- •Лабораторная работа№ 4
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2 Примеры
- •For (выражение1; выражение2;выражение3) {операторы; }
- •Лабораторная работа№ 5
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2. Примеры
- •3. Сортировка элементов массива
- •Сортировка выбором
- •3.2. Сортировка вставкой
- •3.3. Сортировка методом прямого выбора
- •3.4. Сортировка методом обмена
- •Лаборатоная работа № 6
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •Методические указания
- •Лабораторная работа № 7
- •1 Порядок выполнения лабораторной работы:
- •Лаборатоная работа № 8
- •1 Порядок выполнения лабораторной работы:
- •Задания
- •2. Теоретические сведения
- •Год рождения – 1978
- •Лабораторная работа № 9
- •1 Порядок выполнения лабораторной работы:
- •Лабораторная работа № 10
- •1 Порядок выполнения лабораторной работы:
- •2. Задание для выполнения
- •2. Примеры
- •Лабораторная работа № 11
- •1 Порядок выполнения лабораторной работы:
- •2. Задание для выполнения
- •Варианты заданий
- •Лабораторная работа № 12
- •1 Порядок выполнения лабораторной работы:
- •2. Краткие теоретические сведения Объектно-ориентированный подход
- •Сущности и Объекты
- •Система типов
- •Инкапсуляция
- •Пример класса
- •Создание объектов. Конструкторы и деструктор
- •Наследование
- •Перегрузка функций
- •Полиморфизм
- •Функции-друзья
- •Абстрактные классы
- •Дополнительные возможности
- •Индивидуальные задания
- •2.1. Пример решения задания
- •Int windForce; // Сила ветра в баллах
- •Int startHeight; // Начальная высота
- •Int fuel; // Запас топлива
- •Результат выполнения программы:
- •Список использованной литературы
Методические указания
1.
2. Дана целочисленная матрица размера n. Найти матрицу,
полученную из данной перестановкой строк первой с последней,
второй с предпоследней и т.д..
Лабораторная работа № 7
Тема: Программирование задач обработки символьных данных в среде Си++Builder.
Цель работы: Знакомство с функциями и методами обработки строковых данных, при создании программ использовать компоненты вкладки Standard среды Си++Builder.
1 Порядок выполнения лабораторной работы:
1.1 Знакомство с теоретическим материалом, соответствующим теме лабораторной работы
1.2. Ответить на следующие вопросы:
AnsiString — тип строк
В C++Builder тип строка АnsiString реализован как класс, объявленный в файле vcl/dstring.h и аналогичный типу длинных строк в Delphi. Это строки с нулевым символом в конце. При объявлении переменные типа AnsiString инициализируются пустыми строками.
Для AnsiString определены операции отношения = =, !=, >, <, >=, <=. Сравнение производится с учетом регистра. Сравниваются коды символов, начиная с первого, и если очередные символы не одинаковы, строка, содержащая символ с меньшим кодом считается меньше. Если все символы совпали, но одна строка длиннее и в ней имеются еще символы, то она считается больше, чем более короткая.
Для AnsiString определены операции присваивания =, += и операция склеивания строк (конкатенации) +. Определена также операция индексации [ ]. Индексы начинаются с 1. Например, если S1 = "Привет", то S1[1] вернет 'П', Sl[2] вернет 'p' и т.д.
Основные методы класса AnsiString (в описаниях методов через S1 обозначена строка, метод которой используется):
Метод |
Синтаксис / Описание |
|
AnsiCompare |
int fastcall AnsiCompare(const AnsiString& rhs) const Сравнивает данную строку S1 с rhs с учетом регистра. Сравнение зависит от текущих установок Windows и может отличаться от сравнения, осуществляемого операциями сравнения. Возвращает значение > 0 при SI > rhs, значение < 0 при SI < rhs и значение 0 при SI = rhs |
|
AnsiCompareIC |
int fastcall AnsiCompareIC(const AnsiString& rhs) const Осуществляет сравнение, аналогичное AnsiCompare, но без учета регистра |
|
AnsiLastChar |
x;har* fastcall AnsiLastChar() const Возвращает указатель на последний значащий символ. Поддерживает многобайтные символы |
|
AnsiPos |
int fastcall AnsiPos(const AnsiString& subStr) const Возвращает индекс первого символа первого вхождения subStr в S1. Индексы начинаются с 1. Если subStr не содержится в S1, возвращается 0. В отличие от Pos поддерживает многобайтные символы |
|
AnsiString |
fastcall AnsiString(apryMeHT) Конструктор класса. В зависимости от типа аргумента создает: |
|
Аргумент |
Функция создает |
|
Отсутствует |
Пустую строку |
|
const char* src |
Строку с нулевым символом в конце из массива символов |
|
const AnsiString& src |
Копию AnsiString src |
|
const char* src, unsigned char len |
Строку с нулевым символом в конце, являющуюся копией первых len символов из src |
|
const wchar_t* src |
Строку с нулевым символом в конце из массива src символов типа wchar_t |
|
int src |
Строку с нулевым символом в конце из массива src целых значений символов |
|
double src |
Строку с нулевым символом в конце из массива src значений символов с плавающей запятой; преобразуются первые 15 значащих разрядов |
|
c_str |
char* fastcall c_str()const Возвращает указатель на строку с нулевым символом в конце, содержащую те же символы, что в AnsiStrmg |
|
CurrToStr |
static AnsiString fastcall CurrToStr(Currency value) Преобразует значение value типа Currency в строку |
|
CurrToStrF |
static AnsiString fastcall CurrToStrF(Currency value, TstringFloatFormat format, int digits) Преобразует значение value типа Currency в строку, используя указанный формат преобразования чисел с плавающей запятой (см. разд. «TstringFloatFormat — тип»). Параметр определяет задаваемое число разрядов. Функция соответствует функции CurrToStrF с заданной точностью 19 разрядов |
|
Delete |
void fastcall Delete(int index, int count) Удаляет из строки, начиная с позиции index число символов, равное count |
|
floatToStrF |
static AnsiString fastcall FloatToStrF(long double value, TstringFloatFormat format, int precision, int digits) Преобразует значение value с плавающей запятой в строку, используя указанный формат (см. разд. «TstringFloatFormat — тип»). Параметры precision и digits задают точность и число разрядов. Точность должна задаваться не более 7 для типа float, не более 15 для double и не более 18 для Extended. Число разрядов зависит от выбранного формата |
|
Format |
static AnsiString fastcall Format(const AnsiString& format, const TVarRec *args, int size) Формирует строку, используя строку формата format и массив аргументов args |
|
FormatFloat |
static AnsiString fastcall ForniatFloat( const AnsiString& format, const long double& value) Преобразует значение value с плавающей запятой в строку, используя указанный формат format |
|
Insert |
void fastcall Insert(const AnsiString& str, int index) Вставляет в строку подстроку str, начиная с индекса index |
|
IntToHex |
static AnsiString fastcall IntToHex(int value, int digits) Преобразует значение value в строку, содержащую минимум digits шестнадцатеричных цифр |
|
IsDelimiter |
bool fastcall IsDelimiter(const AnsiString& delimiters, int index) const Возвращает true, если символ с индексом index является одним из разделителей, указанных в строке delimiters. Работает и для многобайтных символов |
|
IsEmpty |
bool fastcall IsEmpty() const Возвращает true, если строка пустая |
|
LastDelimiter |
int fastcall LastDelimiter(const AnsiString& delimiters) const Возвращает последний из символов строки, входящих в строку разделителей delimiters. Например, если AnsiString s = "с : \\filename . ext"; то s . LastDelimiter ("\\ .:" ); вернет 12 (индекс символа точки) |
|
Length |
int fastcall Length() const Возвращает число символов в строке |
|
LowerCase |
AnsiString fastcall LowerCase() const Возвращает строку, в которой все символы приведены к нижнему регистру. Не влияет на исходную строку |
|
Pos |
int fastcall Pos(const AnsiString& subStr) const Возвращает индекс первого символа первого вхождения subStr в S1. Индексы начинаются с 1. Если subStr не содержится в S1, возвращается 0. В отличие от AnsiPos не поддерживает многобайтные символы |
|
SetLength |
void fastcall SetLength(int newLength) Усекает строку до newLength символов. Если исходная строка короче, то она не увеличивается |
|
StringOfChar |
static AnsiString fastcall StringOfChar(char ch, int count) Возвращает строку, в которой символ ch повторен count раз. Например, AnsiString s = AnsiString: : StringOfChar ( 'A' , 10); задаст строке s значение «АААААААААА» |
|
Substring |
AnsiString fastcall SubString(int index, int count) const Возвращает подстроку, начинающуюся с символа в позиции index и содержащую count символов |
|
ToDouble |
double fastcall ToDouble() const Преобразует строку в число с плавающей запятой. Если строка не соответствует формату числа с плавающей запятой, генерируется исключение EConvertError |
|
Tolnt |
int fastcall Tolnt() const Преобразует строку в целое число. Если строка не соответствует формату целого числа, генерируется исключение EConvertError |
|
ToIntDef |
int fastcall ToIntDef(int defaultValue) const Преобразует строку в целое число. Если строка не соответствует формату целого числа, возвращается значение по умолчанию defaultValue |
|
Trim |
AnsiString fastcall Trim() const Возвращает строку, соответствующую исходной, но без пробельных символов до и после значащих символов |
|
TrimLeft |
AnsiString fastcall TrimLeft() const Возвращает строку, соответствующую исходной, но без начальных пробельных символов . |
|
TrimRight |
AnsiString fastcall TrimRight() const Возвращает строку, соответствующую исходной, но без заключительных пробельных символов |
|
Unique |
void fastcall Unique() Делает строку уникальной, т.е. устанавливает число ссылок на нее (refcnt) в 1. Таким образом, на нее ссылается только один объект |
|
UpperCase |
AnsiString fastcall UpperCase() const Возвращает строку, в которой все символы приведены к верхнему регистру. Не влияет на исходную строку |
|
WideChar |
wchar_t* fastcall WideChar(wchar_t* dest, int destSize) const Преобразует строку в массив символов dest типа wchar_t и возвращает указатель на этот массив |
|
WideCharBuf- Size |
int fastcall WideCharBufSize() const Возвращает размер буфера, требуемого для функции WideChar |
|
Функции обработки строк типа AnsiString
Функция |
Синтаксис / Описание |
Файл |
AdjustLineBreaks |
System::AnsiString AdjustLineBreaks(const System::AnsiString S) Заменяет в S символы конца строки на CR/LF -стандартные для Unix |
SysUtils.hpp |
AnsiCompareStr |
int AnsiCompareStr(const System::AnsiString SI, const System::AnsiString S2) Сравнивает строки 81и S2 с учетом регистра; результат < 0 при Sl< S2, = 0 при Sl= S2, > 0 при Sl> S2 |
SysUtils.hpp |
AnsiCompareText |
int AnsiCompareText (const System::AnsiString SI, const System::AnsiString S2) Сравнивает строки 81и S2 без учета регистра; результат < 0 при Sl< S2, = 0 при Sl= S2, > 0 при Sl> S2 |
SysUtils.hpp |
AnsiExtractQuotedStr |
System::AnsiString AnsiExtractQuotedStr( char * &Src, char Quote) Возвращает строку Src с удаленными из ее начала и конца символами кавычек, заданными как Quote, и с заменой внутри двойных кавычек на одинарные |
SysUtils.hpp |
AnsiLowerCase |
System::AnsiString AnsiLowerCase(const System::AnsiString S) Возвращает строку S, приведенную к нижнему регистру (работает с кириллицей) |
SysUtils.hpp |
AnsiPos |
int AnsiPos(const System::AnsiString Substr, const System::AnsiString S) Возвращает позицию начала подстроки Substr в S или 0 |
SysUtils.hpp |
AnsiQuotedStr |
System::AnsiString AnsiQuotedStr( const System::AnsiString S, char Quote) Возвращает строку S со вставленными в ее начало и конец символами кавычек, заданными как Quote, и с заменой внутри строки одинарных кавычек на двойные |
SysUtils.hpp |
AnsiUpperCase |
System::AnsiString AnsiUpperCase( const System::AnsiString S) Возвращает строку S, приведенную к верхнему регистру (работает с кириллицей) |
SysUtils.hpp |
IsDelimiter |
bool IsDelimiter(const System::AnsiString Delimiters, const System::AnsiString S, int Index) Определяет, является ли символ с индексом Index в строке S одним из разделителей, указанных в строке Delimiters |
SysUtils.hpp |
IsPathDelimiter |
bool IsPathDelimiter(const System::AnsiString S, int Index); Определяет, является ли символ с индексом Index в строке S обратным слэшем '\', используемым для задания путей к файлам |
SysUtils.hpp |
LastDelimiter |
int LastDelimiter(const System::AnsiString Delimiters, const System::AnsiString S) Возвращает индекс последнего вхождения в строку S одного из разделителей, указанных в строке Delimiters |
SysUtils.hpp |
LowerCase |
System::AnsiString LowerCase(const System::AnsiString S) Возвращает строку S, приведенную к нижнему регистру (для кириллицы используйте AnsiLowerCase) |
SysUtils.hpp |
QuotedStr |
System::AnsiString QuotedStr(const System::AnsiString S) Возвращает строку S со вставленными в ее начало и конец символами одинарных кавычек и с заменой внутри строки одинарных кавычек на двойные (для многобайтных символов используйте AnsiQuotedStr) |
SysUtils.hpp |
StringReplace |
System::AnsiString StringReplace(const System::AnsiString S,const System::AnsiString OldPattern, const System::AnsiString NewPattern, TReplaceFlags Flags)Возвращает строку S с заменой подстроки OldPattern на NewPattern; Flags управляет заменами подстрок |
SysUtils.hpp |
Trim |
System::AnsiString Trim(const System::AnsiString S) Возвращает строку S с удаленными начальными и конечными пробельными и управляющими символами |
SysUtils.hpp |
TrimLeft |
System::AnsiString TrimLeft(const System::AnsiString S) Возвращает строку S с удаленными начальными пробельными и управляющими символами |
SysUtils.hpp |
TrimRight |
System::AnsiString TrimRight(const System::AnsiString S) Возвращает строку S с удаленными конечными пробельными и управляющими символами |
SysUtils.hpp |
UpperCase |
System::AnsiString UpperCase(const System::AnsiString S) Возвращает строку S, приведенную к верхнему регистру (для кириллицы используйте AnsiUpperCase) |
SysUtils.hpp |
WrapText |
System::AnsiString WrapText const System::AnsiString Line, const System::AnsiString BreakStr, const TSysCharSet &BreakChars, int MaxCoI) Возвращает текст Line, разбитый на строки длиной до MaxCol вставкой символов BreakStr и заменой на них символов множества BreakChars |
SysUtils.hpp |
Комментарии
Все функции, оперирующие со строками типа 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.Подсчитать количество слов в строке.
Из условия понятно, что задачу можно решить, перебирая строку посимвольно. Сравнивая каждый символ с пробелом, можно подсчитать их количество. Количество слов будет на одно больше. Например, строка «МАМА МЫЛА РАМУ» содержит два пробела и три слова. Программу можно записать так:
for (i=1;i<=StrLen(st.c_str());i++)
if (IsDelimiter(del,st,i)) k++;
Edit3->Text=IntToStr(k+1);
2.Определить, длину строки
i=st.Length(); // или i=StrLen(st.c_str());
Edit4->Text=IntToStr(i);}
3.Сколько раз в тексте встречается подстрока S2.
s2=Edit2->Text;
i=st.AnsiPos(s2);
while (i)
{ k++;
n+= i+s2.Length();
i=st.SubString(n,255).Pos(s2); }
Edit5->Text=IntToStr(k);
