Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Delphi

.pdf
Скачиваний:
27
Добавлен:
13.04.2015
Размер:
1.18 Mб
Скачать

3 ЯЗЫК ПРОГРАММИРОВАНИЯ 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.

Для анализа выбора круглых кнопок используйте условный оператор IfThen… внутри процедуры обработки нажатия второй кнопки 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

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