Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛАБА_Динамические массивы. Работа с датами

.doc
Скачиваний:
7
Добавлен:
01.04.2016
Размер:
52.74 Кб
Скачать

4

Лабораторная работа №20.

Динамические массивы. Работа с датами.

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

Размер динамического массива не известен заранее и может изменяться в процессе работы программы. Память под динамический массив выделяется не при его объявлении, а при присвоении значения массиву или при вызове процедуры SetLength. Переменная типа динамического массива является указателем – к ней применимы операции над указателями(кроме ^). Тип индексов для динамического массива – только целый. Нижняя граница индексов – всегда 0.

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

Type <тип массива > = array of <базовый тип>;

Например: Type TArray = array of real;

Var A:TArray;

B: Array of string;

Первоначально переменная имеет значение nil – массив имеет длину 0. Для установки новой длины используется процедура

SetLength(динамический массив, длина).

Например:

SetLength(A,50);

SetLength(B,I);

Элементы массива A будут иметь номера от 0 до 49. Элементы массива B – от 0 до i-1.

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

Обращение к элементам массива происходит по номеру:

A[10]:=0.34;

Writeln(A[10]);

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

A:=Nil.

При этом размер массива станет равен нулю.

Присваивание переменных типа динамического массива приводит к тому, что две переменных указывают на один и тот же массив.

Для динамического массива определены функции Low(A) – нижняя граница, High(A) – верхняя граница индексов элементов, Length(A) – количество элементов массива.

Функция Copy (A, m, n) возвращает отрезок массива начиная с элемента с номером m и длиной n.

Если необходимо передавать динамические массивы в качестве фактических параметров в процедуры и функции, то формальные параметры должны являться открытыми массивами.

Динамические массивы могут иметь несколько измерений. Например двумерный массив целых чисел можно описать так:

Type TDArray= array of array of integer; Var A: TDArray

Далее в программе можно задать размер массива с помощью процедуры SetLength

SetLength(A,100,200);

Матрица A будет иметь 100 строк (от 0 до 99) и 200 столбцов (от 0 до 199). Обращаться к элементу матрицы можно традиционно – A[i,j].

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

Var Ints: array of array of Integer;

SetLength(Ints,10);

выделит память под 10 строк. Затем указывается количество элементов в каждой строке (оно может быть разным), например

SetLength(Ints[1], 7);

SetLength(Ints[2], 5);

SetLength(Ints[3], 9);

В следующем примере используются динамические массивы для создания треугольной матрицы из строк:

Program L20_pr1;

Uses SysUtils;

{$APPTYPE CONSOLE}

Var

A : array of array of string;

I, J : Integer;

begin

SetLength(A, 10);

for I := Low(A) to High(A) do

begin

SetLength(A[I], I);

for J := Low(A[I]) to High(A[I]) do

A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';

end;

for I := Low(A) to High(A) do

begin

for J := Low(A[I]) to High(A[I]) do

Write(A[I,J]);

Writeln;

end;

Readln;

end.

  1. Дополнительно к основным базовым типам Object Pascal в функциях и методах для даты и времени используются следующие типы данных, описанные в модуле SysUtils

Type TDateTime =double;

Целая часть переменной типа TDateTime, соответствует дате и содержит количество дней, прошедших с 30 декабря 1899 года, дробная часть соответствует времени и равна части суток, прошелшей с момента их начала.

Type TTimeStamp = record

Time: integer; {количество миллисекунд после полуночи}

Date: Integer; {количество дней с начала нашей эры}

Для обработки даты и времени модуль SysUtils содержит следующие основные функции:

function Date: TDataTime;

Возвращает текущую дату как значение типа TDateTime.

function DateTimeToStr (DateTime: TDateTime): string;

Преобразовывает заданную дату и время в строку, используя формат определяемый глобальными переменными ShortDateFormat и LongTimeFormat. Если значение DateTime не имеет дробной части, то отформатированная строка ие будет содержать значения времени.

function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;

Преобразовывает значение типа TDateTime в значение типа TTimeStamp.

function DateToStr(Date: TDateTime): string;

Преобразовывает дату, указанную параметром Date, в строку в соответствии с форматом, определяемым глобальной переменной ShortDateFormat.

function DayOfWeek(Date: TDateTime): Integer;

Возвращает номер дня недели для даты, указанной параметром Date. Для воскресенья возвращается значение 1, для понедельника - 2 и т. д.

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

Разбирает значение Date на составляющие и записывает в параметры Year, Month и Day значения года, месяца и дня. Если значение, указанное парамет­ром Date, меньше или равно 0, то для всех параметров устанавливается зна­чение 0.

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

Разбирает значение Time на составляющие и записывает в параметры Hour, Min, Sec, MSec значения часа, минут, секунд и миллисекунд.

function EncodeDate(Year, Month, Day: Word): TDateTime;

Собирает значение даты из заданных составляющих Year, Month и Day и воз­вращает его как значение типа TDateTime.

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

Собирает значение времени из заданных составляющих Hour, Min, Sec, MSec и возвращает его как значение типа TDateTime.

function lncMonth(const Date: TDafeTime; NumberOfMonths: Integer): TDateTime;

Возвращает значение даты, увеличенное на указанное параметром NumberOf-Months количество месяцев.

function lsleapYear(Year: Word): Boolean;

Определяет, является ли год, указываемый параметром Year, високосным го­дом.

function Now: TDateTime;

Возвращает значение текущей даты и времени.

procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime);

Заменяет в параметре DateTime значение даты на новое значение, указывае­мое параметром NewDate. Значение времени при этом не изменяется.

procedure RcpfaceTime(var DateTime: TDateTime; const NewTime: TDateTime);

Заменяет в параметре DateTime значение времени на новое значение, указы­ваемое параметром NewDate. Значение даты при этом не изменяется.

function StrToDate(const S; string): TDateTime;

Преобразовывает значение строки, указываемое параметром S, в дату типа TDateTime.

function StrToDateTime(const S: string): TDateTime;

Преобразовывает значение строки, указываемое параметром S, в дату и время типа TDateTime.

Параметр S должен содержать дату и время в формате таком, как dd.mm.yy hh:mm:ss.

function StrToTime(const S: string): TDateTime;

Преобразовывает значение строки, указываемое параметром S, в значение времени типа TDateTime.

function Time: TDateTime;

Возвращает текущее значение времени.

function TimeStampToDateTime (TimeStamp: TTimeStamp): TDateTime;

Преобразовывает значение типа TTimeStamp в значение типа TDateTime.

function TimeToStr(Time: TDateTime): string;

Преобразовывает время в строку в соответствии с форматом, определяемым глобальной переменной LongTimeFormat.

Пример работы с датами и временем см. в проекте LR20_2.dpr.

Задание к лабораторной работе № 20

  1. Напишите программу, в которой задайте с помощью динамического массива матрицу 1000х1000 целых чисел. Заполните матрицу случайными числами от в диапазоне от 0 до 100 000 000.

А) Найдите среднее арифметическое чисел, индексы которых четные числа

Б) Найдите количество элементов, больших произведения собственных индексов

В) Найдите количество элементов, равных среднему арифметическому всех элементов.

Г) Найдите сумму элементов, максимальных в каждой строке.

  1. Напишите программу, которая по номеру года печатает

А) Количество воскресений в заданном году;

Б) Количество несчастливых пятниц, выпадающих на 13-е число

  1. Напишите программу, моделирующую ежедневник. Определите двумерный динамический массив Year, строчки которого – месяцы, а элементы в строчках – дни месяца. Каждый элемент – запись, содержащая время события и его текстовое описание. Ваша программа должна выдавать меню из трех пунктов – Запомнить событие, Посмотреть событие и Выход и выполнять эти действия.