Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Динамические массивы




Туре

СТАТИЧЕСКИЕ МАССИВЫ

End.

While true do begin

Interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type

TForm1 = class(TForm)

Panel1: TPanel;

Button1: TButton;

BitBtnl: TBitBtn;

Bevell: TBevel;

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

ComboBox1: TComboBox;

Label3: TLabel;

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Buttoniciick (Sender: TObject);

procedure Edit1Exit (Sender: TObject); end;

var Form1: TForm1; iplementation

(Sr *.dfm}

Procedure TForm1.Edit1KeyPresa (Sender: TObject;

var Key: Char);

 


if not (key in [‘0'..'9',#8]) then key:=#0; end;

procedure TForm1.Button1Click (Sender: TObject); var k,i,n:integer; begin

if Length(Edit1.Text)=O then Edit1.Text: = '0'; if Edit1.Text-'O' then begin

Label3.Caption:='HeT диапазона n'; ComboBox1.Visible:=false; end else begin

ComboBox1.Visible:=true;

ComboBox1.Clear;

Label3.Caption:='';

n:-StrToInt(Edit1.Text);

Randomize;

i:=0;

k:=Random(2*n + 1) - n;

inc(i);

CoraboBoxl.Items.Add{IntToStr(i)+'-e число= '+

IntToStr(k)); if k>=0 then Continue else begin

ComboBox1.Text:=ComboBox1.Items.Strings[i-1];

Break;

end;

end;

end;

end;

procedure TForm1.Edit1Exit (Sender: TObject);

begin

if Abs{StrToInt(Edit1.Text))>100 then if Application.MessageBox('Введите число Х',' Число jX] < 100 \MB_OK)=IDOK then Edit1.SetFocus;

end;

В данном случае используется бесконечный цикл while true.... Если очередное полученное число к неотрицательно, то осуществляется переход на начало цикла - процедура Break не выполняется. Если значение к станет отрицательным, то сначала в заголовок интерфейсного элемента ComboBox1 заносится последнее значение числа к (так как нумерация строк в списке начинается с 0, последняя строка имеет номер i-1), а затем уже выполняется процедура выхода из цикла Break.

В данной программе приведен пример использования свойства Visible. Если значение этого свойства равно false (ComboBox1. Visible: =f alse), т° соответствующий объект не отображается на экране. Чтобы вернуть его изс бражение, надо свойству Visible присвоить true.


Назначение обработчика Edit1Exit - вернуть фокус на ввод числа п, если не соблюдается условие примера n < 100. Оформлен он так же, как и соответствующий обработчик в примере 6.

МАССИВЫ

Массив представляет собой фиксированное количество однотипных компонентов, снабженных индексами. Массивы соответствуют, например, векторам (одномерный массив), матрицам (двумерный массив) и др.

Тип статического массива объявляют следующим образом:

<Имя> = Array[<тип индекса>] of <тип элеметов>; (например, Туре Vekt = Array [1..10] of byte;).

В данном случае задан одномерный массив (вектор) состоящий из 10 элементов целого типа byte. Отдельные элементы этого массива в програм­ме определяются с помощью индексов, например, если объявлено var X: vekt;,TOB выражениях можно использовать х[1],х[2],...,х[Ю].В квад­ратных скобках указывается значение индекса, т.е. номер компонента в мас­сиве. Отсчет номеров ведется так, как указано в индексе при объявлении. Пусть объявлено: Var Z: array [-2..2] of integer,-. Это значит зада­ны элементы z [-2], Z[-l], z[0], z[l], z [2] целого типа integer.

В общем случае тип индекса может быть любым порядковым типом. Так, в примере Var У: array [ А'..' Z' ] of integer; объявлено 26 элементов (по количеству букв в английском алфавите): Y[ ‘а' ], Y[ ‘В' ],.., Y[ 'z' ], выделено 26 ячеек памяти, в которые можно записывать данные типа integer, например У [ X 3: =5;. Информацию можно также считывать из этих ячеек памяти: A:=cos(Pl + YpC']);.

Индекс можно определять и таким способом: Var Y:array[Char] of single;, т.е. определено 256 ячеек памяти, в которые можно записывать вещественные числа. Однако имеется ограничение при объявлении масси­вов: размер памяти, занимаемый одним массивом не должен превышать 2 оайта. Так, объявление var X:array[Longlnt] of integer; синтакси­чески верно, но превышен размер памяти, который должен быть выделен для этого массива (более 2 Гбайт).

Аналогичные правила действуют и для двумерных массивов, например ьявление var a: array[1..2, 1..3] of double; определяет двумер-


ный массив (матрицу), который содержит 2 строки и 3 столбца (всего 6 эле­ментов). Эти элементы записываются в памяти следующим образом- А[1,1], А[1,2], А[1,3], А[2,1], А[2,2], А[2,3], т.е. сначала пер. вая строка матрицы, а затем вторая. Этот массив можно определить и так: д. array[1..2] of array[1..3] of real; или Type Vekt = аг-ray[1..3] of real; Var A: array[1..2] of vekt;.

Разрешается объявлять и использовать многомерные массивы (до семи­мерных включительно).

Для массивов можно задавать типизированные константы, т.е. задавать начальные значения элементам массива. Например, требуется задать в памя­ти значения элементов вектора q = (5.2, 6.0, -3.1, 0.8). Это можно осущест­вить следующим образом: Const q:array[l..4] of real=(5.2,6.0,-3.1,0.8);.

Начальные значения для двумерного массива, например матрицы

можно задать следующим способом:

Type Matr= array[1..2, 1..3] of byte; Var R:Matr=<(3, 7, 5), (8, 11, 6));.

При задании значения индекса для элемента какого-либо массива можно использовать выражение соответствующего типа, указанного при объявле­нии. При этом необходимо следить, чтобы значение этого выражения не вы­ходило за объявленные границы. Например, для элемента объявленной выше матрицы R можно записать R[Succ(i),Pred(j) ] (см. табл. 2), необходимо лишь, чтобы выполнялись для заданной матрицы R условия: 1 < Succ(i) > 2и1 < Pred(j) > 3.

Если задан массив символов, то типизированную константу можно оп­ределять следующим образом: const С: array[1..5] of Char='abcde';.

Если два или более массивов имеют один тип, т.е. объявлены с помощью одного описания, то эти массивы можно присваивать друг другу. Например, если объявлено Type V= array [1.. 5] of real; Var А, В:V;, то МОЖНО записывать А: =в;. Однако при следующем описании тех же переменных А и ВVar A:= array[1..5] of real; B:= array[1..5] of real; запи­сывать А: = В; нельзя.

Динамический массив, в отличие от статического, объявляется как ссылка на некоторый адрес, по которому будут размещаться данные, напри­мер, Var V = array of real; VI = array of integer;.

Каждая из объявленных переменных (v или vi) может иметь значение какого-то адреса. Прежде чем располагать данные, этот адрес переменная


должна получить. Память под данные выделяется процедурой SetLength: SetLength(V,5); SetLength(VI, 10);.

В данном случае объявлено 5 элементов одномерного массива вещест­венных чисел v и 10 элементов массива целых чисел vi. Нужное количество памяти выделится процедурой SetLength, эта же процедура присвоит кон­кретные значения адресов переменным v и vi.

Имеются особенности в использовании динамических массивов. Первая -нумерация индекса всегда начинается с нуля. Вторая особенность касается правил выполнения операции присваивания, например, пусть объявлено: lype Vekt = array of real; Var VI,V2:Vekt;. Присваивание VI:=V2; для статических массивов означает, что содержимое памяти VI за­меняется содержимым памяти V2 (элементы массива VI получили значения элементов V2). Если учесть, что в случае с динамическими массивами vi и V2 являются ссьшками (адресами), адрес VI заменяется на адрес V2. Таким образом, присваивание vi: =V2; привело к тому, что VI и V2 ссылаются те­перь на один и тот же участок памяти, т.е. элементы массива VI равны эле­ментам V2, но потерялся адрес vi, соответственно потерялся и выделенный участок памяти, начиная с адреса VI.

Освободить память, выделенную под VI, можно, вызвав перед операцией присваивания vi:=V2; процедуру Finalize: Finalize (VI); или просто при­своив VI: =nil;.

Динамические массивы могут быть и многомерными, например объявив Var W:array of array of real;. Далее в программе можно задать раз­мерности массива SetLength (W, 5,10);.

Динамические массивы позволяют, например, создавать треугольные матрицы, имеющие различные размерности индексов. Интерес к таким мас­сивам в вычислительной математике очень большой. Для создания таких массивов сначала нужно задать размерность по первому индексу, например Для объявленного выше двумерного массива W так: SetLength (w,3);. Это означает, что массив будет состоять из 3 строк. Теперь длину каждой строки зададим отдельно: SetLength(W[0],1); SetLength(W[l],2); SetLength (w[2],3);• Если требуется освободить память из-под такого массива, то используется один вызов процедуры Finalize или одно при­сваивание W: =nil;.

Начальный и конечный индексы динамического одномерного массива v Можно определять функциями Low (V) (равно 0) и High (V). Так, например, в следующем операторе For i: =Low (v) to High (V) do...; целесо­образно не указывать непосредственно верхнюю границу для циклических вычислений, поскольку в программе можно неоднократно менять размер­ность динамических массивов.


ПРИМЕР ПРИЛОЖЕНИЯ 8

Задан одномерный массив чисел X = (0,2; 0,7; 1,8; 3,1; 4,2). Получить таблицу косинусов для этих чисел, т.е. рассчитать cos(0,2), cos(0,7), cos(4,2). На рис. 23 представлен вариант решения этого примера.

Рис.23

Для решения задачи был использован новый компонент TStringGrid (таблица строк), который находится на странице Additional палитры компо­нентов. Данный компонент представляет собой двумерную таблицу. Число строк задается свойством RowCount, а число столбцов - ColCount. Размеры одной ячейки таблицы на экране задаются свойствами DefaultColHeight и DefaultRowWidth в пикселах. Компонент может использоваться для имита­ции чего-либо похожего на таблицу. Доступ к отдельной ячейке таблицы осуществляется с помощью свойства Cells[i j], где i - номер столбца, j - но­мер строки. Отсчет номеров столбца и строки начинается с нуля. Часть строк и столбцов, используемых в таблице, можно зафиксировать. Тогда они будут недоступны пользователю. Для этого нужно задать свойство FixedRows и FixedCols (фиксированное число строк и столбцов). Фиксированные колон­ки и строки закрашиваются в другой цвет. Используются они для заголов­ков. С помощью свойства goEdit можно запретить или разрешить редакти­рование ячеек таблицы.

В данном примере для StringGridl установлено: ScroIIBars = ssNone, RowCount = 6, ColCount = 3, FixedRows = 1, FixedCols = 1, GoEdit = false. Ниже приводится программа для данного примера.

unit prim8; interface

uses Windows, Messages, SysUtils,Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Grids;





Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 403; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.023 сек.