29.11.2005, 07:32
общий
это ответ
Здравствуйте, Мордовин Илья!
Могу предложить исходник своего модуля для работы с двоичными и десятичными числами. Если нужны и шестнадцатиричные, и восьмиричные - процесс их перевода очень похож. Если нужно, обращайся, попробую написать и для них.
Приложение:
unit BinDecTranslate;interface{Проверяем, не содержит ли введенное двоичное число другие цифры, кроме 0 и 1}function BinCheck (a: string): boolean;{Проверяем, не содержит ли введенное десятичное число лишних знаков}function DecCheck (a: string): boolean;{Функция будет возвращать результат расчета a в степени b}function power (a,b: integer): integer;{Функция будет выводить максимальную целую степень двойки для данного числа}{Это нужно при переводе из десятичной в двоичную систему вычитанием степеней}function MaxPower (a: integer): integer;{Функция будет переводить числа из двоичной системы счисления в десятичную}functi[/b]on BinToDec (b: string): real;{Функция будет возвращать двоичную строку, соответвтвующую десятничному числу}function DecToBin (d: integer): string;implementation{------------------------------------------------------------------------------}function BinCheck (a: string): boolean;var i: word; {счетчик цикла}beginBinCheck := true; {сначала будет считаться, что число введено правильно}for i := 1 to length(a) do {затем проверяем каждый символ…}if (ord(a[i])<48) or (ord(a[i])>49) then BinCheck := false; {…по ASCII-коду}{и если хоть один из них отличен от 0 или 1, то функции присваиваем false}end;{------------------------------------------------------------------------------}function DecCheck (a: string): boolean;var i: word; {счетчик цикла}beginDecCheck := true; {сначала будет считаться, что число введено правильно}for i := 1 to length(a) do {затем проверяем каждый символ}if (ord(a[i])<48) or (ord(a[i])>57) then DecCheck := false;{и если хоть один из них отличен десятичных цифр, то функции присваиваем false}end;{------------------------------------------------------------------------------}function power (a,b: integer): integer;var i: integer; {это у нас будет счетчиком цикла}res: integer; {а это - промежуточный результат}beginres := 1; {ведь есть истина - любое число в нулевой степени равно единице!}for i := 1 to b do res := res*a; {вот и возведение в степень}power := res; {осталось лишь присвоить функции значение результата}if a=0 then power := 0; {любая степень нуля будет равна нулю}end;{------------------------------------------------------------------------------}function MaxPower (a: integer): integer;var i: word; {это счетчик цикла repeat…until}temp: integer; {промежуточный результат}begini := 0;repeat i := i+1; {будем увеличивать степень до тех пор…}temp := power(2,i);until temp > a; {…пока значение двойки в следующей степени не превысит число}MaxPower := i-1;end;{------------------------------------------------------------------------------}function BinToDec (b: string): real;var i, temp, pow: word; {значит так, здесь - счетчик, разряд (он будет выделятьсяиз двоичной строки) и степень двойки}res: real; {ну а это результат, как и в предыдущей функции}beginres := 0; {начальное значение результата}pow := 0; {степень двойки при первом разряде - нулевая}for i := length(b) downto 1 do {выделяем последовательно все разряды...}begintemp := StrToInt(b[i]); {...}res := res + temp*power(2,pow); {...и рассчитываем результат}pow := pow + 1; {степень двойки увеличим, т.к. номер разряда увеличивается}end;BinToDec := res; {опять-таки присваиваем функции значение результата}end;{------------------------------------------------------------------------------}function DecToBin (d: integer): string;var m, t: integer; i: integer; {максимальная степень, промежуточное число и счетчик}res: string; temp: char; {результат и промежуточные символы}begint := d; {присваиваем t само число, которое нужно перевести}res := ‘‘; {результат сначала будет равен пустой строке, т.к. его еще нет :)}m := MaxPower(d); {максимальная степень двойки для числа переводимого числа…}for i := m downto 0 do {…от нее и будем начинать обратный отсчет}begin{если i-тая степень двойки меньше, чем промежуточное число, то…}if power(2,i)<=t then temp := ‘1‘ else temp := ‘0‘; {добавляем 1, иначе - 0}{и вычитаем из числа другое число: 2 в степени i}{например, макс. степень двойки для 114 – это 6. Тогда отнимаем От 114 2 в степени 6. 114-64=50. Макс. степень этого нового числа находится при следующем прохождении цикла} if power(2,i)<=t then t := t-power(2,MaxPower(t));res := res+temp; {добавляем к результату полученный символ: 0 или 1}end;DecToBin := res; {после цикла результат готов}end;end.