Опубликован: 03.09.2010 | Доступ: свободный | Студентов: 2848 / 492 | Оценка: 4.11 / 3.69 | Длительность: 10:38:00
Лекция 3:

Типы данных, определяемые программистом

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Аннотация: Описываются одномерные и двумерные массивы, строки, записи, множества и файлы.

Презентацию к данной работе Вы можете скачать здесь.

Информация, которую требуется обрабатывать в программе, имеет различную структуру. Для ее адекватного представления используются типы данных, которые программист определяет сам в разделе описания типов type. Типу дается произвольное имя, которое можно затем использовать для описания программных объектов точно так же, как и стандартные имена типов.

type имя_типа = описание_типа
...
var имя_переменной : имя_типа

Можно задать тип и непосредственно при описании переменных:

var имя_переменной : описание_типа

Перечисляемый тип данных

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

type имя_типа = (список имен констант)

Константы в списке перечисляются через запятую, например:

type Menu = (READ, WRITE, EDIT, QUIT)

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

var m, n : Menu;
…
m := READ; n := m;

Перечисляемый тип относится к порядковым типам данных. Константы в списке нумеруются с нуля. Например, Ord(READ) даст в результате 0, Succ(EDIT) QUIT. Попытка получения значения, следующего за последним, приведет к ошибке.

Использовать перечисляемый тип в операциях ввода-вывода нельзя. Имена констант в пределах области их описания (программы или подпрограммы) должны быть уникальными.

Интервальный тип данных

С помощью интервального типа задается диапазон значений какого-либо типа.

type имя_типа = константа_1 .. константа_2

Константы должны быть одного и того же порядкового типа. Тип, на котором строится интервал, называется базовым. Константа_1 должна быть меньше или равна константе_2. Примеры описания интервальных типов:

type Hour = 0 .. 23;
     Range = –100 .. 100;
     Letters = 'a' .. 'z';
     Actions = READ .. EDIT;

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

var r : –100 .. 100;

С переменной интервального типа можно делать все, что допустимо для ее базового типа. Ее значение должно находиться в указанном диапазоне, в противном случае произойдет ошибка времени выполнения 'Constant out of range'.

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

Массивы

При использовании простых переменных каждой области памяти, предназначенной для хранения какого-либо значения, соответствует свое имя. Если с группой величин одинакового типа требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру (индексу). Это позволяет компактно записывать множество операций с помощью циклов.

Конечная именованная последовательность однотипных величин называется массивом. Чтобы описать массив, надо определить, какого типа его элементы и каким образом они пронумерованы (какого типа его индекс).

type имя_типа = array [тип_индекса] of тип_элемента

Здесь array и of — ключевые слова, тип индекса задается в квадратных скобках. Примеры описания типа:

type  mas    = array [1 .. 10] of real;
      Color  = array [byte] of mas;
      Active = array [Menu] of boolean;

В первом операторе описан тип массива из вещественных элементов, которые нумеруются от 1 до 10. Во втором операторе элементами массива являются массивы типа mas, а нумеруются они в пределах, допустимых для типа byte, то есть от 0 до 255. В третьей строке в качестве индекса использовано имя типа из раздела 'Перечисляемый тип данных', а сами элементы могут принимать значения true или false.

Тип элементов массива может быть любым, кроме файлового, тип индексов — интервальным, перечисляемым или byte. Чаще всего для описания индекса используется интервальный тип данных.

ВНИМАНИЕ Размещение массива в памяти происходит до выполнения программы, поэтому при описании индекса можно применять только константы или константные выражения.

Обычно при описании массива верхняя граница его индекса задается в виде именованной константы, например:

const n = 6;
type intmas = array [1 .. n] of integer;

После задания типа массива переменные этого типа описываются обычным образом:

var a, b : intmas;

С массивами в целом можно выполнять только одну операцию: присваивание. При этом массивы должны быть одного типа:

b := a;

Все остальные действия выполняются с отдельными элементами массива. Для обращения к элементу массива после имени массива указывается номер элемента в квадратных скобках:

a[4] b[i]

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

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

Инициализация массивов.Элементам массива можно присвоить значения до начала выполнения программы. Это делается так же, как и для простых переменных, — в разделе описания констант, например:

const a : intmas = (0, 5, –7, 100, 15, 1);

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

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

Сформулируем алгоритм поиска максимума.

  1. Принять за максимальный первый элемент массива.
  2. Просмотреть массив, начиная со второго элемента.
  3. Если очередной элемент оказывается больше максимального, принять его за максимальный.

Программа приведена в пример 3.1.

program max_elem;
const n = 20;
var a   : array [1 .. n] of real;
    i   : integer;
    max : real;
begin
    writeln('Введите ', n, ' элементов массива');
    for i := 1 to n do read(a[i]);
    max := a[1];                 { принять за максимальный первый элемент массива }
    for i := 2 to n do          { просмотреть массив, начиная со второго элемента }
        if a[i] > max then max := a[i];     { при необходимости обновить максимум }
    writeln('Максимальный элемент: ', max:6:2)
end.
Листинг 3.1. Максимальный элемент массива из 20 вещественных элементов

Еще один простой пример работы с массивом приведен в пример 3.2 .

program sum_num;
const n = 10;
var a : array [1 .. n] of integer;
    i, sum, num : integer;
begin
    writeln('Введите ', n, ' элементов массива');
    for i := 1 to n do read(a[i]);
    sum := 0;     
    num := 0; 
    for i := 1 to n do begin
        sum := sum + a[i];
        if a[i] < 0 then inc(num);
    end;
    writeln('Сумма элементов: ', sum);
    writeln('Отрицательных элементов: ', num);
end.
Листинг 3.2. Сумма и количество отрицательных элементов целочисленного массива
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.

Иван Огородников
Иван Огородников
Россия, Ханты-Мансийск
Иван Шихалев
Иван Шихалев
Россия, Екатеринбург