По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Общие сведения о языке программирования Free Pascal
2.4.4 Тип дата-время
Тип данных дата-время TDateTime предназначен для одновременного хранения даты и времени. В памяти компьютера он занимает восемь байтов и фактически представляет собой вещественное число, где в целой части хранится дата, а в дробной — время.
2.4.5 Логический тип данных
Данные логического типа могут принимать только два значения: истина (true) или ложь (false). В стандартном языке Pascal был определён лишь один логический тип данных — boolean. Логические типы данных, определённые в языке Free Pascal, представлены в табл. 2.3.
Пример объявления логической переменной:
var FL : boolean;
2.4.6 Создание новых типов данных
Несмотря на достаточно мощную структуру встроенных типов данных, в среде Lazarus предусмотрен механизм создания новых типов. Для этого используют служебное слово type:
type новый_тип_данных = определение_типа;
Когда новый тип данных создан, можно объявлять соответствующие ему переменные:
var список_переменных: новый_тип_данных;
Применение этого механизма мы рассмотрим в следующих параграфах.
2.4.7 Перечислимый тип данных
Перечислимый тип задаётся непосредственным перечислением значений, которые он может принимать:
var имя_переменной: (значение_1, значение_2,..., значение_N);
Такой тип может быть полезен, если необходимо описать данное, которое принимает ограниченное число значений. Например:
var animal : ( fox, rabbit ); color : ( yellow, blue, green );
Применение перечислимых типов делает программу нагляднее:
type //Создание нового типа данных — времена года. year_seasons = ( winter, spring, summer, autumn ); var //Описание соответствующей переменной. yt : year_seasons;
2.4.8 Интервальный тип
Интервальный тип задаётся границами своих значений внутри базового типа:
var
имя_переменной: минимальное_значение.. максимальное_значение;
Обратите внимание, что в данной записи два символа точки рассматриваются как один, поэтому пробел между ними не допускается. Кроме того, левая граница диапазона не должна превышать правую. Например:
var date : 1.. 3 1; symb : ’ a ’.. ’ h ’;
Применим механизм создания нового типа данных:
type //Создание перечислимого типа данных — дни недели. Week_days = (Mo, Tu, We, Th, Fr, Sa, Su ); //Создание интервального типа данных — рабочие дни. Working_days = Mo.. Fr; var //Описание соответствующей переменной days — рабочие дни. days : Working_days;
2.4.9 Структурированные типы
Структурированный тип данных характеризуется множественностью образующих его элементов. В языке Free Pascal это массивы, строки, записи, множества и файлы.
Массив — совокупность данных одного и того же типа4Подробно о массивах см. в главе 5. Число элементов массива фиксируется при описании типа и в процессе выполнения программы не изменяется.
Для описания массива используют ключевые слова array...of:
имя_массива : array [ список_индексов ] of тип_данных;
где:
- имя_массива — любой допустимый идентификатор;
- тип_данных — любой тип языка.
- список_индексов — перечисление диапазонов изменения номеров элементов массива; количество диапазонов совпадает с количеством измерений массива; диапазоны отделяются друг от друга запятой, а границы диапазона, представляющие собой интервальный тип данных, отделяют друг от друга двумя символами точки: [ индекс1_нач.. индекс1_кон, индекс2_нач.. индекс2_кон,... ]
Например:
var //Одномерный массив из 10 целых чисел. a : array [ 1.. 10 ] of byte; //Двумерный массив вещественных чисел (3 строки, 3 столбца). b : array [ 1.. 3, 1.. 3 ] of real;
Ещё один способ описать массив — создать новый тип данных. Например, так:
type //Объявляется новый тип данных — трёхмерный массив целых чисел. massiv=array [ 0.. 4, 1.. 2, 3.. 5 ] of word; var //Описывается переменная соответствующего типа. M: massiv;
Для доступа к элементу массива достаточно указать его порядковый номер, а если массив многомерный (например таблица), то несколько номеров:
имя_массива[номер_элемента]
Например: a[5], b[2, 1], M[3, 2, 4].
Строка — последовательность символов. В Lazarus строка трактуется как массив символов, то есть каждый символ строки пронумерован, начиная с единицы.
При использовании в выражениях строка заключается в апострофы. Описывают переменные строкового типа так:
имя_переменной : string;
или:
имя_переменной : string [ длина_строки ];
Например:
const S= ’СТРОКА ’; var Str1 : string; Str2 : string [ 255 ]; Stroka : string [ 100 ];
Если при описании строковой переменной длина строки не указывается, это означает, что она составляет 255 символов. В приведённом примере строки Str1 и Str2 одинаковой длины.
Запись — это структура данных, состоящая из фиксированного количества компонентов, называемых полями записи. В отличие от массива поля записи могут быть разного типа. При объявлении типа записи используют ключевые слова record..end:
имя_записи = record список_полей end;
здесь имя_записи — любой допустимый идентификатор, список_полей — описания полей записи. Например:
//Описана структура записи. //Каждая запись содержит информацию о студенте и //состоит из двух полей — имя и возраст. type student = record name : string; age : byte; end; var //Объявлены соответствующие переменные — три объекта типа запись. a, b, c : student;
Доступ к полям записи осуществляется с помощью составного имени:
имя_записи.имя_поля
Например:
a. name:= ’ Ivanov Ivan ’; a. age := 18; b. name:=a.name;
Оператор присоединения with имя_записи do упрощает доступ к полям записи:
with a do begin name:= ’ Petrov Petr ’; age := 19; end;
Множество — это набор логически связанных друг с другом объектов. Количество элементов множества может изменяться от 0 до 255. Множество, не содержащее элементов, называется пустым. Для описания множества используют ключевые слова set of:
имя_множества = set of базовый_тип_данных;
Например:
type TwoNumbers = set of 0.. 1; var Num1, Num2, Num3 : TwoNumbers;
Файл — это именованная область внешней памяти компьютера. Файл содержит компоненты одного типа (любого типа, кроме файлов). Длина созданного файла не оговаривается при его объявлении и ограничивается только ёмкостью диска, на котором он хранится. В Lazarus можно объявить типизированный файл:
имя_файловой_переменой = file of тип_данных;
нетипизированный файл:
имя_файловой_переменой = file;
и текстовый файл:
имя_файловой_переменой = TextFile;
Например:
var f1 : file of byte; f2 : file; f3 : TextFile;
2.4.10 Указатели
Как правило, при обработке оператора объявления переменной
имя_переменной: тип_переменной
компилятор автоматически выделяет память под переменную имя_переменной в соответствии с указанным типом. Доступ к объявленной переменной осуществляется по её имени. При этом все обращения к переменной заменяются адресом ячейки памяти, в которой хранится её значение. При завершении подпрограммы, в которой была описана переменная, память автоматически освобождается.
Доступ к значению переменной можно получить иным способом — определить собственные переменные для хранения адресов памяти. Т акие переменные называют указателями.
Указатель — это переменная, значением которой является адрес памяти, где хранится объект определённого типа (другая переменная). Как и любая переменная, указатель должен быть объявлен. При объявлении указателей всегда указывается тип объекта, который будет храниться по данному адресу:
var имя_переменной : ^тип;
Такие указатели называют типизированными. Например:
var p : ^ integer; //По адресу, записанному в переменной p, //будет храниться переменная типа int, //или, другими словами, p указывает //на тип данных integer.
В языке Free Pascal можно объявить указатель, не связанный с каким либо конкретным типом данных. Для этого применяют служебное слово pointer:
var имя_переменной : pointer;
Например:
var x, y : pointer;
Подобные указатели называют нетипизированными и используют для обработки данных, структура и тип которых меняются в процессе выполнения программы, то есть динамически.