КАТЕГОРИИ: Архитектура-(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; Просмотров: 421; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |