Перейти на главную страницу
Синтаксис определения пользовательского типа следующий
Здесь newTypeName — идентификатор, обозначающий имя определяемого программистом типа данных. Если type1 — существующий тип данных, то newTypeName будет псевдонимом типа type1. Компилятор их не будет различать.
Рассмотрим пример.
Program Example1;
Type int = SmallInt;
big = LongInt;
res : big;
WriteLn('Введите 2 целых числа');
Read(a,b);
res:=a*b;
WriteLn(a,' x ',b,' = ',res)
End.
Этот пример может давать ошибку, если в качестве типа результата вычислений будет использован Int64. Для остальных типов он будет работать корректно. Как сказано в документации по Delphi1, арифметические операции над целыми числами дают результат типа Integer, который эквивалентен LongInt. Результат имеет тип Int64, только если хотя бы один из операндов типа Int64. Чтобы даже в этом случае программа работала правильно, преобразуем её.
Program Example2;
Type int = LongInt;
big = Int64;
Var a,b : int;
res : big;
WriteLn('Введите 2 целых числа');
Read(a,b);
res:=big(a)*b;
WriteLn(a,' x ',b,' = ',res)
End.
Поскольку вещественные типы не относятся к порядковым, для них тип-диапазон определён быть не может. Не следует также думать, что минимальное и максимальное значение в определении типа-диапазона можно брать сколь угодно большими по модулю. Они должны быть допустимыми хотя бы в одном базовом типе, поэтому всегда ограничены.
Примеры определения типа-диапазона и его использования при описании переменных.
Type Digit = 0..9;
Cent = -100..100;
Var c : Digit;
D : Cent;
Тип-диапазон не обязательно описывать в разделе описания типов. Того же эффекта, что в примере выше, можно было достигнуть и так:
Var c : 0..9;
D : -100..100;
В документации FreePascal сказано, что некоторые предопределённые целочисленные типы данных определены как типы-диапазоны.
Тип одномерного (иначе называемого линейным) статического массива определяется следующим образом.
Type имя_типа_массива = array[тип_индекса] of тип_элементов_массива;
В качестве типа индекса можно использовать любой порядковый тип. Чаще всего используют тип-диапазон. Примеры описаний массивов.
Type TMyArr = array[Byte] of Real;
TIntArr = array[-5..5] of Integer;
TA = array[1..100] of ShortInt;
Var a,b : TMyArr;
c : TIntArr;
d : TA;
Вовсе не обязательно было вводить новый тип данных для массива. Например, массив c можно было описать следующим образом:
Var c : array[-5..5] of Integer;
Однако при написании подпрограмм3 обработки массивов без определения нового типа данных для массива не обойтись.
При описании массива можно задать начальные значения его элементам. Они указываются в круглых скобках через запятую. Перед открывающей скобкой после типа элементов ставится знак равенства. Например,
Var c : array[1..5] of Integer=(10,20,30,40,50);
При этом первый элемент массива станет равным 10, второй 20, …, пятый 50. Некоторые считают, что при описании переменной, в том числе и массива, она по умолчанию получает значение 0. Это неверно. Вот цитата из документации по FreePsacal: «By default, variables in Pascal are not initialized after their declaration. Any assumption that they contain 0 or any other default value is erroneous: They can contain rubbish.»4
Многомерные массивы — это массивы массивов, т.е. массивы, элементами которых являются другие массивы. Например,
type TMatrix = array[1..10] of array[1..50] of Real;
Это эквивалентно следующему описанию
type TMatrix = array[1..10, 1..50] of Real;
В этом примере описан двумерный массив. Его часто представляют как таблицу, строки которой пронумерованы от 1 до 10, а столбцы от 1 до 50. Одномерный массив часто представляют как таблицу, состоящую только из одной строки или только из одного столбца. В Паскале также допускаются массивы большего числа измерений, но они используются очень редко.
Если два массива a и b одного и того же типа, то один из них можно присвоить другому: b:=a. При этом массив b станет точной копией массива a5. Вот пример.
Program Example3;
Const N=5;
Type
TMyArray = array[1..N] Of Integer;
a : TMyArray = (10,20,30,40,50);
b : TMyArray;
i : Integer;
Begin
b:=a; //Копирование массива a в массив b
Write(b[i],' ');
WriteLn //Чтобы опустить курсор на новую строку
End.
Var a : array[1..100] of Integer;
b : array[1..100] of Integer;
то при попытке b:=a компилятор Delphi выдаст ошибку несовместимости типов. Поведение компилятора FreePascal в этом случае зависим от режима работы. В режиме совместимости с Delphi тоже будет ошибка. Ошибки не будет, если для массива определить свой тип данных или описать массивы так
Var a,b : array[1..100] of Integer;
Ввод и вывод линейных (одномерных) массивов
Ввод и вывод массивов осуществляется поэлементно. Обычно это делается в цикле.
В следующем примере вводится одномерный массив a из N элементов, а затем выводится в обратном порядке. Известно, что , а его элементы — целые числа, не превосходящие по модулю 106.
Массив описываем из максимально возможного в этой задаче количества элементов, т.е. из тысячи, а использовать будем N первых из них. Тип элементов массива — integer. Чтобы программу легко было перестроить на другое максимальное количество элементов, опишем константу NMAX. В дальнейшем для перестройки на другое предельное число элементов нужно будет только изменить значение этой константы.
{$mode delphi}
Program Example4;
Const NMAX=1000;
Type Massiv = array[1..NMAX] Of Integer;
Var i,N : Integer;
a : Massiv;
Begin
WriteLn('Задайте количество элементов массива');
//Проверка введённого значения N
If (N > NMAX) or (N <= 0) Then
Begin
halt //Прекращение выполнения программы
End;
//Ввод массива
For i:=1 To N Do
Read(a[i]);
//Вывод массива в одну строку
For i:=N DownTo 1 Do
Write(a[i],' ');
WriteLn //Перевести курсор на новую строку
End.
Пусть задан массив из N строк и M столбцов.
Var a : array[1..100,1..100] of Real;
Для его ввода применяют вложенные циклы.
…
For i:=1 To N Do
Read(a[i,j])
Для вывода массива в виде таблицы также применяют вложенные циклы.
В следующем примере формируется двумерный массив из случайных вещественных чисел из диапазона , а потом выводится на экран. Точность вывода — 5 знаков после запятой. Для генерации случайных чисел применяем функцию random. Чтобы при каждом запуске программы случайные, точнее, псевдослучайные, последовательности чисел генерировались разные, перед первым вызовом random вызываем процедуру randomize. Она устанавливает стартовую точку генератора псевдослучайных чисел по системным часам, т.е. случайным образом.
{$mode delphi}
Program Example5;
Const NMAX = 10;
MMAX = 10;
Type Massiv = array[1..NMAX,1..MMAX] Of Real;
Var a : Massiv;
N,M : Integer;
i,j : Integer;
Begin
Read(N,M);
If (N<1) or (N>NMAX) or (M<1) or (M>MMAX) Then
Begin
halt //Прерывание выполнения программы
End;
Randomize; //Инициализация генератора случайных чисел
For i:=1 To N Do
For j:=1 To M Do
a[i,j]:=Random;
//Вывод массива
For i:=1 To N Do
Begin
//Вывод одной строки
Write(a[i,j]:7:5,' ');
//Переход на следующую
WriteLn
End.
Найти минимальный элемент массива из N чисел.
Для решения этой задачи сначала предположим, что самый первый элемент массива и является минимальным. Для массива из одного элемента так оно и есть. Если бы элементов массива было два, нужно было бы сравнить предполагаемый минимальный элемент (первый) со вторым, и, если второй окажется меньше, то теперь минимальным считать его. Потом таким же образом добавить третий элемент, четвёртый и т.д. Получаем следующий алгоритм.
На этой блок-схеме для краткости ввод массива обозначен одним блоком «Ввести a», хотя в программе это надо делать в цикле. Программа для массива из не более 1000 целых чисел типа integer приведена ниже.
{$mode delphi}
Program MinElem;
Const NMAX = 1000;
Type TIntArray = array[1..NMAX] Of Integer;
Var a : TIntArray;
N : Integer;
i, min : Integer;
Begin
Read(N);
Begin
halt
//Ввод массива
WriteLn('Введите ',N,' целых чисел');
For i:=1 To N Do
Read(a[i]);
//Собственно поиск минимального элемента
min:=a[1];
For i:=2 To N Do
If min > a[i] Then
min:=a[i];
WriteLn('Минимальный элемент ', min)
End.
//Собственно поиск минимального элемента
min:=MaxInt;
For i:=1 To N Do
If min > a[i] Then
min:=a[i];
Кто-то может заметить, что нет необходимости в одном цикле вводить массив, а в другом его обрабатывать для поиска минимального элемента. Так оно и есть. Просто целью этого примера было продемонстрировать именно алгоритм поиска минимального элемента массива. А если бы нужно было найти минимальное число из N вводимых с клавиатуры, то и массив никакой не был бы нужен. Попробуйте справиться с такой задачей сами.
2. «Популярные» цифры
Какие цифры в десятичной записи натурального числа N используются чаще всего? Лидирующих нулей в записи числа нет, т.е. запись типа 001 невозможна.
Примеры входных и выходных данных
Вход |
Выход |
525375 |
5 |
12323 |
2 3 |
123 |
1 2 3 |
Program Popular;
Type Digit = 0..9;
Var a : array[Digit] Of Byte;
i : Digit;
N : Int64;
max : Byte;
Begin
Read(N);
If N<=0 Then
Begin
WriteLn('Это число не натуральное');
End;
For i:=0 To 9 Do
a[i]:=0;
(* Разбираем число и заполняем массив *)
While N > 0 Do //Пока в записи N есть хоть одна цифра
Begin
a[i]:=a[i]+1; //Сосчитали: цифра i встретилась ещё раз
N:=N div 10 //"Отрезали" последнюю цифру от N
End;
max:=a[0];
For i:=1 To 9 Do
If (a[i,j]>0) and (a[i,j]<=K) Then
sum:=sum+a[i,j];
WriteLn('Искомая сумма ', sum)
При решении задачи можно было бы ещё проверять на соответствие оговоренному в условии диапазону вводимые значения переменной K и элементов массива. Надеюсь, вы сможете справиться с этим сами.
По существу это будет определение идентификатора, который можно будет дальше использовать в коде программы в качестве имени типа наряду со стандартными типами языка Паскаль. Естест
13 10 2014
1 стр.
При определении перечислимого типа данных в круглых скобках через запятую просто перечисляются все возможные значения переменных этого типа
13 10 2014
1 стр.
Формат \ Ячейки. С помощью этой команд можно менять типы данных. Это бывает необходимо, если произошло неправильное определение типа данных
13 10 2014
1 стр.
В языке программирования Turbo Pascal все данные, используемые программой должны принадлежать к какому-либо типу данных. Некоторые из них
13 10 2014
1 стр.
Рассмотрим основные понятия и термины, используемые в системе Oracle системе управления распределенными базами данных, разработанной фирмой Oracle Corporation
11 09 2014
1 стр.
Основные принципы антибиотикотерапии, определяемые вопросами чувствительности и устойчивости к действию препаратов
25 09 2014
1 стр.
РД. 45. 128-2000 «Сети и службы передачи данных». Основные термины и их определения: пд – передача данных, оод – оконечное оборудование данных, акд – аппаратура окончания канала да
14 12 2014
1 стр.
Данная дисциплина является относительно новой, а сам предмет мкк, как научной дисциплины, еще недостаточно полно определен. Однако, тезис о том
15 10 2014
1 стр.