Lazarus - кросс-платформенный Delphi
Программирование для свободных людей

© 2006 Рудюк С.А.
Компания НеРуСофт

Часть 3. Простые типы данных.

К простым типам данных относятся: порядковые, вещественные типы и тип даты/времени.

Порядковые типы

К порядковым типам относятся: целые, логические, символьные, перечислимые типы и тип-диапазон. [7]

Для выражений порядкового типа определены следующие функции:

Следует отметить, что функции Pred и Succ не определена для самого меньшего и самого большего значения.

Для константы или переменной порядкового типа так же определены следующие функции:

Числовые типы

Числовые типы могут быть целыми и вещественными.

Целые типы данных предназначены для представления целых чисел. Каждый тип целых чисел имеет различные диапазоны значений, а так же занимает различное количество байтов. Рассмотрим целочисленные типы данных в Lazarus.[7]

Тип

Диапазон значений

Размер (в байтах)

Integer

-2147483648...2147483647

4

Cardinal

0..4294967295

4

Shortint

-128...27

1

Smallint

-32768.. 32767

2

Longint

-2147483648..2147483647

4

Int64

-263..263-1

8

Byte

0..255

1

Word

0..65535

2

LongWord

0..4294967295

4

Отметим, что 32-х разрядные процессора наиболее быстро работают с 4-х байтными типами данных: Integer, Cardinal, LongWord, LongInt. Предполагаю, что на 64-х разрядных процессорах наиболее быстро будут работать типы данных 8-ми байтовые – int64.

Вещественные типы данных предназначены для представления действительных чисел. Поскольку в компьютере хранятся данные в двоичном виде, то действительные числа представляются приближенно, пусть и с значительной точностью. [7]

Тип

Диапазон значений

Количество значащих цифр

Размер (в байтах)

Real

5.0*10-324..1.7*10308

15-16

8

Single

1.5*10-45..3.4*1038

7-8

4

Double

5.0*10-324..1.7*10308

15-16

8

Extended

3.6*10-4951..1.1*104932

19-20

10

Comp

-263..263-1

19-20

8

Currency

-922337203685477.5808.. 922337203685477.5807

19-20

8

Тип Comp и Currency применяется для бухгалтерских расчётов. В типе Comp дробная часть отсутствует, а в типе Currency она ограничивается четырьмя цифрами. [7]

Логические типы

В Object Pascal логические типы могут принимать два типа: true (верно), false (ложь).

Тип

Размер (в байтах)

Boolean

1

ByteBool

1

WordBool

2

LongBool

4

В Паскаль основным типом является Boolean, остальные типы данных нужны для совместимости с другими языками программирования.

Операторы
Составной оператор

К составным операторам относится группа операторов, которые расположены между операторными скобками (begin … end). Составной оператор используется тогда, когда правилами Pascal можно использовать один оператор, а необходимо выполнить ряд операторов. Это происходит с операторами: if, while, with, for и т.п.[7]

Условный оператор IF

Условный оператор предназначен для выполнения выбора по заданному условию. Формат данного оператора:

if <условие> then <оператор> else <оператор>;

или

if <условие> then <оператор>;

Оператор выбора CASE

Оператор Case позволяет выполнить выбор из ряда значений.

Формат данного оператора:

Case <переменная> of
<значение 1>: <оператор>;
<значение 2>: <оператор>;
<значение 3>: <оператор>;
<значение 4>: <оператор>;
<значение 5>: <оператор>;
...
else <оператор>
end;

Следует отметить, что переменная должна быть порядкового типа.

Оператор безусловного перехода GoTo

Оператор Goto переводит выполнение программы к заданной метке. Рекомендуется не злоупотреблять данным оператором и по возможности, избегать его выполнение, т.к. такой оператор приводит к ухудшению читабельности программы, а так же высока возможность "зацикливания" программы.

Формат данного оператора: goto <метка>;

Метка – это идентификатор, который определён с помощью ключевого слова label. Метку можно установить перед любым оператором и отделяется от него двоеточием. Нельзя передавать управление внутрь сложных операторов, а так же из вызывающей программы в подпрограмму.

