![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Программирую двоичный калькулятор. По заданию нужно сделать так чтобы он складывал два числа в двоичной системе счисления также как это происходит на бумаге, т.е. 0+0=1; 1+0=1; 1+1=0(с переносом единицы в следующий разряд) и выводил всё в той же двоичной системе счисления.
Программа компилируется, но при выполнении любого действия зависает... Код не доработан, в частности не реализован перенос единица в след. разряд, с чем тоже возникают трудности. Это моя первая работа в Delphi так что прошу без наездов типа:"Ты что, тупой? Тут же надо всего лишь..." Код:
unit BiCalc;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var s: string;
ost, i, a: integer;
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
s:= Edit1.Text;
i:= Length(s);
while i>0 do
begin
if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=0 then
begin
Edit3.Text:= IntToStr(ost);
ost:=0;
end;
if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=1 then
begin
Edit3.Text:= IntToStr(ost);
ost:=1;
end;
if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=2 then
begin
Edit3.Text:= IntToStr(ost);
ost:=0;
a:=1;
end;
end;
end;
end. |
|
#3
|
|||
|
|||
|
Эмм.. Не въехал, разве StrToInt эту самую функцию не выполняет?
|
|
#4
|
|||
|
|||
|
Нет, т.к., как я понял из задания, у тебя в строке находится БИТОВОЕ представление числа. В таком случае StrToInt('101') даст 101, а должно дать 5. Для этого представленные функции и даны. Ну и обратно, пусть будет такой пример:
3 + 5 что соответсвует исходным данным: 011 + 101 Тогда при использовании StrToInt() ты получиш 112, а должно получиться 1000 |
|
#5
|
|||
|
|||
|
И самое главное, внутри цикла i не меняется
|
|
#6
|
|||
|
|||
|
Да пофиг на i, там в принципе код кривой. Деже если это поправить будет неправильно работать. Например, перенос считается, но не используется.
Если уж очень хочется самому, то как-то вот так: Код:
uses
Math;
function BinAdd(D1, D2 : String) : String;
function BitChrToVal(C : Char) : Byte;
begin
Case C Of
'0' : Result := 0;
'1' : Result := 1;
Else Raise Exception.CreateFmt('Unexpected bit value - %s',[C]);
End;
end;
var
I, MaxLen : Integer;
Bit : Byte;
Shtt : Byte;
begin
if Length(D1) <> Length(D2) Then
Begin
MaxLen := Max(Length(D1),Length(D2));
While Length(D1) < MaxLen Do D1 := '0' + D1;
While Length(D2) < MaxLen Do D2 := '0' + D2;
End;
Result := '';
Shft := 0;
For I := MaxLen DownTo 1 Do
Begin
Bit := Shft + BitChrToVal(D1[i]) + BitChrToVal(D2[i]);
Shft := 0;
Case Bit Of
0 : Result := '0' + Result;
1 : Result := '1' + Result;
2 : Begin Result := '0' + Result; Shft := 1; End;
3 : Begin Result := '1' + Result; Shft := 1; End;
Else Raise Exception.Create('something went wrong - got bit intermediate value out of [0..3].');
End;
End;
If Shft > 0 Then Result := '1' + Result;
end; |