Программирование с использованием строк
Цель лабораторной работы: изучить правила работы с компонентами TListBox и TComboBox. Написать программу работы со строками.
5.1.Типы данных для работы со строками
5.1.1. Нуль-терминальная строка char[]
В языке C++ нет специального типа для объявления строк, поэтому они представляются в виде одномерных массивов символов. Последний элемент такого массива - нулевой байт ‘\0’ - (нуль-терминатор). Длина строки равна количеству символов плюс нуль-терминатор. При наборе нуль-терминатор в конце строки ставить не нужно, его автоматически ставит компилятор языка C++ (надо не забывать выделять под него место).
Строки могут быть описаны следующим
образом:
char st1[10]=”123456789”;
char st2[]=”1234”;
Если размер строки не объявлен явно, то он будет установлен автоматически и будет равен количеству введенных символов +1.
Для работы с такими строками существует набор функций, который расположен в файле string.h. Наиболее часто применяются следующие функции:
strcpy(st1, st2) - копирует содержимое строки st2 в строку st1.
strcat(st1, st2) - приписывает содержимое строки st2 к строке stl.
strcmp(st1, st2) - сравнивает содержимое строк st2 и stl. Если st1>st2, то результат отрицательный, если st1=st2 - результат равен нулю, если st1<st2 - результат положительный. Функция strcmpi(st1, st2) делает то же самое, но без учета регистра и только для латинского алфавита.
strstr(st1, st2) - указывает первое появление подстроки st2 в строке st1.
strlen() - возвращает длину строки (нуль-терминатор ‘\0’ не учитывается)
Функции преобразования строк в числа:
atoi(st) - преобразует строку st в число целого типа (int).
atol(st) - преобразует строку st в число длинного
целого типа (long).
atof(st) - преобразует строку st в число
действительного типа (double).
Функции преобразования чисел в строки:
itoa(a,st,kod) - преобразует числа целого типа (int) в строку st.
ltoa(a,st,kod) - преобразует число длинного целого типа (long) в строку st.
5.1.2.Тип AnsiString
Основной строковый тип в C++ Builder имеет большой набор функций, позволяющих производить операции присваивания переменных различных типов. Основные методы:
c_str() - возвращает указатель на нуль-терминальную строку, содержащую ту же информацию, что и исходная строка.
FloatToStrF() - форматированный перевод из действительного числа в строку.
IntToHex() - перевод шестнадцатеричного числа. Второй параметр - минимальное число цифр.
StrToInt(), StrToDouble() - перевод строк в числа, соответственно int, double. Delete(), SubString() - удаление символов и копирование подстроки.
Pos() - позиция строки-аргумента, начиная с 1.
Length() - длина строки.
5.1.3.Широкая строка типа WideString
Этот класс взят из Delphi. Основным его отличием от AnsiString является хранение
массива расширенных символов, называемых wide characters, тип wchar_t*. Поэтому он в основном используется в COM.
5.2.Компонент TListBox
Компонент TListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк. Объект Items хранит строки, находящиеся в списке. Для определения номера выделенного элемента используется свойство ItemIndex.
5.3.Компонент TComboBox
Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TЕdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text, как в TEdit, а для работы со списком выбора - свойство Items, как в TListBox. Cуществует пять модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.
5.4.Компонент TBitBtn
Компонент TBitBtn расположен на странице Additonal палитры компонентов и представляет собой разновидность стандартной кнопки TBotton. Его отличительная особенность - наличие растрового изображения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mr*** (например bkOk - mrOk). Кнопка bkClose закрывает главное окно и завершает работу программы.
Обо всех происходящих в системе событиях, таких, как создание формы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда C++ Builder позволяет принимать и обрабатывать большинство таких сообщений. Каждый компонент содержит обработчики сообщений на странице Events инспектора объектов.
Для создания обработчика события необходимо раскрыть список компонентов в верхней части окна инспектора объектов и выбрать необходимый компонент. Затем на странице Events нажатием левой клавиши мыши выбрать обработчик и дважды щелкнуть по его левой (белой) части. В ответ C++ Builder активизирует окно текста программы и покажет заготовку процедуры обработки выбранного события.
Каждый компонент имеет свой набор обработчиков событий,
однако некоторые из них присущи большинству компонентов. Наиболее часто
применяемые события представлены в табл. 5.1.
Таблица 5.1.
Событие |
Описание события |
OnActivate |
Форма получает это событие при активации |
OnCreate |
Возникает при создании формы (компонент TForm). В обработчике данного события следует задавать действия, которые должны происходить в момент создания формы, например: установка начальных значений |
OnKeyPress |
Возникает при нажатии кнопки на клавиатуре. Параметр Key имеет тип WORD и содержит ASCII-код нажатой клавиши (клавиша Enter клавиатуры имеет код 13, клавиша Esc - 27 и т.д.). Обычно это событие используется в том случае, когда необходима реакция на нажатие одной из клавиш |
OnKeyDown |
Возникает при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctlr, а также о нажатой кнопке мыши. Информация о клавише передается параметром Key, который имеет тип Word |
OnKeyUp |
Является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши |
OnClick |
Возникает при нажатии кнопки мыши в области компонента |
OnDblClick |
Возникает при двойном нажатии кнопки мыши в области компонента |
5.6.Порядок выполнения индивидуального задания
Задание: написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. Для ввода строк и работы с ними использовать TComboBox. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close.
Панель диалога будет иметь вид (рис. 5.1).
Рис 5.1.
Текст программы:
//--------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//......................................................................
___fastcall
TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------
Void___fastcall
TForm1::FormActivate(TObject *Sender)
{
Form1->ComboBox1->SetFocus();
// Передача фокуса ComboBox1
}
//-------------------------------------------------------------------------
// Обработка события нажатия клавиши на клавиатуре
void___fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
if (Key==13)
ComboBox1->Items->Add(ComboBox1->Text);
// Строка из окна редактирования заносится в ComboBoxl
ComboBox1->Text=""; // Очистка окна редактирования
// Обработка события нажатия левой клавиши мыши
Void___fastcall TForm1::ComboBox1Click(TObject *Sender)
int n,i,nst;
nst=ComboBox1->ItemIndex; // Определение номера выбранной строки
String st=ComboBox1->Items->Strings[nst]; // Занесение выбранной строки в переменную st
if (st[1]!=' ') n=1; else n=0;
for(i=1;i<st.Length();i++) // Просмотр всех символов строки st if(st[i]==' '&&st[i+1]!=' ') n++;
Form1->Label3->Caption=IntToStr(n);
// Вывод числа слов в Label3
}
//-----------------------------------------------------------------------------------------
Во всех заданиях исходные данные вводить с помощью компонента TEdit в компонент TListBox либо с помощью свойства Text в свойство Items компонента TComboBox. Скалярный результат выводить c помощью компонента TLabel. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.
1.Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с пятью символами.
2.Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.
3.Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.
4.Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов.
5.Дана строка, состоящая из групп нулей и единиц. Подсчитать количество единиц в группах с нечетным количеством символов.
6.Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака “+” или “-“ и внутри которой нет букв, запятых и точек).
7.Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой.
7.Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой.
9.Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.
10.Дана строка символов, состоящая из произвольных десятичных цифр, разделенных пробелами. Вывести четные числа этой строки.
11.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран слова этого текста в порядке, соответствующем латинскому алфавиту.
12.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова).
13.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая длиной k-символов (если на k-ю позицию попадает слово, то его следует отнести ко второй строке, дополнив первую пробелами до k-позиции).
14.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова максимальной длины и номер позиции строки, с которой оно начинается.
15.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова минимальной длины и количество символов в этом слове.
16.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. В каждом слове заменить первую букву на прописную.
17.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Удалить первые k слов из строки, сдвинув на их место последующие.
18.Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Поменять местами i-е и j-е слова.