Пример. Сделаем приложение в котором по номеру месяца выводится его название. Причём, номер версии будет запрашиваться до бесконечности.

Листинг программы, реализующей данную задачу:

program consple_laz;
{$mode objfpc}{$H+}
{$AppType CONSOLE}
label s1; // Объявление метки
var NumberMonth: Byte; // Номер месяца
begin
s1: // Метка для повторного выполнения программы
write('Month Number: '); // Запрашиваем номер месяца
readln(NumberMonth); // Ввод Номера месяца

Case NumberMonth of // По номеру месяца определяем его название
1: writeln('January'); // Январь
2: writeln('February'); // Февраль
3: writeln('March'); // Март
4: writeln('April'); // Апрель
5: writeln('May'); // Май
6: writeln('June'); // Июнь
7: writeln('July'); // Июль
8: writeln('August'); // Август
9: writeln('September'); // Сентябрь
10: writeln('October'); // Октябрь
11: writeln('November'); // Ноябрь
12: writeln('December'); // Декабрь
else writeln('Error of month!'); // Ошибочно задан месяц
End;

writeln; // Добавляем пустую строку
goto s1; // Повторяем выполнение программы
end.

На компакте Вы данный проект можете найти в папке Month.

Данная программа "зациклен" и выполняется до бесконечности, чтоб прервать её выполнение необходимо нажать Ctrl+Break или Ctrl+F2 (из среды разработки), так же можно просто закрыть окно приложения.

Операторы циклов

Операторы циклов нужны для повторного выполнения одинаковых операций. В Паскале предусмотрено три опратора циклов: for (цикл с параметром), white (цикл с предусловием), repeat (цикл с постусловием).

Оператор For

Оператор цикла for предназначен для выполнения количества циклов заранее известного количества.[7]

Формат цикла for:

for <переменная-счётчик>:=<начальное значение> to <конечное значение> do <оператор>;

Переменная-счётчик будет увеличиваться на 1 до тех пор, пока не достигнет конечного значения. Цикл выполняется столько раз, насколько цифра конечного значения отличается от начального значения. Если, необходимо, чтоб значение счётчика не возрастало, а убывало, тогда вместо to ставится downto.

Пример. Реализуем простейшую задачу из школьного курса информатики – выведем таблицу Пифагора на экран.

Листинг программы [7]:

program consple_laz;
{$mode objfpc}{$H+}
{$AppType CONSOLE}
var s, i , j: integer; // Переменные-счётчики
begin
for i:=1 to 10 do // Цикл по строкам
begin
for j:=1 to 10 do // Цикл по столбцам
write(i*j:4); // Выводим цифру с форматированием в 4 символа
writeln; // Переходим на следующую строку
end;
Readln; // Ожидаем нажатия клавиши
end.

Результат выполнения программы:

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

Оператор цикла While

Оператор цикла While выполняется до тех пор, пока верно логическое условие. Если логическое условие с самого начала не выполнятеся, тогда цикл не выполняется ни разу. Формат опрератора цикла While:

while <условие> do <оператор>;

Оператор цикла Repeat

Оператор цикла Repeat имеет вид:

repeat
<оператор>;
<оператор>;
<оператор>;
<оператор>;
until <условие>;

Компилятор вначале выполняет все операторы, заключённые между repeat ..until, после этого, делается проверка условия и если условие верно, тогда повторяется цикл. Таким образом, операторы в теле цикла выполняются по крайней мере один раз.

Описание процедур и функций

Описание процедур имеет такой вид:

procedure <название процедуры> (<список параметров>);

<тело подпрограммы>;

В отличие от процедур, функции возвращают результат. Описание функции имеет вид:

function <название процедуры> (<список параметров>): <тип результата>;

<тело подпрограммы>

В списке параметров можно указывать переменные которые мы передаём в процедуру или которые получаем. Причём, если переменную из списка параметров мы собираемся изменить, тогда необходимо перед переменной указать var.

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

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

Рассмотрим объявления процедур и функций:

// Перегруженная функция с одной переменной
procedure my_write(str_inp1: string); overload;

