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

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

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

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

Добавлен: 29.03.2023

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

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

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

Таблица составлена по [10],[14],[8]

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

2.2. Вещественные типы

Вещественные типы могут указываться как в обычном десятичном виде, так и методом записи в экспоненциальном виде 0,0012 будет выглядеть как 1.2Е-3. Метод записи имеет следующий вид - mE± p, где m – мантисса (число в основной форме), Е – основание 10, р – порядок числа (целое число). Учитывая, что под значение выделяется свой определенный спецификацией языка объем памяти, то эти числа имеют некоторую точность.

Вещественные типы для языков определены следующие:

Для Qbasic для представления вещественных значений выделено 2 типа single (Single precision) с одинарной точностью и double (Double precision) с двойной точностью. [10]

Для Pascal это типы данных real, single, double, extended и comp.[14] Тип  данных сomp содержит только целые значения, которые представляются в вычислениях как вещественные.

Для С++ определяется три вещественных типа, float, double и long double. [8]

Представим их соотношения в таблице 2.

Таблица 2

Сопоставление вещественных типов данных QBasic, Pascal, С++.

QBasic

Pascal

С++

Тип

Размер

байт

Диапазон

значений

Тип

Размер

байт

Диапазон

значений

Тип

Размер

байт

Диапазон

значений

single

4

3.4E-38 /

3.4E+38

single

4

1.5E-45 /

3.4E+38

float

4

3.4E-38 /

3.4E+38

real

6

2.9E-39 /

1.7E+38

double

8

1.7E-308 /

1.7E+308

double

8

5.0E-324 /

1.7E+308

double

8

1.7E-308 /

1.7E+308

comp

8

-9.2E18 /

9.2E18 /

extended

10

3.4E-4932 /

1.1E4932

long double

10

3.4E-4932 /

3.4E+4932


Таблица составлена по [10], [14], [8]

Точность вещественного числа напрямую связана с тем, что под разрядность мантиссы в разных языках выделяется определённое количество разрядов и например в языке программирования Pascal для типа данных real разрядность мантиссы составляет не более восьми десятичных знаков. Поэтому надо внимательно относиться к выполнению операций с числами имеющими большую разницу порядков. Может возникнуть ситуация когда мантисса не сможет обеспечить необходимую точность вычислений.[14] Приведем наглядный пример операции сложения двух одинаковых пар чисел заданных разными вещественными типами рисунок 3.

Рис. 3. Пример зависимости точности вычисления от используемого типа

Правила присвоение переменным определенного типа данных зависят от синтаксиса языка. Общим правилом является то, что, переменные или константы должны быть определены до их использования. Также в связи с тем, что в каждом языке имеются зарезервированные слова наложен запрет на их использование в качестве имен переменных и констант, а так же другие особенности которые будут описаны ниже для каждого языка.[16][17] Рассмотрим в примерах объявления типа данных для изучаемых языков программирования.

В Qbasic объявление (присвоение) типа переменной происходит следующим образом: Существуют специальные символы для объявления типов данных. [6]:

% - для присвоения целого (integer);

# - для присвоения вещественного с двойной точностью (double);

! – для присвоения вещественного с одинарной точностью (single);

& - для присвоения целого длинного (long);

Операция присваивания в общем случае выглядит следующим образом.

CONST [имя константы]=[значение]

[имя переменной]=[значение]

