Концепция данных в языке Pascal. Реализация Delphi

Автор работы: Пользователь скрыл имя, 26 Апреля 2013 в 18:52, курсовая работа

Описание работы

Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов. Delphi оказал огромное влияние на создание концепции языка C# для платформы .NET. Многие его элементы и концептуальные решения вошли в состав С#. Мы будем рассматривать концепцию данных на основе среды версии Delphi 5. Delphi 5 имеет высокую производительность для развития Интернет. Представлено множество новых функций и усовершенствований. Некоторые из них, среди многих других, являются: различные макеты рабочего стола, концепция кадров, параллельное развитие, перевод возможности, более интегрированный отладчик, новые возможности Интернет (XML), базы данных ADO.

Файлы: 1 файл

курсовая.doc

— 903.50 Кб (Скачать файл)

Структура объявления типа записи такова:

<имя типа> = record <сп.полей> [<сп.свойств>] [<сп.методов>] end;

Здесь <имя типа> - правильный идентификатор; record, end - зарезервированные слова {запись, конец); <сп.полей> - список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой; <сп.свойств> и <сп.методов> - необязательные списки свойств и методов.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделённых друг от друга запятыми. За идентификатором ставится двоеточие и описание типа поля (полей), например:

type

BirthDay = record

Day, Month : Byte;

Year : Word

end;

var

a, b : Birthday;

В этом примере тип BirthDay есть запись с полями Day, Month и Year; переменные a и b содержат записи типа BirthDay.

Как и в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например:

а := b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, то есть указать имя переменной, затем точку и имя поля:

a.day : = 27;

b.year : = 2002;

Для вложенных полей приходится продолжать уточнения:

type

BirthDay = record

Day, Month : Byte;

Year : Word

end;

var

с : record

Name : String;

Bd : BirthDay

end;

begin

if c.Bd.Year = 1989 then …

end.

Например:

uses

SysUtils,

Windows;

type

BirthDay = record //объявили тип записи с тремя полями

Day: Dword;

Month : Dword;

Year : Dword;

end;

var

a: Birthday;

begin

a.Day:=27;

a.Month:=1;

a.Year:=2010;

Writeln(a.Day,'.',a.Month,'.',a.Year);

ReadLn;

end.

(приложение 9)

Чтобы упростить доступ к полям записи, используется оператор присоединения with:

with <переменная> do <оператор>;

Здесь with, do — зарезервированные слова (с, делать); <переменная> — имя переменной типа записи, за которым, возможно, следует список вложенных полей; <оператор> — любой оператор Delphi.

Например:

Bd.Month:= 9;

Я считаю, что этот оператор эквивалентен любому из трех таких операторов:

with c.Bd do Month : = 9;

with с do with Bd do Month := 9;

with c, Bd do Month := 9;

Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако, если записи содержат поля-записи, то есть вложены одна в другую, имена могут повторяться на разных уровнях вложения.

Предложение case ... of, открывающее вариантную часть, внешне похоже на соответствующий простой оператор выбора, но на самом деле лишь играет роль своеобразного служебного слова, обозначающего начало вариантной части. Именно поэтому в конце вариантной части не следует ставить end как пару к case...of. (Поскольку вариантная часть - всегда последняя в записи, за ней все же стоит end, но лишь как пара к record).

Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако, если записи содержат поля-записи, т. е. вложены  одна в другую, имена могут повторяться  на разных уровнях вложения.

    1. Множества

Множества - это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Object Pascal. Количество элементов, входящих во множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Два множества считаются  эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.

Описание типа множества  имеет вид:

<имя типа> = set of <базовый  тип>;

Здесь <имя типа> - правильный идентификатор; set, of - зарезервированные слова (множество, из); <базовый тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, Longint, Int64.

Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделенных друг от друга запятыми; список обрамляется квадратными скобками. Спецификациями элементов могут быть константы или выражения базового типа, а также тип-диапазон того же базового типа.

Над множествами определены перечисленные далее операции:

Пересечение множеств (*). Результат содержит элементы, общие для обоих множеств; например, S4*S6 содержит [3], S4*S5 — пустое множество.

Объединение множеств (+). Результат содержит элементы первого множества, дополненные недостающими элементами из второго множества:

S4+S5 содержит [0,1,2,3,4,5,6];