// Перегруженная функция с двумя переменными
procedure my_write(str_inp1, str_inp2: string); overload;

// Перегруженная функция с тремя переменными
procedure my_write(str_inp1, str_inp2, str_inp3: string); overload;

Таким образом, в программе мы можем задавать различное значение не задумываясь о том, какое название процедуры необходимо указать для какого случая. По сути, у нас получилась процедура, которая работает аналогично стандартной процедуре write. Мы можум писать:

my_write('Привет!');
my_write('Привет!', 'Иванов Иван Иванович');
my_write('Привет!', 'Иванов Иван Иванович', 'Как Вы поживаете ?');

Если бы процедура не была перегружаемой, компилятор не разрешил бы Вам использовать различное количество параметров.

// Задаём значения по умолчанию
procedure get_user(str_inp1: string='Иванов';age: integer=20);

// После выполнения, процедуры возвращаем параметр age
procedure get_user(str_inp1: string='Иванов';var age: integer=20);

// Функция с одним входным параметром. Возвращает значение косинуса
function my_cos(x: real): real;

// Функция без параметра, но с возвратом значения
function my_cos: string;

Следует отметить, что процедуры и функции можно задавать так же в типах данных. Такие типы называются: процедурный тип, тип-функция.

Пример таких функций и процедур:

type
fmy_curr = function (summa: currency; nds: currency): currency;
fmy_proc = procedure (mess: string);

Строковые типы

Строка представляет собой последовательность символов, заключенную в одинарные или двойные кавычки. [7]

Константа типа Char представляет собой строку раз мером в 1 символ.[7]

Примеры строк:

'Привет!', "Тест", "A"

Рассмотрим какие типы строк есть в Object Pascal.

Тип строки

Максимальная длина

Есть ли нулевой символ в конце

ShortString

255 байт

нет

AnsiString

2 Гб

есть

String

255 байт/2 Гб

нет/есть

WideString

1 Гб

есть

Тип String по умолчанию воспринимается компилятором, как AnsiString.

Если указать директиву {$H-}, тогда String воспринимается, как ShortString. По умолчанию, действует директива {$H+} – AnsiString.

Тип ShortString – это стандартные Паскалевые строки с ограничением в 255 символов. Нулевой символ содержит длину строки (в виде символа). Для того, чтоб получить длину строки по нулевому байту необходимо вызвать процедуру – ord(). К каждому символу короткой строки можно обратиться по индексу, например:

Stroka[8] – возвращает 8-й символ.
Stroka[53] – возвращает 53 символ.
ord(Stroka[0]) – возвращает количество символов в строке.

Для определения длины строки всех типов можно воспользоваться стандартной функцией – Length(<строка>).

Например:

length('Строка'); - возвратит цифру 6.

Для объединения строк используется знак +. Например:

new_str:='Иванов '+'Иван'; // Переменная new_str примет значение Иванов Иван
str:='str'+IntToStr(55); // Переменная str примет значение str55

В Паскале предусмотрено большое количество стандартных процедур и функций для работы со строками. Рассмотрим некоторые из них:

function AnsiCompareStr(const S1, S2: string): Integer;
// Сравнивает две строки S1 и S2 в кодировке с учётом регистра.
// Возвращает значение меньше 0, если S1S2.

function AnsiCompareText(const S1, S2: string): Integer;
// Аналогична предыдущей функции, но сравнение происходит без учёта регистра.

function AnsiLowerCase(const S: string): string;
// Возвращает в кодировке ANSI строку S, преобразованную у нижнему регистру.

function AnsiPos(const Substr, S: string): Integer;
// Возвращает позицию (индекс) первого вхождения Substr в S. Если Substr нет
// в S, тогда возвращается 0.

function AnsiUpperCase(const S: string): string;
// Возвращает строку S в кодировке ANSI, преобразованную к верхнему регистру.

function Concat(s1 [, s2,...,sn]: string): string;
// Возвращают строку, сцеплённую из строк s1..sn. Аналогична операции + для строк.