a1=5 (переменной а1 присвоено значение 5 тип single (т.к. если не указать тип данных, то по умолчанию присваивается тип single).

a1%=5 (переменной а1 присвоено значение 5 тип integer)

CONST р1!=3.14  (константе p присвоено значение 3.14 тип single).

Помимо использования суффиксов для объявления типа можно воспользоваться операторами, например, имеется возможность объявить тип данных группе переменных или функциям с помощь оператора DEF[10]. DEFINT для присвоения типа целые, DEFLNG для присвоения типа длинные целые, DEFSNG для присвоения типа вещественные, DEFDBL для присвоения типа вещественные двойной точности.

На практике это выглядит так: DEFINT А, N-T - всем объявляемым переменным начинающимся с символа А символа и N по T и будет присвоен тип целые (integer). При этом надо учитывать, что если имя переменной или функции заканчивается зарезервированные для объявления типов знаки, то будет присвоен именно тот тип, на который оканчивается имя переменной. Например, если мы объявим всем переменным начинающимся с буквы L тип целые (DEFINT L), то, несмотря на это переменная LONGDATA# будет иметь тип double.


Длина имени не должна превышать 40 знаков, а также должна начинаться с букв латинского алфавита и состоять только из букв того же алфавита и цифр и не иметь пробелов в названии[6], не иметь сочетания начальных букв FN в имени, т.к. оператор FN(наименование) используется для создания пользовательских функций. Для наименования массивов используются те же правила/

В языке программирования Pascal особенностью является то, что константы и переменные и соответственно их типы должны быть самом в самом начале программы в разделах const и var. [17] Так так в языке Pascal помимо использования стандартных типов возможно создание пользовательских типов, то их так же надо объявить в самом начале в разделе type.

Общий синтаксис имеет следующий вид:

const

[имя константы]=[определение типа]

type

[имя типа]=[определение типа]

var

[имя переменной]=[определение типа]

const

abc=123;

xyz=3,14;

Как видно в этом примере не указан тип констант, т.к. он определяется способом ее записи, при компиляции компилятор сам соотнесет типы констант и присвоит константе abc тип integer, а константе xyz тип real. [11]

type

mas= array [1..10] of word; (задан новый пользовательский тип mas)

var

a, b, c :real; d, e, f: extended; (переменные a, b, с – тип real и т.д.)

Необходимо обратить внимание, что в языке Pascal строка должна заканчиваться символом «;», иначе будет выдана ошибка при компиляции. И как видно на рисунке 3 при присваивании значения некой переменной необходимо использовать оператор присваивания «:=».[17]

В Pascal при объявлении имени прописные и строчные буквы в именах переменных не различаются. Имена переменных могут быть сочетанием английских букв и цифр, использование пробелов не допускается. Нельзя начинать имена переменных с цифры или специальных символов, но допускается использование знака подчеркивания «_».

В языке программирования С++ как и в Qbasic в отличии от Pascal менее строгие правила объявления типов. Переменные и константы могут объявляться в теле функций.[15]

В общем случае объявление типа выглядит следующим образом.

[тип] [имя] = [значение] (значение не обязательно)

double x = 7.89 (х присвоен тип double и значение 7.89)

int x (х присвоен тип int)

int x, y, z (x, y, z присвоен тип int)

Для типа констант можно использовать директиву #define. И хотя в зависимости от значения константы компилятор автоматически задает ей тип, но его можно указать и вручную с помощью суффиксов. U (или u) задать целую константу типа unsigned, F (или f) константу типа float, L (или l) для типа long int, L (или l) типа long double.[13]


#define B 280LU  (для B задан тип unsigned long int и ее значение 280)

В С++ имя переменной, в отличии от Qbasic и Pascal, чувствительно к регистру.[15] Имена ABC, Abc, abc являются разными. Идентификатор может состоять только из букв (нижнего или верхнего регистра), цифр или символов подчёркивания. Это означает, что все другие символы и пробелы запрещены. Идентификатор должен начинаться с буквы (нижнего или верхнего регистра). Он не может начинаться с цифры. При этом правильным считается то, что наименование переменной должно начинаться с маленькой буквы.

Кроме того форма записи значения констант может быть как обычная десятичная, так и восьмеричная и шестнадцатеричная. Общим правилом является то, что значения в шестнадцатеричном виде начинаются с 0X (0x), а восьмеричная с 0.

При затруднении определения типа в последних версиях С++ имеется возможность использования спецификатора auto для того чтобы компилятор сам определил тип. Обязательное условие при этом – задание значения переменной (ее инициализация каким либо значением).

С числовыми типами возможны разнообразные арифметические и логические операции, выполнение с ними математических функций. Порядок их выполнения в выражении зависит от приоритета определенным логикой языком программирования. Общим правилом является то, что в сложных выражениях порядок операций определяется их приоритетом и его можно изменить используя скобки. Операции одного приоритетного уровня выполняются слева направо. [6], [8]

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

Для Qbasic такими операциями являются:

Арифметические операции: Возведение в степень (^); смена знака (-); умножение и деление (*, /); целочисленное деление (\); остаток от деления (MOD); сложение и вычитание (+, -).[10]

Продемонстрируем важность правильного применения операций над типами данных на примере простого и целочисленного деления, отношения на рисунке 4.

Рис. 4. Пример простого и целочисленного деления, отношения

Операции отношения: = ; > ; < ; <> ; <= ; >=.

Логические операции: NOT; AND; OR; XOR; EQV[6] В результате выполнения возвращается 0 если утверждение ложно и 1 при истинности.


Перед ними все вещественные числа преобразуются в целочисленные, т.к. логические операции производятся над битами, а вещественные числа в QBasic не могут выступать в качестве логического значения непосредственно, происходит неявное преобразование типа в integer, или, если необходимо то в long. Так же Qbasic имеется большой список функций для работы с числовыми значениями: вычисление тригонометрических значений, логарифмов, получение модуля числа и т.п.

В Pascal определены следующие арифметические операции и функции: + сложение; - вычитание; * умножение; / деление; DIV – операция целочисленного деления; MOD – остаток целочисленного деления (последние две операции применимы только к целым операндам); ABS – абсолютная величина; TRUNC и ROUND - получение целой части и округление вещественного числа; SQR - возведение в квадрат, ++ операции инкремента и -- операция декремента. [11]

Операции отношения: <, <=, >, >=, =, <>.

Допустимые логические операции будут рассмотрены позднее при рассмотрении логического типа данных.

Помимо этого есть и другие различные математические, тригонометрические функции, преобразования из вещественного типа в целый и т.п.[11]

Для С++ определены следующие арифметические операции: + сложение; - вычитание и унарный минус; / деление; % деление по модулю, ++ операции инкремента и -- операция декремента, варианты арифметических выражений с присваиванием - *=, += и т.д.[9]

Операциями отношения являются: а также возможны следующие операции отношения: > (больше), < (меньше), == (равно) (следует обратить внимание что именно 2 символа =, в отличии от предыдущих рассматриваемых языков) , >= (больше или равно), <= (меньше или равно) и != (не равно). [12]

Логические операции так же будут рассмотрены позднее.

Как и в предыдущих языках имеется большой набор функций для работы с целыми и вещественными типами.

Как видно в большинство операций совпадают, это утверждение можно отнести и к функциям, но и имеются отличия обусловленные синтаксисом и семантикой языков и, например, ни в Pascal, ни в С++ нету операции возведения в степень имеющейся в Qbasic. Это не означает что возведение в степень невозможно, например в С++ можно воспользоваться функцией pow. Для возведения 5 в степень 4 - pow (5, 4). При этом при работе с различными функциями в языке С++ необходимо учитывать тот факт, что «по умолчанию» подключаются только основные арифметические операции, а для того чтобы воспользоваться расширенными возможностями необходимо подключить стандартную библиотеку cmath - #include <cmath>. [15]