S5 + S6 содержит [3, 4, 5, 6, 7, 8, 9].

Разность множеств (-). Результат содержит элементы из первого множества, которые не принадлежат второму:

S6-S5 содержит [3,6,7,8,9];

S4-S5 содержит [0,1, 2, 3, 6].

Проверка эквивалентности (=). Возвращает True, если оба множества эквивалентны.

Проверка неэквивалентности (<>). Возвращает True, если оба множества неэквивалентны.

Проверка вхождения (<=). Возвращает True, если первое множество включено во второе.

Проверка вхождения (>=). Возвращает True, если второе множество включено в первое.

Проверка принадлежности (in). В этой бинарной операции первый элемент — выражение, а второй — множество одного и того же типа. Возвращает True, если выражение имеет значение, принадлежащее множеству:

3 in s6 — возвращает True;

2*2 in s1 — возвращает - False.

Дополнительно к этим операциям можно использовать две процедуры:

Include — включает новый элемент в множество. Обращение к процедуре:

Include(S,I)

Здесь S — множество, состоящее  из элементов базового типа TSetBase; I — элемент типа TSetBase, который необходимо включить в множество.

Exclude — исключает элемент из множества. Например:

Exclude(S,I)

Внутреннее устройство множества таково, что каждому  его элементу ставится в соответствие один двоичный разряд (один бит); если элемент  включен во множество, соответствующий  разряд имеет значение 1, в противном  случае - 0. В то же время минимальной  единицей памяти является один байт, содержащий 8 бит, поэтому компилятор выделил множествам по одному байту, и в результате мощность каждого из них стала равна 8 элементам. Максимальная мощность множества - 256 элементов. Для таких множеств компилятор выделяет по 16 смежных байт.

Опишем пример, который  иллюстрирует приемы работы с множествами.

uses

SysUtils,

Windows;

const

N=255;

type

SetofNumber=set of 1..N;

var

n1,Next,i:Word;

BeginSet,PrimerSet:SetofNumber;

begin

BeginSet:=[2..N];

PrimerSet:=[1];

Next:=2;

while BeginSet <> [] do

begin

n1:=Next;

while n1<= N do

begin

Exclude (BeginSet, n1);

n1:=n1+Next;

end;

Include (PrimerSet, Next);

repeat

inc(Next)

until( Next in BeginSet) or (Next>N)

end;

for i:=2 to N do

if i in PrimerSet then

Write(i,' ');

ReadLn;

end.

Здесь реализован алгоритм выделения из первой сотни натуральных  чисел всех простых чисел.

(приложение 10)

    1. Файлы

Файл представляет собой  именованную последовательность однотипных элементов, размещенных на внешнем устройстве, чаще всего на диске. Файл имеет много общего с одномерным динамическим массивом, но размещается не в оперативной, а во внешней памяти и не требует предварительного указания размера.

Для выполнения операций с конкретным файлом, размещенным  на диске, в программе обычно используется так называемая файловая переменная, или логический файл Файловая переменная после описания связывается с некоторым файлом, после чего операции, выполняемые с ней, приводят к соответствующим изменениям в файле. После выполнения всех операций связь между файловой переменной и файлом разрывают, и файловую переменную можно повторно связывать с любым другим файлом этого же типа.

В зависимости от типа элементов различают текстовые, типизированные и нетипизированные файлы. Текстовый файл содержит строки символов переменной длины, типизированный файл составляют элементы указанного типа (кроме файлового), а в нетипизированном файле находятся элементы, тип которых не указан. Описание файловой переменной, предназначенной для работы с файлом, должно соответствовать типу элементов файла.

Например:

var

fl: TextFile;

f2: File of integer;

f3: File of real;

f4: File;

Здесь переменная f1 предназначена для работы с текстовыми файлами. Переменные f2 и f3 служат для работы с типизированными файлами, содержащими целые и вещественные числа соответственно. Переменная f4 предназначена для работы с нетипизированными файлами.

В языке Delphi описателем текстовых  файлов служит слово Text. Как уже ранее было выявлено, в системе Delphi многие компоненты имеют одноименное свойство, поэтому при описании текстовых файлов этот описатель в чистом виде использовать нельзя: текстовый файл определяется как TextFile или System.Text.

