Файл: Сравнительный анализ описания данных для различных языков программирования.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.03.2023

Просмотров: 286

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рис. 10. Демонстрация приоритета в логических выражениях

Приоритет и правила в логических выражения в общих случаях таковы:

Если логический оператор НЕ (NOT, !) должен работать с результатами работы других операторов, то эти операторы и их операнды должны находиться в круглых скобках.

Логические операции одного приоритетного уровня выполняются слева направо.[17] Порядок операций можно изменить, воспользовавшись круглыми скобками. Обязательно следует учитывать тот факт, что в разных языках программирования логические операции могут иметь разный приоритет по отношению к другим операциям – арифметическим и сравнения. Например, в QBasic приоритет логических операций ниже, чем операций сравнения. В Pascal наоборот, а приоритет оператора NOT выше, чем у арифметических операций. В Pascalоператор OR (логическое ИЛИ) имеет высший приоритет над оператором =, а в С++ оператор == имеет приоритет выше чем || (логическое ИЛИ). [14], [16]

2.9. Тип массивы

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

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

а трехмерный массив как массив с элементами из двумерных. [13] Каждый элемент массива имеет свой индекс - в одномерных массивах (векторах) это порядковый номер элемента, в двумерных индексы обозначает номер строки и столбца.

1 3 4 6

9 8 7 5

В приведенной матрице элемент соответствующий числу 7 имеет индекс [2,3]

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

Массив может быть фиксированного размера и его размер может задаваться динамически.

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


В Qbasic для объявления массивов и одновременного отведения памяти под хранение их элементов используется оператор DIM. [10]

Пример:

DIM NAMES$(9)

Задан одномерный массив из 10 элементов (с 0 по 9) каждый элемент массива имеет строковый тип (String). После создания массива значения элементов массива равны 0, а в нашем случае пустой строке. [6]

Для двумерного массива правила те же DIM CEL (3, 4) - здесь мы указали двумерного массива чисел.

Ввод данных может осуществляться с клавиатуры с помощью оператора INPUT и PRINT, READ, DATA.

Обращение к элементу массива происходит по индексу элемента А$ = NAMES$(5) где 5 это индекс массива.

С элементами массива возможны любые операции соотносящиеся с типом данных массива.

В Pascal процедура объявление массива используется «array» [11], массив можно задать несколькими способами:

Через объявление типа

type

massiv = array[ 1..10 ] of string;

- где massiv это имя типа, в квадратных скобках список одного или нескольких индексных типов, разделенных запятыми, string – задание типа данных массива.

Индекс массива может быть задан любым перечислимыми типом кроме типа longint.

Вторым способом объявления является непосредственное задание переменной указанного типа в разделе объявления переменных[7]

var

x,y,z: array[1..10] of integer;

a : array [byte] of integer;

В случает такого описания переменные x,y,z считаются массивами одного типа, но вот в случае такого объявления:

var

с = array[1..10] of char;

d = array[1..10] of char;

переменные c и d будут считаются переменными разных типов.

Наиболее удачным в таком случае будет объявление через предварительное описание типа. При этом надо учитывать то, что часто возникает необходимость чтобы значения переменных одного массива были присвоены другому массиву и при одинаковых типах не возникает проблем совместимости. [17]

Еще один интересный момент заключается в тоv, что тип в объявлении массива «of» может быть любым типом имеющимся в Pascal, то он может быть и в том числе массивом. Это дает возможность создания многомерных массивов:

type

massiv = array[1..10] of array[1..15] of integer;[17]

или то же, но в более удобным виде

type

massiv = array[1..10, 1..15] of integer;

Глубина вложенности массивов может быть произвольной, единственное ограничение это размер в адресации, который зависит от реализации, т.к. адреса в массиве это беззнаковые целые числа. [17]

Если мы имеем массив с заранее известными данными, то при объявлении можно сразу же «заполнить» массив значениями, например:

const

massiv:array[1..4] of integer = (1, 3, 2, 5);


Массив, как и в QBasic, можно заполнить различными способами и в том числе случайными значениями с использованием функции random: - рисунок 11.

Рис. 11. Присваивание элементам массива значений функцией random

Обращение к элементам массива отличается от Qbasic тем, в для Pascal индекс элемента заключается в квадратные скобки: [7],[10],

Massiv[5]:= 66; (элементу с индексом 5 присвоено значение 66).

Массивы в С++ организуются по тем же основным признакам, что и в предыдущих языках. Массив объявляется в следующем виде:

int massiv[10] - создан одномерный массив с именем М состоящий из 10 целых чисел. Он может быть также объявлен без инициализации либо его создании можно сразу указать значения всех элементов массива int massiv [10] = {10,5,3,2,8,8,6,0,1,4}.[8]

Как и в случае с Pascal объявление int mas[10], a[16]; задаст нам два массива одного типа.

int a[]={5,-12,-12,9,10,0,-9,-12,-1,23,65,64,11,43,39,-15}; 

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

При инициализации двумерного массива можно воспользоваться следующим способом:

int a[4][3] = { {0, 7, 9}, {9, 63, -1}, {4, 9, 0}, {3, -3, 30}}; - четыре строки по три значения.[8]

Правила обращения к элементу по индексу был продемонстрирован на рисунке 9.

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

