Hi-Tech  ->  Программы  | Автор: | Добавлено: 2015-03-23

Преобразование типов в Паскале

В Паскале оператор присваивания не всегда работает, даже если он написан синтаксически верно. Когда мы производим вычисления с известными числами, результат известен и проблем не возникает. С переменными же все проходит не всегда так гладко, поскольку переменные типов Integer и Real хранятся по-разному (занимают разный объем памяти). Компьютер устроен так, что выполнять действия он может только с одинаковыми объектами. Возьмем следующую программу: program wrong; var a :Integer; b :Real; begin b : =2; a : =2. 9; {Здесь содержится ошибка!} end.

Если набрать эту программу и попробовать ее оттранслировать, получим сообщение об ошибке Нарушение соответствия типов. Курсор при этом укажет на ту строку, у которой в комментарии сказано, что здесь содержится ошибка. Давайте разберемся в причинах появления данного сообщения. В первом операторе переменной вещественного типа присваивается целое число 2. Ошибки здесь нет, поскольку произойдет так называемое преобразование типа, при котором число 2 будет представлено в виде десятичной дроби 2. 0 и записано в b. А наоборот нельзя — в целую переменную a дробное число 2. 9 не запишется, и транслятор выдаст ошибку. Такие ситуации возникают очень часто, и сложнее всего бывает разобраться со случаем, когда используется операция деления «/» (например, что будет с результатом f / 2, где f — целое число?). Существует несколько правил, два из которых уже были описаны ранее (в переменную вещественного типа можно записать целое число, а наоборот — нельзя). Остальные правила, касающиеся выполнения арифметических операций, представлены в следующей таблице.

Операция Тип операнда Тип результата Пример Результат первый второй

+,*, - Integer Integer Integer 2 + 27 29

+,*, - Integer Real Real 2 -3. 5 -1. 5

+,*, - Real Integer Real 3. 0 - 27 -24. 0

+,*, - Real Real Real 2. 5 * 2. 5 6. 25

/ любой любой Real 8/2 4. 0

Что делать, если надо получить в результате целое число, пусть даже округленное? В этом случае можно воспользоваться одной из двух встроенных функций Паскаля: Trunc(a) или Round (а). Встроенные функции пока можно считать обычными операторами языка Паскаль. Здесь Тrunс отбрасывает дробную часть аргумента, a Round округляет его по правилам математики до ближайшего целого. Примеры:

Trunc(2. 73) = 2;

Trunc(-3. 4) = -3;

Trunc(1. 9) = 1;

Round (2. 5) = 3;

Round(-3. 7) = -4. 0.

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

Программа для вычисления этого выражения пишется очень просто — в две строчки. В первой вводим значение х, а во второй выводим результат: program polynomial; var х :Real; begin

Write(‘Введите x:’);

Readln(x);

Write(x*x*x*x*x+7*x*x*x*x-18*x*x*x+9*x*x-x+8); end.

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

= х (х (х (х (х+7)- 18) + 9) - 1) + 8.

После преобразования количество операций уменьшилось до 9, то есть тот же результат мы получим быстрее: program polynomial_fast; var х :Real; begin

Write('Введите х:');

ReadLn(x);

Write(x * (x *(х * (х *(х + 7) - 18) + 9) - 1) + 8); end.

Этот метод вычисления значения многочлена называется схемой Горнера.

Встроенные функции. Кроме упомянутых функций Round и Trunc в Паскале существует целый ряд других встроенных функций. Далее приводятся наиболее распространенные из них.

Функция Тип аргумента х Результат

Sqrt(x) Real или Integer корень квадратный из х

Abs(x) Real или Integer модуль х

Sin(x) Real или Integer синус х

Cos(x) Real или Integer косинус х

Pred(x) Integer следующее целое после х

Succ(x) Integer предыдущее целое до х

Sqr(x) Real или Integer квадрат х

Следует особо отметить, что каждая функция возвращает значение определенного типа:

+ Sin(x), Cos(x), Sqrt(x) —вещественного;

+ Pred(x), Succ(x) — целого;

+ Sqr(x), Abs(x) — того же типа, что и аргумент.

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

Мы теоретически подкованы. Теперь можно перейти к практической части.

Комментарии


Войти или Зарегистрироваться (чтобы оставлять отзывы)