Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2012, 20:38   #1
AnderoN
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 14
По умолчанию Функция

Добрый вечер, программирую в Delphi, у меня есть функция, которая переводит из двоичной (типа интеджер) в шестнадцатиричную (строковую) систему счисления
вот код этой функции

Код:
FUNCTION DEC2HEX(DEC: LONGINT): STRING;   {из двоичной (целочисленного типа) в шестнадцатиричную (строкового типа)}
CONST
HEXDigts: STRING[16] = '0123456789ABCDEF';
VAR
HEX : STRING;
I, J: LONGINT;
BEGIN
  IF DEC = 0 THEN HEX := '0'
  ELSE
    BEGIN
      HEX := '';
      I := 0;
      WHILE (1 SHL ((I + 1) * 4)) <=DEC DO I := I + 1;
      { 16^N = 2^(N * 4) }
      { (1 SHL ((I + 1) * 4)) = 16^(I + 1) }
      FOR J := 0 TO I DO
        BEGIN
          HEX := HEX + HEXDigts[(DEC SHR ((I - J) * 4)) + 1];
          { (DEC SHR ((I - J) * 4)) = DEC DIV 16^(I - J) }
          DEC := DEC AND ((1 SHL ((I - J) * 4)) - 1);
          { DEC AND ((1 SHL ((I - J) * 4)) - 1) = DEC MOD 16^(I - J) }
        END;
    END;
  DEC2HEX := HEX;
END;
мне нужна такая же функция, только чтобы перевод осуществлялся не из типа integer, а из типа real. Помогите пожалуйста, а то моего образования программиста не хватает для создания такой функции.
AnderoN вне форума Ответить с цитированием
Старый 29.03.2012, 21:03   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

какой интеджер? какой реал
Вы вообще о чём?
Вы переводите из двоичной в шестнадцатиричную
В таком случае двоичное число должно храниться в строке и соответственно шестнадцатиричное в строке!
Сейчас сделаю пример!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 29.03.2012, 21:17   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Из какой, какой СС? Двоичной? Скопировали чужой код, скорей всего из второй ссылки в Go_Ogle, и даже не проверили))). А не из десятичной ли переводим числа?
Берите и присваивайте другой переменной(например n) округлённую в меньшую степень вашу real. Потом n присваиваете разность real и n. Теперь у вас в n хранится дробная часть числа. Функцией floattostr переводите его в строку, убираете пару символов, а именно нуль и точку, а потом переводите результат в integer и применяете "ВАШУ" функцию снова.
Последним результатом будет конкатенация строк.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 29.03.2012, 21:52   #4
AnderoN
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
какой интеджер? какой реал
Вы вообще о чём?
Вы переводите из двоичной в шестнадцатиричную
В таком случае двоичное число должно храниться в строке и соответственно шестнадцатиричное в строке!
Сейчас сделаю пример!
Спасибо, жду пример.

Цитата:
Из какой, какой СС? Двоичной? Скопировали чужой код, скорей всего из второй ссылки в Go_Ogle, и даже не проверили))). А не из десятичной ли переводим числа?
Берите и присваивайте другой переменной(например n) округлённую в меньшую степень вашу real. Потом n присваиваете разность real и n. Теперь у вас в n хранится дробная часть числа. Функцией floattostr переводите его в строку, убираете пару символов, а именно нуль и точку, а потом переводите результат в integer и применяете "ВАШУ" функцию снова.
Последним результатом будет конкатенация строк.
Спасибо, я не писал, что это моя функция

Вообще мне надо перевести переменную типа real в переменную тип byte, есть какая - нибудь функция для такого перевода?

Последний раз редактировалось AnderoN; 29.03.2012 в 22:05.
AnderoN вне форума Ответить с цитированием
Старый 29.03.2012, 23:55   #5
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Собственно, что у меня получилось!
Просьба не смеяться!
Код:
program convert;
uses crt;
var
   BIN, HEX: string;

function _BIN_TO_HEX (const bin: string): string;
const
    zero = '000';
    number = '0123456789ABCDEF';
var
    i: integer;
    decim: char;
    count_dec: integer;
    hi, low, temp, temp2: string;
begin
    _BIN_TO_HEX := '';
    temp := '';
    count_dec := 0;
    for i := 1 to length(bin) do
    begin
        if not(bin[i] in ['.', ',', '0', '1']) then
        begin
            _BIN_TO_HEX := 'ERROR NUMBER';
            exit;
        end;
        if (bin[i] = ',') or (bin[i] = '.') then
        begin
            Inc(count_dec);
            decim := bin[i];
        end;
    end;
    if count_dec = 0 then
    begin
        hi := bin;
        low := '';
    end
    else if count_dec = 1 then
         begin
             hi := copy(bin, 1, pos(decim, bin) - 1);
             low := copy(bin, pos(decim, bin)+1, length(bin) - pos(decim, bin) + 1);
         end
         else
         begin
             _BIN_TO_HEX := 'ERROR NUMBER';
             WRITELN('VERY HI');
             exit;
         end;
    if (length(hi) mod 4) <> 0 then
        hi := copy(zero, 1, 4 - (length(hi) mod 4)) + hi;
    if (length(low) mod 4) <> 0 then
        low := low + copy(zero, 1, 4 - (length(low) mod 4));
    while hi <> '' do
    begin
        temp2 := copy(hi, 1, 4);
        delete(hi, 1, 4);
        temp := temp + number[(8*(ord(temp2[1]) - 48) + 4*(ord(temp2[2])-48) +
                       2*(ord(temp2[3])-48) + (ord(temp2[4])-48))+1];
    end;
    temp := temp + decim;
    while low <> '' do
    begin
        temp2 := copy(low, 1, 4);
        delete(low, 1, 4);
        temp := temp + number[(8*(ord(temp2[1]) - 48) + 4*(ord(temp2[2])-48) +
                       2*(ord(temp2[3])-48) + (ord(temp2[4])-48)) + 1];
    end;
    _BIN_TO_HEX := temp;
end;

begin
    clrscr;
    Write ('Enter bin number: ');
    ReadLn(BIN);
    Writeln;
    HEX := _BIN_TO_HEX(BIN);
    Writeln ('IT IS HEX NUMBER: ', HEX);
    ReadKey;
end.
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция на С. Bogdan11 Помощь студентам 2 02.01.2012 13:52
функция shok.92 Общие вопросы C/C++ 6 04.12.2010 12:19
функция shok.92 Помощь студентам 0 03.12.2010 18:50
Функция aus Общие вопросы C/C++ 2 17.11.2010 08:30
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50