Delphi
.pdf3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal
Чтобы вычислить длину строки, т.е. узнать количество символов входящих в неё, надо воспользоваться стандартной функцией Length, например, Length(Line) равно 11.
Для очистки строки достаточно сделать пустое присваивание,
например, Line:='';
Многие компоненты Delphi, работающие со строками, оперируют не просто со строками, – а с массивами строк. Такие структуры имеют тип:
TStrings и его потомок – TStringList – списки строк. Это невизуальные компоненты контейнеры строк в Delphi. Поскольку первый компонент является предком, то он обладает меньшим набором свойств, методов и событий, чем его потомок. С другой стороны он требует меньших объемов оперативной памяти компьютера.
Эти компоненты обладают свойствами: Count – количество строк в списке; Sorted1– должен ли быть список сортированным по алфавиту; <идентификатор списка>[i] – обращение к строке номер i, нумерация начинается с нуля; Text – обращение ко всем строкам списка. Имеется и ряд других свойств.
Их методы: Add('<строка>') – добавляет новую строку (в конец списка, если Sorted не задано, иначе – в соответствующее место внутри списка); Assign(<идентификатор списка>) – копирует список; Clear – очищает список; Delete(N) – удалить строку номер N; Find1 ('<строка>', N) – возвращает номер N заданной строки и принимает значение True если такая строка есть, иначе – False. IndexOf('<часть строки>') – принимает значение номера строки в которой имеется '<часть строки>', если таковой нет, то принимает -1; Insert(N, '<строка>') – вставляет указанную строку в позицию N; Sort1 – сортирует список, если свойство Sorted было равно False. Имеется и ряд других методов.
Для создания невизуального контейнера строк, как впрочем, и любого другого объекта заданного класса, необходимо объявить соответствующий идентификатор и применить к нему метод-конструктор Create. После работы с этим объектом его следует удалить из памяти компьютера методом-деструктором Free. Ниже, в примере 3.4, написаны некоторые операторы, иллюстрирующие работу с контейнерами строк
Наиболее простой способ ввода данных – это использование однострочного окна компонента TEdit, а для вывода – многострочного окна TListBox. С компонентом TEdit мы уже познакомились в предыдущей лабораторной работе. Рассмотрим следующие контейнеры
строк – TListBox, TMemo и TRichEdit:
1 доступно только для TStringList
30
3.2 ВВОД-ВЫВОД ДАННЫХ
TListBox – визуальный контейнер списка строк. Непосредственно список строк содержится в свойстве Items, которое имеет тип TStrings. Поэтому, согласно принципу наследования для классов, к Items применимы все методы списка TStrings. Например, добавить строку из
Edit1 – это ListBox1.Items.Add(Edit1.Text), очистить первую строку – ListBox1.Items[0]:='' и т.п. Имейте в виду, что обратиться к строке можно только тогда, когда она уже создана методом Add или
Insert.
Вывод строк в список TListBox можно организовывать несколькими колонками. Идентификатор колонок – это свойство Colomns. Если список не помещается в отведенное ему окно, автоматически появляется слайдер прокрутки строк.
TMemo – многострочный редактор списка строк. Непосредственно список строк содержится в свойстве Lines, которое имеет тип TStrings и наследует все его свойства. Например, содержимое второй строки находится в Memo1.lines[1]. Содержимое всего редактора – это свойство
Text, точнее Memo1.Lines.Text.
TRichEdit – редактор текста для стандартного формата RTF (Windows-файлы типа *.rtf). Этот компонент работает практически с бесконечным количеством строк и позволяет в них форматировать шрифты, параграфы и т.д. Список строк содержится в свойстве Lines типа TStrings. Логическое свойство PlainText указывает, будет ли текст хранится в формате RTF или как обычный неформатированный текст.
П р и м е р 3.4
var |
|
|
S1 : TStringList; |
|
|
str : TStrings; |
|
|
begin |
|
|
S1 :=TStringList.Create; |
//создание объекта S1 |
|
str:=TStringList.Create; |
//создание объекта str |
|
S1.Add(('Первая строка №0')); |
//создание первой строки в S1 |
|
S1.Add(('Вторая строка №1')); |
//создание второй строки |
|
S1[1]:='Новая вторая строка №1'; |
//замена второй строки |
|
S1.Sort; |
|
//сортировка строк в S1 |
str.Add('Строка 1: TStrings');//создание первой строки в str str.Add('Строка 2: TStrings'); //создание второй строки в str
//копирование (замена) строк в ListBox1.Items на строки из S1:
ListBox1.Items.Assign(S1);
//добавление строк в ListBox1.Items из str:
ListBox1.Items.AddStrings(str);
31
3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal
S1.Free; str.Free; |
//удаление объектов S1, str |
... |
|
Результаты работы приведенных кодов показаны на рис. 3.1. Вывод результатов осуществляется в визуальный объект ListBox1, содержащий контейнер строк в своем свойстве Items. Списки строк типа TStrings на столько простые, что даже не имеют своего метода-конструктора и нам пришлось использовать метод Create из их потомка TStringList.
Рис. 3.1 Содержимое контейнера строк Items: TStrings
объекта ListBox1
Приведем некоторые стандартные процедуры и функции для работы с символами и строками. После параметров процедур и имени функций через двоеточие могут следовать указания на их типы, – это только разъяснения, которые не должны присутствовать при написании кодов программы.
3.2.2 Стандартные строковые процедуры и функции
Chr(X: Byte): Char – возвращает символ, соответствующий номеру X таблицы кодов ANSI. Например, C1:=Char(177), далее при выводе C1 на экран мы увидим символ ± , код ANSI которого #177.
Copy(St,Pos,Num): String – возвращает подстроку, содержащую Num символов строки St, начиная с позиции Pos , например, S1:='ABCDEFG'; Copy(S1,4,2); получим строку 'DE'.
Delete(St,Pos,Num) – удаляет Num символов из строки St, начиная с позиции Pos, например, S1:='ABCDEFG'; Delete(S1,2,4); полу-
чим строку 'AFG'.
IntToStr(I): String – возвращает строку, полученную из целого числа I;
Insert(Obj,St,Pos) – вставляет строку Obj в строку St, начиная с позиции Pos, например, Insert('XX',S1,4) получим строку
'ABCXXDEFG'.
32
3.2 ВВОД-ВЫВОД ДАННЫХ
FloatToStr(Value): String – возвращает строку символов, состоящую из цифр вещественного числа Value;
Length(St): Word – возвращает длину строки St, например, S1:= 'ABCDEFG'; i:= Length(S1); получим i равное 7.
Ord(C): Integer – возвращает порядковый номер величины C, которая является элементом некоторого упорядоченного множества, например, i:=Ord(±) получим i равное 177.
Pos(Obj,St): Word – возвращает номер позиции, с которого подстрока Obj первый раз входит в строку St, например, S1:= 'ABCDEFG'; i:=Pos('DE',S1); получим i равное 3.
Str(Value,St) – преобразовывает числовое значение Value в строку символов и заносит результат в строку St. Параметр Value может быть целым или вещественным и сопровождаться указанием формата преобразования, например, X:=2.5E4; Str(X:9:1, St) получим строку St
равную ' 25000.0'.
StrToInt(St): Integer – возвращает целое число из строки цифр St;
StrToFloat(St): Extended – возвращает вещественное число, полученное из строки цифр St;
Val(St,IRVar,Code) – преобразовывает строку St из цифр в целое или вещественное число и заносит в переменную IRVar. Code=0 если преобразование прошло без ошибок, в противном случае Code принимает номер символа в строке, который не поддается преобразованию, например,
S1:='12X'; Val(S1,i,Res) получим Res=3, S1:='2.5E4'; Val(S1,i,Res) получим i=25000, Res=0.
При вводе данных в программу с клавиатуры (через компонент TEdit и т.п.) рекомендуется использовать именно эту функцию преобразования, поскольку она позволяет анализировать ошибки ввода и обрабатывать исключительные ситуации.
В процедуре Str использовано понятие формата. Рассмотрим его подробнее. Выражение X:N:M означает, что для отображения величины X отводится поле из N позиций (N и M в общем случае выражения целого типа). Значение X выравнивается по правому краю поля. Если для вывода заданной информации выделенного поля не хватает, оно автоматически увеличивается до нужного размера. Отбрасывание «ненужных» правых знаков осуществляется с округлением. Если M не задано, то вещественные числа выводятся в формате с плавающей точкой, т.е. в виде:
<+, пробел или - ><одна цифра>.<цифры мантиссы>Е<+ или -><4 цифры>
Если M задано, – то в формате с фиксированной точкой, где M указывает сколько символов должно быть после точки. Заметим, что точка также
33
3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal
занимает позицию. Знак + положительного числа не выводится, он заменяется пробелом.
Управлять форматом вывода арифметических данных можно также при помощи стандартной функции FormatFloat через шаблон вывода.
П р и м е р 3.5
Пусть X=-1230. Организуем следующий вывод: ListBox1.Items.Add('Значение X с фиксированной точкой равно: '+
FormatFloat('0.00', X); ListBox1.Items.Add('Значение X с плавающей точкой равно: '+
FormatFloat('#.###E+0', X);
Мы получим:
Значение X с фиксированной точкой равно: -1230.00 Значение X с плавающей точкой равно: -1.23E+3
Символ # (не используется в показателе числа) вместо 0 в строке-шаблоне функции FormatFloat позволяет отбрасывать незначащие нули выводимого параметра X.
Задание 3.
Организация ввода-вывода
Цель задания
1.Получение навыков в организации ввода-вывода простых типов данных.
2.Знакомство с компонентами TListBox, TMemo, TRichEdit, TRadioButton, TRadioGroup, TChekBox и всплывающими подсказками Hint.
3.Знакомство со стандартными функциями преобразования типов.
Постановка задачи
Построить приложение для ввода и вывода переменных согласно варианту задания. Образец интерфейса приведен на рис. 3.2. Нажатие мышкой на кнопку OK должно выводить соответствующие переменные в окно списка вывода, нажатие на копку «Очистить» должно очищать список вывода. Для вещественных переменных предусмотреть возможность их вывода в формате с фиксированной и плавающей точкой. По желанию, кнопки могут быть снабжены подсказками Hint.
Рекомендации
В качестве окна списка вывода данных используйте один из описанных ранее компонентов: TListBox, TMemo или TRichEdit. Для организации переключения формата вывода вещественного числа можно использовать компоненты:
34
3.2 ВВОД-ВЫВОД ДАННЫХ
Рис. 3.2
Интерфейс программы для ввода-вывода данных разных типов
TRadioButton – круглая кнопка выбора опции. Включение или выключение кнопки управляется свойством Checked. Круглые кнопки характерны тем, что из множества установленных кнопок (опций) только одна из них может быть включена (выбрана).
TRadioGroup – объединение нескольких круглых кнопок в группу. Идентификатор, например, второй кнопки в группе 1 – это RadioGroup1.Items[1], где Items – это свойство группы в виде массива заголовков каждой кнопки. Нет заголовка – нет кнопки. Нумерация кнопок начинается с нуля. Если кнопки должны располагаться в колонках, то необходимо установить соответствующее значение свойства Colomns. Значение состояния каждой кнопки хранится в идентификаторе целого типа
– свойство ItemIndex. Значение -1 – не включена ни одна кнопка, 0 – включена первая, 1 – вторая и т.д. В каждой группе может быть включена только одна кнопка.
TCheckBox – поле выбора опции . В отличие от круглых кнопок они допускают выбор сразу нескольких опций. Включение каждой опции может быть трех типов: включена (состояние State=CbChecked); выключена
(State=CbUnChecked); частично включена (State=CbGrayed). В последнем случае некоторые из вложенных опций включены, а некоторые нет – . Допустимость третьего состояния определяется логическим значением свойства AllowGrayed (разрешать частичное включение или нет). Начальное состояние объетка TCheckBox задается свойством Checked.
Подсказка для каждого визуального объекта хранится в свойстве Hint. Подсказка вcплывает при наведении курсора мыши на соответствующий объект если свойство ShowHint=True. Пример Hint показан на рис. 3.2 для верхней кнопки.
35
3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal
Для взаимного преобразования строковых и арифметических данных используйте стандартные процедуры и функции IntToStr, StrToInt,
FloatToStr, StrToFloat, Val и Str.
Для анализа выбора круглых кнопок используйте условный оператор If… Then… внутри процедуры обработки нажатия второй кнопки OK. Такая процедура может иметь вид:
procedure TForm1.Button2Click(Sender: TObject); Var Code : Integer;
begin
//чтение введенной вещественной переменной X:
Val(Edit2.Text,X,Code); //или X:=StrToFloat(Edit2.Text); //добавление строки в список вывода:
//преобразование числа X с фиксированной запятой
If RadioGroup1.ItemIndex=0 then ListBox1.Items.Add(FormatFloat('###.##', X));
//преобразование числа X с плавающей запятой
If RadioGroup1.ItemIndex=1 then ListBox1.Items.Add(FormatFloat('0.0000E+0', X));
end;
Варианты задания:
1.Организовать ввод и вывод двух целых, одной вещественной и четырёх символьных переменных;
2.Организовать ввод и вывод одной целой, двух вещественных и трех символьных переменных;
3.Организовать ввод и вывод двух целых, одной вещественной и двух символьных переменных;
4.Организовать ввод и вывод трех целых, одной вещественной и двух символьных переменных;
5.Организовать ввод и вывод трех целых, одной вещественной и одной символьной переменной;
6.Организовать ввод и вывод одной целой, двух вещественных и двух символьных переменных;
7.Организовать ввод и вывод одной целой, двух вещественных и одной символьной переменной;
8.Организовать ввод и вывод двух целых, двух вещественных и одной символьной переменной;
9.Организовать ввод и вывод двух целых, одной вещественной и трёх символьных переменных;
10.Организовать ввод и вывод двух целых, одной вещественной и двух символьных переменных;
36
3.3 ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
Контрольные вопросы для сдачи лабораторной работы:
1.Какой порядок имеют числа типа Double и Extended?
2.Как задается формат вывода чисел при помощи функции FormatFloat?
3.Какими свойствами и методами обладает компонент TStrings?
4.Как преобразовываются строковые данные в арифметические и наоборот?
5.Как контролируются значения радиальных кнопок?
6.Какие операции можно выполнять со строковыми переменными?
7.Как запрограммировать изменение названия (заголовка) радиальной кнопки в группе кнопок?
8.Покажите в исходных кодах программы пример локальных и глобальных переменных.
3.3 ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
3.3.1 Выражения
Выражения задают порядок вычислений, они состоят из операндов, соединённых операциями. Результат выражения может присваиваться переменной соответствующего типа посредством оператора присваивания
:=
3.3.2 Арифметические операции
Арифметические операции перечислены в следующей таблице:
Знак опера Операция Тип операнда Тип результата ции
+Сложение
-Вычитание
* |
Умножение |
|
/ |
Деление |
|
Div |
Целочисленное |
|
деление |
||
|
||
Mod |
Остаток от цело- |
|
численного деления |
Целый/веществ. Целый/веществ. Целый/веществ. Целый/веществ.
Целый
Целый
Целый/веществ. Целый/веществ. Целый/веществ. Вещественный
Целый
Целый
37
3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal
|
|
|
П р и м е р 3.6 |
|
|
Пусть переменные i, j: Integer; x: Double; тогда |
|
||||
i*20-(j+5); |
результат целый |
|
|
||
i*20-(j+5.1); |
результатвещественный |
|
|||
i:=i/j; |
недопустимое присвоение, т.к. результат вещественный |
||||
x:=i*j; |
допустимое присваивание |
|
|||
22 div 5; |
|
результат 4 |
|
|
|
22 mod 5; |
|
результат 2 |
|
|
|
|
3.3.3 Булевские (логические) операции |
|
|||
|
|
|
|
|
|
|
Знак операции |
Операция |
Тип операндов |
Тип результата |
|
|
NOT |
|
Отрицание |
Boolean |
Boolean |
|
AND |
|
Логическое И |
Boolean |
Boolean |
|
OR |
|
Логическое ИЛИ |
Boolean |
Boolean |
П р и м е р 3.7
Пусть A,B,C:Boolean; i:Integer; значения A=True; B=True; C=False; тогда
A And B |
True |
|
|
|
A And C |
False |
|
|
|
A Or C |
True |
|
|
|
Not C |
True |
|
|
|
3.3.4 |
Операции отношений |
|
|
|
|
|
|
|
|
|
Знак |
Операция |
Тип операндов |
Тип рез- |
|
операции |
|
та |
=Равно
<> |
Не равно |
<Больше
>Меньше
<= Меньше или равно >= Больше или равно
Целые, вещественные, символьные, строковые
-“- -“- -“- -“- -“-
Boolean
-“- -“- -“- -“- -“-
38
3.3 ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
Все выражения вычисляются слева направо с учетом приоритета операций. Приоритеты, т.е. порядок очерёдности выполнения операций в выражениях следующий:
1.Not ;
2.*, /, Div, Mod, And ;
3.+, -, Or ;
4.>, >= ,<, <=, <>, = ;
Приоритет может нарушаться только скобками в выражении.
П р и м е р 3.8
Порядок вычисления выражения ((X+2*Y/(X-3))=8) Or True :
1.2*Y;
2.X-3;
3.2*Y/(X-3);
4.X+2*Y/(X-3);
5.Сравнение полученного арифметического результата с числом 8;
6.Сравнение Or булевского результата с булевским операндом True, результат всегда True.
3.3.5 Стандартные арифметические процедуры и функции
Round(X: Extended): Int64 – возвращает округлённое значение X, преобразованное к целому типу, например, i:=Round(-1.5) получим i=-2.
Trunc(X: Extended): Int64 – преобразование к целому типу путём отбрасывания дробной части, например, i:=Trunc(1.5) получим i=1.
Int(X: Extended): Extended – возвращает целую часть аргумента X.
Frac(X: Extended): Extended – возвращает дробную часть аргумента X. Любое вещественное число можно представить как: X=Int(X)+Frac(X).
Pi: Extended – возвращает число 3.1415926535897932385.
Abs(X) – возвращает абсолютное значение аргумента X.
ArcTan(X: Extended): Extended – возвращает арктангенс аргумента X. Для вычисления других обратных тригонометрических функций следует пользоваться формулами:
ArcSin(X)=ArcTan(X/Sqrt(1-X*X));
ArcCtg(X)=Pi/2-ArcTan(X);
ArcCos(X)=Pi/2-ArcTan(X/Sqrt(1-X*X)).
Cos(X: Extended): Extended – возвращает косинус аргумента. Sin(X: Extended): Extended – возвращает синус аргумента. Exp(X: Double): Double – возвращает экспоненту аргумента.
39