Главная » Free Pascal » Прямые и обратные преобразования числовых данных Free Pascal

0

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

Традиционные функции и процедуры

К этой категории отнесены функции и процедуры, использовавшиеся в ранних версиях систем Turbo Pascal. Полный их перечень приведен в табл. 5.2. Система Free Pascal расширила их сферу действия на все типы числовых данных

Таблица 5.2

Формат вызова

Выполняемое преобразование

s:=BinStr(num,k);

Преобразование целочисленного значения num

из машинного формата в символьное представление, содержащее k двоичных разрядов

s:=OctStr(num,k);

Преобразование целочисленного значения num

из машинного формата в символьное представление, содержащее k восьмеричных разрядов

Таблица 5.2 (окончание)

Формат вызова

Выполняемое преобразование

s:=HexStr(num,k)

Преобразование целочисленного значения num

из машинного формата в символьное представление, содержащее k шестнадцатеричных разрядов

Str(v_num,s);

Преобразование числового значения v_num любого типа в строковую переменную s типа String

Val(s,v_num,ind)

Преобразование числа любого типа из символьного представления s в числовую переменную v_num. Целочисленная переменная ind — признак завершения операции

Три первые функции преобразуют целочисленное значение любого типа — со знаком или без знака. Это очень нехарактерные для Паскаля подпрограммы, т. к. до- пускают наличие аргумента num, имеющего тип, совместимый с данными многих ти- пов (Byte, SmallInt, ShortInt, Word, Integer, LongInt, Int64, Qword). Результат пре- образования напоминает целочисленное значение, получающееся при выводе данных на дисплей. Единственное неудобство состоит в задании количества k символов в возвращаемом значении. Этот параметр допускает значения из диапазона Byte. Если вы зададите величину k слишком маленькой, то старшие разряды в переводимом зна- чении будут потеряны и никакое сообщение о произошедшем не выдается. А ведь было бы удобно, например, при k=0 получать точно переведенное значение без лиди- рующих нулей, т. е. такой же результат переменной длины, как и при выводе на дис- плей. С точностью до указанного ограничения результат, возвращаемый функциями BinStr, OctStr и HexStr, имеет тип ShortString. Программа conv_1 демонстрирует некоторые возможности указанных функций (листинг 5.9).

   Листинг 5 .9 .  Программа  conv_1                                               

program conv_1; var

n1: integer=45; n2: integer=-1;

begin

writeln(n1,’ в двоичной системе = ‚,BinStr(n1,32)); writeln(n1,’ в восьмеричной системе = ‘,OctStr(n1,10)); writeln(n1,’ в шестнадцатеричной системе = ‘,HexStr(n1,8)); writeln(n2,’ в двоичной системе = ‘,BinStr(n2,32)); writeln(n2,’ в восьмеричной системе = ‘,OctStr(n2,10)); writeln(n2,’ в шестнадцатеричной системе = ‘,HexStr(n2,8)); readln;

end.

Результаты ее работы приведены на рис. 5.8.

Рис. 5.8. Преобразование числовых данных в строку

Процедуры Str и Val предназначены для прямого и обратного преобразования числовых значений любого типа (целочисленных и вещественных). Результат ра- боты процедуры Str абсолютно такой же, как и при выводе соответствующего чи- слового значения v_num на экран с помощью оператора write. Более того, при об- ращении к процедуре Str можно также указывать длину результирующей строки n и количество цифр m после запятой:

Str(x:n:m, s);

Процедура Val в качестве своего исходного аргумента может получить строку s, в которой может содержаться числовое значение с недопустимым символом, прерывающим нормальную работу алгоритма перевода. Тогда в целочисленную переменную ind заносится индекс ошибочного символа. Если процесс преобразо- вания завершился удачно, то содержимое ind равно 0. Строковый аргумент про- цедуры Val может быть представлен символьной константой в двоичном, восьме- ричном или шестнадцатеричном формате. Более того, конвертируемому значению могут предшествовать один или несколько пробелов в начале:

Val(‘ E4′,x,ind);   {перевод шестнадцатеричного числа}

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

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии