|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Задача с системами исчисления
Прошу помочь решить несколько вопросов.
Сама задача такова: необходимо зделать калькулятор систем исчисления, тоесть перевод вещественных чисел в разные сс(2\8\10\16) и обратно, а также их складывать вычитать и умножать. Выобор сс осуществляется нажатием на радиобаттом и таким образом числа в трех едитах меняются в другую сс. Такой вопрос: как зделать, что б после перевода чисел в другую сс(например в двоичную)числа складывались, омножались итд уже в выбраной системе счисления, а не определялись как десятичные(например двоичное число 1001 не определялось как тысяча один). И второй вопрос, помогите найти ошибку в переводе в 16ричную систему(точнее ошибку не выбивает, а отображает только в одном эдите и не A B C D F, а непонятные символы. Код:
procedure TForm1.RadioButton4Click(Sender: TObject); var result: string; remainder: word; c: char; num: word; result2: string; remainder2: word; c2: char; num2: word; result3: string; remainder3: word; c3: char; num3: word; begin num:=strtoint(edit1.Text); num2:=strtoint(edit2.Text); num3:=strtoint(edit3.Text); begin result := ''; while num <> 0 do begin remainder := num mod 16; num := num div 16; If remainder = 10 then c:='A'; If remainder = 11 then c:='B'; If remainder = 12 then c:='C'; If remainder = 13 then c:='D'; If remainder = 14 then c:='E'; If remainder = 15 then c:='F'; result := c + result; end; edit1.Text := result; end; begin result2 := ''; while num2 <> 0 do begin remainder2 := num2 mod 16; num2 := num2 div 16; If remainder = 10 then c:='A'; If remainder = 11 then c:='B'; If remainder = 12 then c:='C'; If remainder = 13 then c:='D'; If remainder = 14 then c:='E'; If remainder = 15 then c:='F'; result2 := c2 + result2; end; edit2.Text := result2; end; begin result3 := ''; while num3 <> 0 do begin remainder3 := num3 mod 16; num3 := num3 div 16; If remainder = 10 then c:='A'; If remainder = 11 then c:='B'; If remainder = 12 then c:='C'; If remainder = 13 then c:='D'; If remainder = 14 then c:='E'; If remainder = 15 then c:='F'; result3 := c3 + result3; end; edit3.Text := result3; end; end; Последний раз редактировалось Admin, 24.05.2009 в 13:10. |
#2
|
|||
|
|||
Вот так можно переводить из 10ой в 16ую
Код:
function Dec2Hex(const Source: Integer): String; var Dec: Integer; Hex: String; begin Dec := Source; Hex := ''; while Dec <> 0 do begin case (Dec mod 16) of 10: Hex := 'A' + Hex; 11: Hex := 'B' + Hex; 12: Hex := 'C' + Hex; 13: Hex := 'D' + Hex; 14: Hex := 'E' + Hex; 15: Hex := 'F' + Hex; else Hex := IntToStr(Dec mod 16) + Hex; end; Dec := Dec div 16; end; Result := Hex; end; А для сложения в других системах делай так: смотришь в какой системе у тебя числа, переводишь их в 10ую, производишь операции и делаешь перевод получившегося числа обратно |
#3
|
|||
|
|||
Ошибку с переводом 16ричную сс я нашел, подскажите еще: как реализовать, что б при нажатии на радиобаттом переводило в нужную сс, например если в эдитах осталось двоичное число после перевода, то перевести, допустим, в 16ричное, не определяя ето двоичное число как десятиричное
|