Для непосредственной работы с файлами предоставляются соответствующие методы, например, LoadFromFile (const FileName: String) (загрузить из файла) или SaveToFile (const FileName: String) (сохранить в файле). В таких методах файловая переменная не нужна, и в параметре FileName указывается просто имя файла.

Пример:

Var

F:TextFile;// создаём переменную типа файл

MyStr: String;

begin

WriteLn('Enter Any String');

ReadLn(MyStr);

AssignFile(F,'MyString.txt');

ReWrite(F);

Write(F, MyStr);// записываем в файл значение переменной

CloseFile(F);

WriteLn('Enter Any String');

readln;

end.

(приложение 11)

 

  1. СТРОКИ

Для обработки текстов  в Object Pascal используются следующие типы:

    • короткая строка ShortString или String [n] , где n <= 255;
    • длинная строка String;
    • широкая строка WideString;
    • нуль - терминальная строка Pchar.

Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: для String [n] длина строки меняется от 0 до n, для String и Pchar - от 0 до 2 Гбайт.

В стандартном Паскале используются только короткие строки String [n]. В памяти такой строке выделяется n+i байт, первый байт содержит текущую длину строки, а сами символы располагаются, начиная со 2-го по счету байта. Поскольку для длины строки в этом случае отводится один байт, максимальная длина короткой строки не может превышать 255 символов. Для объявления короткой строки максимальной длины предназначен стандартный тип ShortString (эквивалент String[255]).

В Windows широко используются нуль - терминальные строки, представляющие собой цепочки символов, ограниченные символом #0. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой.

В 32-разрядных версиях Delphi введен тип String, сочетающий в себе удобства обоих типов. При работе с этим типом память выделяется по мере надобности (динамически) и ограничена имеющейся в распоряжении программы доступной памятью, имеющейся, а распоряжении программы. В отличии от символов коротких строк, символы длинной строки кодируются кодировкой Unicode и занимают в памяти по 2 байта каждый .Примеры объявлений строковых типов:

var

ssS: String [250];   // Короткая строка длиной до 250 символов

ssMax: ShortString;  // Короткая строка длиной до 255 символов

stS: String;   // Длинная строка

swS: WideString;   // Широкая строка

Несмотря на разницу во внутреннем представлении, короткие строки ShortString и длинные строки String (WideString) имеют одинаковые свойства.

Текущую длину строки можно получить с помощью функции Length. Например, следующий оператор уничтожает все ведомые пробелы:

while (Length(stS) <> 0) and

(stS[Length(stS)] = '   ') do

SetLentgh (stS, Length (stS) - 1) ;

В этом примере стандартная процедура SetLength устанавливает новую длину строки. К строкам можно применять операцию сцепления (+), например:

stS := 'а' +  'b';// stS содержит "ab"

stS :=stS + 'с';// stS содержит "abc"

Если длина строки превысит максимально допустимую длину N короткой строки, то «лишние» символы отбрасываются. Следующая программа, например, выведет символ «1»:

var

ssS: String[1];

begin

ssS := '123';

Writeln(ssS);

end;

(приложение 12)

 Также существуют операции отношения =,<>, >, <, >=, <= выполняются над двумя строками посимвольно слева направо с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением #0.

Следующие операции отношения дадут значение True:

' ' ' ' < '. '

'А' > '1'

'Object' < 'Delphi'

'Пас' > 'Pascal'

 

  1. УКАЗАТЕЛИ

Оперативная память ПК представляет собой совокупность ячеек для хранения информации - байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться, к любому байту памяти. Object Pascal предоставляет гибкое средство управления динамической памятью - так называемые указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, ShortInt, Boolean) занимают во внутреннем представлении один байт, остальные - несколько смежных. Поэтому на самом деле указатель адресует лишь первый байт данных.

Как правило, указатель  связывается с некоторым типом данных. Такие указатели называются типизированными. Для объявления типизированного указателя используется значок ^, который помещается перед соответствующим типом.

В Object Pascal можно объявлять  указатель и не связывать его  при этом с каким-либо конкретным типом данных. Для этого служит стандартный тип pointer, например:

var

р: Pointer;

Указатели такого рода называются нетипизированные. Поскольку нетипизированные указатели не связаны с конкретным типом, с их помощью удобно динамически размещать данные, структура и тип которых меняются в ходе работы программы.

Информация о работе Концепция данных в языке Pascal. Реализация Delphi