function Copy(S; Inex, Count: Integer): string;
// Параметр S-строка или динамический массив. Эта функция возвращает построку S,
// начинающуюся с символа S[Index] и содержащую Count символов.

procedure Delete(var S: string; Index, Count: Integer);
// Удаляет из строки S подстроку, начинающуюся с символа Index и содержащую Сount
// символов.

procedure Insert(Source: String; var S: string; Index: integer);
// Вставляет строку Source в S, начиная с символа с номером Index.

function Length(S): Integer;
// Возвращает число символов в строке S.

function Pos(Substr; S: String): Integer;
// Возвращает позицию первого вхождения строки Substr в строку S.
// Если вхождений нет, тогда возвращается 0

procedure SetLength(var S; NewLength: Integer);
// Эта процедура устанавливает строку или динамический массив к длине NewLength
// Параметр S является строкой или динамическим массивом.

function StringOfChar(Ch: Char; Count: Integer): String;
// Создаёт строку, состоящую из Count раз повторяющегося символа Сh

function Trim(const S: string): String;
// Удаляет из строки S все пробелы и управляющие символы.

function TrimLeft(const S: string): String;
// Удаляет из строки S все пробелы и управляющие символы слева в строке.

function TrimRight(const S: string): String;
// Удаляет из строки S все пробелы и управляющие символы справа в строке.

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

Перечислим основные функции для преобразования типов:

function IntToStr(Value: Integer): String; Overload;
function IntToStr(Value: Int64): String; Overload;
// Функция для преобразования целого числа в строку.
// Как видите, есть две функции IntToStr. Одна для Integer, другая для Int64

function FloatToStr(Value: Extended): String;
// Преобразует вещественное значение Value в строку.

procedure Str(X [:Width [:Decimal]]; var S);
// Преобразует строку S в целое число.
// Не обязательные параметры Width - длина всего числа.
// Decimal - длина цифр после запятой.

function StrToInt(const S: string): Integer;
// Преобразует строку в целое число. Строка должна содержать только цифровые
// символы.

function StrToFloat(const S: string): Extended;
// Преобразует строку S в действительное число. Строка должна содержать только
// цифровые символы и знак разделителя дробной части.

Procedure Val(S; var V; var Code: Integer);
// Преобразует строку S в вещественный или целочисленный тип, в зависимости от
// типа данных V. В параметре Code выводится успешность преобразования.
// Если Code=0, тогда тогда преобразование прошло успешно, иначе переменная
// Code выводит позицию первого ошибочного символа.

function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision,
Digits: Integer): String;
// Позволяет преобразовавть вещественное значение в строковое с возможностью
// настройки вида отображения строки
// Параметры данной функции:
// Value - число, которое мы будем преобразовывать на строку.
// Format - форматирование строки. Задаёт внешний вид строки.
// Precision - точность представления числа.
// Digits - значение зависит от используемого формата.
// Значения Format могут быть:
// ffGeneral - общий цифровой формат. Число отображается с десятичной точкой.
// Например: 34342.993
// ffExponent - Отображение в научном формате.
// Например: 34342.993E-5
// ffFixed - число с фиксированной запятой. Число отображается с десятичной точкой.
// Например: 34342.993
// ffNumber - числовой формат. Показывается число с фиксированной десятичной точкой
// и в добавок к этому показываются разделители групп разрядов. Например: 3,434,232.99
// ffCurrency - денежный формат. Подобен формату ffNumber, но в конце ещё дописывается
// денежная единица. Например: 3,332,234.32 грн.

Есть ещё две важные функции, которые я не перечислил: Format(), FmtStr(Result,…). По действию они схожи, но первая возвращает результат из вызова функции, а вторая – как параметр.[15]

Рассмотрим семантику данных функций:

function Format(const Format: string; const Args: array of const): string; overload;

function Format(const Format: string; const Args: array of const; const FormatSettings: TFormatSettings): string; overload;

procedure FmtStr(var StrResult: string; const Format: string; const Args: array of const); overload;

procedure FmtStr(var StrResult: string; const Format: string; const Args: array of const; const FormatSettings: TFormatSettings); overload;

Пример применения функции Format:

Write(Format('Мне %d лет'),[29]); // Программа выведет на экран: Мне 29 лет

Как видите, вместо %d ф-ция Format подставило значение 29.

Существует несколько спецификаторов формата, применяемых с функцией Format. Каждый из спецификаторов предваряется знаком процента и переменным числом внутренних аргументов, представленных в следующем списке [15]:

d: integer;

e: scientific;

f: fixed;

g: general;

n: number;

m: Money;

p: Pointer;

s: string;

x: Hex;

Приведём ещё несколько примеров применения ф-ции Format:

Wirite(Format('Сумма счёта: %m',[13.2]));
// Выводит: Сумма счёта: 13,2 грн

Write(Format('Возникла ошибка:'+Chr(13)+'%s: %s.', [E.ClassName, E.Message]));
// Выводится на экран сообщение о том, что возникла ошибка и на следующих строках
// приводится текст самой ошибки

Тип-диапазон

Тип-диапазон – базовый тип. С его помощью, можно задать диапазон значений, которые может принимать переменная. Если значение переменной будет выходить за диапазон, тогда во время выполнения программы возникнет ошибка. Для того, чтоб отключить проверку диапазонов можно использовать директиву {$R-}, а для включения – {$R+}.

Пример задания типов-диапазонов:

type
numbers=(first, second, third); // Три значения: first, second, third
num_age=20..120; // Значения могут приниматься от 20 до 120
rus_sim='а'..'я'; // Символы от а до я

Типы даты и времени

Тип дата (TDateTime) предназначен для хранения информации о дате и времени. Значения этого типа представляют собой 8-ми байтовые вещественные числа с фиксированной запятой. Целая часть такого числа обозначает количество суток, прошедших с 30 декабря 1899 года, а дробная – часть суток, прошедших с 0 часов. Таким образом, целая часть позволяет определить дату, а дробная – время.[7]

Необходимо учитывать, что в различных странах дата может быть представлена в различном виде.

Так, например для России и Украины принято написание:

17.09.2006 16:19 (день, месяц, год, часы, минуты)

А для США:

2006.09.17 4:19PM (год, месяц, день, часы, минуты)

Приведём функции для работы с датой и временем [7].

function Date: TDateTime;
// Функция возвращает текущую дату

function DateTimeToStr(DateTime: TDateTime): String;
// Функция преобразует дату и время DateTime к строковому типу

procedure DateTimeToString(var Result: String; const Format: String;
DateTime: TDateTime);
// Преобразует дату и время в строку и помещает результат в переменную Result
// с использованием формата Format.

function DateToStr(Date: TDateTime): string;
// Преобразует дату к строке. При преобразовании используется формат, указанный
// в глобальной переменной ShortDateFormat.

function DateOfWeek(Date: TDateTime): Integer;
// Возвращает день недели для указанной даты Date. Обратите внимание, что
// 1-воскресенье, 2-понедельник,..., 7 - суббота.

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
// Процедура разбивает длату на отдельные цифры: год (Year), месяц (Month), день (Day).

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
// Процедура разбивает время на отдельные цифры: час, минуты, секунды, миллисекунды.

function EncodeDate(Year, Month, Day: Word): TDateTime;
// Формирует дату из отдельных цифр: год, месяц, день.

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
// Функция формирует время из отдельных цифр: часы, минуты, секунды, миллисекунды.

function FormatDateTime(const Format: String; DateTime: TDateTime): String;
// Преобразует дату и время в строку в соответствии с заданным форматом даты/времени.

function IsLeapYear(Year: Word): Boolean;
// Функция проверяет является ли заданный год высокосным

function Now: TDateTime;
// Функция возвращает текущую дату и время

function StrToDate(const S: string): TDateTime;
// Функция преобразует строку S в дату.

function StrToDateTime(const S: string): TDateTime;
// Функция преобразует строку S в дату и время.

function StrToTime(const S: string): TDateTime;
// Функция преобразует строку S во время.

function TimeToStr(Time: TDateTime): String;
// Функция преобразует время Time в строку

В некоторых функциях указывается строка формата даты. Ниже опишем возможные символы-спецификаторы для строки формата [7]:

