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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2008, 01:10   #1
strab
Новичок
Джуниор
 
Регистрация: 11.06.2008
Сообщений: 2
По умолчанию Алгоритм перевода двоичного числа в десятичное и обратно

Я начинающий "Программист" на дельфи, и решил озадачить себя воплащением простейшего арифметически-логического алгоритма в код. Задача такая, перевести двоичное восьмизначное число в десятичное, и так же любое десятичное в двоичное. В форме эксперимента, я взял две тетрады - 8 бит, то есть число не может превысить значение 256, ну и соответсвенно 11111111 в двоичной системе.
начиная с первого бита с правой стороны, начинается отсчёт степеней числа два, и единица стоящая на первом(с правой стороны) месте будет обозначать 2^0=1, второй бит при наличии положительного значения означает 2^1, третий бит соотвественно 2^2, сощитая сумму всех степеней двойки обозначенные в байте единицей, и будет деситизначным значением байта. Вот посмотрите мой алгоритм, да и сам код решения этой задачи.... Делаем калькулятор который будет переводить из двузнака в десятизнак и обратно:

unit calcXXX1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type //ну эта батва автаматом тута
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label2: TLabel;
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.RadioButton2Click(Sender: TObject);
begin
label1.caption:='Введите число в двоичной системе';
end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
label1.Caption:='Введите число в 10ичной системе';

end;



procedure TForm1.Button1Click(Sender: TObject);
var
sstr:string[8];
sint:integer;
sint1:integer;
xx:array[1..8] of boolean;
n:integer;
len:integer;
begin
if radiobutton1.Checked then
begin
sint:=strtoint(edit1.text);
if sint>256 then showmessage('Ошибка - трансперируемое число не может быть болье 256')
else if sint=256 then
begin
sint:=0;
for n:=1 to 8 do
begin
xx[n]:=true;
end;
end
else
begin
if
sint>=128 then begin xx[8]:=true; sint:=sint-128;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint>=64 then begin xx[7]:=true; sint:=sint-64;sstr:=sstr+'1';end
else sstr:=sstr+'0';

if sint>=32 then begin xx[6]:=true;sint:=sint-32;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint>=16 then begin xx[5]:=true;sint:=sint-16;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint>=8 then begin xx[4]:=true;sint:=sint-8;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint>=4 then begin xx[3]:=true;sint:=sint-4;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint>=2 then begin xx[2]:=true;sint:=sint-2;sstr:=sstr+'1';end
else sstr:=sstr+'0';
if sint=1 then begin xx[1]:=true;sstr:=sstr+'1';end
else sstr:=sstr+'0';

label2.caption:=sstr;

end
end;
if radiobutton2.checked then
begin
len:=length(edit1.Text);
if len<>8 then showmessage('неверный формат ввода, вводите двоичное число в 8 символах')
else
begin
sint:=0;
sstr:=copy(edit1.text,1,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+128;
0: sint:=sint+0;

end;

sstr:=copy(edit1.text,2,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+64;
0: sint:=sint+0;
end;

sstr:=copy(edit1.text,3,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+32;
0: sint:=sint+0;
end;

sstr:=copy(edit1.text,4,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+16;
0: sint:=sint+0;
end;

sstr:=copy(edit1.text,5,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+8;
0: sint:=sint+0;

end;
sstr:=copy(edit1.text,6,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+4;
0: sint:=sint+0;
end;
sstr:=copy(edit1.text,7,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+2;
0: sint:=sint+0;
end;

sstr:=copy(edit1.text,8,1);
sint1:=strtoint(sstr);
case sint1 of
1: sint:=sint+1;
0: sint:=sint+0;
end;
sstr:=inttostr(sint);
label2.Caption:=sstr;
end
end;

end;

end.

<<<<<<<Комментарии приветствуются, кто как бы , по своему обмутил код?>>>>>>
strab вне форума Ответить с цитированием
Старый 17.06.2008, 09:36   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Учите Pascal и обязательно используйте циклы!!!
а вот эта строчка: 0: sint:=sint+0; вообще не нужна (она ничего не делает!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2008, 10:06   #3
GenAcid
Пользователь
 
Регистрация: 22.04.2008
Сообщений: 28
По умолчанию

Код:
leng := length(stroka)
sum := 0;
for i := 1 to leng do
  sum:=sum + (strtoint (stroka [leng - i])) shl (i - 1));
Если что ногами не бить: среды под рукой нет, все по памяти и на глаз.
GenAcid вне форума Ответить с цитированием
Старый 17.06.2008, 15:04   #4
strab
Новичок
Джуниор
 
Регистрация: 11.06.2008
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Учите Pascal и обязательно используйте циклы!!!
а вот эта строчка: 0: sint:=sint+0; вообще не нужна (она ничего не делает!
А каким образом здесь можно использовать цикл и упростить код?
strab вне форума Ответить с цитированием
Старый 17.06.2008, 21:16   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, во-первых, постом выше GenAcid привёл пример кода с использованием цикла..рекомендую разобраться с ним.

а во вторых, вот, на примере Вашего кода (выделяете повторяющиеся части и смотрите, что надо исправить, чтобы в их можно было бы повторять в цикле:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ...
  xbase : integer;
....
if radiobutton2.checked then
begin
  len:=length(edit1.Text);
  if len<>8 then showmessage('неверный формат ввода, вводите двоичное число в 8 символах')
  else
    begin
      {тут подготовились к циклу}
      xbase :=128;
      sint  :=0;
      {а вот и цикл}
      for n:=1 to length(edit1.Text) do
      begin
        sstr:=copy(edit1.text,n,1);
        sint1:=strtoint(sstr);
        if sint1=1 then
           sint:=sint+xbase;
        xbase := xbase div 2;
      end;
      {всё все 8 чисел обработаны. можно выводить результат}
      sstr:=inttostr(sint);
      label2.Caption:=sstr;
    end
end;
заметьте, я сознательно оставил так, как это было у Вас, хотя, надо бы сделать:
1) цифры брать не слева направо, а наоборот! тогда можно не проверять, чтобы было ровно восемь цифр.
xbase в начале цикла := 1 потом не уменьшается в два раза, а увеличивается в два раза: xbase := xbase * 2
2) и просто просится код... :-))
sint:=sint + xbase*strtoint(copy(edit1.text,n,1) );

и ещё - используйте тэг CODE при оформлении кода!!

удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2008, 21:33   #6
embedder
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 25
По умолчанию

Цитата:
Сообщение от strab Посмотреть сообщение
8 бит, то есть число не может превысить значение 256, ну и соответсвенно 11111111 в двоичной системе.
Вам бы, молодой человек, в начале надо выучить азы. А уже потом браться за программирование.
11111111 = 255
embedder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо представить десятичное число в двоичном виде Xardas Паскаль, Turbo Pascal, PascalABC.NET 2 26.01.2008 00:54
Помогите сдать экзамен!!! Нужен код деревьев двоичного поиска и еще 2 програмки Девчонка Помощь студентам 8 18.01.2008 19:02
ВВести десятичное число N и вывести таблицу чисел от 1 до N и их двоичный эквивалент XpideX Общие вопросы C/C++ 5 04.01.2008 19:30
как перевести из integer в real(и обратно), и из real в string(и обратно) Ga-sergey Общие вопросы Delphi 2 08.06.2007 21:13
нужна функция WinApi, которая переводит десятичное число в шестнадцатиричное??? Morskoivolk Win Api 3 02.04.2007 18:14