|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Перевод из двоичной СИ в десятичную
Вообщем сам перевод я по сути сделал:
Код:
procedure TForm1.BinToDecClick(Sender: TObject); var i,result:integer; bin:string; begin bin:=BinDec.Text; result:=0; for i:=1 to length(bin) do begin result:=result+(1 shl(length(bin)-i)); end; tr.Caption:=IntToStr(result); end; Но вот такой вопрос: как указать, что если вводится числа отличные от 0 или 1, то программа выводит сообщение и сбрасывается, я делал так: Код:
if not (bin in ['0','1']) then begin ShowMessage('Ошибка'); Exit; end; но не получается, выдаёт ошибку о несовместимости типов данных String и Сhar ((( И как сделать так, что программа считает по формуле Код:
result:=result+(1 shl(length(bin)-i)); |
#2
|
||||
|
||||
Потому что у тебя bin - это строка, а не символ.
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#3
|
|||
|
|||
Цитата:
А разве так переводится в десятичную систему? Вообще то формула такая (допустим надо перевести число 1101) 1*2^3 + 1*2^2 +0*2^1 +1*2^0 и получаем 8+4+1= 13. Попробовал твой вариант считает по другому! Цитата:
Код:
for i:=1 to length(bin) do if (copy(BinDec.Text,i,1)<>IntToStr(1)) and (copy(BinDec.Text,i,1)<>IntToStr(0)) then ShowMessage('Ошибка'); |
#4
|
|||
|
|||
To The Shadow
Я знаю...я хотел узнать, как это можно сделать иначе. To MegaPiha Пасиб)Формула то правильная, просто есть косяк с тем, что когда число содержит "0" то, она их считает за "1", но это можно исправить условием) |
#5
|
|||
|
|||
Всё сделал))
Выложу код для перевода из 2-й в 10-ю и наоборот, мб кому пригодится) из 10-й в 2-ю Код:
procedure TForm1.DecToBinClick(Sender: TObject); var result:string; dec:integer; begin dec:=StrToInt(BinDec.Text); result:=''; While dec>0 do begin if Odd(dec) then result:='1'+result else result:='0'+result; dec:=dec shr 1; end; if result='' then result:='0'; tr.Caption:=result; end; из 2-й в 10-ю Код:
procedure TForm1.BinToDecClick(Sender: TObject); var i,result:integer; bin:string; begin bin:=BinDec.Text; result:=0; for i:=1 to length(bin) do begin if (copy(BinDec.Text,i,1)<>IntToStr(1)) and (copy(BinDec.Text,i,1)<>IntToStr(0)) then begin ShowMessage('Ошибка'); Exit; end; if not (copy(BinDec.Text,i,1)<>IntToStr(1)) then result:=result+(1 shl(length(bin)-i)); end; tr.Caption:=IntToStr(result); end; |
#6
|
|||
|
|||
Работает!
|
#7
|
||||
|
||||
Вот исходничек для перевода из 2..36-й систем счисления в 2..36-ю. Думаю, кому-нибудь пригодится
З.Ы. Знаю, что примитивный код, зато работает |