Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labs Borland С++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.77 Mб
Скачать

Методические указания

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 с плавающей запятой в строку, используя указанный формат (см. разд. «TstringFloatFor­mat — тип»). Параметры precision и digits задают точность и число разрядов. Точность должна задаваться не более 7 для типа float, не более 15 для double и не более 18 для Exten­ded. Число разрядов зависит от выбранного формата

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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]