c

Отображает дату и время в виде мм/дд/гг чч.мм.сс. Например: 01/25/2006 17.31.42. Время не отображается, если дробная часть парамета DateTime равна нулю.

d

Отображается день как число без ведущего нуля (1-31).

dd

Отображается день как число с ведущим нулём (01-31).

ddd

Отображается название в сокращенном виде. Например: Sun, Sat.

dddd

Отображается название дня полностью. Например: Sunday, Saturday.

ddddd

Отображает дату в формате дд.мм.гг Например: 17.09.06

dddddd

Отображает дату в формате д месяц г. Например: 23 October 1999.

m

Отображает месяц как число без ведущего нуля (0-12). Если данный спецификатор идёт за спецификатором h, тогда отображается не месяц, а минуты.

mm

Отображает месяц как число с ведущи нулем (0-12). Если данный спецификатор идёт за спецификатором h, тогда отображается не месяц, а минуты.

mmm

Отображается название месяца в сокращенном виде. Например: Jan, Dec.

mmmm

Отображается полное название месяца. Например: January, December.

yy

Отображается год как число, состоящее из двух цифр (00-99).

yyyy

Отображается год как число, состоящее из четырёх цифр (0000-9999).

h

Отображаются часы без ведущего нуля (0-23).

hh

Отображается час с ведущим нулём (00-23).

n

Отображаются минуты без ведущего нуля (0-59).

nn

Отображаются минуты с ведущим нулём (00-59).

s

Отображаются секунды без ведущего нуля (0-59).

ss

Отображаются секунды с ведущим нулём (00-59).

z

Отображаются миллисекунды без ведущего нуля (0-999).

zzz

Отображаются миллисекунды с ведущим нулём (000-999).

t

Отображается время в формате чч:мм. Например: 14:53.

tt

Отображается время в формате чч:мм:сс. Например: 17:43:55

am/pm

Отображается время в двенадцатеричном формате. am – до полудня, pm – после полудня. Например: 7:33 am

a/p

Время в шестнадцатеричном формате. a – до полудня, p – после полудня.

ampm

Время в шестнадцатеричном формате, но без установки метки до полудня или после полудня.

'xx'/"xx"

Символы xx, отличные от символов-спецификаторов, помещенные в строку Format, отображаются на экране дисплея без каких-либо преобразований. Например: "hh hour, nn minutes, ss seconds", для 17:54:23 будет от ображено: 17 hour 54 minutes 23 seconds.

Если строка формата указывается пустой, тогда будет форматироваться так, как будто указан символ c.[7]

Массивы

Массивы бывают статические или динамические. В статических массивах не изменяется количество элементов во время выполнения программы, а в динамических массивах – изменяется количество элементов.

Статические массивы

Статический тип массивов представляет собой фиксированное количество однотипных элементов. Данный тип массива имеют такую форму:

type

<имя типа>=array [<диапазон элементов>] of <тип элементов>;

Например:

type
month_names=array [1..12] of string; // массив для 12 элементов массива
matrix=array [1..100, 1..100] of real; // Матрица 100x100.

Элементами статического массива могут быть любые типы, кроме Int64 и LongWord.

Для доступа к элементу массива необходимо писать: month[2] – обращение ко второму элементу. В Паскале копировать сразу две переменные разных типов элементов нельзя. Необходимо копировать каждый элемент массива индивидуально. Если же переменные одинакового типа, тогда Вы можете скопировать элементы простым присваиванием, например: arr2:=arr1;

Пример: Сделаем программу в которой производится ввод элементов массива. Потом, делается копирование элементов во второй массив, целочисленного типа и этот массив выводится на экран.

Вот листинг программы:

program consple_laz;
// Программа копирует элементы массива Arr1 в элемент массива Arr2.
{$mode objfpc}{$H+}
{$AppType CONSOLE}
Uses SysUtils;
var Arr1: array[0..6] of real; // Первый массив. (откуда копируем)
Arr2: array[0..6] of integer; // Второй массив. (куда копируем)
i: integer;
begin
// Запрашиваем ввод элементов массива