- •Основы программирования
- •Предисловие
- •Введение
- •1. Изучение интегрированной среды Delphi
- •Контрольные вопросы к главе 1
- •Задание к лабораторной работе № 1
- •2. Программирование линейных алгоритмов в системе Delphi
- •Контрольные вопросы к главе 2
- •Задания к лабораторной работе № 2
- •3. Программирование разветвленных алгоритмов в системе Delphi
- •Контрольные вопросы к главе 3
- •Задания к лабораторной работе № 3
- •4. Программирование простых циклических алгоритмов в системе Delphi
- •Контрольные вопросы к главе 4
- •Задания к лабораторной работе № 4
- •5. Программирование с использованием одномерных массивов в системе Delphi
- •Контрольные вопросы к главе 5
- •Задания к лабораторной работе № 5
- •6. Программирование с использованием двумерных массивов в системе Delphi
- •Контрольные вопросы к главе 6
- •Задания к лабораторной работе № 6
- •7. Программирование в системе Delphi с использованием подпрограмм
- •Контрольные вопросы к главе 7
- •Задания к лабораторной работе № 7
- •8. Изучение приемов работы с графикой в delphi
- •Контрольные вопросы к главе 8
- •Задания к лабораторной работе №8
- •9. Программирование в системе Delphi с помощью строк
- •Контрольные вопросы к главе 9
- •Задания к лабораторной работе №9
- •10. Изучение работы с файлами в системе delphi
- •Контрольные вопросы к главе 10
- •Задания к лабораторной работе №10
- •Заключение
- •Библиографический список
- •Предметный указатель
- •Delphi: основы программирования
9. Программирование в системе Delphi с помощью строк
Целью данного раздела является изучение разновидностей строк, получения навыков описания, ввода, вывода и обработки строк.
Типы строк
Для обработки текстов в Object Pascalиспользуются следующие типы:
короткая строкаShortStringилиString[N], где N <= 255;
длинная строка StringилиAnsiString;
широкая строкаWideString;
нуль-терминальная строкаPChar.
Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: дляShortString– от 0 до 255; дляString[N] длина строки меняется от 0 до N; дляString, WideString иPChar− от 0 до 2 Гбайт.
Тип Stringимеет разный смысл в зависимости от директивы компилятора $H. Если включена директива {$H+} (она включена по умолчанию), тоStringинтерпретируется компилятором как типAnsiString− длинная строка. Если же включить директиву {$H-}, тоStringинтерпретируется компилятором как типShortString− короткая строка.
Если в объявлении типа после ключевого слова Stringследует число символов в квадратных скобках (например,String[4]), то, независимо от директив компилятора, тип трактуется как короткая строка с указанным числом символов.
Для объявления короткой строки максимальной длины может использоваться стандартный тип ShortString (эквивалентно String [255]).
При объявлении короткой строки компилятор выделяет для ее размещения на один байт больше (добавляется нулевой байт) и помещает в нулевой байт текущую длину строки.
В коротких и длинных строках используются однобайтовые символы ANSI. Однобайтный символ связан с одним из 256 возможных значений, которые трактуются в зависимости от установленной вWindowsнациональной страницы. 256 символов вполне достаточно для отображения национального алфавита любого европейского языка.
ВDelphiвведены такжеширокиестроки, объявляемые стандартным типомWideString. По своим свойствам они идентичны длинным строкамString, но отличаются от них тем, что для представления каждого символа используются не один, а два байта.
Для отображения алфавита некоторых азиатских языков 256 символов недостаточно. В этом случае используются двухбайтные символы кода Unicode, в котором младший байт обычно кодируется семибитнымANSI– кодом, а старший указывает, как должен трактоваться этот код. СимволUnicodeв памяти занимает одно двухбайтовое слово, которое имеет 65536 возможных значений. С помощью этого кода можно представить все символы всех языков мира. Двухбайтные символы Unicode объявляются стандартным типомWideChar, а составленные из них строки – типомWideString.
Короткие, длинные и широкие строки нумеруются с 1.
Нуль-терминальные строки представляют собой цепочки символов, ограниченные символом #0. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой. Нуль-терминальные строки нумеруются с 0. В нуль-терминальных строках используются однобайтовые символыANSI. Необходимость в нуль-терминальных строках возникает при прямом обращении кАРI-функциям ОС. При работе с компонентамиDelphiв основном используются более удобные длинные строки.
Примеры объявлений строковых типов:
var
swS:WideString; // широкая строка
pcS: PChar; // нуль-терминальная строка
acS: array [0. .1000] of Char; // строка длиной до 1000 символов
ssS: String [250]; // короткая строка длиной до 250 символов
ssMax: ShortString; // короткая строка длиной до 255 символов
stS: String; //длинная строка
При объявлении длинной строки stS компилятор выделит для переменной 4 байта, достаточные для размещения адреса той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Говорят, что stS ссылается на строку. Такого рода переменные-ссылки называются указателями.
При объявлении переменной pcS типаPCharкомпилятор считает эту переменную указателем и выделит для нее 4 байта.
Операции над строками
К строкам можно применять операцию «+» − конкатенации (сцепление или объединение) строк. Например:
stS:= ‘a’ +’b’; //stSсодержит "ab"
stS:=stS+ ‘c’; //stSсодержит "abc"
Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо, с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы более короткой строки заменяются значениемChr(0). ФункцияChr(0) преобразует целочисленный аргумент к эквивалентному символу в соответствии с кодовой таблицей. ФункцияChr(0) и #0 обозначают один и тот же символ. Результаты операций отношения приведены ниже (табл.9.1).
Таблица 9.1
Операции отношения со строками
Значение S |
Значение S1 |
S>S1 |
S>=S1 |
S<S1 |
S<=S1 |
S=S1 |
S<>S1 |
‘abc’ |
‘abc’ |
false |
true |
false |
true |
true |
false |
‘abcd’ |
‘abc’ |
true |
true |
false |
false |
false |
true |
‘bac’ |
‘abc’ |
true |
true |
false |
false |
false |
true |
Текущую длину строки можно получить с помощью функции Length. Со строками можно работать как с одномерными символьными массивами:
n:=0;
for k:=1 to Length(s) do
if s[k] in [0..9] then n:=n+1;
В данном примере осуществляется подсчет количества символов цифр в строке. Операция inпроверяет принадлежность символа строкиs[k] множеству целых чисел [0..9].
В следующем примере уничтожаются все ведомые (хвостовые) пробелы в длинной строкеstS:
while (Length(stS) <> 0) and (stS [Length(stS)] = ’ ‘) do
SetLength (stS, Length (stS) –1);
Стандартная процедура SetLength устанавливает новую длину строки stS.
Многострочные окна редактирования Memo и RichEdit
Компоненты MemoиRichEditявляются окнами редактирования многострочного текста. Они так же, как и компонентаEdit, снабжены многими функциями, свойственными большинству редакторов. При редактировании текста можно использовать «горячие» клавиши:
Ctrl-C– копирование выделенного текста в буфер обмена;
Ctrl-X– вырезание выделенного текста в буфер обмена;
Ctrl-V– вставка текста из буфера обмена;
Ctrl-Z– отмена последней команды редактирования.
В компоненте Memoтекст выравнивается с помощью свойстваAligment, значения которого могут быть следующими:
taLeftJustify; // выравнивается по левой границе (по умолчанию);
taСenter; // выравнивается по центру;
taRightJustify;// выравнивается по правой границе.
Если вы сохраните в файле текст, введенный или отредактированный пользователем, то будет создан текстовый файл, содержащий только символы и не содержащий элементов форматирования. При последующем чтении этого файла в Memoформат будет определяться текущим состоянием свойстваFontкомпонентыMemo, а не тем, в каком формате ранее вводился текст.
Для доступа ко всему содержимому Memo используется свойствоTextтипаTString. Для доступа к отдельным строкам используется свойствоLinesтипаTstring:
Memo1.Lines[5]:=’abc’;
Очистить Memo можно методомClear:
Memo1.Clear;
Добавить строку можно с помощью метода Add:
Memo1.Lines.Add(‘abc’);
Компонента Memoможет реагировать на нажатие клавиши <Enter> при значении свойстваWantReturns типа Boolean,равное True. Это значение установлено по умолчанию. Число строк вMemo хранится в свойствеCount(свойство только для чтения).
Компонента RichEditработает с текстом в обогащенном форматеRTF. При желании изменить атрибуты вновь вводимого фрагмента текста можно задать свойствоSelAttributes. Это свойство типаTTextAttributes, которое в свою очередь имеет подсвойства:Color(цвет),Name(имя шрифта),Size(размер),Style(стиль) и др. В компоненте имеется также свойствоDefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойствеSelAttributes. Но значения атрибутов вDefAttributesсохраняются и в любой момент могут быть методомAssignприсвоены атрибутам свойстваSelAttributes, чтобы вернуться к прежнему стилю. За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойствоParagraphтипаTParaAttributes. Этот тип в свою очередь имеет ряд свойств, которые можно задавать только в процессе выполнения приложения, например в обработчике события при щелчке на какой-нибудь кнопке. Значение подсвойств свойстваParagraphотносятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответствующее выравнивание текущего абзаца:
RichEdit1. Paragraph. Aligment:=taLeftJustify; // влево
RichEdit1. Paragraph. Aligment:=taСenter; // по центру
RichEdit1. Paragraph. Aligment:=taRightJustify; // вправо
Основное свойство окон Memo и RichEdit − Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойстваLinesв окне Инспектора объектов. Перед вами откроется окно редактирования списка строк. Вы можете редактировать и вводить текст непосредственно в этом окне либо нажать кнопкуCodeEditorи работать в обычном окне Редактора кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопки мыши, командуClose Pageи ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования.
Сохранение текста в файле осуществляется методом SaveToFile, а загрузка текста из файла –LoadFromFile:
Memo1.SaveToFile (‘myfile.txt’);
Memo1. LoadFromFile (‘myfile.txt’);
RichEdit1.SaveToFile (‘myfile1.rtf’);
RichEdit1.LoadFromFile (‘myfile1.rtf’);
Справочные данные
Действия над строками и символами реализуются с помощью большого набора стандартных процедур и функций. В таблицах 9.2 –9.6приведены описания процедур и функций (в квадратных скобках указываются необязательные параметры).
Таблица 9.2
Процедуры и функции для работы со строками
Процедура или функция |
Пояснение |
function Concat (SI [ , S2, ..., SN] : String) : String; |
Возвращает строку, представляющую собой сцепление строк-параметров S1, S2, ..., SN |
function Copy (St: String; index, Count: integer): String; |
Копирует из строки St Count символов, начиная с символа с номером Index |
procedure Delete (St: String; index, Count: Integer); |
Удаляет Count символов из строки St, начиная с символа с номером Index |
procedure Insert (SubSt: String; St, index: Integer); |
Вставляет подстроку SubSt в строку St, начиная с символа с номером Index |
function Length (St: String) : integer; |
Возвращает текущую длину строки St |
function Pos (SubSt, St: String): integer; |
Отыскивает в строке St первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается ноль |
procedure SetLength (St: String; NewLength: Integer); |
Устанавливает новую (меньшую) длину NewLengh строки St. Если NewLengh больше текущей длины строки, обращение к SetLength игнорируется |
Таблица 9.3
Подпрограммы преобразования строк в другие типы
Процедура или функция |
Пояснение |
function StrToCurr (St: String): Currency; |
Преобразует символы строки St в число типа Currency. Строка не должна содержать ведущих или ведомых пробелов |
function StrToDate (St: String): 'ГdateTime; |
Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты (в русифицированной версии таким разделителем является <.>). Первое число – правильный день, второе – правильный месяц. Если указано третье число, оно должно задавать год в формате XX или ХХХХ. Если символы года отсутствуют, дата дополняется текущим годом. Например, DateToStr(StrToDate ('28.06')) даст строку '28 .06. 09' |
function StrTоDateTime (St: String): TdateTime; |
Преобразует символы строки St в дату и время. Строка должна содержать правильную дату (см. StrToDate) и правильное время (см. StrToTime), разделенные пробелом, например: StrToDateTime('28.06 18:23') |
function StrToFloat (St: String): Extended; |
Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов |
function StrToInt (St: String): Integer; |
Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов |
function StrTolntDef (St: String; Default: Integer): Integer; |
Преобразует символы строки St в целое число. Если строка не содержит правильного представления целого числа, возвращается значение Default |
functiton StrTOIntRange (St: String; Min, Max: LongInt) : LongInt; |
Преобразует символы строки St в целое число и возбуждает исключение ERangeError, если число выходит из заданного диапазона Min...Max |
Окончание табл. 9.3
Процедура или функция |
Пояснение |
function StrToTime (St: String): TdateTime; |
Преобразует символы строки St во время. Строка должна содержать два или три числа, разделенных правильным для Windows, разделителем времени (для русифицированной версии таким разделителем является < >). Числа задают часы, минуты и, возможно, секунды. За последним числом через пробел могут следовать символы <am> или <pm>, указывающие на 12-часовой формат времени |
Procedure Val (St: String; var X;Code: lnteger); |
Преобразует строку символов во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое X не меняется. В строке St могут быть ведущие и/или ведомые пробелы |
Таблица 9.4
Подпрограммы обратного преобразования
Процедуры и функции |
Пояснения |
function DateToStr (Value: TDateTime): String; |
Преобразует дату из параметра Value в строку символов |
function DateTimeToStr (Value: TdateTime): String; |
Преобразует дату и время из параметра Value в строку символов |
procedure DateTimeToString (var St: String; Format: String; Value: TdataTime); . |
Преобразует дату и время из параметра Value в строку St в соответствии со спецификаторами параметра Format |
function FormatDateTime (Format: String; Value: TDateTime): String; |
Преобразует дату и время из параметра Value в строку символов в соответствий со спецификаторами параметра Format |
function FloatToStr (Value: Extended): String; |
Преобразует вещественное значение Value в строку символов |
Окончание табл. 9.4
Процедуры и функции |
Пояснения |
function FloatToStrF (Value: Extended; Format: TFIoatFormat; Precision, Digits: Integer): String; |
Преобразует вещественное значение Value в строку символов с учетом формата Format и параметров Precision и Digits |
function FormatFloat (Format: String; Value: Extended): String; |
Преобразует вещественное значение Value в строку символов с учетом спецификаторов формата Format (см. пояснения ниже) |
function IntToStr (Value: Integer) : String; |
Преобразует целое значение Value в строку символов. |
function TimeToStr (Value: TdateTime): String; |
Преобразует время из параметра Value в строку символов |
procedure Str(X [:Width [:Decimals]]; var St: String); |
Преобразует число X любого вещественного или целого типа в строку символов St; параметры Width и Decimals, если они присутствуют, задают формат преобразования: Width определяет общую ширину поля, выделенного под соответствующее символьное представление вещественного или целого числа X, a Decimals − количество символов в дробной части (этот параметр имеет смысл только в том случае, когда X − вещественное число) |
В примерах таблицы 9.5 показаны строки для времени 19 ч 45 мин и даты 8 июня 2009 г.
Таблица 9.5
Спецификаторы формата даты/времени
Спецификаторы |
Пояснения |
c |
Отображает сначала дату в формате дд.мм.гг, затем через пробел время в формате чч.мм.сс: 08.06.09 19:45 |
d |
Отображает день без ведущего нуля: 8 |
dd |
Отображает день с ведущим нулем: 08 |
dddd |
Отображает день недели: воскресенье (для нерусифицированной версии-Windows-sunday) |
ddddd |
Отображает дату в формате дд.мм.гг: 08.06.09 |
dddddd |
Отображает дату в формате день Месяц год: 8 Июнь 2009 (для нерусифицированной версии Windows – 8 June 2009) |
Окончание табл. 9.5
Спецификаторы |
Пояснения |
m |
Отображает число месяца без ведущего нуля: 6 |
mm |
Отображает число месяца с ведущим нулем: 06 |
mmm |
Отображает сокращенное название месяца: июнь |
mmmm |
Отображает полное название месяца: Июнь |
у или yy |
Отображает две последние цифры года: 09 |
yyy или yyyy |
Отображает все цифры года: 2009 |
h |
Отображает час без ведущего нуля: 19 |
hh |
Отображает час с ведущим нулем: 19 |
n |
Отображает минуты без ведущего нуля: 45 |
nn |
Отображает минуты с ведущим нулем: 45 |
s |
Отображает секунды без ведущего нуля: 0 |
ss |
Отображает секунды с ведущим нулем: 00 |
t |
Отображает время в формате чч:мм: 19: 45 |
tt |
Отображает время в формате чч:мм:сс: 19: 45: 00 |
am/pm |
Отображает время в 12-часовом формате (am – до полудня, рm – после полудня). Для спецификаторов hh: mm am/pm получим 07: 45 pm |
ampm ' |
Отображает время в 12-часовом формате, но без указания до/после полудня. Для спецификаторов hh:mm ampm получим 07: 45 |
a/p |
Отображает время в 12-часовом формате а – до полудня, p – после полудня). Для спецификаторов hh:mm a/p получим 07: 45 p. |
/ |
Отображает используемый в Windows разделитель даты. Для спецификаторов d/m/y получим 8.6.09 |
: |
Отображает используемый в Windows разделитель времени. Для спецификаторов h:n:m получим 19:45:0 |
Любые другие символы, указанные в строкеFormat, а также заключенные в апострофы или кавычки специальные символы-спецификаторы помещаются в выходную строку без преобразования, поэтому спецификаторы ‘h час n мин' дадут строку 19 час 45 мин, а 'h час «n мин» − 19 час n мин.
Таблица 9.6
Подпрограммы для работы с нуль-терминальными строками
Процедура или функция |
Пояснение | |
function CharToOem (Str, OemStr: Pchаr): Bool; |
Преобразует символы строки Str из кодировки ANSI в кодировку DOS и помещает результат в OemStr. Всегда возвращает True | |
function ChàrToOemBuff (Str, OemStr: PChàr; MаxLen: LongInt): Bool; |
Преобразует не более MaxLen символов cтроки Str из кодировки ANSI в кодировку DOS и помещает результат в OemStr. Всегда возвращает True | |
function StrCаt(Dest, Source: PChаr): PChаr; |
Копирует строку Source в конец строки Dest и возвращает указатель на строку Dest | |
function StrComp (Strl, Str2: PChаr): Integer; |
Побайтно сравнивает строку Str1 со строкой Str2 и возвращает следующий результат: =0 для Str1=Str2; > 0 для Str1 > Str2; < 0 для Str1 < Str2 | |
function StrCopy(Dest, Source: PChаr): PChаr; |
Копирует строку Source в строку Dest и возвращает указатель на Dest. StrCopy не проверяет реальный размер памяти, связанный с Dest (он должен быть не меньше StrLen (Source )+1) | |
procedure StrDispose (Str: PChаr); |
Удаляет строку Str из памяти. Строка должна быть предварительно помещена в память функцией StrNew. Если Str=NlL, процедура ничего не делает | |
function StrECopy(Dest, Source: Pchаr): PChàr; |
Объединяет строки. Эта функция работает в точности как StrCat, но возвращает указатель на конец сцепленных строк, т.е. на терминальный ноль | |
function StrEnd (Str: PChàr): Pchàr;. |
Функция возвращает указатель на терминальный ноль строки Str | |
function StrIComp(Strl, Str2: PChаr): Pchаr; |
Функция сравнивает строки, игнорируя возможную разницу в высоте букв. Возвращает такой же результат, как и StrComp. Функция правильно работает лишь с латиницей. Для кириллицы ее нужно модифицировать | |
function StrLCаt(Dest, Source: PChàr; MaxLen: Word): PChàr; |
Копирует символы строки Source в конец строки Dest до тех пор, пока не будут скопированы все символы или когда длина сцепленной строки Dest не достигнет MaxLen. Возвращает указатель на сцепленную строку. В отличие от StrCopy эта функция блокирует возможное переполнение области памяти, связанной с Dest. Обычно в качестве MaxLen используется выражение SizeOf(Dest)-l |
Продолжение табл. 9.6
Процедура или функция |
Пояснение |
function StrLComp(Dest, Source: Pchаr; MaxLen: Word): Pchаr; |
В отличие от StrComp сравнивает не более MaxLen символов строк. Возвращаемый результат такой же, как и у StrComp |
function StrLCopy ( Dest, Source: PChàr; MàxLen: Word): PChаr; |
Копирует символы из строки Source в строку Dest до тех пор, пока не будет скопирована вся строка или пока не будет скопировано МaxLеn символов. В отличие от StrCopy блокирует возможность переполнения области памяти, связанной с Dest. В качестве MaxLen обычно используется выражение SizeOf(Dest)-l |
function StrLen(Str: PChаr): Cardinal; |
Возвращает длину строки |
function StrLIComp(Strl, Str2: PChаr; MаxLen: Word): PChаr; |
Сравнивает не более MaxLen символов строк, проверяя точное соответствие высоты букв. Возвращаемый результат см. StrСomр. Функция правильно работает только с латиницей. |
function StrLower(Str: PChàr): PChаr; |
Преобразует заглавные буквы строки Str к строчным и возвращает указатель на результат. Функция правильно работает только с латиницей |
function StrMove(Dest, Source: PChаr; Count: Word): Pchàr; |
Копирует точно Count символов строки Source в строку Dest и возвращает указатель на результат. Функция игнорирует действительные размеры строк и может выйти за их пределы |
function StrNew(Str: PChаr): Pchar; |
Помещает строку в память |
function StrPas(Str: PChàr): String; |
Преобразует нуль-терминальную строку в строку String |
function StrPCopy(Str: PChаr; S: String); PChar; |
Преобразует строку String в нуль-терминальную строку. Возвращает указатель на Str |
function StrPos(Strl, Str2: PChàr): PChàr; |
Ищет подстроку Str2 в строке Str1 и возвращает указатель на первое вхождение Str2 или NIL, если подстрока не найдена |
function StrRScan(Str: PChar; Ch: Chàr): PChàr;. |
Ищет символ Ch в строке Str и возвращает указатель на последний обнаруженный символ Ch или NIL, если символ не найден |
function StrScan(Str: PChar; Ch: Char): Pchar; |
Ищет символ Ch в строке Str и возвращает указатель на первый обнаруженный символ Ch или NIL, если символ не найден |
Окончание табл. 9.6
Процедура или функция |
Пояснение |
function StrUpper (Str: PChar): PChаr; |
Преобразует строчные буквы строки Str к заглавным и возвращает указатель на результат. Функция правильно работает только с латиницей |
function OemToChаr (OEMStr, Str: Pchar): Bool; |
Преобразует символы из кодировки DOS в кодировку ANSI и возвращает Truе |
function OemToCharBuff (OEMStr, Str: PChаr; MaxLen: LongInt): Bool; |
Преобразует не более MaxLen символов строки OemStr из кодировки DOS в кодировку ANSI и помещает результат в Str. Всегда возвращает True |
Пример программирования с использованием строк
Задание. Дана последовательность из 50 литер (строчных латинских букв, цифр). Напечатать этот текст, заменяя все цифры «9» – русской «x», а остальные входящие в него цифры – звездочкой.
Значения используемых компонент для программного интерфейса показаны ниже (табл. 9.7).
Таблица 9.7
Используемые компоненты
Компонента |
Свойство |
Значение |
Form1: TForm |
Name Caption |
Form1 Работа со строками |
Button1: TButton |
Name Caption |
Button1 Преобразовать |
Button2: TButton |
Name Caption |
Button1 Выход |
Label1: TLabel |
Name Caption |
Label1 Введите строку |
Edit1: TEdit |
Name Text |
Edit1 отсутствует |
Edit2: TEdit |
Name Text |
Edit2 отсутствует |
1. Разработка алгоритма (рис. 9.1):
а) исходные данные: str – строка символов;
б) промежуточные данные: i – переменная целого типа, счетчик цикла;
в) результат: str – преобразованная строка.
Рис. 9.1. Схема алгоритма решения задачи
2. Текст программы:
Unit Unit1;
Interface
Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls
type
TForm1=class (TForm)
Label1: TLabel; //комментарий к полю ввода
Edit1: TEdit; //поле ввода строки
Label2: TLabel; //комментарий к полю вывода
Edit2: TEdit; //поле вывода измененной строки
Button1: TButton; //кнопка «выполнить»
Button2: TButton; //кнопка «выход»
Procedure Button2Click(Sender: TObject); //процедура, вызываемая
при щелчке на Button2
Procedure Button1Click(Sender: TObject); // процедура, вызываемая
при щелчке на Button1
private
{Private declarations}
public
{Public declarations };
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Close
end;
procedure TForm1.Button1Click(Sender: TObject); { процедура,
заменяющая цифры '9' буквой 'х', а остальные символы – на '*'}
var str: string;
i: integer;
begin
str:= Edit1.Text;
while pos (‘9’, str) > 0 do
str[pos(‘9’, str)]:= ’х’;
for i=1 to Length(str) do
if str[i] in [‘0’..’8’] then
str[i]:= ’*’;
Edit2.Text:= str;
end;
end.