В связи с этим работа с массивами почти всегда связана с организацией циклов обрабатывающих массив данных.[15],[17]

Работая с массивами данных нередко возникает вопрос о том какие размеры необходимы для размещения массива в памяти, сколько элементов должен содержать массив и т.п. Эти вопросы можно решать различными способами: можно задавать размеры массива «жестко», но тогда, если вдруг случиться ситуация что количество элементов массива необходимо увеличить, то придется перекомпилировать программу, можно задать максимально возможные размеры, а использовать только необходимое количество задаваемое пользователем значений, но в этом случае нерационально расходуется память, а можно память выделять динамически – по мере необходимости, а в случае ненадобности освобождать ее.


Для этого служат динамические массивы.[4] Их реализация чрезвычайно сильно зависит от языка программирования и даже в семействе Pascal она довольно сильно различается. В Классическом Турбо Паскале способов заключается в использовании указателей и процедуры getmem [14] которая создает новую динамическую переменную заданного размера и помещает ее адрес в указателя. Для освобождения памяти используется процедура freemem, в PascalABC процедура SetLength и т.д.

Для С++ пример задания динамического массива приведен на рисунке 12.

Рис. 12. Пример создания динамического массива С++

2.10. Тип диапазон

Тип диапазон (он же интервальный тип) применяется в Pascal в качестве производного типа от своего базового в качестве которого может выступать любой порядковый тип.[17] Тип диапазон задается границами внутри базового типа. В основном применяется при создании массивов. При этом необходимо помнить что левая граница не должна превышать правую границу и что тип-диапазон наследует все свойства базового типа. При объявлении ему надо задать минимальное и максимальное значение.

type

bukva = ‘A’ .. ‘Я’

var

diap:0..100; (переменная diap может принимать значение от 0 до 100)

В Pascal имеются две основных функции работающие с диапазонами high(x) - максимальное значение диапазона, к которому принадлежит переменная x; и соответственно low(x) для минимального.

2.11. Тип множество

Множество — это структурированный тип данных имеющийся в языках Pascal [14], он является набором каких либо элементов взаимосвязанных между собой по каком-либо признакам и этот набор можно рассматривать как некое единое целое.

В Pascal элементы множества должны принадлежать одному из порядковых типов, количество элементов множества может меняться от 0 (пустое множество) до 256 значений. Отличительно чертой множества от массива является именно непостоянное количество элементов. Для объявления множества используются зарезервированные слова set of.

type

DandC = set of ‘0’.. ‘9’;

var

s1,s2 : DandC;

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

s1: = [‘5’, ‘1’, ‘6’, ‘0’];

Базовым типом для множества могут быть любые порядковые типы кроме word, longint и integer.

С множествами возможны стандартные те же операции что и в математическом понимании. * - пересечение множеств, + объединение, - разность, = проверка эквивалентности, проверки вхождения <= и > = (первое во второе и второе в первое), IN – проверка принадлежности и т.д.[17] Имеется также две процедуры ориентированные на увеличение скорости работы с одиночными элементами – INCLUDE для включения элемента во множество и EXCLUDE для исключения.


INCLUDE (s1, ‘9’) - во множество s1 включен символ ‘9’.

В операциях со множествами возвращаемым значением является true или false, при этом как в сложных выражениях операции имеют свой приоритет выполнения.[17]

В С++ ситуация со множествами такая же как и, например, со строками, отдельного типа множество нет, но для работы с ними необходимо подключить библиотеку в заголовочным файлом #include <set> и объявить множество.[16]

На рисунке 13 показаны правила объявления множества и работы с ним.

Рис. 13. Пример объявления и работы со множеством в С++

2.12. Тип записи

Тип записи необходим для объединения различных типов данных в единую структуру. Например, описывая звезду мы можем указать ее имя, которое будет являться текстовым типом, расстояние до нее в километрах и это будет целое положительное число (применять иное нету смысла), а звездная величина как положительным так и отрицательным вещественным. В этом главное отличие запись от массива, т.к. в массиве могут присутствовать только данные одного типа.[8]

В языке Паскаль запись определяется путем указания служебного слова record и перечисления входящих в запись элементов с указанием типов этих элементов.[14]

type star=record

sname: string;

sras: longint;

svel: single;

end;

Присваивание переменной типа запись происходит стандартным методом zvezda1: star;. Единственная операция, которую можно произвести над однотипными записями это присваивание. Все другие операции производятся над отдельными полями записи zvezda1.sname := ‘Sun’.[17]

С++ тип записи называется структурой. Он относится к типу структуры данных и классы. Для объявления используется ключевое слово struct.[12]

stuct star {

char sname

long sras

float svel };

Присваивание значений производится следующим образом: имя переменной.имя члена структуры значение: star.svel= 25;

В обоих случаях наблюдается единый подход к обращению элементу структуры через оператор выбора члена записи/структуры (.) Записи и структуры широко используются для организации более сложных структур динамических данных как стек, дерево и т.д.

2.13. Процедурные типы

Эти типы используются в Pascal. Функции с процедурами рассматриваются как некоторые параметры которые могут принимать переменные. Процедурные тип указывает вид процедуры или функции который можно использовать в качестве параметра и с какими параметрами должны они должны быть.