Автор работы: Пользователь скрыл имя, 11 Декабря 2013 в 22:12, курс лекций
Delphi – это среда быстрой разработки, в которой в качестве языка про-граммирования используется язык Delphi. Язык Delphi – строго типизиро-ванный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal. В настоящее время программистам стала доступна очередная версия пакета Delphi – Borland Delphi 7 Studio.
Рассмотрим программу, которая вычисляет значение числа p с точностью, задаваемой пользователем во время работы программы. В основе алгоритма лежит тот факт, что сумма ряда 1 – 1/3 + 1/5 – 1/7 + 1/9 + … приближается к значению p/4 при достаточно большом количестве членов ряда. Каждый член ряда с номером i вычисляется по формуле 1/(2*i – 1) и умножается на минус единицу, если i – четное (определить, является ли i четным, можно проверкой остатка от деления на 2). Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления.
Вид диалогового окна программы во время ее работы приведен на рис. 19. Текст программы приведен в листинге 10.
procedure TForm1.Button1Click(Sender: TObject); Листинг 10
var
pi,t,e:real;
i:integer;
begin
t:=StrToFloat(edit1.Text); // точность
pi:=0;
i:=1;
e:=1; { чтобы начать цикл }
while e>=t do
begin
e:=1/(2*i-1);
if i mod 2 =0 then pi:=pi-e
else pi:=pi+e;
i:=i+1;
end;
pi:=4*pi;
label3.Caption:='ПИ равно '+FloatToStr(pi)+#13+
'Просуммировано '+IntToStr(i)+' членов ряда';
end;
Инструкция repeat тоже используется ,когда число повторений неизвестно и определяется ходом вычислений.
В общем виде инструкция repeat записывается в следующем виде:
repeat
// тело цикла
until условие;
где условие – выражение логического типа, определяющее условие завершения цикла.
Инструкции тела цикла выполняются как минимум один раз. Для того чтобы цикл завершился, необходимо чтобы инструкции тела цикла изменяли значение переменных, входящих в выражение условие.
Попробуйте самостоятельно, не заглядывая в листинг 11, переделать программу, вычисляющую число p, используя инструкцию repeat.
procedure TForm1.Button1Click(Sender: TObject); Листинг 11
var
pi,t,e:real;
i:integer;
begin
t:=StrToFloat(edit1.Text); // точность
pi:=0;
i:=1;
e:=1; { чтобы начать цикл }
repeat
begin
e:=1/(2*i-1);
if i mod 2 =0 then pi:=pi-e
else pi:=pi+e;
i:=i+1;
end;
until e<t;
pi:=4*pi;
label3.Caption:=' ПИ равно '+FloatToStr(pi)+#13+
' Просуммировано '+IntToStr(i)+' членов ряда ';
end;
Контрольные вопросы к лекции 4
Массив, как и любая переменная, должен быть описан в разделе объявления переменных. В общем виде инструкция объявления массива выглядит следующим образом:
Имя: array[нижний_индекс..верхний_
где
Примера объявления массивов:
t: array[1..31] of real; k: array[0..2] of integer; name: array[1..30] of string[25];
Если массив не является локальным, т.е. объявлен не в процедуре обработки события, а в разделе переменных модуля, то одновременно с объявлением массива можно выполнить его инициализацию, т.е. присвоить начальные значения элементам массива. Инструкция объявления массива с его инициализацией в общем виде выглядит так:
Имя: array [нижний_индекс..верхний_
где список – разделенные запятыми значения элементов массива.
Например:
Team: array[1..5] of string[10] = (‘Зенит’,’Динамо’,’Спартак’,’
Обратите внимание, что количество элементов списка инициализации должно соответствовать размерности массива.
Локальный массив можно инициализировать только во время работ программы, например, так:
for i:=1 to 10 do
a[i]:=0;
Для ввода массива удобно использовать компонент StringGrid, значок которого находится на вкладке Fdditional (Рис. 20).
Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 4 перечислены некоторые свойства компонента StringGrid.
Таблица 4
Свойство |
Определяет |
ColCount RowCount Cells
FixedCols
FixedRows
Options.goTab
Font ParentFont |
Количество колонок таблицы Количество строк таблицы Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом Cells[col,row] Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте Разрешает (True) или запрещает (False) использование клавиши <Tab> для перемещения курсора в следующую ячейку таблицы. Шрифт содержимого таблицы. Признак наследования характеристик шрифта формы |
Пример вывода массива приведен в листинге 12. Форма проекта в процессе его работы показана на рис. 21.
В этом примере следует обратить внимание на то, что массив tabl строкового типа объявлен как глобальный, т.е. не внутри описания процедуры TForm1.Button1Click, а до нее. Кроме того, размер массива nt=5 и длина слов (элементов массива) sn=10 описаны как инициализированные константы перед объявлением массива.
const nt=5; sn=10; Листинг 12
var
tabl:array[1..nt] of string[sn]=
('Зенит','Динамо','Ротор','
procedure TForm1.Button1Click(Sender: TObject);
var
st:string; // список команд
i:integer;
begin
// формирование списка для отображения в форме
for i:=1 to nt do st:=st+IntToStr(i)+' '+tabl[i]+#13;
// вывод списка
label1.Caption:=st;
end;
В качестве примера использования компонента StringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 22, текст программы – в листинге 13.
В табл. 5 показаны некоторые свойства компонента StringGrid. Нужно учитывать, что колонки и строки таблицы нумеруются с нуля.
Табл. 5
Свойство Значение
ColCount 5
FixedCols 0
RowCount 1
Options.goTabs True
procedure TForm1.Button1Click(Sender: TObject); Листинг 13
var
a:array[0..4] of real;
s:real;
i:integer;
begin
s:=0;
for i:=0 to 4 do
begin
if Length(StringGrid1.Cells[i,0])
then a[i]:=StrToFloat(StringGrid1.
else a[i]:=0; // если ячейка пустая,
s:=s+a[i];
end;
s:=s/5;
label2.Caption:='Среднее арифметическое '+FloatToStr(s);
end;
Для ввода массива можно
В табл. 6 перечислены некоторые свойства компонента Memo.
Таблица 6
Свойство |
Определяет |
Text Lines |
Текст, находящийся в поле Memo. Рассматривается как единое целое Текст, находящийся в поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру |
Получить доступ к находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля). Основной цикл процедуры ввода символьного массива из компонентов Memo может выглядеть так:
for i:=1 to SIZE do
a[i]:= Memo1.Lines[i];
где
Следующая программа, текст которой приведен в листинге 14, демонстрирует использование компонента Memo для ввода символьного массива.
Форма программы в процессе ее работы приведена на рис. 24, а.
Поле Memo1 первоначально пусто, оно заполняется, когда программа запущена.
Процедура TForm1.Button1Click, обрабатывающая щелчок по кнопке Ввод, сначала проверяет, есть ли в поле Memo1 текст. Если текст есть (в этом случае значение свойства Lines.Count больше нуля), то процедура сравнивает количество введенных строк и размер массива (массив а объявлен перед описанием процедур как глобальный массив, имеющий 5 строк). Если количество введенных строк превышает размер массива, то программа изменяет значение n, подготавливая ввод только первых пяти строк. Появляется окно (рис. 24, б), которое содержит значения элементов массива, полученные из Memo-поля. Введенный массив обрабатывается процедурой TForm1.Button2Click, осуществляющей поиск по введенному в поле Edit1 образцу. Если одна из строк массива совпадает с образцом, программа выводит окно с соответствующим сообщением (рис. 24 в).
var a:array[1..5] of string[30]; Листинг 14
procedure TForm1.Button1Click(Sender: TObject);
var
n:integer; // количество строк
i:integer;
st:string;
begin
n:=Memo1.Lines.Count;
if n=0 then
begin
ShowMessage('Исходные данные не введены!');
Exit; // Выход из процедуры
end;
if n>5 then
begin
ShowMessage('Количество строк превышает размер массива');
n:=5; // будем вводить только первые 5 строк
end;
for i:=1 to n do
a[i]:=Memo1.Lines[i-1]; // строки Memo пронумерованы с нуля
st:='Введенный массив:'+#13;
for i:=1 to n do st:=st+IntToStr(i)+' '+a[i]+#13;
ShowMessage(st);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
obr:string; // образец для поиска
found:boolean;
// TRUE - совпадение образца с
i:integer;
begin
obr:=edit1.text;
found:=false; // пусть нужного элементата в массиве нет
i:=1;
repeat
if a[i]=obr then found:=TRUE else i:=i+1;
until (i>5) or (found=TRUE);
if found then ShowMessage('Совпадение с элементом № '+
IntToStr(i))
else ShowMessage('Совпадений с образцом нет');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
Для закрепления материала
составьте программу ввода
Для нахождения максимального числа в массиве воспользуйтесь дополнительной переменной, которой присвойте заведомо маленькое значение, например (-124). Затем в цикле сравнивайте эту переменную с каждым элементом массива и, если она меньше очередного элемента массива, присвойте ей значение этого элемента.
Если возникнут трудности в составлении программы, загляните в листинг 14.
procedure TForm1.Button1Click(Sender: TObject); Листинг 14
var
a:array[1..100] of real;
n,i,j:integer;
b:real;
s:string;
begin
b:=-1E24; // заведомо маленькое число
n:=Memo1.Lines.Count;
for i:=1 to n do
begin
{ строки Memo пронумерованы с нуля }
a[i]:=StrToFloat(Memo1.Lines[
if a[i]>=b then
begin
b:=a[i];
j:=i;
end;
end;
s:='Максимальное число'+#13+FloatToStr(b)+#13+'
label1.Caption:=s;
end;
Часто приходится иметь дело с информацией, которая представлена в табличной форме. Колонки и (или) строки, как правило, состоят из однородной информации. Поэтому в программе, обрабатывающей табличные данные, имеет смысл использовать массивы для хранения и обработки таблиц. Если вся таблица содержит однородную информацию, например, только целые числа, то такая таблица может быть представлена как двумерный массив. В общем виде инструкция объявления двумерного массива выглядит так:
Имя: array[Нижняя_граница1..
Нижняя_граница2.. Верхняя_граница2] of Тип
где:
Информация о работе Курс лекций по дисциплине "Программирование и комьпютеры"