Стандартные функции для обработки числовых данных
Программы линейной структуры
Программой линейной структуры называется такая программа, каждый оператор которой выполняется один и только один раз. Она может строиться только из простых операторов, не меняющих естественный порядок вычислений, а именно, из операторов присваивания и операторов процедур. Из числа последних в этом разделе нас будут интересовать только операторы процедур ввода и вывода для стандартных устройств – клавиатуры и монитора.
Средства разработки программ линейной структуры
Рассмотрение вопросов алгоритмизации задач и приёмов программирования удобнее всего проводить на примерах обработки числовых данных. Рассмотрим в первую очередь стандартные типы(имеющиеся в Delphi и не требующие объявления в программе) числовых данных.
Целые типы данных
К числу стандартных целых типовотносятся:
Int64 – тип, представляющий целые со знаком от –263 до +263-1, занимает 8 байт;
Integer – тип, представляющий целые со знаком от –2147483648 до +2147483647, занимает 4 байта;
LongInt – тип, эквивалентный типу Integer;
SmallInt – тип, представляющий целые со знаком от –32768 до +32767, занимает 2 байта;
ShortInt – тип, представляющий целые со знаком от –128 до +127, занимает 1 байт;
Byte – тип, представляющий целые без знака от 0 до 255, занимает 1 байт;
Word – тип, представляющий целые без знака от 0 до 65535 занимает 2 байта;
LongWord – тип, представляющий целые без знака от 0 до 4294967295, занимает 4 байта;
Cardinal – тип, эквивалентный типу LongWord .
Например, чтобы объявить переменные с именами I и K как переменные типа Integer и N – как Byte, в программе следует записать
var
I, K:Integer; //Объявление целых переменных I и K типа Integer
N:Byte //Объявление целой переменной N типа Byte
Константыцелого типазаписываются в виде последовательности цифр, перед которой может стоять знак числа. Знак + перед положительным числом можно не писать. Например, константы +25 и 25 представляют одно и то же значение. Тип целой константы определяется как стандартный целый тип с наименьшим диапазоном значений, включающим значение константы.
Именованные константы(имя такой константы представляет значение) объявляют в разделе const, связывая имя и значение знаком =, например,
const
Nmax=10; //Объявление именованной константы Nmax
Для данных целого типа определены следующие арифметические операции, результат выполнения которых также будет иметь целый тип такой, который имеет минимальный диапазон, включающий вычисленное значение:
сложение (знак +),
изменение знака (унарный минус -),
вычитание (знак -),
умножение (знак *),
целочисленное деление (знак div),
взятие по модулю (знак mod).
Результатом выполнения операции div является целая часть частного, а операции mod – остаток от целочисленного деления (знак остатка всегда совпадает со знаком делимого). Например, выполнение –5 div -2 даст значение 2, а после выполнения -5 mod –2 получим –1.
Допустима над целыми также операция деления (знак /), приводящая к вещественному значению. Так, результатом выполнения –5/-2 будет вещественное число 2,5.
К числу целых относятся также интервальные (диапазонные) типы, объявляемые в программе. Например, в следующем фрагменте программы
type
tBall = 2..5; //Объявление типа tBall
tIndex = 1..10; //Объявление типа tIndex
объявляются тип tBall с диапазоном значений от 2 до 5 и тип tIndex с диапазоном значений от 1 до 10. Значение, представляющее начало диапазона должно быть меньше значения, представляющего конец диапазона, а разделителем между ними является составной символиз двух точек.
Вещественные типы данных
К числу стандартных вещественных (действительных) типовотносятся:
Extended – вещественный тип с повышенной точностью, допускающий множество значений с 19 – 20 десятичными цифрами в диапазоне абсолютных значений от 3,6ּ10-4951 до 1,1 ּ10+4932, занимает 10 байт;
Double – тип, допускающий множество значений с 15 – 16 десятичными цифрами в диапазоне абсолютных значений от 5ּ10-324 до 1,7ּ10+308, занимает 8 байт;
Real – тип, эквивалентный типу Double;
Real48 – тип, допускающий множество значений с 11 – 12 десятичными цифрами в диапазоне абсолютных значений от 2,9ּ10-39 до 1,7ּ10+38, занимает 6 байт;
Single – тип, допускающий множество значений с 7 – 8 десятичными цифрами в диапазоне абсолютных значений от 1,5ּ10-45 до 3,4ּ10+38, занимает 4 байта;
Comp – тип, допускающий множество целых значений с 19 – 20 десятичными цифрами в диапазоне от -263+1до +263-1, занимает 8 байт;
Currency – тип, допускающий множество значений с 19 – 20 десятичными цифрами в диапазоне от -922337203685477,5808 до +922337203685477,5807, занимает 8 байт;
Константы вещественного типа записываются либо в естественной форме, например,
-12.345, либо в экспоненциальной форме, в которой то же самое число можно записать по–разному, например, -0.12345E+2, или -0.12345E2, или -0.12345е+2, или –1.2345E+1, или –1.2345E1, или –12.345E0, или –1234.5E-2, или –12345E-3, или и так далее. При представлении числа в такой форме безразлично, используется строчная или прописная латинская буква Е. Чтобы получить значение числа, представленного в экспоненциальной форме, нужно умножить мантиссу, то есть то, что стоит перед символом Е, на порядок, то есть на 10 в степени, значение которой представляет целое число, записанное после Е. Так, константу -0.12345E+2 следует читать как –0,12345·10+2, а константу -1234.5E-2 – как –1234,5·10-2.
Следующий фрагмент программы представляет объявления вещественных переменных Х и Y типа Real, Z – типа Extended и именованной константы H со значением 0,00000025:
var
X, Y: Real;
Z: Extended;
const
H = 2.5E-7;
Для данных вещественного типа определены следующие арифметических операции, результат выполнения которых также будет иметь вещественный тип такой, который имеет минимальный диапазон, включающий вычисленное значение:
сложение (знак +),
изменение знака (унарный минус -),
вычитание (знак -),
умножение (знак *),
деление (знак /).
В отличие от языков программирования BASIC и Fortran, в языке Object Pascal нет операции возведения в стерень.
Стандартные функции для обработки числовых данных
Стандартные функции, предназначенные для вычисления некоторых математических и тригонометрических функций, а также для преобразования данных вещественного типа к целому, содержатся в модуле System, подключаемом к программе по умолчанию, и в модуле Math.
Стандартные функцииможно разбить на группы по признаку, – какого типа их аргументы (то есть фактические параметры, которыми могут быть константы, переменные, выражения) и какого типа возвращаемый ими результат.
Стандартные функции, не меняющие тип, то есть для целого аргумента возвращается целое значение, а для вещественного – вещественное:
Abs(X) – возвращает абсолютное значение аргумента,
Sqr(X) – возвращает квадрат аргумента
Max(X,Y) – возвращает максимальное из X и Y,
Min(X,Y) – возвращает минимальное из X и Y.
Стандартные функции, возвращающие в любом случае (аргумент целый, вещественный или вообще нет аргумента) вещественное значение:
Tan(X) – возвращает значение тангенса аргумента,
ArcTan(X) – возвращает значение арктангенса аргумента,
Sin(X) – возвращает значение синуса аргумента,
ArcSin(X) – возвращает значение арксинуса аргумента,
Cos(X) – возвращает значение косинуса аргумента,
ArcCos(X) – возвращает значение арккосинуса аргумента,
Exp(X) – возвращает значение ex,
Frac(X) – возвращает дробную часть аргумента,
Int(X) – возвращает целую часть аргумента,
Ln(X) – возвращает значение натурального логарифма аргумента,
Log10(X) – возвращает значение логарифма аргумента X по основанию 10,
LogN(N,X) – возвращает значение логарифма аргумента X по основанию N,
Pi – возвращает значение числа p,
Sqrt(X) – возвращает значение квадратного кореня аргумента,
IntPower(X,N) – возвращает значение X, возведенное в целую степень N,
Power(X,Y) – возвращает значение X, возведенное в степень Y (если Y не целое, то значение X должно быть не отрицательным).
Стандартные функции, возвращающие значение целого типа:
Round(X) – возвращает округленное значение вещественного аргумента,
Trunc(X) – возвращает значение вещественного аргумента после отбрасывания его дробной части,
Sign(X) – возвращает значение 1 для X>0, значение 0 – для X=0, значение -1 – для X<0.
Дополнительные сведения о подпрограммах модулей System и Math можно найти в справочных разделах Delphi Arithmetic routines и Trigonometry routines.
Арифметические выражения
Арифметическое выражениезаписывается в виде последовательности целых или вещественных констант, переменных и обращений к функциям, разделенных знаками арифметических операций и круглыми скобками. В арифметических выражениях могут использоваться одновременно переменные, константы и функции разных целых и вещественных типов (такую возможность обозначают термином «совместимость типов в выражениях»).
Результат вычисления выражения будет целого типа, если все используемые в нем константы, переменные и функции имеют целый тип и не используется знак операции /, иначе – вещественного типа.
В выражениях в первую очередь вычисляются обращения к функциям и содержимое круглых скобок, затем – операции типа умножения (*, /, div, mod) в порядке слева направо, затем – операции типа сложения (+ и -) в порядке слева направо.
Например, для вычисления выражения
можно записать в программе
Sqr(Sin(X))*Cos(IntPower(Y,3))*1.2E-4/Sqrt(X)/Y/Power(Z,2/3).
Оператор присваивания
В процессе выполнения программы переменные могут получать новые значения либо с помощью процедур ввода, либо с помощью операторов присваивания (либо как выходные параметры подпрограмм, но об этом позже).
Оператор присваивания записывается в виде:
Выражение, записанное справа от знака присваивания:= (состоит из знаков «двоеточие» и «равно»), вычисляется, преобразуется, при необходимости, к типу переменной, стоящей слева от знака присваивания, после чего эта переменная получает вычисленное значение. Например, для вещественной переменной Х выполнение оператора
X:=5 mod 2;
будет складываться из следующих действий: вычисления выражения 5 mod 2 целого типа, результатом чего станет значение 1, преобразование этого значения к вещественному типу и сохранение преобразованного значения в ячейке памяти, соответствующей переменной Х.
Возможность преобразования в операторе присваивания значения одного типа к другому называют совместимостью по присваиванию. Допустимо оно не во всех случаях. Например, целое можно преобразовать присваиванием к вещественному, но не наоборот. В последнем случае следует воспользоваться стандартными функциями Round или Trunc. Например, для переменной K целого типа допустимо использование операторов
K:=Round(5.6); //Переменная K получит значение 6
или
K:=Trunc(5.6); //Переменная K получит значение 5,
но запрещено
K:=5.6;
Ввод данных с клавиатуры
В консольных приложениях для ввода данных с клавиатуры есть два оператора вызова процедур с именами Read и ReadLn (далее их будем называть просто операторами ввода или операторами Read и ReadLn). Параметры этих процедур – переменные, значения которых вводятся, располагаются вслед за именами этих процедур в круглых скобках в виде списка через запятую, который называют списком ввода. Элементами списка ввода могут быть переменные только числовых типов, символьные и строковые. Вводимые данные для числовых типов, набираемые на клавиатуре, должны разделяться или пробелами, или символами табуляции (клавиша TAB), или символами конца строки (клавиша Enter). Набор данных заканчивается нажатием клавиши Enter. Набранные данные последовательно присваиваются переменным списка ввода. Возможно также, что число элементов списка ввода будет меньше или больше количества набранных на клавиатуре данных. Тогда, при использовании оператора Read, в первом случае не использованные этим оператором числа могут быть введены следующим оператором ввода, а во втором – следующий оператор ввода будет ждать набора на клавиатуре недостающих данных и нажатия клавиши Enter.
Например, ввести значения вещественных переменных X и Y оператором Read(X,Y) можно, подготовив вводимые числа на одной строке:
5.21 1e-3¿
или в двух строках:
5.21¿
1e-3¿
где символ ¿ обозначает нажатие клавиши Enter.
Использование для тех же целей двух операторов:
Read(X); Read(Y);
также допустимо при наборе данных в одной или двух строках.
Оператор ReadLn отличается от оператора Read тем, что после завершения ввода оставшиеся неиспользованными набранные числа пропадают (не могут быть использованы следующими операторами ввода). Например, для ввода операторами
ReadLn(X); ReadLn(Y);
тех же данных их следует набирать в двух строка, как показано в предыдущем примере.